IAR中断向量
IAR中断向量
IAR的工程建立比较简单,直接先建立工作区然后保存,不保存无法调试。
把官方的INC 放到工程目录下,在C/C++编辑连接包含这个文件的绝对路径(最简单的搞法)。
把c文件添加进去就可以了,它的中断很简单你只要写一个如下的.c文件就能用了:中断头文件: #include <intrinsics.h>开启全局中断:__enable_interrupt();关闭全局中断: __disable_interrupt();#pragma vector=1__interrupt void TRAP_IRQHandler(void){}#pragma vector=2__interrupt void TLI_IRQHandler(void){}#pragma vector=3__interrupt void AWU_IRQHandler(void){}#pragma vector=4__interrupt void CLK_IRQHandler(void){}#pragma vector=5__interrupt void EXTI_PORTA_IRQHandler(void){}#pragma vector=6__interrupt void EXTI_PORTB_IRQHandler(void){}#pragma vector=7__interrupt void EXTI_PORTC_IRQHandler(void){}#pragma vector=8__interrupt void EXTI_PORTD_IRQHandler(void){}#pragma vector=9__interrupt void EXTI_PORTE_IRQHandler(void){}#ifdef STM8S903#pragma vector=0xA__interrupt void EXTI_PORTF_IRQHandler(void){}#endif#ifdef STM8S208#pragma vector=0xA__interrupt void CAN_RX_IRQHandler(void){}#pragma vector=0xB__interrupt void CAN_TX_IRQHandler(void){}#endif#pragma vector=0xC__interrupt void SPI_IRQHandler(void){}#pragma vector=0xD__interrupt void TIM1_UPD_OVF_TRG_BRK_IRQHandler(void) {CleT1UPF;PDODR->bit3=(~PDODR->bit3);}#pragma vector=0xE__interrupt void TIM1_CAP_COM_IRQHandler(void){}#ifdef STM8S903#pragma vector=0xF__interrupt void TIM5_UPD_OVF_BRK_TRG_IRQHandler(void){}#pragma vector=0x10__interrupt void TIM5_CAP_COM_IRQHandler(void){}#else#pragma vector=0xF //定时器二中断地址__interrupt void TIM2_UPD_OVF_BRK_IRQHandler(void){}#pragma vector=0x10__interrupt void TIM2_CAP_COM_IRQHandler(void){}#endif#if defined (STM8S208) || defined(STM8S207) || defined(STM8S105) #pragma vector=0x11__interrupt void TIM3_UPD_OVF_BRK_IRQHandler(void){}#pragma vector=0x12__interrupt void TIM3_CAP_COM_IRQHandler(void){}#endif#ifndef STM8S105#pragma vector=0x13__interrupt void UART1_TX_IRQHandler(void){}#pragma vector=0x14__interrupt void UART1_RX_IRQHandler(void) {}#endif#pragma vector=0x15__interrupt void I2C_IRQHandler(void){}#ifdef STM8S105#pragma vector=0x16__interrupt void UART2_TX_IRQHandler(void) {}#pragma vector=0x17__interrupt void UART2_RX_IRQHandler(void) {}#endif#if defined(STM8S207) || defined(STM8S208) #pragma vector=0x16__interrupt void UART3_TX_IRQHandler(void) {}#pragma vector=0x17__interrupt void UART3_RX_IRQHandler(void) {}#endif#if defined(STM8S207) || defined(STM8S208) #pragma vector=0x18__interrupt void ADC2_IRQHandler(void){}#else#pragma vector=0x18__interrupt void ADC1_IRQHandler(void){}#endif#ifdef STM8S903#pragma vector=0x19__interrupt void TIM6_UPD_OVF_TRG_IRQHandler(void) {}#else#pragma vector=0x19__interrupt void TIM4_UPD_OVF_IRQHandler(void){}#endif#pragma vector=0x1A__interrupt void EEPROM_EEC_IRQHandler(void){}这里面的函数和51一样你可以放到任何文。
stm8笔记2-定时3更新中断+pwm输出(IDE为IAR)
stm8笔记2-定时3更新中断+pwm输出(IDE为IAR)⼀:IAR编译器中断函数说明下⾯说⼀下在IAR下,在IAR下必须要添加iostm8s105s6.h⽂件,在⽂件的最后有如下内容:/*-------------------------------------------------------------------------* Interrupt vector numbers*-----------------------------------------------------------------------*/#define AWU_vector 0x03#define SPI_TXE_vector 0x0C#define SPI_RXNE_vector 0x0C#define SPI_WKUP_vector 0x0C#define SPI_CRCERR_vector 0x0C#define SPI_OVR_vector 0x0C#define SPI_MODF_vector 0x0C#define TIM1_OVR_UIF_vector 0x0D#define TIM1_CAPCOM_BIF_vector 0x0D#define TIM1_CAPCOM_TIF_vector 0x0D#define TIM1_CAPCOM_CC1IF_vector 0x0E#define TIM1_CAPCOM_CC2IF_vector 0x0E#define TIM1_CAPCOM_CC3IF_vector 0x0E#define TIM1_CAPCOM_CC4IF_vector 0x0E#define TIM1_CAPCOM_COMIF_vector 0x0E#define TIM2_OVR_UIF_vector 0x0F#define TIM2_CAPCOM_CC1IF_vector 0x10#define TIM2_CAPCOM_TIF_vector 0x10#define TIM2_CAPCOM_CC2IF_vector 0x10#define TIM2_CAPCOM_CC3IF_vector 0x10#define UART1_T_TXE_vector 0x13#define UART1_T_TC_vector 0x13#define UART1_R_OR_vector 0x14#define UART1_R_RXNE_vector 0x14#define UART1_R_IDLE_vector 0x14#define UART1_R_PE_vector 0x14#define UART1_R_LBDF_vector 0x14#define I2C_ADD10_vector 0x15#define I2C_ADDR_vector 0x15#define I2C_OVR_vector 0x15#define I2C_STOPF_vector 0x15#define I2C_BTF_vector 0x15#define I2C_WUFH_vector 0x15#define I2C_RXNE_vector 0x15#define I2C_TXE_vector 0x15#define I2C_BERR_vector 0x15#define I2C_ARLO_vector 0x15#define I2C_AF_vector 0x15#define I2C_SB_vector 0x15#define ADC1_AWS0_vector 0x18#define ADC1_AWS1_vector 0x18#define ADC1_AWS2_vector 0x18#define ADC1_AWS3_vector 0x18#define ADC1_AWS4_vector 0x18#define ADC1_AWS5_vector 0x18#define ADC1_AWS6_vector 0x18#define ADC1_EOC_vector 0x18#define ADC1_AWS8_vector 0x18#define ADC1_AWS9_vector 0x18#define ADC1_AWDG_vector 0x18#define ADC1_AWS7_vector 0x18#define TIM4_OVR_UIF_vector 0x19#define FLASH_EOP_vector 0x1A#define FLASH_WR_PG_DIS_vector 0x1A对照中断向量表,如果⽤到中断,必须⾃⼰写中断,⽐如TIM3定时器中断#pragma vector=TIM3_OVR_UIF_vector__interrupt void TIM3_UPD_OVF_IRQHandler (void){TIM3_SR = 0X00;//清除中断标志}⽤关键字#pragma vector=指出本中断处理函数指向的中断号,⽤关键字__interrupt作为函数的前缀,表⽰这是中断处理函数。
原创--IAR for AVR入门学习笔记
原创--IAR for A VR入门学习笔记A VR单片机的编译软件五花八门,用宋丹丹的话就是:那是相当的多汇编语言的开发平台就不说了(俺不大会,呵呵,说不出什么道道来)。
简单列举几个高级语言的开发平台:WINA VR(GNU GCC A VR);ICC A VRCodeVison A VRIAR for A VRBASIC A VRFastA VRBASCOM其中用得最多的是完全免费的WINA VR。
我一直都是用的这个。
最专业,最好的,对AVR支持最全面的是IAR。
但同时IAR也是最贵的一款开发软件(听说升级也要收费,真黑啊)。
呵呵,不过不怕,我们可以破解之。
下面就详细介绍如何破解IAR。
这里安装破解的是5.11B版本的。
全名IAREmbeddedWorkbenchforAtmelAVR,v.5.11B1、先到网上下载5.11B文件,大概133M。
解压后,有如下文件:a1.jpg (29.87 KB)2009-12-20 00:282、到网上下载破解文件解压后生成文件Keygen包,将它复制到C盘根目录下,如下图a2.jpg (63.75 KB)2009-12-20 00:283、打开文件包keygen,双击文件IARID.exe,出现本电脑ID号,如图,记下来a3.jpg (42.68 KB)2009-12-20 00:284、从电脑的“程序---运行”输入“CMD”回车,按照下图操作,得到sn.txt文件;注意输入计算机ID号的时候,所有字符全部大写,包括"0X"中的"X"也要大写,a4.jpg (161.06 KB)2009-12-20 00:285、然后运行安装文件中的autorun.exe,开始安装IAR,当出现要求输入注册号的时候,请用记事本打开刚刚生成的sn.txt 文件,找到"EW A VR" version "2.25_WIN"对应的号码段,先输入序列号,NEXT后,再复制key:后面的一串字符,注意只复制#之前的那一部分,包括#也要复制。
中断向量号(Interruptvectornumber)
中断向量号(Interrupt vector number)/ * * * * * * * * * * * * * * * * interrupt vector numbers * * * * * * * * * * * * * * * * /# defines vectornumber _ VSI 119u / spurious interrupt# defines vectornumber _ vsyscall 118u / system call interrupt (sys)# defines vectornumber _ vreserved118 117u# defines vectornumber _ vreserved117 116u# defines vectornumber _ vreserved116 115u# defines vectornumber _ vreserved115 114u# defines vectornumber _ vreserved114 113u# defines vectornumber _ vreserved113 112u# defines vectornumber _ vreserved112 111u# defines vectornumber _ vreserved111 110u# defines vectornumber _ vreserved110 109u# defines vectornumber _ vreserved109 108u# defines vectornumber _ vreserved108 107u# defines vectornumber _ vreserved106 105u# defines vectornumber _ vreserved105 104u# defines vectornumber _ vreserved104 103u# defines vectornumber _ vreserved103 102u# defines vectornumber _ vreserved102 101u# defines vectornumber _ vreserved101 100u# defines vectornumber _ vreserved100 99u# defines vectornumber _ vreserved99 98u# defines vectornumber _ vreserved98 97u# defines vectornumber _ vatd0compare 96u / ATD compare interrupt# defines vectornumber _ vreserved96 95u# defines vectornumber _ vreserved95 94u# defines vectornumber _ vreserved94 93u# defines vectornumber _ vreserved93 92U# defines vectornumber _ vreserved91 90u # defines vectornumber _ vreserved90 89u # defines vectornumber _ vreserved89 88u # defines vectornumber _ vreserved88 87u # defines vectornumber _ vreserved87 86u # defines vectornumber _ vreserved86 85u # defines vectornumber _ vreserved85 84u # defines vectornumber _ vreserved84 83u # defines vectornumber _ vreserved83 82u # defines vectornumber _ vreserved82 81u # defines vectornumber _ vreserved81 80u # defines vectornumber _ vreserved79 79u # defines vectornumber _ vreserved78 78u # defines vectornumber _ vreserved77 77u # defines vectornumber _ vreserved76 76u# defines vectornumber _ vreserved75 75u# defines vectornumber _ vreserved74 74U# defines vectornumber _ vreserved73 73u# defines vectornumber _ vreserved72 72u# defines vectornumber _ vreserved71 71u# defines vectornumber _ vreserved70 70u# defines vectornumber _ vpit3 69u / periodic interrupt timer 3 (pit3)#定义vectornumber_vpit2 68u /定时器周期中断2(pit2)#定义vectornumber_vpit1 67u /定时器周期中断1(PIT1)#定义vectornumber_vpit0 66u /定时器周期中断0(pit0)#定义vectornumber_vhti 65u /高温中断(HTI)#定义vectornumber_vapi 64u /自治周期中断(API)#定义vectornumber_vlvi 63u /低压中断(LVI)#定义vectornumber_vreserved62 62u#定义vectornumber_vreserved61 61u#定义vectornumber_vreserved60 60u#定义vectornumber_vreserved59 59u#定义vectornumber_vreserved58 58u#定义vectornumber_vpwmesdn 57u / PWM急救关机(pwmesdn)#定义vectornumber_vportp 56u /端口P#定义vectornumber_vreserved55 55u#定义vectornumber_vreserved54 54u#定义vectornumber_vreserved53 53u#定义vectornumber_vreserved52 52u#定义vectornumber_vreserved51 51u#定义vectornumber_vreserved50 50u#定义vectornumber_vreserved49 49u#定义vectornumber_vreserved48 48u#定义vectornumber_vreserved47 47u#定义vectornumber_vreserved46 46u#定义vectornumber_vreserved45 45u#定义vectornumber_vreserved44 44u#定义vectornumber_vreserved43 43u#定义vectornumber_vreserved42 42u#定义vectornumber_vreserved41 41u#定义vectornumber_vreserved40 40u#定义vectornumber_vcan0tx 39u /发送中断#定义vectornumber_vcan0rx 38u /接收中断#定义vectornumber_vcan0err 37u /错误中断#定义vectornumber_vcan0wkup 36u /唤醒中断#定义vectornumber_vflash 35u /命令操作完成fcnfg(CCIE)#定义vectornumber_vflashfd 34u /命令操作检测到闪存故障检测#定义vectornumber_vreserved33 33u#定义vectornumber_vreserved32 32u#定义vectornumber_vreserved31 31u#定义vectornumber_vreserved30 30u#定义vectornumber_vcrgscm 29u /单片机中断CRG自时钟模式#定义vectornumber_vcrgplllck 28 U / /锁中断CRG PLL锁#定义vectornumber_vreserved27 27u#定义vectornumber_vreserved26 26u#定义vectornumber_vporth 25u/h /端口#定义vectornumber_vportj 24u /端口J#定义vectornumber_vreserved23 23u#定义vectornumber_vatd0 22u / ATD序列完全中断atd0ctl2(美国信息交换标准代码)#定义vectornumber_vsci1 21u /串行通信接口sci1cr2(领带,TCIE、反应离子刻蚀、伊利耶)#定义vectornumber_vsci0 20u / / / /串行通信接口sci0cr2(领带,TCIE、反应离子刻蚀、伊利耶)#定义vectornumber_vspi0 19u /串行外设接口spi0cr1(SPIE,sptie)#定义vectornumber_vtimpaie 18u /脉冲累加器输入中断#定义vectornumber_vtimpaaovf 17u /脉冲累加器的溢出中断#定义vectornumber_vtimovf 16u /定时器溢出中断#定义vectornumber_vtimch7 15u#定义vectornumber_vtimch6 14u#定义vectornumber_vtimch5 13u#定义vectornumber_vtimch4 12u#定义vectornumber_vtimch3 11u#定义vectornumber_vtimch2 10u#定义vectornumber_vtimch1 9u#定义vectornumber_vtimch0 8u /通道[7:0]中断#定义vectornumber_vrti 7u /实时中断(RTI)#定义vectornumber_virq 6u / IRQ#定义vectornumber_vxirq 5u / XIRQ#定义vectornumber_vswi 4U/ /游泳#定义vectornumber_vtrap每天3 /执行指令陷阱#定义vectornumber_vcop 2、看门狗复位/警察#定义vectornumber_vclkmon 1U / /时钟监控器复位#定义vectornumber_vreset 0u /复位/ ****************中断向量表**************** / # VSI 0xff10u定义#定义vsyscall 0xff12u#定义vreserved118 0xff14u#定义vreserved117 0xff16u#定义vreserved116 0xff18u#定义vreserved115 0xff1au#定义vreserved114 0xff1cu#定义vreserved113 0xff1eu#定义vreserved112 0xff20u#定义vreserved111 0xff22u#定义vreserved110 0xff24u#定义vreserved109 0xff26u#定义vreserved108 0xff28u#定义vreserved107 0xff2au #定义vreserved106 0xff2cu #定义vreserved105 0xff2eu #定义vreserved104 0xff30u #定义vreserved103 0xff32u #定义vreserved102 0xff34u #定义vreserved101 0xff36u #定义vreserved100 0xff38u #定义vreserved99 0xff3au #定义vreserved98 0xff3cu #定义vatd0compare 0xff3eu #定义vreserved96 0xff40u #定义vreserved95 0xff42u #定义vreserved94 0xff44u #定义vreserved93 0xff46u #定义vreserved92 0xff48u#定义vreserved91 0xff4au #定义vreserved90 0xff4cu #定义vreserved89 0xff4eu #定义vreserved88 0xff50u #定义vreserved87 0xff52u #定义vreserved86 0xff54u #定义vreserved85 0xff56u #定义vreserved84 0xff58u #定义vreserved83 0xff5au #定义vreserved82 0xff5cu #定义vreserved81 0xff5eu #定义vreserved79 0xff60u #定义vreserved78 0xff62u #定义vreserved77 0xff64u #定义vreserved76 0xff66u#定义vreserved75 0xff68u #定义vreserved74 0xff6au #定义vreserved73 0xff6cu #定义vreserved72 0xff6eu #定义vreserved71 0xff70u #定义vreserved70 0xff72u #定义vpit3 0xff74u#定义vpit2 0xff76u#定义vpit1 0xff78u#定义vpit0 0xff7au#定义vhti 0xff7cu# VAPI 0xff7eu定义#定义vlvi 0xff80u#定义vreserved62 0xff82u #定义vreserved61 0xff84u #定义vreserved60 0xff86u#定义vreserved59 0xff88u #定义vreserved58 0xff8au #定义vpwmesdn 0xff8cu#定义vportp 0xff8eu#定义vreserved55 0xff90u #定义vreserved54 0xff92u #定义vreserved53 0xff94u #定义vreserved52 0xff96u #定义vreserved51 0xff98u #定义vreserved50 0xff9au #定义vreserved49 0xff9cu #定义vreserved48 0xff9eu #定义vreserved47 0xffa0u #定义vreserved46 0xffa2u #定义vreserved45 0xffa4u#定义vreserved44 0xffa6u #定义vreserved43 0xffa8u #定义vreserved42 0xffaau #定义vreserved41 0xffacu #定义vreserved40 0xffaeu #定义vcan0tx 0xffb0u#定义vcan0rx 0xffb2u#定义vcan0err 0xffb4u#定义vcan0wkup 0xffb6u #定义vflash 0xffb8u#定义vflashfd 0xffbau#定义vreserved33 0xffbcu #定义vreserved32 0xffbeu #定义vreserved31 0xffc0u #定义vreserved30 0xffc2u #定义vcrgscm 0xffc4u#定义vcrgplllck 0xffc6u #定义vreserved27 0xffc8u #定义vreserved26 0xffcau #定义vporth 0xffccu#定义vportj 0xffceu#定义vreserved23 0xffd0u #定义vatd0 0xffd2u#定义vsci1 0xffd4u#定义vsci0 0xffd6u#定义vspi0 0xffd8u#定义vtimpaie 0xffdau#定义vtimpaaovf 0xffdcu #定义vtimovf 0xffdeu#定义vtimch7 0xffe0u#定义vtimch6 0xffe2u#定义vtimch5 0xffe4u #定义vtimch4 0xffe6u #定义vtimch3 0xffe8u #定义vtimch2 0xffeau #定义vtimch1 0xffecu #定义vtimch0 0xffeeu #定义vrti 0xfff0u#定义virq 0xfff2u#定义vxirq 0xfff4u #定义计算0xfff6u#定义vtrap 0xfff8u #定义0xfffau共同体#定义vclkmon 0xfffcu # VRESET 0xfffeu定义各个中断解释:PWMESDN:PWM模块只有一个中断是在急救关机时产生的,如果相应的使能位(pwmie)设置。
使用IAR时遇到的一些Error、Waring
使用IAR时遇到的一些Error、Waring/sendoc/blog作为菜虫,在使用IAR的时候编写CC2430、、Z-Stack2006程序会遇到如下一些错误,当然随着学习的深入,我会持续更新。
1Q:Error[e16]: Segment XDATA_Z (size: 0x19a1 align: 0) is too long for segment definition. At least 0xe4c more bytesneeded. The problem occurred while processing the segment placement command"-Z(XDATA)XDATA_N,XDATA_Z,XDATA_I=_XDATA_START-_XDATA_END", where at the moment ofplacement the available memory ranges were "XDATA:f1ff-fd53"Reserved ranges relevant to this placement:XDATA:f000-f1fe XSTACKXDATA:f1ff-fd53 XDATA_NBIT:0-7 BREGBIT:80-97 SFR_ANBIT:a8-af SFR_ANBIT:b8-c7 SFR_ANBIT:d8-df SFR_ANBIT:e8-ef SFR_ANA:其实这个问题并不是你的程序本身有问题,主要是因为你编写的程序太大了,超出了芯片本身的定义。
今天在群里学习了一招,就是将数组定义到code里,我们看一下例子。
我们定义一个5100个元素的数组,有以下两种方法:mermaid提出的方法是:typedef unsigned char const __code INT8U;extern INT8U shuzi[5100];文晶提出的方法是INT8U code shuzi[5100];这两种方法其实效果是一致的,定义完数组之后,调用的部分就是需要用指针来调用数组里面的数值了。
AVR_中断向量表
C中断向量:#if defined(_ICC_A VR_) // "ICCA VR 编译器"条件编译开始/*==================================================================== ==================中断向量定义====================================================================== ================*/#define IT_RESET 1// 外部引脚、上电复位、掉电检测复位、看门狗复位、以及 JTAG A VR 复位中断向量#define IT_INT0 2 // 外部中断请求0中断向量#define IT_INT1 3 // 外部中断请求1中断向量#define IT_TIMER2_COMP 4 // 定时器/计数器2比较匹配中断向量#define IT_TIMER2_OVF 5 // 定时器/计数器2溢出中断向量#define IT_TIMER1_CAPT 6 // 定时器/计数器1输入捕获中断向量#define IT_TIMER1_COMPA 7 // 定时器/计数器1A比较匹配中断向量#define IT_TIMER1_COMPB 8 // 定时器/计数器1B比较匹配中断向量#define IT_TIMER1_OVF 9 // 定时器/计数器1溢出中断向量#define IT_TIMER0_OVF 10 // 定时器/计数器0溢出中断向量#define IT_SPI_STC 11 // SPI串行传输结束中断向量#define IT_USART_RXC 12 // USART接收结束中断向量#define IT_USART_UDRE 13 // USART数据寄存器空中断向量#define IT_USART_TXC 14 // USART传送结束中断向量#define IT_ADC 15 // ADC转换结束中断向量#define IT_EE_RDY 16 // EEPROM就绪中断向量#define IT_ANA_COMP 17 // 模拟比较器中断向量#define IT_TWI 18 // 两线串行接口中断向量#define IT_INT2 19 // 外部中断请求2中断向量#define IT_TIMER0_COMP 20 // 定时器/计数器0比较匹配中断向量#define IT_SPM_RDY 21 // 保存程序存储器内容就绪中断向量#endif // "_ICC_A VR_" 条件编译结束#if defined(_CodeVision_A VR_) // "CodeV ision A VR C 编译器"条件编译开始#define EXT_INT0 2 // 外部中断请求0中断向量#define EXT_INT1 3 // 外部中断请求1中断向量#define TIM2_COMP 4 // 定时器/计数器2比较匹配中断向量#define TIM2_OVF 5 // 定时器/计数器2溢出中断向量#define TIM1_CAPT 6 // 定时器/计数器1输入捕获中断向量#define TIM1_COMPA 7 // 定时器/计数器1A比较匹配中断向量#define TIM1_COMPB 8 // 定时器/计数器1B比较匹配中断向量#define TIM1_OVF 9 // 定时器/计数器1溢出中断向量#define TIM0_OVF 10 // 定时器/计数器0溢出中断向量#define SPI_STC 11 // SPI串行传输结束中断向量#define USART_RXC 12 // USART接收结束中断向量#define USART_DRE 13 // USART数据寄存器空中断向量#define USART_TXC 14 // USART传送结束中断向量#define ADC_INT 15 // ADC转换结束中断向量#define EE_RDY 16 // EEPROM就绪中断向量#define ANA_COMP 17 // 模拟比较器中断向量#define TWI 18 // 两线串行接口中断向量#define EXT_INT2 19 // 外部中断请求2中断向量#define TIM0_COMP 20 // 定时器/计数器0比较匹配中断向量#define SPM_READY 21 // 保存程序存储器内容就绪中断向量#endif // "defined(_CodeVision_A VR_)" 条件编译结束#if defined(_IAR_EW_A VR_) // "IAR Embedded Workbench A VR 编译器"条件编译开始#define RESET_vect (0x00)// 外部引脚、上电复位、掉电检测复位、看门狗复位、以及 JTAG A VR 复位中断向量#define INT0_vect (0x04) // 外部中断请求0中断向量#define INT1_vect (0x08) // 外部中断请求1中断向量#define TIMER2_COMP_vect (0x0C) // 定时器/计数器2比较匹配中断向量#define TIMER2_OVF_vect (0x10) // 定时器/计数器2溢出中断向量#define TIMER1_CAPT_vect (0x14) // 定时器/计数器1输入捕获中断向量#define TIMER1_COMPA_vect (0x18) // 定时器/计数器1A比较匹配中断向量#define TIMER1_COMPB_vect (0x1C) // 定时器/计数器1B比较匹配中断向量#define TIMER1_OVF_vect (0x20) // 定时器/计数器1溢出中断向量#define TIMER0_OVF_vect (0x24) // 定时器/计数器0溢出中断向量#define SPI_STC_vect (0x28) // SPI串行传输结束中断向量#define USART_RXC_vect (0x2C) // USART接收结束中断向量#define USART_UDRE_vect (0x30) // USART数据寄存器空中断向量#define USART_TXC_vect (0x34) // USART传送结束中断向量#define ADC_vect (0x38) // ADC转换结束中断向量#define EE_RDY_vect (0x3C) // EEPROM就绪中断向量#define ANA_COMP_vect (0x40) // 模拟比较器中断向量#define TWI_vect (0x44) // 两线串行接口中断向量#define INT2_vect (0x48) // 外部中断请求2向量#define TIMER0_COMP_vect (0x4C) // 定时器/计数器0比较匹配中断向量#define SPM_RDY_vect (0x50) // 保存程序存储器内容就绪中断向量#endif // "defined(_IAR_EW_A VR_)" 条件编译结束汇编语言中断向量:;************************************************************************* ;* 中断向量位置声明 *;************************************************************************* ;******** 中断向量地址定义:.equ INT0addr = 0x002 ;外部中断请求0向量地址.equ INT1addr = 0x004 ;外部中断请求1向量地址.equ OC2addr = 0x006 ;定时器/计数器2比较匹配中断向量地址.equ OVF2addr = 0x008 ;定时器/计数器2溢出中断向量地址.equ ICP1addr = 0x00a ;定时器/计数器1输入捕获中断向量地址.equ OC1Aaddr = 0x00c ;定时器/计数器1A比较匹配中断向量地址.equ OC1Baddr = 0x00e ;定时器/计数器1B比较匹配中断向量地址.equ OVF1addr = 0x010 ;定时器/计数器1溢出中断向量地址.equ OVF0addr = 0x012 ;定时器/计数器0溢出中断向量地址.equ SPIaddr = 0x014 ;SPI串行传输结束中断向量地址.equ URXCaddr = 0x016 ;USART接收结束中断向量地址.equ UDREaddr = 0x018 ;USART数据寄存器空中断向量地址.equ UTXCaddr = 0x01a ;USART传送结束中断向量地址.equ ADCCaddr = 0x01c ;ADC转换结束中断向量地址.equ ERDY addr = 0x01e ;EEPROM就绪中断向量地址.equ ACIaddr = 0x020 ;模拟比较器中断向量地址.equ TWIaddr = 0x022 ;两线串行接口中断向量地址.equ INT2addr = 0x024 ;外部中断请求2向量地址.equ OC0addr = 0x026 ;定时器/计数器0比较匹配中断向量地址.equ SPMRaddr = 0x028 ;保存程序存储器内容就绪中断向量地址。
中断向量码和中断类型码
中断向量码和中断类型码1.引言1.1 概述中断向量码和中断类型码是计算机系统中重要的概念和组成部分。
在计算机运行过程中,当发生某些特定事件或条件时,系统需要立即中断当前操作,转而处理这些事件或条件的相应操作。
中断向量码和中断类型码就是用来识别和区分不同中断事件和类型的标识符。
简单来说,中断向量码是一种用于唯一标识各种不同中断事件的编码方式。
它通常是一个整数值,拥有特定的含义和对应的处理程序。
当发生中断事件时,系统会根据中断向量码找到对应的处理程序,从而按照预定义的方式对中断事件进行处理。
而中断类型码则是用于区分不同类型中断的编码方式。
计算机系统中可能存在多种不同类型的中断,如硬件中断、软件中断等。
每种类型的中断都有特定的中断类型码,用于区分和识别不同类型的中断。
通过中断类型码,系统可以准确地判断中断的来源和类型,从而进一步调度相应的处理程序或资源。
中断向量码和中断类型码在计算机系统中起到了至关重要的作用。
它们不仅为系统提供了灵活、快速的中断处理机制,还允许系统针对不同类型的中断事件进行有针对性的处理。
通过合理设计和使用中断向量码和中断类型码,可以提高系统的稳定性、可靠性和响应能力。
在接下来的篇章中,我们将详细介绍中断向量码和中断类型码的定义、作用以及使用方法。
通过深入了解这些概念,读者将能够更好地理解中断处理的机制和原理,并且能够在实际应用中灵活使用和调度中断处理程序。
我们希望通过这篇文章的介绍,读者能够对中断向量码和中断类型码有更深入的认识,并且能够将其应用于自己的实际工作和学习中。
1.2 文章结构本文共分为三个主要部分:引言、正文和结论。
下面将详细介绍每个部分的内容和结构安排。
1. 引言部分将提供本文的背景和目的。
首先,我们将概述中断向量码和中断类型码的基本概念和作用。
然后,我们将介绍本文的结构和各个部分的内容安排。
最后,我们将明确本文的目的,即深入探讨中断向量码和中断类型码对于中断处理的重要性。
IAR软件错误调试
使用IAR时遇到的一些Error、Waring/sendoc/blog作为菜虫,在使用IAR的时候编写CC2430、、Z-Stack2006程序会遇到如下一些错误,当然随着学习的深入,我会持续更新。
1Q:Error[e16]: Segment XDATA_Z (size: 0x19a1 align: 0) is too long for segment definition. At least 0xe4c more bytesneeded. The problem occurred while processing the segment placement command"-Z(XDATA)XDATA_N,XDATA_Z,XDATA_I=_XDATA_START-_XDATA_END", where at the moment ofplacement the available memory ranges were "XDATA:f1ff-fd53"Reserved ranges relevant to this placement:XDATA:f000-f1fe XSTACKXDATA:f1ff-fd53 XDATA_NBIT:0-7 BREGBIT:80-97 SFR_ANBIT:a8-af SFR_ANBIT:b8-c7 SFR_ANBIT:d8-df SFR_ANBIT:e8-ef SFR_ANA:其实这个问题并不是你的程序本身有问题,主要是因为你编写的程序太大了,超出了芯片本身的定义。
今天在群里学习了一招,就是将数组定义到code里,我们看一下例子。
我们定义一个5100个元素的数组,有以下两种方法:mermaid提出的方法是:typedef unsigned char const __code INT8U;extern INT8U shuzi[5100];文晶提出的方法是INT8U code shuzi[5100];这两种方法其实效果是一致的,定义完数组之后,调用的部分就是需要用指针来调用数组里面的数值了。
IAR相关问题处理办法,及其注意事项
问题一:IAR中如何做位定义,位操作以前在STVD中,使用如下语句做位定义_Bool L1 @PA_ODR : 6; //数码管个位, 低电平点亮_Bool L2 @PA_ODR : 5; //数码管十位, 低电平点亮_Bool L3 @PA_ODR : 4; //数码管百位, 低电平点亮但是同样的语句在IAR中不能用了,编译时报错。
后来,查看IAR中的头文件 "iostm8s207rb.h",看到如下语句/*-------------------------------------------------------------------------* Port A bit fields*-----------------------------------------------------------------------*/#ifdef __IAR_SYSTEMS_ICC__#define PA_ODR_ODR0 PA_ODR_bit.ODR0#define PA_ODR_ODR1 PA_ODR_bit.ODR1想想看:既然可以用PA_ODR_ODR1来指定某个位,那么我再将某个位用define重新定义为我想要的名字不就可以了吗?心动不如行动,于是写下如下语句:#define Sound_K PA_ODR_ODR6; //语音控制K原本以为十拿九稳,肯定能编译通过,结果现实狠狠地教训了我一下,报错!Error【Pe029】:expected an expression我百思不得其解,以为IAR不支持这种重复定义的方式,于是换用bool,_Bool, _bool, bit ......各种方法尝试,结果均以失败告终,事情似乎走到了尽头。
最后,抱着试一试的想法,我把原头文件中的语句#define PA_ODR_ODR6 PA_ODR_bit.ODR6换成#define Sound PA_ODR_ODR6 //语音控制K结果,编译通过了,我真是泪流满面啊,没想到问题解决了。
STM8教程-第五章 熟悉IAR开发环境
第五章熟悉IAR开发环境IAR Systems 推出开发工具“STM8 系列嵌入式设计工作台”(EWSTM8),支持8 位微控制器市场主流的STM8(STM8A,STM8L,STM8S)系列产品。
IAR EWSTM8 嵌入式设计工作台提供一整套开发工具,包括一个项目管理器、编辑器和项目创建工具(C 语言编译器和链接器)。
该工作台还为开发人员提供调试功能,可以连接意法半导体价格低廉的在线调试器ST-LINK 以及先进的高端仿真器STice。
下面向读者详细介绍IAR 的使用方法,希望读者能够迅速熟悉和掌握IAR。
5.1 IAR For STM8 的下载以及安装IAR For STM8 可以在IAR 的官网中下载,现在提供两种版本,一是免费的8K 受限制版本,另一个是评估板的30 天免费的版本。
可以在以下网址下载:/en/Products/IAR-Embedded-Workbench/STMicroelectronics-STM8/ 安装完成之后,运行IAR 集成开发环境,其界面如图所示:5.2 使用IAR 创建C 语言项目5.2.1 新建a)创建一个Workspace首先,创建一个Workspace。
选择菜单File>New>Workspaceb)创建一个Project1、创建一个新工程,选择Project>Create New Project,创建新工程的对话框,如下图所示:2、Tool chain 默认是STM8 Series。
无需再选择3、在Project templates 中选择C 或者其它4、在弹出Save As 对话框,选择Project 保存的路径,并输入Project 的名字。
在Workspace 窗口中,显示如下:有Debug 和Release 两个配置,默认配置是Debug。
5、在添加文件到工程之前,先保存Workspace。
选择File>Save>Workspace,指定要保持的路径,并输入Workspace 的名字。
MSP430中断服务函数的定义
__interrupt void SPI0_rx (void)
#else //在IAR2.0以下中断函数声明。
interrupt[USART0RX_VECTOR] void SPI0_rx (void)
#endif //IAR中断函数声明结束。
//为了保证代码可以在IAR编译器的任何版本中都能正确得到编译,所以作以下的条件编译。
#ifdef __IAR_SYSTEMS_ICC__ //如果编译器是IAR, 那么以下将被编译。
#if __VER__ >= 200
#pragma vector=USART0RX_VECTOR //在IAR2.0以上中断函数声明。
//例程描述:利用定时器定时功能,实现P1.0方波输出。
#include <msp430x14x.h>
{
WDTCTL = WDTPW + WDTHOLD; //停止看门狗WDT,不使用内部看门狗定时器。
P1DIR |= 0x01; //设置P1.0口方向为输出。
{ }
----------------------------------------------------------------------------是定义中断地址宏,其实就是一个中断矢量值,例如,地址, 0xffe0 。
这个中断矢量有芯片型号决定,一旦信号确定,那么所有的终端矢量也就确定了。
_BIS_SR(LPM0_bits + GIE); //进入低功耗模式LPM0和开中断
}
//定时器A 中断服务程序区
//当IAR编译器版本大于或等于2.0以上时,则中断写法格式如下。
#pragma vector=TIMERA0_VECTOR //定时器A0中断向量
关于IAR和Keil中断函数启动文件设置
首先声明,我也是刚刚接触 Cortex-M3 这东西。废话不多说进入正题吧。 我在找 LM3S 这类东西的程序时发现很多都是 IAR 写,所以下下来装到 IAR 里面就发现根 本编译有错误,主要体现在语法错误。如果没有中断的话那还问题不大,主要是把驱动文件 换过来就可以了,但是如果一用到中断的话那就要修改启动文件里面的一些东西了。这里我 就不解释启动文件这东西了,主要讲在启动文件里面该改什么地方就可以,这样比较适合我 们这类菜鸟接受,要不然讲出一大堆东西,结果想解决的问题没解决。
高 通过修改以上的地方之后就可以在其他文件写中断如口处理程序 Timer0A_ISR(void)
{ }
州பைடு நூலகம்
广 说完 IAR 的中断设置,然后我们也讲讲 Keil 的,我也是用刚才 GPIO 的例子来说明,
在建立 LM3S 的工程时候会有个启动文件,我选了默认添加进来,然后在里面修改,方法 跟 IAR 里面的差不多,但是差别还是有,经过对比其他程序使用中断之后,总结了修改启 动文件也是需要两步骤。
// Timer 0 subtimer A// 然后把这里的 IntDefaultHandler 改成
大 Timer0A_ISR , 当 然 你 想 改 成 什 么 样 的 名 称 只 命 名 的 问 题 , 只 要 跟 以 上 extern void
Timer0A_ISR(void)定义的一就可以了。
在其下面添加
Default_Handler PROC
EXPORT Timer0A_ISR
[WEAK]
Timer0A_ISR
B
.(注意这里有个小点,我曾经想去掉,但是结果编译出错)
IAR学习(杂项)
IAR学习(杂项)我是IAR的新手,最近搞avr才使用的IAR,在使用的过程中第一个遇到的问题就是很多寄存器不可以使用,比如PORTC,PORTD等等,这些明明是可以用的,不知道问什么不能用,后来问人终于知道了,这是IAR设置的问题,在设置里面,option->general options -> system -> enable bit defination in I/O - Include files 把位操作使能勾上就可以了.=============================================================================== ===============** IAR嵌入式开发平台编译链接时产生UBROF F8格式即可导入到AVR Studio中调试。
** 按下面设置:Project -> Options -> LINKER -> Output -> Other -> UBROF F8** 打开AVR Studio,File -> Open File -> Debug\Exe\*.d90 (有必要改变文件类型为“所有文件”)。
=============================================================================== ===============IARAVR C编译器的中断使用方法IAR公司开发的AVR单片机C编译器是一款非常优秀的开发工具,由于它的编译效率要比ICCAVR、CODEVISIONAVR、GCCAVR编译器都要高,很容易编写出高效的C程序。
对于C程序的编写,大体都是一样的,只是不同的编译器在标准C基础上都有自己的扩展特性。
AVR单片机的中断服务程序的编写对于不同的编译器声明的方法也就不同。
例如在IAR AVR C编译器中使用定时器Timer0溢出中断声明的方法如下:#pragma vector = TIMER0_OVF_vect__interrupt void Timer0_OverFlow_Interrupt(void){//用户自己添加的程序段}"#pragma vector = "是必须声明的,等于号后面内容为对应中断向量地址“__interrupt”这是IAR AVR C编译器中的中断服务程序声明的关键字,是必须的。
stm8s外部中断
stm8s外部中断
stm8s外部中断
stm8s外部中断相关的寄存器除了io的⼏个寄存器之外,还有就是EXTI_CR1,EXTI_CR2寄存器。
这⼏要注意,io的CR2寄存器的作⼏是开关中断。
另外,stm8s系列外部中断没有标志位。
以PC1下降沿触发为例,配置如下:
asm("sim");//关总中断
EXTI_CR1_PCIS = 2;//仅下降沿触发
PC_DDR_DDR1 = 0;//io⼏向:输⼏
PC_CR1_C11=0;//因为DDR为0,所以CR1为0表⼏浮空输⼏模式
PC_CR2_C21 = 1;//1:使能外部中断,0:关闭外部中断
asm("rim");//开总中断
说明:EXTI_CR1_PCIS可以选择0——3,含义如下图所⼏:
iar中断函数写法如下:
/* Defines an interrupt handler for EXTI2 vector. */
#pragma vector=7
__interrupt void EXTI2_IRQHandler(void)
{
}
中断函数我并没有写内容,说明⼏点:iar的中断向量号⼏stm8s 参考⼏册的中断向量号⼏2,所以⼏册⼏PC的终端向量号为5,此处为7。
2_中断控制(Interrupt)(免费下载)
4. 编写中断服务函数
中断服务函数从形式上跟普通函数类似,但在命名及具体的处理上有所不同。 中断服务函数命名 对于 GCC 编译器下的程序,中断服务函数的名称是事先约定好的。 用户可以打开启动文件“LM3S_Startup.s”来查看每个中断服务函数的标准名称(参见表 1.1)。 例如,GPIOB 端口的中断服务函数名称是 GPIO_Port_B_ISR,对应的函数头应当是“void GPIO_Port_B_ISR(void)”,参数和返回值都必须是 void 类型。在 Keil 或 IAR 开发环境下, 中断服务函数的名称可以由程序员自己指定,但还是推荐采用 GCC 下的标准名称,这样有
unsigned long ulStatus;
ulStatus = GPIOPinIntStatus(GPIO_PORTA_BASE, true); GPIOPinIntClear(GPIO_PORTA_BASE, ulStatus);
// 读取中断状态 // 清除中断状态,重要
if (ulStatus & GPIO_PIN_0) {
I2C_ISR(void)”为例,找到“Vectors”表格,根据注释内容把相应的“IntDefaultHandler” 替换为“I2C_ISR”,并且在“Vectors”表格前面插入声明“EXTERN I2C_ISR”,完成。
IAR 在 IAR 开发环境下,启动文件“startup_ewarm.c”是用 C 语言写的,很好理解。 仍以中断服务函数“void I2C_ISR(void)”为例,先插入函数声明“void I2C_ISR(void);”,然 后在中断向量表里,根据注释内容把相应的“IntDefaultHandler”替换为“I2C_ISR”,完成。
IARFORAVR编译环境中启动代码和堆栈设置的分析
IARFORAVR编译环境中启动代码和堆栈设置的分析1.例子1程序中仅包含一个空的main()函数,代码如下:#include <ioavr.h>int main(void){}此时对应的map文件显示:表中CSTACK的区域由编译环境中DATA STACK的值确定,起始位置是0060H,而RSTACK区域的起始地址就是CSTACK的最大地址+1,即RSTACK紧接着CSTACK,其大小由编译环境则为Return address stack中的值*2。
从0000-0025都是中断向量表的区域,从0026-0049才是程序代码中断向量表的区域如下图所示:从表中可以看出,上电复位后的第一条指令就转移到启动代码?C_STARTUP中。
程序代码如下图所示:在启动代码中,首先设置堆栈指针SP位009FH,这个值就是MAP文件中给出的RSTACK区域的最大地址。
然后将(R29,R28)寄存器对设置成0080H,这个值就是MAP文件中给出的RSTACK区域的最小地址。
由于在AVR中,当压栈时,堆栈指针进行减法,出栈时进行加法,所以栈顶就是009FH,实际上堆栈可使用的区域为0080到009FH。
这部分区域主要用来保存返回地址,因此在编译环境中也被称为返回地址的堆栈,而CSTACK则称为数据堆栈。
这个部分区域应该是用于局部变量的操作,因此要小心设置改值,否则会导致空间溢出。
2.例子2程序包含有一个main()函数,其中定义了一个10个字节的数组,如下图所示:int main(void){unsigned char i;char s[10];for(i=0;i<10;i++){s[i] = 0x55;}}这个程序编译后,生成的MAP图如下:从这里可以发现,没有CSTACK和RSRTACK没有发生变化。
启动代码部分如下所示:可以看出,也没有什么变化。
那么再来看看main()函数的汇编代码,如下图所示:通过读代码,可以看出R16用于存储局部变量i,用于for循环的计数。
飞思卡尔单片机中断(两篇)
引言概述飞思卡尔单片机中断是指在特定的条件下,单片机的运行被打断,转而执行特定的处理程序。
在飞思卡尔单片机的开发中,中断是非常重要的一部分,它可以提高系统的响应速度和实时性。
本文将详细介绍飞思卡尔单片机中断的相关知识。
正文内容一、中断的基本概念和原理1. 中断的定义:中断是指在特定的条件下,程序的执行被打断,转而执行事先定义好的处理程序。
2. 中断的分类:外部中断和内部中断。
外部中断是由外部设备引发的,例如按键、定时器等;内部中断是由单片机内部的某个事件引发的,例如指令执行完成、通信完成等。
3. 中断的触发方式:电平触发和边沿触发。
电平触发是指当外部信号保持一定电平时触发中断;边沿触发是指在信号的上升沿或下降沿触发中断。
二、飞思卡尔单片机中断的使用方法1. 中断的初始化:对中断控制寄存器进行设置,使能相应的中断源。
2. 中断的优先级设置:多个中断源同时触发时,可以通过设置优先级来确定执行顺序。
3. 中断服务程序的编写:根据不同的中断源,编写相应的中断服务程序,完成特定的处理。
4. 中断的开启和关闭:根据需要,可以在程序中开启或关闭特定的中断。
三、飞思卡尔单片机中断优化技巧1. 中断嵌套:可以在一个中断中触发另一个中断,提高系统的实时性和处理效率。
2. 临界区保护:在关键代码段加入关中断代码,保护临界区避免竞态条件的发生。
3. 中断延时处理:在某些特定情况下,需要延时处理中断,可以使用延时函数或软件延时方式实现。
四、飞思卡尔单片机中断的常见问题和解决方法1. 中断误触发问题:可能是由于外部干扰、软件错误等原因导致中断被误触发,可以通过加入滤波电路、改进软件设计等方式解决。
2. 中断处理时间过长问题:中断处理程序执行时间过长会导致系统响应变慢,可以通过优化中断程序、减少中断次数等方式解决。
3. 中断嵌套问题:如果中断嵌套层次太多,可能会导致系统死锁或无法预测的结果,可以通过合理设计中断嵌套层次、减少中断嵌套次数来解决。
IAR_for_AVR入门学习笔记 - IAR学习资料
a2.jpg (63.75 KB) 2009-12-20 00:28 3、打开文件包 keygen,双击文件 IARID.exe,出现本电脑 ID 号,如图,记下来
a9.jpg (33.54 KB) 2009-12-20 22:42 7、关于调试版本“debug”和发行版本“release”的选择如下图所示。在下拉箭头处进行两种版本的切换。
a10.jpg (4.92 KB) 2009-12-20 22:42 8、接下来把刚才创建的项目保存到一个工作区中,依次点击 file-save workspace 后,出现如图所示的保存界面,输入 工作区的名称(注意文件格式是.eww 格式),选择存放路径,然后点击“保存”按钮进行保存。
a6.jpg (3.12 KB) 2009-12-21 23:14
今天就到这里,明天我们来学习一下中断程序的编写 四、中断程序的编写 1、在 IAR 中中断处理函数的形式为: #pragma vector = 中断向量 _interrupt void 函数名(void) { /******中断服务函数的程序代码********/ } 例如:定时器 0 的溢出中断 #pragma vector = TIMER0_OVF_VECT _interrupt void timer0(void) { /******中断服务函数的程序代码********/ } 2、不同型号的 AVR 芯片,其中断个数和中断向量各不相同。以下是 ATmega16 的中断向量表。从下面的中断向量表 可以看出,所谓的中断向量,其实只是一个符号,利用#define 语句,将中断入口地址与中断向量符号联系了起来,这 样用助记符来表示中断,便于记忆 #define RESET_vect (0x00) #define INT0_vect (0x04) #define INT1_vect (0x08) #define TIMER2_COMP_vect (0x0C) #define TIMER2_OVF_vect (0x10) #define TIMER1_CAPT_vect (0x14) #define TIMER1_COMPA_vect (0x18) #define TIMER1_COMPB_vect (0x1C) #define TIMER1_OVF_vect (0x20) #define TIMER0_OVF_vect (0x24) #define SPI_STC_vect (0x28) #define USART_RXC_vect (0x2C)
中断向量及中断向量表的概念
中断向量及中断向量表的概念
中断向量是指在计算机系统中,用于存储处理中断的地址。
当发生中断时,CPU会根据中断类型查找对应的中断向量,并
跳转到该中断向量所存储的地址中去执行中断处理程序。
中断向量表则是一个存储中断向量的数据结构,通常为一个数组或者一个表格。
每个中断类型都会对应一个唯一的中断向量。
中断向量表会根据中断发生时的类型,通过索引的方式找到对应的中断向量。
在中断发生时,硬件会向CPU发送一个中断请求信号,CPU
会根据这个信号来确定中断的类型,然后根据中断类型找到对应的中断向量,最后跳转到中断向量中存储的地址去执行相应的中断处理程序。
中断向量表的作用就是方便CPU快速地找
到对应的中断向量,并执行相应的中断处理程序。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
IAR的工程建立比较简单,直接先建立工作区然后保存,不保存无法调试。
把官方的INC 放到工程目录下,在C/C++编辑连接包含这个文件的绝对路径(最简单的搞法)。
把c文件添加进去就可以了,它的中断很简单你只要写一个如下的.c文件就能用了:
中断头文件: #include <intrinsics.h>
开启全局中断:__enable_interrupt();
关闭全局中断: __disable_interrupt();
#pragma vector=1
__interrupt void TRAP_IRQHandler(void)
{
}
#pragma vector=2
__interrupt void TLI_IRQHandler(void)
{
}
#pragma vector=3
__interrupt void AWU_IRQHandler(void)
{
}
#pragma vector=4
__interrupt void CLK_IRQHandler(void)
{
}
#pragma vector=5
__interrupt void EXTI_PORTA_IRQHandler(void)
{
}
#pragma vector=6
__interrupt void EXTI_PORTB_IRQHandler(void)
{
}
#pragma vector=7
__interrupt void EXTI_PORTC_IRQHandler(void)
{
}
#pragma vector=8
__interrupt void EXTI_PORTD_IRQHandler(void)
{
}
#pragma vector=9
__interrupt void EXTI_PORTE_IRQHandler(void)
{
}
#ifdef STM8S903
#pragma vector=0xA
__interrupt void EXTI_PORTF_IRQHandler(void)
{
}
#endif
#ifdef STM8S208
#pragma vector=0xA
__interrupt void CAN_RX_IRQHandler(void)
{
}
#pragma vector=0xB
__interrupt void CAN_TX_IRQHandler(void)
{
}
#endif
#pragma vector=0xC
__interrupt void SPI_IRQHandler(void)
{
}
#pragma vector=0xD
__interrupt void TIM1_UPD_OVF_TRG_BRK_IRQHandler(void) {
CleT1UPF;
PDODR->bit3=(~PDODR->bit3);
}
#pragma vector=0xE
__interrupt void TIM1_CAP_COM_IRQHandler(void)
{
}
#ifdef STM8S903
#pragma vector=0xF
__interrupt void TIM5_UPD_OVF_BRK_TRG_IRQHandler(void)
{
}
#pragma vector=0x10
__interrupt void TIM5_CAP_COM_IRQHandler(void)
{
}
#else
#pragma vector=0xF //定时器二中断地址
__interrupt void TIM2_UPD_OVF_BRK_IRQHandler(void)
{
}
#pragma vector=0x10
__interrupt void TIM2_CAP_COM_IRQHandler(void)
{
}
#endif
#if defined (STM8S208) || defined(STM8S207) || defined(STM8S105) #pragma vector=0x11
__interrupt void TIM3_UPD_OVF_BRK_IRQHandler(void)
{
}
#pragma vector=0x12
__interrupt void TIM3_CAP_COM_IRQHandler(void)
{
}
#endif
#ifndef STM8S105
#pragma vector=0x13
__interrupt void UART1_TX_IRQHandler(void)
{
}
#pragma vector=0x14
__interrupt void UART1_RX_IRQHandler(void) {
}
#endif
#pragma vector=0x15
__interrupt void I2C_IRQHandler(void)
{
}
#ifdef STM8S105
#pragma vector=0x16
__interrupt void UART2_TX_IRQHandler(void) {
}
#pragma vector=0x17
__interrupt void UART2_RX_IRQHandler(void) {
}
#endif
#if defined(STM8S207) || defined(STM8S208) #pragma vector=0x16
__interrupt void UART3_TX_IRQHandler(void) {
}
#pragma vector=0x17
__interrupt void UART3_RX_IRQHandler(void) {
}
#endif
#if defined(STM8S207) || defined(STM8S208) #pragma vector=0x18
__interrupt void ADC2_IRQHandler(void)
{
}
#else
#pragma vector=0x18
__interrupt void ADC1_IRQHandler(void)
{
}
#endif
#ifdef STM8S903
#pragma vector=0x19
__interrupt void TIM6_UPD_OVF_TRG_IRQHandler(void) {
}
#else
#pragma vector=0x19
__interrupt void TIM4_UPD_OVF_IRQHandler(void)
{
}
#endif
#pragma vector=0x1A
__interrupt void EEPROM_EEC_IRQHandler(void)
{
}
这里面的函数和51一样你可以放到任何文。