我用的开发平台是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();就是读这个地址开始往后四个字节(单精度浮点型)的数据