[学习资料] Microchip Studio 7.0项目移植

[复制链接]
 楼主| 漫天星yl 发表于 2022-5-31 15:02 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| 漫天星yl 发表于 2022-5-31 15:03 | 显示全部楼层
五、EEPROM操作函数

        1、在ICC AVR中加载头文件#include <eeprom.h>后,可以使用如下两个读写函数:
  1. EEPROM_read(addr, var); //读EEPROM中的一个字节
  2. EEPROM_write(addr, var); //向EEPROM中写入一个字节
 楼主| 漫天星yl 发表于 2022-5-31 15:04 | 显示全部楼层
2、在Microchip Studio 7.0中,加载头文件#include <avr/eeprom.h>后,可以使用如下两个读写函数:
  1. _EEGET(var, addr); //读EEPROM中的一个字节
  2. _EEPUT(addr, var); //向EEPROM中写入一个字节
 楼主| 漫天星yl 发表于 2022-5-31 15:05 | 显示全部楼层
    3、为了移植时不修改代码,我的做法是在总的头文件(include.h)中添加以下宏定义:

  1.    #define EEPROM_read(addr, var) _EEGET(var, addr)
  2.     #define EEPROM_write(addr, var) _EEPUT(addr, var)
 楼主| 漫天星yl 发表于 2022-5-31 15:06 | 显示全部楼层
六、定义数据在flash区

        主要用于在字符点阵或图形点阵数据存放在flash区,这样可以减少data区的使用,不至于使data区溢出。
        1、在ICC AVR中,用const关键字定义变量,并在ICC软件设置项中,勾选treat "const" as
__flash即可。
 楼主| 漫天星yl 发表于 2022-5-31 15:07 | 显示全部楼层
2、在Microchip Studio 7.0中,需加载头文件#include <avr/pgmspace.h>,并加入以下宏定义:  
  1. #include <avr/pgmspace.h>
 楼主| 漫天星yl 发表于 2022-5-31 15:07 | 显示全部楼层
1)、声明

                    声明时使用PROGMEM关键字

                    例如:声明字节常量
  1. PROGMEM const unsigned char x=1;
 楼主| 漫天星yl 发表于 2022-5-31 15:08 | 显示全部楼层
    例如:声明字节一维数组常量
  1. PROGMEM const unsigned char x[5] = { 1, 2, 3, 4, 5 };
 楼主| 漫天星yl 发表于 2022-5-31 15:09 | 显示全部楼层
例如:声明字节多维数组常量
  1. PROGMEM const unsigned char x[3][5] = {
  2.                         { 1, 2, 3, 4, 5 },
  3.                         { 1, 2, 3, 4, 5 },
  4.                         { 1, 2, 3, 4, 5 }
  5.         };
 楼主| 漫天星yl 发表于 2022-5-31 15:10 | 显示全部楼层
(2)、flash常量的读取

                    先在ram区定义一个变量,然后使用pgm_read_byte(&)或pgm_read_word(&)读取。其中:pgm_read_byte(&)用于读取字节常量,pgm_read_word(&)用于读取字常量。

                     警告:一定要添加&。
 楼主| 漫天星yl 发表于 2022-5-31 15:11 | 显示全部楼层
     例如:读取字节常量
  1. PROGMEM const unsigned char x=1;//把数据放到flash
  2.                 unsigned char a;//定义一个变量
  3.                 a = pgm_read_byte(&x);//取出flash里面的数据到变量a
 楼主| 漫天星yl 发表于 2022-5-31 15:11 | 显示全部楼层
          例如:读取字节一维数组常量


  1. PROGMEM const unsigned char x[5] = { 1, 2, 3, 4, 5 };//把数组放到flash
  2.                 unsigned char a;//定义一个变量
  3.                 a = pgm_read_byte(&x[0]);//取出flash里面的数据(数组的第0个成员)到变量a
 楼主| 漫天星yl 发表于 2022-5-31 15:13 | 显示全部楼层
      例如:读取字节多维数组常量
  1. PROGMEM const unsigned char x[3][5] = {
  2. { 1, 2, 3, 4, 5 },
  3. { 1, 2, 3, 4, 5 },
  4. { 1, 2, 3, 4, 5 }};//把数组放到flash
  5.                
  6. unsigned char a;//定义一个变量
  7. a = pgm_read_byte(&x[0][0]);//取出flash里面的数据(多维数组的第0个成员)到变量a
 楼主| 漫天星yl 发表于 2022-5-31 15:14 | 显示全部楼层
七、变量优化问题

        ICCAVR运行的好好的,结果移植到Microchip Studio发现出了问题,原因是GCC编译器在函数中定义的变量,经常会被优化掉,导致参数传递不过去,此时只需在定义时添加volatile即可。
 楼主| 漫天星yl 发表于 2022-5-31 15:15 | 显示全部楼层
警告:定义变量时,添加volatile关键字,即可防止编译器优化。

        例如:
  1. uint8_t volatile USART1_sendPosi = 0;
 楼主| 漫天星yl 发表于 2022-5-31 15:15 | 显示全部楼层
八、关于prog_uchar关键字

     网上很多人移植ICCAVR到Atmel Studio时,定义数据在flash区时使用了prog_uchar关键字,但是Microchip Studio 7.0已经废弃了prog_uchar关键字,如果使用,编译器会报错。
 楼主| 漫天星yl 发表于 2022-5-31 15:16 | 显示全部楼层
Microchip Studio 7.0已经废弃了prog_uchar关键字,如果使用,编译器会报错。
 楼主| 漫天星yl 发表于 2022-5-31 15:16 | 显示全部楼层
例如:假如我使用prog_uchar关键字在flash区定义一个常量。
 楼主| 漫天星yl 发表于 2022-5-31 15:17 | 显示全部楼层
  1. PROGMEM const prog_uchar x[5] = { 1, 2, 3, 4, 5 };
 楼主| 漫天星yl 发表于 2022-5-31 15:17 | 显示全部楼层
结果编译后,系统报错,参见下图

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部