AVR的pgm_read_byte

发布者:平安幸福最新更新时间:2017-11-22 来源: eefocus关键字:AVR  pgm_read_byte 手机看文章 扫描二维码
随时随地手机看文章

刚刚从ICC过渡到GCC,鉴于GCC使用的标准的C语言,在编译器编译优化以及语法定义中要求变的“苛刻”了,遇到一些问题,但很快解决了,很高兴啊,以后就GCC了!

以往在ICC中把大容量的数组(例如图片数据image[ ])放到flash中去,在使用读出是可以直接使用image[ ]来访问flash空间,感觉使用很方便。结果直接移植ICC的程序到GCC中时遇阻了,经查阅资料和研读GCC带的手册发现,

GCCAVR(AVR Studio)数据存储在程序存储器(flash)空间的定义

(1)flash常量:

#include //须增加的头文件

const prog_uchar FlashConst = 3; //定义uchar型的常量n定义在flash里(flash常量)

unsigned char RamVar; //定义无符号整型变量(Ram变量)

RamVar = pgm_read_byte(&FlashConst); //读取flash常量到ram变量

(2)flash一维数据:

#include

const prog_uchar s[5] = { 1, 2, 3, 4, 5 };

unsigned char RamVar; //定义无符号整型变量(Ram变量)

RamVar = pgm_read_byte( &s[1] ); //读取s[1]的值到RamVar, or RamVar = pgm_read_byte( s+1 );

(3)flash多维数据:

#include

const prog_uchar s[4][16] = { {14, 4,13, 1, 2,15,11, 8, 3,10, 6,12, 5, 9, 0, 7 },
{ 0,15, 7, 4,14, 2,13, 1,10, 6,12,11, 9, 5, 3, 8 },
{ 4, 1,14, 8,13, 6, 2,11,15,12, 9, 7, 3,10, 5, 0 },
{15,12, 8, 2, 4, 9, 1, 7, 5,11, 3,14,10, 0, 6,13 }
};

unsigned char RamVar[4],[16]; //定义无符号整型变量(Ram变量)

register char i, j;

for(i=0; i<4; ++)

{

for(j=0; j<16; j++)

{

RamVar[i][j] = pgm_read_byte( &s[i][j] ); //读取数组s的值到RamVar

}//end for 2

}//end for 1

(4)扩展部分

avr对ram和flash是独立编址的,ram是按8位编址,而flash却按16位编址,读ram和读flash的汇编指令也是不同的。

类似flash数据类型还有:prog_void 、prog_char 、prog_int8_t、prog_uint8_t、prog_int16_t、prog_uint16_t、prog_int32_t、prog_uint32_t等。

读取指令pgm_read_xxx宏定义其实就是一段包括了flash读取指令的内联汇编代码。函数原型为:pgm_read_byte(address_short)、pgm_read_word(address_short)、pgm_read_dword(address_short)、pgm_read_float(address_short)。括号中是地址值。


关键字:AVR  pgm_read_byte 引用地址: AVR的pgm_read_byte

上一篇:AVR单片机寄存器DDR,PORT和PIN之间对应关系
下一篇:AVR的uart串口通信程序

推荐阅读最新更新时间:2024-03-16 15:46

