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

后续有想到在新增

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值