8位单片机开发注意事项
前言
目前部分产品为了成本依然使用8位单片机,不过在使用8位单片机开发过程中踩过很多的坑,做个笔记留意记录。
注意事项
1、中断服务函数中操作的变量在主循环调用
在中断服务函数中有操作的变量,都需要注意,如果使用这些变量作为形参传递时,需要注意变量的数据类型,如果该变量为16位数据类型,则传参时发生中断会导致传参异常,举个例子:
// 这里只是举个例子,一个定时器中断内累加毫秒计时
volatile unsigned int ms = 0;
void Timer0Interrupt() interrupt 1
{
ms++;
}
void getSystemMs(unsigned int tim)
{
return tim;
}
int main()
{
getSystemMs(ms);
}
上面只是一个草稿,这里具体在描述一下,当ms=0x1FF时,此时调用getSystemMs函数准备将ms传递进去,由于单片机是8位的,所以16位的变量需要传递两次,先传低八位在传高八位,而在刚传递完低八位时触发了定时中断,此时ms++变成了0x200,然后退出中断回到传递形参这里,低八位已经传递完了就开始传递高八位,但是此时高八位已经从0x1变成了0x2,所以最后传递到函数中时tim实际=0x2FF,就会导致数据错误了。
2、STARTUP.A51关于RAM清零配置
这个STARTUP.A51配置文件是Keil为51内核的单片机生成的启动配置文件,在该文件中有关于IDATA和XDATA以及一些特殊单片机还有PDATA等特殊的RAM大小设置,设置完后再后面会通过汇编根据该大小进行清零,这与其他的16位或32位单片机略有不同,如STM32会有官方提供专门的启动汇编.s文件,而STARTUP.A51文件只是Keil创建工程时自动生成的,生成后需要注意其中的XDATA和IDATA长度,有的单片机可能有外部扩展SRAM。
IDATALEN EQU 100H
;
; <o> XDATASTART: XDATA memory start address <0x0-0xFFFF>
; <i> The absolute start address of XDATA memory
XDATASTART EQU 0
;
; <o> XDATALEN: XDATA memory size <0x0-0xFFFF>
; <i> The length of XDATA memory in bytes.
XDATALEN EQU 1000H
;
; <o> PDATASTART: PDATA memory start address <0x0-0xFFFF>
; <i> The absolute start address of PDATA memory
PDATASTART EQU 0H
;
; <o> PDATALEN: PDATA memory size <0x
后续有想到在新增


被折叠的 条评论
为什么被折叠?