AVR基础知识:ATMEGA的SPI总线 - 第1部分
当AVR与其他器件进行数据交互时,我们需要选择采用哪种方式。这里可以使用UART、I2C等经典的串口方式,也可以选择串行外设接口(SPI)。我比较喜欢SPI总线方式。那么让我们来聊一聊这种总线形式。 关系 在SPI中的一个重要的概念就是主从关系。一个设备作为主机,负责产生时钟信号并启动每次通信。除了时钟之外,其他设备在很多方面都像主机一样操作,而且只有在被呼叫时才会回应。 一般情况下,SPI总线至少由四条线组成 - 也就是说,它需要每个器件的四个引脚。 他们是: ● MOSI:主机输出,从机输入 - 数据从主机传输到从机。 ● MISO:主机输入,从机输出 - 用于从从机到主机的数据传输。 ● SCK:时钟线,
[单片机]
<font color='red'>AVR</font>基础知识:ATMEGA的SPI总线 - 第1部分
AVR单片机硬件线路的设计步骤及方法
基本的AVR硬件线路,包括以下几部分: 1、复位线路 2、晶振线路 3、AD转换滤波线路 4、ISP下载接口 5、JTAG仿真接口 6、电源 下面以本网站推荐的AVR入门芯片ATmega16L-8AI 分析上述基本线路。(-8AI表示8M频率的TQFP贴片封装,工业级,更详细的型号含义资料,请参考:AVR芯片入门知识) 复位线路的设计 Mega16已经内置了上电复位设计。并且在熔丝位里,可以控制复位时的额外时间,故AVR外部的复位线路在上电时,可以设计得很简单:直接拉一只10K的电阻到VCC即可(R0)。 为了可靠,再加上一只0.1uF的电容(C0)以消除干扰、杂波。 D3(1N4148)的作用有两个:作用一是将复
[单片机]
<font color='red'>AVR</font>单片机硬件线路的设计步骤及方法
AVR单片机的T0使用
本文介绍ATmega 16 单片机的T0使用 M16中的T0是8位定时器/计数器 以下内容摘至ATmega 16 Datasheet 注意,使用前要将OC0设置输出,上拉电阻 使用CTC方式产生38K方波。红外常用的 void timer0_init(void) //CTC模式输出38KHz方波,用于红外检测 { OCR0 = 11; //设定TOP值 //TOP=7372800/(2*8*38000)-1=11 选11 38.397KHz(13uS) TCCR0 = (1 WGM01)|(0 WGM00)|(0 COM01)|(1 COM00)|(0 CS02)|(1 CS01)|(0 CS00); //
[单片机]
<font color='red'>AVR</font>单片机的T0使用
事无巨细,GCC AVR入门详解
简介:乘着Cepark电子园正在搞AVR单片机开发板优惠活动,花160块钱买了他们提供的散件。近日终于收到了,虽然是散件,自己焊的也很难看,但好歹能用,足够我折腾好些日子了。希望接下去的短短日子里,能小有收获,即便是最简单的东西也希望跟大家分享。 这是第一篇,我说说AVR的集成开发环境。也就是常说的IDE(Integrated Development Environment)。图片比较多,虽然用软件处理过体积,网页可能还是比较慢,还请见谅。 现今世界上的AVR开发环境可以说是百花齐放了,互相当然各有长短,我们看看都有哪些: 首当其冲的应该还是IAR,为什么呢,因为当初AVR还在ATMEL胎中酝酿的时候,IAR公司参与了AVR的
[单片机]
AVR单片机的熔丝应该如何设置
初学者对熔丝经常不解,AVR芯片使用熔丝来设定时钟、启动时间、一些功能的使能、BOOT区设定、当然还有最让初学者头疼的保密位,设不好锁了芯片很麻烦。要想使MCU功耗最小也要了解一些位的设定。 1:未编程 0:编程 1、BOD(Brown-out Detection) 掉电检测电路 BODLEVEL(BOD电平选择): 1: 2.7V电平; 0:4.0V电平 BODEN(BOD功能控制): 1:BOD功能禁止;0:BOD功能允许 使用方法:如果BODEN使能(复选框选中)启动掉电检测,则检测电平由BODLEVEL决定。一旦VCC下降到触发电平(2.7v或4.0v)以下,MCU复位;当VCC电平大于触发电平后,经过tTOUT 延时
[单片机]
<font color='red'>AVR</font>单片机的熔丝应该如何设置
Linglong之AVR程例1 点亮一个LED
原理图用我上一次发的最小系统图。 PA口接8个LED.LED阴极接地。 这里我用的WINAVR。。。。也就是GCC。。。很有名的一个软件。 看程序: #include avr/io.h //io端口寄存器配置文件,必须包含 //#include util/delay.h int main(void) //GCC中main文件必须为返回整形值的函数,没有参数 { DDRA = 0xff; //设制PA口都为输出 while(1) { PORTA = 0x01; //点亮第一个LED } }
[单片机]
BASCOM-AVR版调光演示程序
rem Main.bas file generated by New Project wizard rem Created: 周五 8月 30 2019 TAOTIE rem Processor: ATmega16 rem Compiler: BASCOM-AVR rem BASCOM-AVR版调光程序由Proteus 8 .8 中 Arduino Dimming 230V AC例程修改而来 rem 示波器观察220V交流波形与同步过零信号交叉位置。触发可控硅信号时上升沿的位置 $regfile = m16def.dat $crystal = 8000000
[单片机]
BASCOM-<font color='red'>AVR</font>版调光演示程序
基于AVR单片机和GPRS的矿区铁路道口监测系统
1 引言   矿区铁路是衔接国家铁路与矿区的中间环节,是铁路运输网的重要组成部分。据有关资料统计,目前国内矿区铁路超过2万公里且其沿线附近通常分布着多个道口。由于道口大多分布在远离市区的矿山企业内部,并且其数量多、分散以及道口之间的距离长,加上矿区内各种运输工具的交叉作业及车辆、人员的不固定的流动,使矿区铁路道口的安全管理成为十分突出的问题。为使各级矿区管理部门能及时、准确掌握各个道口的的安全情况,本文以 Atmega128和MC55为核心,设计一套铁路道口监测系统,实现对铁路道口监测管理的自动化、数字化和网络化。这对保证矿区正常生产、提高矿山企业经济效益和通过道口车辆、行人安全具有重要意义。   2 系统组成   整
[单片机]
基于<font color='red'>AVR</font>单片机和GPRS的矿区铁路道口监测系统
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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