找回密码
 注册
关于网站域名变更的通知
查看: 503|回复: 6
打印 上一主题 下一主题

C语言访问MCU寄存器的两种方式

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-2-28 09:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
C语言访问mcu寄存器的两种方式- h8 k5 x: n. X1 v3 C
3 A; G6 Q% \7 k& k$ U

" H' W0 ?/ a! e. N5 H& n

单片机的特殊功能寄存器SFR,是SRAM地址已经确定的SRAM单元,在C语言环境下对其访问归纳起来有两种方法。

1、采用标准C的强制类型转换和指针来实现

采用标准C的强制转换和指针的概念来实现访问MCU的寄存器,例如:

#define DDRB (*(volatile unsigned char *)0x25)

分析如下:

A:(unsigned char *)0x25中的0x25只是个值,前面加(unsigned char *)表示0x25是个地址,而且这个地址所存储的数据的数据类型是unsigned char,意思就是说读/写这个地址时,要写进unsigned char的值,读出也是unsigned char的值。

(*(volatile unsigned char *)0x25)是一个固定的指针,是不可变的,而不是指针变量。再在前面加"*",即*(volatile unsigned char *)0x25则变成了变量(普通的unsigned char变量,不是指针变量),如果是#define i (*(volatile unsigned char *)0x25),则与unsigned char i是一样的,只不过前面i的地址是固定的。

B:关键字volatile确保本指令不会以为C编译器的优化而被省略,且要求每次直接读值。例如使用while(*(unsigned char *)0x25)时,有时系统可能不能真正去读0x25的值,而是用第一次读出的值,如果这样,这个循环可能就是个死循环。用了volatile则要求每次都去读0x25的实际值。

这样读/写以0x25为地址的SRAM单元,直接书写DDRB即可,即DDRB为变量,只不过变量的地址固定为0x25。例如:

DDRB = 0xff;

这样比直接采用指针变量的方法直观和方便的多,例如:

unsigned char *p, i;

p = 0x25;

i = *p; //把地址为0x25单元中的数据读出送入i变量

*p = 0; //向地址为0x25的单元中写入0

总结一下,就是(*(volatile unsigned char *)0x25)可以看作是一个普通变量,这个变量哟固定的地址,指向0x25。而0x25只是个常量,不是指针,更不是变量。

游客,如果您要查看本帖隐藏内容请回复


  S0 f9 _  E. p  z; h) Z% Y

该用户从未签到

2#
发表于 2019-2-28 18:06 | 只看该作者
学习一下,谢谢分享

该用户从未签到

4#
发表于 2019-4-1 13:11 | 只看该作者
呃,单片机啊,什么单片机?那个型号?什么架构,单片机不等于MS51啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-6-27 11:04 , Processed in 0.093750 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表