[整理]IAR+STM8_EXTI外部IO中断

原创文章,转载请注明: 转载自勤奋的小青蛙
本文链接地址: [整理]IAR+STM8_EXTI外部IO中断

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,重新来一遍编译、下载、运行,按键终于听话了。

原创文章,转载请注明: 转载自勤奋的小青蛙
本文链接地址: [整理]IAR+STM8_EXTI外部IO中断

文章的脚注信息由WordPress的wp-posturl插件自动生成



|2|left
打赏

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: