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

最新更新时间: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-汇编-地址空间分配

推荐阅读

软件定义汽车时代下为什么硬件变得更重要了?
“汽车工业正在发生着天翻地覆的变化。”恩智浦半导体执行副总裁兼汽车处理器业务总经理Henri Ardevol日前对媒体表示。“电气化、数字化和云端连接是未来汽车发展的三大主要趋势。”Ardevol表示,除了技术,在价值链上汽车业也在发生着改变。从Tier3、Tier2、Tier1到OEM的线性价值链正在向三角价值链过渡,三个顶点包括了OEM、Tier1以及技术供应商。“恩智浦的定位就是逐渐转型成这三角之中的一端——技术型合作伙伴。”Ardevol说道。作为中国通,Ardevol深知酒香也怕巷子深这一道理,就在2023年3月,他和恩智浦半导体执行副总裁兼高级模拟业务总经理Jens Hinrichsen一起来到中国拜访客户,在中国的短暂
发表于 2023-03-29
单片机自定义协议FIFO高效发送数据方法
本文介绍如何使用带FIFO的串口来减少接收中断次数,通过一种自定义通讯协议格式,给出帧打包方法;之后介绍一种特殊的串口数据发送方法,可在避免使用串口发送中断的情况下,提高系统的响应速度。1、概述在此之前,先来列举一下传统串口数据收发的不足之处:每接收一个字节数据,产生一次接收中断。不能有效的利用串口硬件FIFO,减少中断次数。应答数据采用等待发送的方法。由于串行数据传输的时间远远跟不上CPU的处理时间,等待串口发送完当前字节再发送下一字节会造成CPU资源浪费,不利于系统整体响应(在1200bps下,发送一字节大约需要10ms,如果一次发送几十个字节数据,CPU会长时间处于等待状态)。应答数据采用中断发送。增加一个中断源,增加系统的中
发表于 2023-03-28
浅谈高性能汽车仿真技术的定义及发展历程
仿真技术在汽车生产过程中扮演重要角色,根据汽车产品制造阶段可分为CAD、CAE、CAM三种。 其中CAD用于前期产品设计,CAE用于产品性能及结构分析;CAM用于产品生产制造的落地;CAD将工业设计以数字化模型的方式,协助工程技术人员完成产品设计,从而提升产品开发效率、降低开发成本、缩短开发周期,据统计结果表明,在应用CAE技术后,开发期的费用占开发成本的比例从80%下降至8%。 头豹预测,未来中国汽车仿真市场在下游汽车渗透率将保持平稳增长,汽车仿真将从2021年33.0亿元的市场规模,以15.4%的复合增长率在2026年达77.8亿元。1.汽车仿真技术行业定义仿真技术是利用计算机并通过建立模型进行科学实验的一门多学科综合性制作,具
发表于 2023-03-27
浅谈高性能汽车仿真技术的<font color='red'>定义</font>及发展历程
软件定义汽车,谁来“撑”起软件?
随“硬件趋同、软件定义”成为业界共识,软件成为了决定智能车上限的关键要素,其占整车的比重也不断提升。根据德勤测算,预计2030年,软件成本占整车BOM的比重将从目前的不到10%增长到50%。当一半的车身组成都变成软件,汽车行业的话语权无疑也会向软件领域倾斜,企业筛选、判断核心技术的能力就成为了制胜软件定义汽车时代的关键。世界汽车工程师学会联合会(FISITA)终身名誉主席赵福全就曾指出:软件定义汽车的实质是企业对未来核心技术的判断:“类比传统汽车硬件领域的黑、白、灰匣子,黑匣子是买来用就行的技术,白匣子是必须掌握的核心技术,而灰匣子是能了解、能定义但是不一定非要自己造的技术。”为辨析汽车软件中的“黑、白、灰匣子”,研究者需要从全局视
发表于 2023-03-24
软件<font color='red'>定义</font>汽车,谁来“撑”起软件?
NVIDIA重新定义工作站,推动AI、设计和工业元宇宙新时代的到来
NVIDIA重新定义工作站,推动AI、设计和工业元宇宙新时代的到来全球系统集成商利用高性能的NVIDIA RTX Ada GPU和SmartNIC打造新一代笔记本电脑和台式工作站加利福尼亚州圣克拉拉—GTC—太平洋时间2023年3月21日—NVIDIA于今日发布六款面向笔记本电脑和台式电脑的全新NVIDIA RTX™ Ada Lovelace架构GPU,满足创作者、工程师和数据科学家对AI、设计和元宇宙新时代的需求。通过全新NVIDIA RTX GPU以及用于构建和运行元宇宙应用的平台NVIDIA Omniverse™,设计师可以在将概念变成现实之前对其进行模拟,规划人员可以在建造整个工厂之前将其可视化,而工程师可以实时评估他们的设
发表于 2023-03-22
NVIDIA重新<font color='red'>定义</font>工作站,推动AI、设计和工业元宇宙新时代的到来
主机开发模式“由硬变软”,全球汽车芯片巨头正布局软件定义汽车
随着汽车工业正在向电气化、数字化、云端连接发展,推动主机厂开发模式从硬件主导型,逐步转向软件主导型。“我们软件工程师的数量已经超过了硬件工程师。”在日前媒体沟通会上,恩智浦半导体执行副总裁兼汽车处理器业务总经理Henri Ardevol介绍,公司正在芯片基础上集成更多软件,未来将聚焦5纳米处理技术引领的汽车电子变革。随着汽车工业正在向电气化、数字化、云端连接发展,推动主机厂开发模式从硬件主导型,逐步转向软件主导型。作为全球汽车芯片巨头,恩智浦在汽车处理器以及非功率模拟器件处于国际领先地位,正在布局软件定义汽车这一核心趋势。“恩智浦作为技术合作伙伴,我们与主机厂的交流就更多聚焦在芯片平台与主机厂软件架构相匹配。这与过往沟通方式截然不同
发表于 2023-03-21
主机开发模式“由硬变软”,全球汽车芯片巨头正布局软件<font color='red'>定义</font>汽车

推荐帖子

用SD储存卡读写单片机
我现在想用DS卡读写单片机,但是我不知道怎么开始,不知道卡座什么要不要的,需要哪些硬件啊用SD储存卡读写单片机
ylf175300 51单片机
TA75074 求助
各位工程师: 请问TA75074可以用2个upc4558d替换吗,谢谢TA75074求助
sfg1988 模拟电子
MSP430F149测电源电压
请问有谁知道如何用MSP430F149来测自身的供电电压啊?紧急求助,谢谢!MSP430F149测电源电压
472283165 微控制器 MCU
C中使用汇编访问寄存器结构体
在CCS下,使用的C文件中嵌入汇编语言,在访问寄存器结构体时提示没有定义。如: asm("MOVACC,@_AdcResult.ADCRESULT0<<12"); 编译时提示:Thefollowingsymbolsareundefined: 2AssemblyErrors,NoAssemblyWarnings ADCRESULT0 这是什么原因?怎么解决呢?------不使用绝对地址访问C中使用汇编访问寄存器结构体
dontium 微控制器 MCU
以HID的SETREPORT为例说明如何使用STM32的USB库支持控制端点0
首先我们先回顾一下控制端点的传输方式:控制端点的传输有三个阶段,SETUP阶段、数据阶段和状态阶段;数据阶段又分为数据入(DATAIN)和数据出(DATAOUT),控制端点传输可以没有数据阶段;状态阶段有状态入(STATUSIN)和状态出(STATUSOUT)。总结起来,控制端点有如下三种可能的传输过程(以下括号中的0或1表示DATA0或DATA1传输):一、SETUPDATA_IN(0)DATA_IN(1)DATA_IN(0)......STATUS_OUT(1)二、SETUPDATA_
chnyuan stm32/stm8
逻辑信号
请问取一次反和取多次反有啥区别看到一个机器逻辑芯片是多次对信号取反不明白。 逻辑信号
tangwei8802429 模拟电子
小广播
设计资源 培训 开发板 精华推荐

何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2023 EEWORLD.com.cn, Inc. All rights reserved