打印
[学习资料]

Microchip Studio 7.0项目移植

[复制链接]
1203|79
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
IO, ic, ip
从ICC AVR移植到Microchip Studio 7.0要完成以下六方面的移植工作。

            1、MCU头文件的移植。

            2、宏定义macros.h的移植。

            3、延时函数移植。

            4、中断函数的移植。

            5、EEPROM操作函数的移植。

            6、数据在flash区的移植。

使用特权

评论回复
沙发
漫天星yl|  楼主 | 2022-5-31 13:41 | 只看该作者
一、MCU 头文件移植

        1、在ICC AVR,不同的MCU需要包含不同的头文件。

               例如:MCU为ATMEGA128,需要包含  #include <iom128v.h>

                          MCU为ATMEGA16, 需要包含  #include <iom16v.h>

使用特权

评论回复
板凳
漫天星yl|  楼主 | 2022-5-31 13:43 | 只看该作者
2、在Microchip Studio 7.0,所有MCU的头文件都只需要包含 “#include <avr/io.h>” 即可。
#include <avr/io.h>

使用特权

评论回复
地板
漫天星yl|  楼主 | 2022-5-31 13:45 | 只看该作者
二、宏定义头文件<macros.h>的移植

        1、在ICC AVR中,头文件<macros.h>包含了#include<AVRdef.h〉,在AVRdef.h中,宏定义了一些常用的汇编指令和一些不常用的函数,参见下面:

使用特权

评论回复
5
漫天星yl|  楼主 | 2022-5-31 13:46 | 只看该作者
  #define WDR()  asm("wdr")
         #define SEI()     asm("sei")
         #define CLI()     asm("cli")
         #define NOP()  asm("nop")
         #define SLEEP()asm("sleep");
         #define_WDR)    asm("wdr")
         #defineSEI()      asm("sei")
         #define CLI()     asm("cli")
         #define NOP()  asm("nop")
         #define_SLEEP()asm("sleep");
         #define BIT(x)  (1<<(x));

使用特权

评论回复
6
漫天星yl|  楼主 | 2022-5-31 13:48 | 只看该作者
2、在Microchip Studio 7.0中,你就不能直接使用WDR(),SEI(), NOP()啦!因为ICCAVR常包含的文件 #include <macros.h> 和#include<AVRdef.h〉,在Microchip Studio 7.0里面是没有的。

使用特权

评论回复
7
漫天星yl|  楼主 | 2022-5-31 13:49 | 只看该作者
3、在Microchip Studio 7.0中,你可以先在文件中添加  #include <avr/io.h>,然后直接使用 asm("wdr"),asm("sei"),asm("nop")。

使用特权

评论回复
8
漫天星yl|  楼主 | 2022-5-31 13:49 | 只看该作者
4、在Microchip Studio 7.0中,使用asm("sei")上述做法比较麻烦。

        我的做法是将这些宏命令添加到一个总的头文件(include.h)中,所有c文件都引用include.h,那么在移植过程中,就不需要修改这方面的代码。

使用特权

评论回复
9
漫天星yl|  楼主 | 2022-5-31 13:53 | 只看该作者
#ifndef __include__
#define  __include__

/// include.h      

         #define WDR()  asm("wdr")
         #define SEI()     asm("sei")
         #define CLI()     asm("cli")
         #define NOP()  asm("nop")
         #define SLEEP()asm("sleep");
         #define_WDR)    asm("wdr")
         #defineSEI()      asm("sei")
         #define CLI()     asm("cli")
         #define NOP()  asm("nop")
         #define_SLEEP()asm("sleep");
         #define BIT(x)  (1<<(x));
#endif

使用特权

评论回复
10
漫天星yl|  楼主 | 2022-5-31 13:54 | 只看该作者
三、 延时函数

        1、在ICC AVR中,delay延时函数,需要自己写,往往不准。

使用特权

评论回复
11
漫天星yl|  楼主 | 2022-5-31 13:55 | 只看该作者
2、在Microchip Studio 7.0中,只需要加载一个头文件 #include <util/delay.h>,就可以使用两个标准的延时函数,分别是

使用特权

评论回复
12
漫天星yl|  楼主 | 2022-5-31 13:55 | 只看该作者
  _delay_ms(double__ms)

            _delay_us(double __us),

使用特权

评论回复
13
漫天星yl|  楼主 | 2022-5-31 14:19 | 只看该作者
两个函数的参数均为double型的,通常使用整数延时即可。

        比较讨厌一点是,这两个延时函数是基于1MHz的晶振频率,所赋给延时函数的参数值需乘以你所用的晶振频率。

        例如你用14.7456MHz的晶振,延时10ms的函数为_delay_ms(10*14.7456)。我的选择是直接去修改util/delay.h,加入宏定义#define F_CPU 14.7456E6,这样延时10ms的函数写为_delay_ms(10)。这两种方法各有利弊,自己选择。

使用特权

评论回复
14
漫天星yl|  楼主 | 2022-5-31 14:42 | 只看该作者
四、中断函数

        1、例如 T0 溢出中断,在 ICC AVR 中如下定义:
#pragma interrupt_handler timer0_ovf_isr:iv_TIMER0_OVF
void timer0_ovf_isr( void)
{…}

使用特权

评论回复
15
漫天星yl|  楼主 | 2022-5-31 14:53 | 只看该作者
    timer0_ovf_isr 这个函数名是自定义的。

使用特权

评论回复
16
漫天星yl|  楼主 | 2022-5-31 14:54 | 只看该作者
2、在Microchip Studio 7.0中,首先需加载头文件#include <avr/interrupt.h>,并且函数名为ISR,且中断函数名不可自定义,格式如下:


    ISR( TIMER0_OVF_vect )

    {…}
    TIMER0_OVF_vect 含义同iv_TIMER0_OVF ,是T0溢出中断号。

使用特权

评论回复
17
漫天星yl|  楼主 | 2022-5-31 14:55 | 只看该作者
不同型号mcu的中断向量号的名称不同,AS的中断向量号请从avr/iomXXX.h中查找。

使用特权

评论回复
18
漫天星yl|  楼主 | 2022-5-31 14:55 | 只看该作者
   例如:atmega128单片机,中断号的名称可以在iom128.h文件中查找,Microchip Studio 7.0的iom128.h文件的路径如下:

使用特权

评论回复
19
漫天星yl|  楼主 | 2022-5-31 14:57 | 只看该作者
 C:\Program Files (x86)\Atmel\Studio\7.0\packs\atmel\ATmega_DFP\1.6.364\include\avr

使用特权

评论回复
20
漫天星yl|  楼主 | 2022-5-31 14:57 | 只看该作者

使用特权

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

本版积分规则

30

主题

346

帖子

0

粉丝