B001-Atmega16-PORTA的定义-(ques=1)

发布者:Tapir最新更新时间:2022-01-29 来源: eefocus关键字:Atmega16  PORTA  定义 手机看文章 扫描二维码
随时随地手机看文章

在 iom16.h中定义了 PORTA如下:

#define PORTA   _SFR_IO8(0x1B)

接着在sfr_defs.h中定义了_SFR_IO8()如下:


#if _SFR_ASM_COMPAT

......

#define _SFR_IO8(io_addr) ((io_addr) + __SFR_OFFSET)

#define _SFR_IO16(io_addr) ((io_addr) + __SFR_OFFSET)

......

#else  /* !_SFR_ASM_COMPAT */

......

#define _SFR_IO8(io_addr) _MMIO_BYTE((io_addr) + __SFR_OFFSET)

#define _SFR_IO16(io_addr) _MMIO_WORD((io_addr) + __SFR_OFFSET)

......

#endif /* !_SFR_ASM_COMPAT */

这个定义表示:

如果编译器( _SFR_ASM_COMPAT等于1)可以直接使用汇编、那么像 PORTA这样的变量,就是一个地址值。


此时、__SFR_OFFSET是IO寄存器的基地址,其值等于0x00,所以PORTA展开如下:


#define PORTA   _SFR_IO8(0x1B)

              = ((io_addr) + __SFR_OFFSET)

              = ((0x1B) + 0x00)

              =   0x1B

在汇编中操作 PORTA时,就是直接操作 PORTA的地址:

否则、如果只能使用C语言,那么操作 PORTA这样的变量,就是一个指针操作的过程。

此时、 PORTA的定义展开如下:

#define PORTA   _SFR_IO8(0x1B)

              = _MMIO_BYTE((io_addr) + __SFR_OFFSET)

_MMIO_BYTE()的定义如下:

#define _MMIO_BYTE(mem_addr) (*(volatile uint8_t *)(mem_addr))

这就是用指针的方式去操作一个内存地址,此时 __SFR_OFFSET等于 0x20。

到此、 PORTA的定义进一步展开如下:

#define PORTA   _SFR_IO8(0x1B)

              = _MMIO_BYTE((io_addr) + __SFR_OFFSET)

              = (*(volatile uint8_t *)((io_addr) + __SFR_OFFSET))

              = (*(volatile uint8_t *)((0x1B) + __SFR_OFFSET))

              = (*(volatile uint8_t *)(0x3B))

__SFR_OFFSET是IO寄存器的基地址,0x1B是PORTA在寄存器文件中的偏移量,加在一起就是PORTA的真实的物理地址(端口地址)。 


所以我们对PORTA赋值的时候,就是将数值写入上面这个地址处的寄存器中。 


参考avr-libc的介绍:http://www.nongnu.org/avr-libc/user-manual/group__avr__sfr__notes.html


 -------------------------------------------------------------------------------------------------------------------------------------


因此、我们可以将PORTA重命名如下:


    uint8_t *LED = (uint8_t *)(&PORTA);

然后就可以直接对 LED进行操作,来点亮 LED:

    *LED = 0x55;

如果以后更换了 LED的 IO口,只需要修改 LED这个变量的定义即可。

这样对 代码的移植是很有好处的。

也可以进一步打包成这样来隐藏指针操作符:

#define LED  (*(volatile uint8_t *)(&PORTA))

最后、如果可以不用#define的定义来隐藏指针操作符就更好了,因为#define定义的部分阅读起来不方便


<还在继续...>


|<----question-001

关键字:Atmega16  PORTA  定义 引用地址:B001-Atmega16-PORTA的定义-(ques=1)

上一篇:B001-Atmega16-带电复位后不清0的.noinit变量
下一篇:B001-Atmega16-汇编-地址空间分配

推荐阅读最新更新时间:2024-11-11 13:36

