STM32
直播中

无厘头

13年用户 546经验值
擅长:基础元器件
私信 关注
[问答]

STM32编程常踩的坑有哪些?

STM32编程常踩的坑有哪些?

回帖(1)

谢丹丹

2021-12-17 14:10:06
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的中断能设,只是要特别小心特别小心。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分