[STM32F10x] 标准库初始化问题
2024-10-18 10:06:15
硬件: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 ×××××××××××××××××××××××××××××××××××××××/
最新文章
- linux 查找文件或目录
- RAC+asm通过rman恢复到单实例+asm
- ucenter用户登录过程
- 莫名其妙MyEclipse
- Scalaz(11)- Monad:你存在的意义
- ArcGis 001270 : 合并数据失败
- HDU 3727 Jewel 可持久化线段树
- 【转】Eclipse下导入外部jar包的3种方式
- Android 播放视频文件
- 【codeforce 219D】 Choosing Capital for Treeland (树形DP)
- BZOJ2749: [HAOI2012]外星人
- Android导入项目时出现红色感叹号
- KVM管理平台openebula安装
- php字符串与数组的特殊情况
- 如何在本地搭建DVWA环境
- 跟我一步一步写出MongoDB Web 可视化工具(二)
- oracle插入数据的时候报错:ORA-00928: 缺失 SELECT 关键字
- CF176E Archaeology
- [Java] 绕过证书验证调 HTTPS 接口时报 “SSLHandshakeException: DHPublicKey does not comply to algorithm constraints”的解决办法
- (zhuan) Speech and Natural Language Processing