AVR(ATMEGA128/ATMEGA16)数码管显示
这是多文件形式,程序为128的,16的没什么区别 PROTEUS仿真图 /****************led数码管的头文件*********************/ #ifndef __led_H__ #define __led_H__ #define led_wei_ddr DDRD|=0X0F #define led_wei PORTD #define led_duan_ddr DDRF=0XFF #define led_duan PORTF extern void led_display(uint dat,uchar num); #endif /************led数码管显示函数的C文件****
[单片机]
AVR(ATMEGA128/<font color='red'>ATMEGA16</font>)数码管显示
51单片机 bit定义标志位无效原因
我的51程序中用到了位定义:bit flag; 这样定义后,运行程序,下载到电路板上,发现flag根本不是按照自己设定的值,导致函数判断错误;后来查找到了原因 将keil中options中 target中 Memory Mode中要选择下图那两种方式才行;设置好后运行程序到电路板,果然成功正确运行了; 原因:之前设置成 Small:in DATA了,因为bit变量是位可寻址变量,而在51单片机RAM中有单独的区域是可位寻址的,那就是 PDATA区,至于为什么选择XDATA也可以, 那是因为XDATA区已经包括PDATA区了;
[单片机]
恩智浦发布S32 CoreRide平台,展示5nm处理器方案,赋能软件定义汽车发展
近日,在恩智浦汽车生态技术峰会上,该 公司 在中国正式发布全新S32 CoreRide开放平台,并重点展示了基于S32 CoreRide平台的首款 产品 ——S32N55 处理器 的 最新 方案。恩智浦S32 CoreRide平台以及S32N55处理器是该公司面向软件定义汽车需求推出的中央计算平台,提供安全、实时和应用处理的可扩展组合,更好地赋能软件定义汽车的发展。 正如恩智浦 半导体 全球执行副总裁、高级 模拟 业务总经理Jens Hinrichsen所言,汽车是最终极的边缘 智能 设备,将逐渐从 硬件 和 机械 件定义汽车,过渡到软件定义汽车。就像 智能手机 越来越多地由软件定义一样,智能汽车将成为一个复杂的系统,需要有高
[汽车电子]
恩智浦发布S32 CoreRide平台,展示5nm处理器方案,赋能软件<font color='red'>定义</font>汽车发展
工业4.0时代,谁将定义新规则?
  一直以来,“德国制造”仿佛都是高质量和高科技的代名词。德国70%左右的制造业产品都用于出口到世界各地,也正是因为这一点,在最近几年的经济危机中,德国经济才能保持强劲的稳定性,和美国、欧洲其他国家形成了鲜明对比。但德国并不满足于此,为了与工业3.0时代的集大成者美国形成竞争,德国迫切希望引领新一轮的工业革命,成为游戏规则的制定者。下面就随工业控制小编一起来了解一下相关内容吧。   在2013年4月的汉诺威工业博览会上,德国政府正式提出“ 工业4.0 ”战略,这是德国试图以高科技带动工业生产发展的国家战略,而不是国际标准,也就是说,各国没有跟上的义务。事实上,许多国家都发表了类似的纲领性文件,只不过各有不同的提法,如美国的“先进
[工业控制]
Xilinx专为数据中心加速设计的软件定义开发环境上线AWS
赛灵思公司(Xilinx, Inc.,(NASDAQ:XLNX))今天宣布其软件定义开发环境SDAccel现已上线亚马逊AWS,可与亚马逊弹性计算云(Amazon EC2)F1实例配合使用。Amazon EC2 F1实例借助赛灵思16nm Virtex®UltraScale+™FPGA,可提供可重配置的定制硬件加速功能,能够满足数据分析、视频处理和机器学习等计算密集型工作负载的种种需求。 随着面向Amazon EC2 F1实例的SDAccel开发环境的部署,使不太熟悉FPGA的软件开发人员现在也能够将工作负载的性能提升高达50倍之多。 SDAccel通过为Amazon EC2 F1构建专用的FPGA内核,可以自动加速使用C
[嵌入式]
avr atmega16做的频率计 利用输入捕获功能
/***************************************** * 基于频率计程序设计 * * 功 能:频率计 * * 时钟频率:内部8M * 频率计最大频率范围。proteus测的65K 左右 MADE BY LYQ *****************************************/ #include iom16v.h #include macros.h #include 1602.c #define uint unsigned int #define uchar unsigned char #pragma interrupt_hand
[单片机]
avr <font color='red'>atmega16</font>做的频率计 利用输入捕获功能
ATmega16的lcd12864显示程序及proteus仿真工程文件
#include iom16v.h #include macros.h #include 12864.h #include main.h void port_init(void) { DDRC=0xFF; //12864数据口,置为输出 PORTC=0xFF; en_out; //置EN输出 rw_out; //置rw输出 rs_out; //置rs输出 cs1_out;//置cs1输出 cs2_out;//置cs2输出 } /*** ******12864写命令函数 ***/ void lcd_write_com(uchar com) { rw_clr;
[单片机]
<font color='red'>ATmega16</font>的lcd12864显示程序及proteus仿真工程文件
BlackBerry QNX与英特尔合作推出软件定义功能安全平台,助力工业自动化
联合功能安全认证平台为制造商提供了一条简化路径,以构建可靠、功能安全和网络信息安全的工业自动化解决方案 加拿大安大略省滑铁卢,2024年11月1日—— BlackBerry今日宣布扩大与英特尔公司的长期合作,助力制造商设计、构建并安全认证其工业系统和机器人应用,以进一步迈向工业5.0。 在制造与仓储等功能安全关键型环境中,工业自动化技术正在向协作性更强的应用场景过渡,即机器与人类在共享的工作空间中共同工作。随着这些系统的发展,功能安全(FuSa)在确保机械设备和人员安全方面发挥着至关重要的作用。符合IEC 61508标准确保了工业系统和机器人应用满足标准的功能安全生命周期要求。 “英特尔与BlackBerry QNX的
[工业控制]

