STM32编程常踩的地雷

常常越简单的bug, 越难排查.

1: 声明数据, 但没赋值就被使用, 如下面的 u8 i;

for(u8 i;i<8;i++){
    printf(" %d ",i);
}

上面的示例代码, 绝大部分时候, 会如期输出 0, 1, 2, 3, 4, 5, 6, 7

但是! 但是! 但是! 某个时候值不是这样的, 什么值? 什么时候? 


2: 先清中断, 后清中断

void TIM6_DAC_IRQHandler(void)
{
    TIM6->SR = 0;               // A位 
 
    TimesCount--;       
    if(TimesCount==0)         
        TIM6->CR1  = 0;    

    TIM6->SR = 0;              // B位
}

A位和B位, 只是示例, 现实中当然是只使用其中的一行.

这就是常见的: 先清中断和后清中断最清晰的示例了,  延时差了一倍时间, 不管是us, 还是ms, 注意, 并不是因为执行中间的代码花了时间, 而是内部处理机制. 曾在这个先后顺序上费了近一天时间.

代码上是没错的, 逻辑也没错,  任你查也根本发现不.

先清中断、后清中断是两回事, 为什么? 不为什么, 没资料, 你试试百度, 查无下文!! 


3: 宏标识符

#define  24L01_SPI_CS_GPIO       GPIOH
#define  24L01_SPI_CS_PIN        PIN5

错误提示: error in include chain : macro name must be an identifier (宏名称必须是标识符)。

上面这种引脚的宏定义方法,很多人天天用着.  但,这个很多人里面,绝大部分不知道上面问题在哪。

别想了,度娘.............不能以数字开头, 就这简单, 只是那错误提示带着你绕远路了。


4:中断处理函数里调用函数

这个,你一定中过枪! 不论多简单的程序,不要在中断里面调用函数!!!

因为:  它出错时,你根本不会得到错误提示,查找中断类错误是个丧气事。

铁律:

  • 不要在中断里调用函数!如果要,快进快出,确保清晰每一行代码!
  • 绝对禁止:函数调用再调用的,更甚者,调用中还有延时函数!

5:低于1ms的中断

如果,芯片刚启动时工作正常,过一会就不正常了,程序查无错误,那么......

查查程序中有没有低于1ms的中断。中断进出过于频繁时,芯片消耗资源过多......用手摸摸芯片,看是不是有点发烫了。

有什么事,必须要1秒处理1000次以上的?才十元八块的芯片现在这么牛叉了吗?

用过FreeRTOS的同学都知道,最小计时单位:1ms.

不是小于1ms的中断能设,只是要特别小心特别小心。

发布了49 篇原创文章 · 获赞 25 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/zhouml_msn/article/details/104167199