MCU:STM8S207SB
要操作的IO口:PD7 采用下降沿触发中断
代码:
#include <iostm8s207sb.h> #define LED1_FLASH PD_ODR_ODR3 = !PD_ODR_ODR3 // 开发板上的LED1接在PD3上 void GPIO_init(void) { PD_DDR = 0x08; // 配置PD端口的方向寄存器PD3输出 PD_CR1 = 0x08; // 设置PD3为推挽输出 PD_CR2 = 0x80; // 使能PD7外部中断 } void EXTI_init(void) { EXTI_CR1 = 0x80; // PD口下降沿触发中断 } #pragma vector=0x02 // 这里很关键!看下面说明。 __interrupt void EXTI_PD7_TLI(void) { LED1_FLASH; } void init_devices(void) { asm("sim"); // 关全局中断 GPIO_init(); EXTI_init(); asm("rim"); // 开全局中断 } void main( void ) { init_devices(); // 主循环里没有程序需要执行 while(1); }
这里着重要说明的一点是PD7的外部中断程序。看了一下芯片手册,PD口外部中断EXTI3的中断向量号是6,想当然,又是想当然,按IAR的规矩中断向量要加2,就这样写#pragma vector=0x08,结果就是按下按键,程序没响应了,一直在中断里不出来。接下来只能另想办法,仔细翻了资料后发现,PD7和PD其他端口不一样,PD7后面拖了个小尾巴TLI,再看手册上的TLI描述,乖乖,TLI拥有芯片最高级别中断,享有独立专用的中断向量号0,这下就好办了,按IAR的规矩,芯片手册中断向量号 + 2 = IAR中断向量号,程序改成#pragma vector=0x02,重新来一遍编译、下载、运行,按键终于听话了。
文章的脚注信息由WordPress的wp-posturl插件自动生成