找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4949|回复: 17
打印 上一主题 下一主题
收起左侧

STM32惊天大BUG,定时器1,8,和定时器6初始化顺序的BUG

  [复制链接]
跳转到指定楼层
楼主
ID:644357 发表于 2021-3-8 20:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
众所周知,初始化先后顺序是不会影响到while(1)循环体的,但是TIM1,8和TIM6之间的初始化先后顺序,直接影响两个定时器能否正常工作

例子,TIM8用作输出4路PWM波,
          TIM6用作定时延时,
    初始化
         TIM6_init();
         TIM8_init();



于是,PC6,7,8,9,只有C9有波形,

调换位置之后,皆大欢喜,一切正常,

我使用了FreeRTOS,因为这个问题抓狂了2天2夜,结果就一顺序产生的问题,深感耻辱,发帖纪念。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

来自 2#
ID:669393 发表于 2021-3-10 01:35 | 只看该作者
定时器6用到中断了吗?如果用到并且没有在定时器初始化函数里面清空中断标志位,main函数里初始化的时候会自动执行一次定时器中断,进入中断函数,如果正好中断里有未初始化的内容,程序就会卡死在中断里, 你的TIM6_init()中断函数里肯定有TIM8相关内容。程序进入不了定时器8初始化函数里,也就是无法产生pwm波。你调换了顺序,其实是先执行了tim8初始化,再执行tim6初始化,自动进入一次中断,这时候中断服务函数恰好能正常执行。肯定是程序的问题,不可能是bug
回复

使用道具 举报

板凳
ID:830831 发表于 2021-3-8 23:03 | 只看该作者
我靠,还能这样?  啥开发环境呀?
回复

使用道具 举报

地板
ID:866661 发表于 2021-3-9 09:51 | 只看该作者
这种情况很常见,LCD液晶显示初始化顺序调换一下就不能显示!
回复

使用道具 举报

5#
ID:337834 发表于 2021-3-9 11:58 | 只看该作者
多看看自己的代码,毕竟STM32都是经过市场验证的
回复

使用道具 举报

6#
ID:276761 发表于 2021-3-9 12:45 | 只看该作者
会不会其他地方有问题你没发现
回复

使用道具 举报

7#
ID:95703 发表于 2021-3-9 14:00 | 只看该作者
会不会是 TIM6_init()的时钟没使能,到了  TIM8_init();才使能。
回复

使用道具 举报

8#
ID:644357 发表于 2021-3-9 18:45 | 只看该作者
天地摩登恒 发表于 2021-3-9 14:00
会不会是 TIM6_init()的时钟没使能,到了  TIM8_init();才使能。

定时器8,6都是分开的,用的固件库,这种错误检查了好几遍
回复

使用道具 举报

9#
ID:759755 发表于 2021-3-9 19:27 | 只看该作者
这个和顺序没关系吧
回复

使用道具 举报

10#
ID:493780 发表于 2021-3-9 20:55 | 只看该作者
你这个是stm32哪个型号的
回复

使用道具 举报

11#
ID:830831 发表于 2021-3-10 09:34 | 只看该作者
Nevergp 发表于 2021-3-9 11:58
多看看自己的代码,毕竟STM32都是经过市场验证的

坑多的很,只是你不知道
回复

使用道具 举报

12#
ID:830831 发表于 2021-3-10 09:39 | 只看该作者
SPEAR 发表于 2021-3-10 01:35
定时器6用到中断了吗?如果用到并且没有在定时器初始化函数里面清空中断标志位,main函数里初始化的时候会 ...

比较靠谱的分析,楼主试试看
回复

使用道具 举报

13#
ID:890487 发表于 2021-3-10 19:03 | 只看该作者
具体是哪个型号
回复

使用道具 举报

14#
ID:531542 发表于 2021-3-12 13:30 | 只看该作者
个人觉得,和顺序没有太大的关系,除非是你的一些局部变量没有初始化,或者其他的一些BUG导致,你可以贴出代码给大家瞅瞅。。
回复

使用道具 举报

15#
ID:644357 发表于 2021-3-19 21:19 | 只看该作者
SPEAR 发表于 2021-3-10 01:35
定时器6用到中断了吗?如果用到并且没有在定时器初始化函数里面清空中断标志位,main函数里初始化的时候会 ...
  1. void TIM6_IRQHandler(void)
  2. {
  3.         if(TIM_GetITStatus(TIM6,TIM_IT_Update)!=RESET)
  4.         {
  5.                 if(Global_time_ms>0){
  6.                         Global_time_ms--;
  7.                 }
  8. //                if(Global_time_us>0){
  9. //                        Global_time_us--;
  10. //}
  11. //                if(Infraredcnt<300){Infraredcnt++;} else{read_all_status();Infraredcnt=0;}
  12.                 TIM_ClearITPendingBit(TIM6,TIM_FLAG_Update);
  13.         }
  14. }
复制代码

这个延时函数就没用到他,在闲置,代码维护过了好长时间,可能就是大哥你说的这个情况。
不过学到了,初始化会自动执行一次中断
回复

使用道具 举报

16#
ID:644357 发表于 2021-3-19 21:20 | 只看该作者
kidxpp 发表于 2021-3-10 19:03
具体是哪个型号

103ZET6
回复

使用道具 举报

17#
ID:519089 发表于 2021-7-14 21:25 | 只看该作者
肯定是代码问题,不用多想~~~~~
回复

使用道具 举报

18#
ID:698693 发表于 2021-7-18 00:53 | 只看该作者
我也出现了类似的情况    TIM1和TIM3的初始化顺序不能反   TIM1要在前
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表