调试STM32/8 程序一些浅显又不易发现的问题

1 串口映射printf后是否勾选上USE MicroLIB ?如果没有勾选可能不会进入main函数,目前不知道什么原因。

2 定义计数用的变量cntx时是否大于255但是仍然用的u8 ? u8最大值是255 这个错误非常低级但是总是让人费很大的劲才找到。

3 像下面这种语句 ,这条if后面多了个分号,非常容易被忽略。

if(flag);
{
;
}

4 如果定义了一个int16_t的变量A,和int32_t的变量B,当执行下列语句时应注意增加强制转换(在VC6.0里没有加就可以,但在MDK ARM中就会出错)。

B=(int32_t)A<<16;

5 STM32初始化结构体要尽量填完,因为初始化结构体定义时里面变量的值是随机的,如果不认为更改的话,可能会出现意想不到的错误比如我在一个论坛发的帖子

6 在定义变量时尽量不要使用int类型,如果需要定义4字节的变量,可以用int32_t ,uint32_t或者s32,u32。避免被优化掉可以使用__IO int32,__IO uint32,vs32,vu32,volatile u32等,因为在使用int,unsigned int 来定义时,变量的大小可能是2字节(STM8 in IAR)或者4个字节(STM32 in MDK)。如果写一个程序希望从IAR上往MDK上移植时会带来些麻烦。

 

7 stm8用库函数时,初始化过程中切记把CLK初始化放在第一位。因为初始化其他外设的时候库函数会获取当前运行频率,如初始化UART时,有CLK_GetClockFreq()。

posted @ 2014-08-16 17:00  cntsw  阅读(384)  评论(0编辑  收藏  举报