推荐帖子

自耦式BoostDC/DC变换
本帖最后由jameswangsynnex于2015-3-320:00编辑自耦式BoostDC/DC变换
lorant 移动便携
【WEBENCH DIY】晒:基于WEBENCH的11V-18V转5V/2A的降压稳压电路设计
基于WEBENCH的11V-18V转5V/2A的降压稳压电路设计设计目标:设计并制作一个11-18V转5V/2A的BUCK电路设计工具:TI公司的WEBENCH(完成电路的在线设计和仿真)芯片选用:1.TPS5430DDA2.LM2596DDPAK(-ADJ)使用WEBENCH设计流程1.进入TI官网主页2.找到WEBENCH®Designer右
sunduoze 模拟与混合信号
又送出2个MAXIM气象站,大家猜猜是谁?
随着活动的不断进行,越来越多的朋友完成了自己的应急灯设计。所以也对完成特别优秀的朋友小小的表彰一下下:还有一个气象站,希望还未做完的朋友继续加油哦!又送出2个MAXIM气象站,大家猜猜是谁?恭喜恭喜哈哈!~恭喜!!~~来了,报道了恭喜了。。班竹,下次有活动要大声说哦。。。嘿嘿。。。呵呵,是不是你对论坛还不够关注哟!回复5楼shilaike的帖子谢谢eeworld网站,谢谢SOSO,谢谢灰太狼!谢谢网友!谢谢琳子小姐姐!我感动的流
EEWORLD社区 DIY/开源硬件专区
F28335,CCS5.5+Controlsuite,求助下各位大神
各位好,首次发帖,激动万分。我们常用的是CCS3.3,芯片主要是F240,F2812等,现在在单位领导的果断决策下升级到了CCS5.5,芯片升级到了F28335,安装完5.5及Controlsuite后,眼前一亮,很是高大上,但自己也迷茫了,很感兴趣,但也无从下手,希望在这里能得到大神们的指点。问题1:Controlsuite中PDF资料的查阅必须得联网下载吗?单位电脑没有联网的,或者是我安装操作有问题?毕竟安装完已经好多个G了,不能脱机查看吗?问题2:有没有类似某些单片机的
liuyue11a 微控制器 MCU
详细介绍MSP430开发工具及其特性
目前公司在MSP430开发工具方面主要有仿真器、编程器、各类学习板、转接板、适配器等。一:仿真器、编程器IAR和JTAG无法连接,是怎么回事?这是客户问的问题,在论坛中也很常见,FAE也有在问。我们就从这个问题开始讲解吧。MSP430无论是仿真还是烧写程序,一般可以通过:JTAG、SBW、BSL接口进行。1、JTAG是利用边界扫描技术,在430内部有逻辑接口给JTAG使用,内部有若干个寄存器连接到了430内部数据地址总线上,所以可以访问到430的所有资源,包括全地址FLASH、RAM及各
fish001 微控制器 MCU
FPGA设计小技巧
FPGA设计小技巧mark一下,感谢上传!
至芯科技FPGA大牛 FPGA/CPLD
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved