STM8L外部中断为何死循环 寄存器操作
扫描二维码
随时随地手机看文章
STM8L系列单片机是ST公司推出的低功耗单片机,与STM8S系列相比功耗降低了很多,但内部结构也删减了很多,使用时一定要仔细阅读手册。这是第一次使用STM8,实现功能不是很复杂就没想研究库函数,准备直接控制寄存器操作,没想到本人因为中断问题纠结了大半天。
在外部中断中这一点很不同,STM8S自动清除外部中断,而STM8L是需要软件清除,清除标志位的寄存器根据设置而不同,下面有说明。
下面以STM8L外部中断PB1为例说明外部中断寄存器操作
设置外部中断有下面几步:
第一步、设置IO口为中断输入通过设置(PB_DDR |= 0X00;PB_CR1 |= 0X02;PB_CR2 |= 0X02;)
第二步、设置中断触发方式(00: Falling edge and low level;01: Rising edge on
第三步、更改中断向量表(stm8_interrupt_vector.c文件中)
第四步、编写中断处理函数,记住在函数里面清除中断
第一步、设置IO口为中断输入
PB_DDR |= 0X00; //输入
PB_CR1 |= 0X02; // 0000_0010
PB_CR2 |= 0X02; // 0000_0010 CR1与CR2结合确定为上拉外部中断输入
第二步、设置中断触发方式STM8L中PB与PD端口比较特殊可以有两种触发模式
EXTI_CONF= 0x00;
这两种触发模式通过寄存器EXTI_CONF进行设置
第一种方式与A,C port一样通过下面两个寄存器设置触发模式设置寄存器EXTI_CONF[0]为0,表示Port B[3:0]使用第一种方式(我在此命名为普通方式)
EXTI_CR1寄存器设置Port A, B, C and/or D external interrupts 的3、2、1、0引脚
EXTI_CR2寄存器设置Port A, B, C and/or D external interrupts 的7、6、5、4引脚
第二种方式通过EXTI_CR3寄存器设置触发模式EXTI_CONF[0]为1,表示Port B[3:0]使用第二种方式(我在此命名为特殊方式)
EXTI_CR3寄存器的[3:2]位设置端口D的触发模式
EXTI_CR3寄存器的[1:0]位设置端口B的触发模式
第三步、更改中断向量表
{0x82, KEY_Interrupt}, /* irq9 */
PB1普通模式中断向量号为9,其中KEY_Interrupt可以根据实际命名,只要和后面写的中断函数名一致就可以。
为什么选择为9看下面的图片就知道了。
第四步、编写中断处理函数
@far @interrupt void KEY_Interrupt(void)
{
LED1 = !LED1;
//EXTI_SR2 = 0x01; //如果设置为特殊模式通过此寄存器清除中断标志位
EXTI_SR1 |=0x02; //如果设置为普通模式通过此寄存器清除中断标志位
}
在这一步骤中有两点说明:
1、如果中断执行函数不想在stm8_interrupt_vector.c文件中编写,需要在stm8_interrupt_vector.c 文件中添加这样一个函数
@far @interrupt void KEY_Interrupt(void);
2、EXTI_SR2 = 0x01; //如果设置为特殊模式通过此寄存器清除中断标志位
EXTI_SR1 |=0x02; //如果设置为普通模式通过此寄存器清除中断标志位
中断向量等级:
通过下面的第一个表格可以知道如果我们用普通中断模式端口B1的中断属于EXTI1(如果是PB2属于EXTI2),特殊模式端口B的中断属于EXTIB and EXTID,
知道这点后我们结合手册中的中断向量表就知道我们应该在哪个位置写中断入口函数名了。