zoukankan      html  css  js  c++  java
  • [STM32F10x] 标准库初始化问题

      硬件:STM32F103C8T6

      平台:ARM-MDK V5.11

      STM32F系列提供的标准库都是通过结构体来初始化的。比如,以下是GPIO初始化的一个示例代码:

      GPIO_InitTypeDef   GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Pin
    = GPIO_Pin_0 | GPIO_Pin_2; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOD, &GPIO_InitStructure);

      先定义一个初始化结构体变量,然后根据实际需求给结构体里面的元素赋值,最后调用初始化函数,开始初始化。

      我一般喜欢把这个结构体定义为局部变量,因为初始化过程一般只调用一次,问题就来了。

      这是我在使用TIM1定时器时遇到的一个问题,本想使用TIM1产生一个8us的定时,可是产生的却是1ms的定时。TIM1定时器初始化的代码如下:

    void TimeBaseConfig(void)
    {
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        
        TIM_TimeBaseStructure.TIM_Period            = 575;
        TIM_TimeBaseStructure.TIM_Prescaler         = 0;
        TIM_TimeBaseStructure.TIM_ClockDivision     = 0;
        TIM_TimeBaseStructure.TIM_CounterMode       = TIM_CounterMode_Up;
        TIM_TimeBaseInit(EM4095_TIMEBASE, &TIM_TimeBaseStructure);
        
        TIM_ARRPreloadConfig(EM4095_TIMEBASE, ENABLE);
    
        /* TIM1 enable counter */
        TIM_Cmd(EM4095_TIMEBASE, ENABLE);
        
        /* Update interrupt config */
        TIM_ITConfig(EM4095_TIMEBASE, TIM_IT_Update, ENABLE);
    }

      问题就出在初始化结构定义的位置!运行时,查看这个结构体的值:

      

      由于定义为局部变量,初始化结构体里面的元素的值是随机的,而我的初始化函数里也少了TIM_RepetitionCounter赋值,本来该值应设为0,结果初始值为0x80,

      即重复128次才产生一个定时中断,大概是1ms。

      假如初始化结构体定义为全局变量:

      

      可以看到,结构体定义为全局变量时,所有值都初始化为0.

      结论

      虽然初始化结构定义为全局变量后,每个元素都会初始化为0,但并不一定是你需要的值。因此对外设进行初始化时,结构体中的每一个元素都要根据

      实际需求赋值。

      /×××××××××××××××××××××××××××××××××××××××× THE END ×××××××××××××××××××××××××××××××××××××××/

  • 相关阅读:
    Java 课程设计:LWZ
    回溯法解骑士巡游问题
    2021.3.30 错误2
    2021.3.29 关于上下滚动
    2021.3.28 WebView的用法
    2021.3.27 关于错误1
    2021.3.26 Python创建表
    2021.3.25 人月神话阅读笔记06
    2021.3.24 个人作业第三阶段1
    2021.3.23 个人作业第三阶段
  • 原文地址:https://www.cnblogs.com/mr-bike/p/4199175.html
Copyright © 2011-2022 走看看