现象
用定时器TIM4定时翻转GPIO用低电平灌电流驱动LED闪烁的简单测试程序不能正常执行。LED灯不闪烁,debug查看GPIO口却是正确的被翻转了。测试IO口电压不对。
问题代码
void main(void)
{
// 系统时钟不分频(内部16MHz)
CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);
// TIM4进行128分频,同时设置溢出上限值保证1ms一次中断
TIM4_TimeBaseInit(TIM4_PRESCALER_128, 124);
// 开TIM4更新事件中断
TIM4_ITConfig(TIM4_IT_UPDATE, ENABLE);
// 开总中断
enableInterrupts();
// 使能定时器4
TIM4_Cmd(ENABLE);
// 初始化GPIO,输出上拉模式
GPIO_Init(LED_GPIO_PORT, (GPIO_Pin_TypeDef)LED_GPIO_PINS, GPIO_MODE_OUT_PP_LOW_SLOW);
while (1){}
}
直接原因
继续debug发现GPIO的方向寄存器DDR和模式寄存器CR1没有被设置。
根本原因
在GPIO初始化完成之前定时器就开始运行了。导致不断进入定时器中断,后面的GPIO初始化代码没有正确被执行(或者定时器中断中不能被正确执行?这个没有深究了)
解决
将GPIO初始化代码放在定时器初始化之前(放在使能之前即可)
正确代码
void main(void)
{
// 系统时钟不分频(内部16MHz)
CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);
// GPIO的初始化要放在timer初始化之前,否则初始化的过程会被中断打断导致输出有问题(DDR还没来得及配置成输出模式)
GPIO_Init(LED_GPIO_PORT, (GPIO_Pin_TypeDef)LED_GPIO_PINS, GPIO_MODE_OUT_PP_LOW_SLOW);
// TIM4进行128分频,同时设置溢出上限值保证1ms一次中断
TIM4_TimeBaseInit(TIM4_PRESCALER_128, 124);
// 开TIM4更新事件中断
TIM4_ITConfig(TIM4_IT_UPDATE, ENABLE);
// 开总中断
enableInterrupts();
// 使能定时器4
TIM4_Cmd(ENABLE);
while (1){}
}
上一篇:梦之墨T系列产品的又一次完美亮相
下一篇:解决STM8定时器首次进入中断时间不对
推荐阅读最新更新时间:2024-11-04 16:52
设计资源 培训 开发板 精华推荐
- the-little-bili-tv:基于ESP32的哔哩哔哩小电视
- 【已验证】STC8G1K08A mini系统板
- 具有集成升压控制器的 LED6001 PWM 可调光单通道 LED 驱动器的典型基本应用电路原理图(升压拓扑)
- CS5171HVBSTGEVB:HVBS 评估板
- DN05063/D、两级并联、能源之星低成本线性 LED 驱动器设计(120 VAC)
- 使用 Microchip Technology 的 TCL1117-2.85 的参考设计
- 具有关断功能的 ADM8829 开关电容器电压逆变器的典型应用
- LTC4440 的典型应用 - 高速、高电压高压侧栅极驱动器
- 4455C-868-PDK,用于 Si4455 868-MHz 射频收发器的 EZRadio 双向链路开发套件
- SC4213H 极低输入/极低压差 0.5 安培稳压器的典型应用
- 跟帖免费申请UFUN学习板开始啦,跟着张进东学习&进阶模拟、工程技能
- 看东芝在线展会视频,听权威汽车技术讲解!
- ADI电磁流量计解决方案
- 【贝能好礼相送】我们拼啦 寻觅Infineon 调光恒流LED驱动器 ICL5102写真
- TI 中国大学计划20周年狂欢盛宴
- 免费申请评测:欧时电子(RS Components)树莓派3来袭,待你玩耍带你飞
- 免费申请|基于STM32H7处理器的机器视觉微控制器板OpenMV4 Cam H7
- 直播预约 | 汽车圈盛会!第二届英飞凌汽车创新峰会(IACE)全程直播
- 3小时实战+剖析:TI工程师手把手带你全面入门MSP430(限量售$4.3开发套件,助你参与动手实验)