IAR中断定义 #pragma vector

来源:互联网 发布:java seversocket 编辑:程序博客网 时间:2024/05/29 19:00

IAR for AVR 学习笔记1--中断定义

单片机
在AVR编程一直是C,从ICC->GCC->IAR IAR是一个唯一自己选择的.ICC由于入门容易所以选择了开始,GCC因为不要钱,所以后来就用了它.随着对GCC的不断认识,缺点不断显露,开始对IAR产生了兴趣.
    IAR在51,AVR,ARM的C上都是非常优秀的,它针对不同的单片机都有不同的C版本.唯一一点遗憾的是IAR的价格是个人和小公司难以承受的.当然网上有很多破解,现在的最新版4.20A也有了破解.
    IAR FOR AVR相关信息:
  • 网站:www.iar.com
  • 4.20A下载地址:http://www.mcu123.com/down/view.asp?id=57
  • 破解方法:ID号注意一定要大写,不然注册将会失败 ,另外并不是每个号都是能用的了,要多试几次.如果注册成功后,编译就会通过.不然就报"没有可的证书"错误.
注意点:
  • 如何输出HEX文件?
在配置文件后面加入以下代码,便可输出HEX文件,A90文件与HEX文件一样,SLISP都能识别.
// Output File  
-Ointel-extended,(XDATA)=.eep  //产生eeprom文件  
-Ointel-extended,(CODE)=.A90   //产生烧写文件  
-Ointel-extended,(CODE)=.hex   //产生烧写文件 
  • 中断向量的使用
IAR中定义中断函数的格式是 
///////////////////////////////// 
#pragma vector=中断[url=]向量[/url] 
__interrupt void 中断服务程序(void) 

//中断处理程序 

///////////////////////////////////// 
中断的初始化要另外加入代码,可在[url=]主程序[/url]内加入。如下是各个中断函数的定义。 
//中断定义  
#include <iom16.h> 
  • #pragma vector=INT0_vect 
    __interrupt void INT0_Server(void) 


    #pragma vector=INT1_vect 
    __interrupt void INT1_Server(void) 


    #pragma vector=TIMER2_COMP_vect 
    __interrupt void TIMER2_COMP_Server(void) 


    #pragma vector=TIMER2_OVF_vect 
    __interrupt void TIMER2_OVF_Server(void) 


    #pragma vector=TIMER1_CAPT_vect  
    __interrupt void TIMER1_CAPT_Server(void) 


    #pragma vector=TIMER1_COMPA_vect 
    __interrupt void TIMER1_COMPA_Server(void) 


    #pragma vector=TIMER1_COMPB_vect 
    __interrupt void TIMER1_COMPB_Server(void) 


    #pragma vector=TIMER1_OVF_vect 
    __interrupt   void TIMER1_OVF_Server(void) 


    #pragma vector=TIMER0_OVF_vect 
    __interrupt   void TIMER0_OVF_Server(void) 


    #pragma vector=SPI_STC_vect 
    __interrupt   void SPI_STC_Server(void) 


    #pragma vector=USART_RXC_vect 
    __interrupt   void USART_RXC_Server(void) 


    #pragma vector=USART_UDRE_vect 
    __interrupt   void USART_UDRE_Server(void) 


    #pragma vector=USART_TXC_vect 
    __interrupt   void USART_TXC_Server(void) 


    #pragma vector=ADC_vect 
    __interrupt void ADC_Server(void) 


    #pragma vector=EE_RDY_vect 
    __interrupt void EE_RDY_Server(void) 


    #pragma vector=ANA_COMP_vect 
    __interrupt void ANA_COMP_Server(void) 


    #pragma vector=TWI_vect 
    __interrupt void TWI_Server(void) 


    #pragma vector=INT2_vect 
    __interrupt void INT2_Server(void) 


    #pragma vector=TIMER0_COMP_vect 
    __interrupt void TIMER0_COMP_Server(void) 


    #pragma vector=SPM_RDY_vect 
    __interrupt void SPM_RDY_Server(void) 

    }
  • 如何把常数字符串定义在flash 空间?
法一:unsigned char __flash temptab[] = {1,2,3,4,5};  
法二:__flash unsigned char temptab[] = {1,2,3,4,5}; 
法三:#pragma type_attribute=__flash  
      unsigned char temptab[]={1,2,3,4,5}; 
法四:const unsigned char temptab[]={1,2,3,4,5};  
注:第三种方式用#pragma说明后,下面的定义的变量将都在FLASH空间了,用于定义一批FLASH变量,但实际上一般只能作为[url=]常量[/url]使用了.
(本人将陆续推出关于IAR for AVR的学习心得,希望大家多多支持!)

 

IAR #pragma vector

分类: MSP430 15人阅读 评论(0) 收藏 举报

        在IAR编译器里用关键字来__interrupt来定义一个中断函数。用#pragma vector来提供中断函数的入口地址。


#pragma vector = 0x12    //定时器0溢出中断入口地址
__interrupt void time0(void)
{
 ;
}
    上面的入口地址写成#pragma vector=TIMER0_OVF_vect更直观,每种中断的入口地址在头文件里有描述。函数名称time0可以为任意名称。中断函数会自动保护局部变量,但不会保护全局变量。

1 .内在函数也可以称为本征函数
        编译器自己编写的能够直接访问处理器底层特征的函数。在intrinsics.h中有描述完整类型在comp_a90.h里有进一步的简化书写方式

延时函数,以周期为标准
        __delay_cycles(unsigned long );
        如果处理器频率为1M,延时100us,如下:
        __delay_cycles(100 );
        当然你也可以对该函数进行修改:
        #define CPU_F 1000000
        #define delay_us (unsigned long) __delay_cycles((unsigned long )*CPU_F)
        #define delay_ms (unsigned long) __delay_cycles((unsigned long )*CPU_F/1000)

2.中断指令
   __disable_interrupt( );//插入CLI指令, 也可以用_CLI();也可以SREG_Bit7=0;
    __enable_interrupt( );// 插入SEI指令,也可以用_SEI();也可以SREG_Bit7=1;
    其实对于状态字的置位和清零只有BSET S 和BCLR S两条指令。像SEI不过是BSET 7;的另一个名字而已。AVR指令中还有很多类似的现象,如:ORI 和 SBR 指令完全一样,号称130多条指令的AVR其实没有那么多指令的。

3.从FLASH空间指定地址读取数据
__extended_load_program_memory(unsigned char __farflash *);
__load_program_memory(unsigned char __flash *);


4.乘法函数
__fracdtional_multiply_signed(signed char, signed char);
__fractional_multiply_signed_with_unsigned(signed char, unsigned char);
__fractional_multiply_unsigned(unsigned char, unsigned char);
//以上为定点小数乘法
__multiply_signed(signed char, signed char);//有符号数乘法
__multiply_signed_with_unsigned(signed char, unsigned char);
//有符号数和无符号数乘法
__multiply_unsigned(unsigned char, unsigned char);//无符号数乘法

 5.半字节交换指令
__swap_nibbles(unsigned char);

6.MCU控制指令
__no_operation();//空操作指令
_NOP();
__sleep();//休眠指令
_SLEEP();
__watchdog_reset();//看门狗清零
_WDR();