700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > GCC AVR(Atmel Studio+ AVR Studio)在程序存储器(flash)空间存放常量或者常量数组

GCC AVR(Atmel Studio+ AVR Studio)在程序存储器(flash)空间存放常量或者常量数组

时间:2022-09-19 19:42:06

相关推荐

GCC AVR(Atmel Studio+ AVR Studio)在程序存储器(flash)空间存放常量或者常量数组

我用的开发平台是AVR Studio4.19 + avr-toolchain-installer-3.3.0.710-win32.win32.x86

一、avr-toolchain-installer-3.3.0.710-win32.win32.x86的下载链接:

avr-toolchain-installer-3.3.0.710-win32.win32.x86

二、要将变量定义到flash,必须包含头文件:#include <avr/pgmspace.h>

#include <avr/pgmspace.h>

三、从flash读取常量

1、在flash定义常量

// 一定要添加这行代码喔! #include <avr/pgmspace.h>PROGMEM const unsigned char x=1;

通过上面1行代码,我们就在flash里面写入了一个名字为x的无符号字符型的常量,然后这个常量里面的数值是1。 这个常量里面的数值是可以自行给定,比如x=2,x=3等等,最大给到255,因为我们定义了无符号字符型。当然 我们也可以定义整数型,长整型等等。

2、读取flash定义的常量

// 一定要添加这行代码喔! #include <avr/pgmspace.h>PROGMEM const unsigned char x=1;//把数据放到flashunsigned char a;//定义一个变量a = pgm_read_byte(&x);//取出flash里面的数据到变量aPORTA = a;//把flash的数据给到PA口

四、从flash读取一维数组

1、在flash定义一维数组

// 一定要添加这行代码喔! #include <avr/pgmspace.h>PROGMEM const prog_uchar x[5] = { 1, 2, 3, 4, 5 };

通过这行代码,我们就在flash里面写入了一个名字为x的无符号字符型的一维数组,这个数组有5个成员,数组里面的数分别是1,2,3,4,5。

这个数组里面的数值是可以自行给定,x[5] = { 1, 1, 1, 1, 1 }等等,数组里的每个成员最大给到255,因为我们定义了无符号字符型。当然我们也可以定义整数型,长整型等等。

2、读取flash定义的一维数组

// 一定要添加这行代码喔! #include <avr/pgmspace.h>PROGMEM const prog_uchar x[5] = { 1, 2, 3, 4, 5 };//把数组放到flashunsigned char a;//定义一个变量a = pgm_read_byte(&x[0]);//取出flash里面的数据(数组的第0个成员)到变量aPORTA = a;//把flash的数据给到PA口

这四行代码我们可以得知怎么去使用我们一开始存放到flash的数组

五、从flash读取多维数组

1、在flash定义多维数组

// 一定要添加这行代码喔! #include <avr/pgmspace.h>PROGMEM const prog_uchar x[3][5] = {{ 1, 2, 3, 4, 5 },{ 1, 2, 3, 4, 5 },{ 1, 2, 3, 4, 5 }};

通过这行代码,我们就在flash里面写入了一个名字为x的无符号字符型的二维数组,这个数组有三行五列, 15个成员。

2、读取flash定义的多维数组

PROGMEM const prog_uchar x[3][5] = {{ 1, 2, 3, 4, 5 },{ 1, 2, 3, 4, 5 },{ 1, 2, 3, 4, 5 }};//把数组放到flashunsigned char a;//定义一个变量a = pgm_read_byte(&x[0][0]);//取出flash里面的数据(多维数组的第0个成员)到变量aPORTA = a;//把flash的数据给到PA口

这八行代码我们可以得知怎么去使用我们一开始存放到flash的多维数组。

六、扩展资料

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)。

括号中是地址值。

七、总结

我发现了存放数据到flash其实就跟平常定义变量差不多,只不过是前面多了一串代码:PROGMEM const;不管你存放是什么类型的常量,只需要在前面添加这一串就可以把常量放到flash里面。

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

pgm_read_word(address_short)、

pgm_read_dword(address_short)、

pgm_read_float(address_short)。

括号中是地址值。 其中Pgm_Read_Byte();就是读这个地址开始往后一个字节的数据 Pgm_read_word();就是读这个地址开始往后两个字节(一个字)的数据 Pgm_read_dword();就是读这个地址开始往后四个字节(一个双字)的数据 Pgm_read_float();就是读这个地址开始往后四个字节(单精度浮点型)的数据

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。