zoukankan      html  css  js  c++  java
  • 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 only;10: Falling edge only;11: Rising and falling edge

    第三步、更改中断向量表 (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,

    知道这点  后我们结合手册中的中断向量 表就知道 我们应该在哪个位置写中断 入口函数名了。

     


                 

       希望可以对 大家有帮助 --------  ForeverLongo

              

  • 相关阅读:
    现代物流系统及其输送机构
    什么是线性插值原理 什么是双线性插值?
    Windows常见窗口样式和控件风格
    CAsyncSocket
    使用CRectTracker类进行对象动态定位
    英文自我介绍
    QQ 静态截图程序模拟实现
    使用CRectTracker类进行对象动态定位
    QQ 静态截图完善实现之改造 CRectTracker 类
    [原创] 骨骼运动变换的数学计算过程详解
  • 原文地址:https://www.cnblogs.com/LJWJL/p/3750513.html
Copyright © 2011-2022 走看看