[STM32F10x] 标准库初始化问题
阅读原文时间:2023年07月10日阅读:3

  硬件: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 ×××××××××××××××××××××××××××××××××××××××/

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章