打印
[学习资料]

Microchip Studio 7.0项目移植

[复制链接]
楼主: 漫天星yl
手机看帖
扫描二维码
随时随地手机跟帖
21
漫天星yl|  楼主 | 2022-5-31 15:02 | 只看该作者 |只看大图 回帖奖励 |倒序浏览

使用特权

评论回复
22
漫天星yl|  楼主 | 2022-5-31 15:03 | 只看该作者
五、EEPROM操作函数

        1、在ICC AVR中加载头文件#include <eeprom.h>后,可以使用如下两个读写函数:
EEPROM_read(addr, var); //读EEPROM中的一个字节
EEPROM_write(addr, var); //向EEPROM中写入一个字节

使用特权

评论回复
23
漫天星yl|  楼主 | 2022-5-31 15:04 | 只看该作者
2、在Microchip Studio 7.0中,加载头文件#include <avr/eeprom.h>后,可以使用如下两个读写函数:
_EEGET(var, addr); //读EEPROM中的一个字节
_EEPUT(addr, var); //向EEPROM中写入一个字节

使用特权

评论回复
24
漫天星yl|  楼主 | 2022-5-31 15:05 | 只看该作者
    3、为了移植时不修改代码,我的做法是在总的头文件(include.h)中添加以下宏定义:

   #define EEPROM_read(addr, var) _EEGET(var, addr)
    #define EEPROM_write(addr, var) _EEPUT(addr, var)

使用特权

评论回复
25
漫天星yl|  楼主 | 2022-5-31 15:06 | 只看该作者
六、定义数据在flash区

        主要用于在字符点阵或图形点阵数据存放在flash区,这样可以减少data区的使用,不至于使data区溢出。
        1、在ICC AVR中,用const关键字定义变量,并在ICC软件设置项中,勾选treat "const" as
__flash即可。

使用特权

评论回复
26
漫天星yl|  楼主 | 2022-5-31 15:07 | 只看该作者
2、在Microchip Studio 7.0中,需加载头文件#include <avr/pgmspace.h>,并加入以下宏定义:  
#include <avr/pgmspace.h>

使用特权

评论回复
27
漫天星yl|  楼主 | 2022-5-31 15:07 | 只看该作者
1)、声明

                    声明时使用PROGMEM关键字

                    例如:声明字节常量
PROGMEM const unsigned char x=1;

使用特权

评论回复
28
漫天星yl|  楼主 | 2022-5-31 15:08 | 只看该作者
    例如:声明字节一维数组常量
PROGMEM const unsigned char x[5] = { 1, 2, 3, 4, 5 };

使用特权

评论回复
29
漫天星yl|  楼主 | 2022-5-31 15:09 | 只看该作者
例如:声明字节多维数组常量
PROGMEM const unsigned char x[3][5] = {
                        { 1, 2, 3, 4, 5 },
                        { 1, 2, 3, 4, 5 },
                        { 1, 2, 3, 4, 5 }
        };

使用特权

评论回复
30
漫天星yl|  楼主 | 2022-5-31 15:10 | 只看该作者
(2)、flash常量的读取

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

                     警告:一定要添加&。

使用特权

评论回复
31
漫天星yl|  楼主 | 2022-5-31 15:11 | 只看该作者
     例如:读取字节常量
PROGMEM const unsigned char x=1;//把数据放到flash
                unsigned char a;//定义一个变量
                a = pgm_read_byte(&x);//取出flash里面的数据到变量a

使用特权

评论回复
32
漫天星yl|  楼主 | 2022-5-31 15:11 | 只看该作者
          例如:读取字节一维数组常量


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

使用特权

评论回复
33
漫天星yl|  楼主 | 2022-5-31 15:13 | 只看该作者
      例如:读取字节多维数组常量
PROGMEM const unsigned char x[3][5] = {
{ 1, 2, 3, 4, 5 },
{ 1, 2, 3, 4, 5 },
{ 1, 2, 3, 4, 5 }};//把数组放到flash
               
unsigned char a;//定义一个变量
a = pgm_read_byte(&x[0][0]);//取出flash里面的数据(多维数组的第0个成员)到变量a

使用特权

评论回复
34
漫天星yl|  楼主 | 2022-5-31 15:14 | 只看该作者
七、变量优化问题

        ICCAVR运行的好好的,结果移植到Microchip Studio发现出了问题,原因是GCC编译器在函数中定义的变量,经常会被优化掉,导致参数传递不过去,此时只需在定义时添加volatile即可。

使用特权

评论回复
35
漫天星yl|  楼主 | 2022-5-31 15:15 | 只看该作者
警告:定义变量时,添加volatile关键字,即可防止编译器优化。

        例如:
uint8_t volatile USART1_sendPosi = 0;

使用特权

评论回复
36
漫天星yl|  楼主 | 2022-5-31 15:15 | 只看该作者
八、关于prog_uchar关键字

     网上很多人移植ICCAVR到Atmel Studio时,定义数据在flash区时使用了prog_uchar关键字,但是Microchip Studio 7.0已经废弃了prog_uchar关键字,如果使用,编译器会报错。

使用特权

评论回复
37
漫天星yl|  楼主 | 2022-5-31 15:16 | 只看该作者
Microchip Studio 7.0已经废弃了prog_uchar关键字,如果使用,编译器会报错。

使用特权

评论回复
38
漫天星yl|  楼主 | 2022-5-31 15:16 | 只看该作者
例如:假如我使用prog_uchar关键字在flash区定义一个常量。

使用特权

评论回复
39
漫天星yl|  楼主 | 2022-5-31 15:17 | 只看该作者
PROGMEM const prog_uchar x[5] = { 1, 2, 3, 4, 5 };

使用特权

评论回复
40
漫天星yl|  楼主 | 2022-5-31 15:17 | 只看该作者
结果编译后,系统报错,参见下图

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则