登录
|
立即注册
网站首页
网站论坛
BBS
积分充值
每日签到
搜索
MCU智学网
»
网站论坛
›
单片机论坛
›
STC/51单片机
›
帖子
两种方式实现C语言访问MCU寄存器
[复制链接]
2556
0
发表于 2018-12-13 23:47:39
|
查看全部
|
阅读模式
本文包含源代码、原理图、PCB、封装库、中英文PDF等资源
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
单片机的特殊功能寄存器SFR,是SRAM地址已经确定的SRAM单元,在C语言环境下对其访问归纳起来有两种方法。
1、采用标准C的强制类型转换和指针来实现
采用标准C的强制转换和指针的概念来实现访问MCU的寄存器,例如:
#define DDRB (*(volatile unsigned char *)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只是个常量,不是指针,更不是变量。
2、对C编译器进行语法扩充
对C编译器进行语法扩充。例如MCS51系列KeilC中扩充sfr关键字,举例如下:
sfr P0 = 0x80;
这样操作0x80单元直接写P0即可。
下面对AVR的歌C编译器对访问MCU寄存器的方法进行简介。
A:采用标准C的强制类型转换和指针来实现访问MCU的寄存器,每一个C编译器都支持,原因很简单,这是标准C。
B:ICCAVR和GCCAVR没有定义新的数据类型,只能采用标准C的强制类型转换和指针来实现访问MCU的寄存器。而IAR和CodeVisionAVR编译器对ANSI C进行了扩充,都定义了新的数据类型,是C语言可以直接访问MCU的有关寄存器,例如,IAR中:
SFR_B(DDRB, 0x28)
CodeVisionAVR中:
sfrb DDRB = 0x28
这样,PORTB=0xff;等同于(*(volatile unsigned char *)0x05) = 0xff;而0x25正好是寄存器PORTB在器件ATmega48/88/168中的地址。
GCCAVR每个AVR器件在头文件不采用直接定义特殊功能寄存器宏,例如在iomx8.h文件中一个定义如下:
#define PORTB _SFR_IO8(0x25)
而在sfr_defs.h中可以找到如下两个宏定义:
#define _SFR_IO8(io_addr) _MMIO_BYTE((io_addr)+0x20)
#define _MMIO_BYTE(mem_addr) (*(volatile unit8_t *)(mem_addr))
实质上与直接的强制类型转换和指针定义是一样的。
另外,GCCAVR中宏_BV(bit)是操作I/O寄存器是频繁用到的,avr-libc建议使用这一宏进行寄存器的位操作,他在文件sfr_defs.h中定义如下:
#define _BV(bit)
以下是他的使用示例:
DDRB = _BV(PB0) | _BV(PB1); //器件头文件中已经定义PB0代表0,PB1代表1
他等同于“DDRB=0x03;”,这样写的目的是为了提供程序的可读性。不要担心它会生成比“DDRB=0x03;”更大的代码,编译器会处理这种事情,最终会输出与“DDRB=0x03;”同样的结果。
举报
回复
返回列表
*
滑块验证:
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
本版积分规则
发表回复
回帖后跳转到最后一页
admin
管理员
293
主题
21
回帖
3995
积分
Ta的主页
发信息
签到
连续天
5人
签到看排名
更多
精彩推荐
RV1126 RV1109硬件设计全套参考资料包
1、介绍 RV1126和RV1109是专用于视觉处理的高性能处理器SoC,可广泛应用于智能门锁、
瑞芯微 RK3326 RK3326S 硬件参考设计分享
RK3326是为个人平板电脑和智能音频设备设计的高性能四核应用程序处理器。提供了许多嵌
更新自动建库工具PCB Footprint Expert 202
已更新至目前最新版本Footprint Expert 2024.04 自动建库工具Footprint Expert 2023.
RK1808全套资料 包含芯片手册 参考设计 硬
一、简介 随着物联网和人工智能的兴起,AIoT(AI+IoT)芯片也随之兴起,RK1808是瑞芯
瑞芯微 RK3568 硬件参考设计分享 原理图 PC
RK3568芯片介绍简介瑞芯微RK3568芯片是一款定位中高端的通用型SOC,是一款高性能低功
更多
热点动态
1.
量程自动切换数字电压表proteus仿真 程序资
2.
自制FM收音机
3.
Cadence Allegro 17.4 电子设计速成实战宝
4.
RTL8309N方案-8口Switch原理图PCB规格书
5.
思特威SC4336_数据手册 SC4336_设计应用指
6.
思特威SC3338_数据手册 SC3338_设计应用指
7.
思特威SC3336_数据手册 SC3336_设计应用指
8.
思特威SC3335_数据手册 SC3335_设计应用指
更多
随手拍
1.
量程自动切换数字电压表proteus仿真 程序资
2.
自制FM收音机
3.
免费分享 全开源全协议245W桌面充电站-无线
4.
Cadence Allegro 17.4 电子设计速成实战宝
5.
VL817-Q7 USB3.0 HUB方案 包含规格书 参考
更多
客服中心
微信扫描二维码
服务时间:周一至周日 8:30-22:00
在线客服
客服微博
产品咨询
售后中心
快速回复
返回顶部
返回列表