新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > STM8L外部中斷 為何 死循環 寄存器操作

        STM8L外部中斷 為何 死循環 寄存器操作

        作者: 時間:2016-11-20 來源:網絡 收藏
          STM8L 系列單片機是 ST公司推出的低功耗單片機,與STM8S系列相比功耗降低了很多,但內部結構也刪減了很多,使用時一定要仔細閱讀手冊。 這是第一次使用STM8,實現功能不是很復雜就沒想研究庫函數,準備直接控制寄存器操作,沒想到本人 因為中斷問題糾結了大半天。

        外部中斷中這一點很不同, STM8S自動清除外部中斷,而STM8L是需要軟件清除, 清除標志位的寄存器根據設置而不同,下面有說明。

        本文引用地址:http://www.104case.com/article/201611/318680.htm

        下面以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; // 0_0010

         PB_CR2 = 0X02; // 0_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,

        知道這點 后我們結合手冊中的中斷向量 表就知道 我們應該在哪個位置寫中斷 入口函數名了。



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 绥阳县| 永兴县| 丽水市| 文山县| 德安县| 丹凤县| 瑞金市| 米易县| 广平县| 友谊县| 小金县| 东乌| 堆龙德庆县| 北安市| 赤壁市| 台前县| 磐安县| 博罗县| 万载县| 濉溪县| 城市| 塘沽区| 尉犁县| 合川市| 邹城市| 青田县| 海晏县| 新化县| 山西省| 商水县| 深水埗区| 东阿县| 沈阳市| 新野县| 永宁县| 景谷| 定兴县| 葫芦岛市| 永嘉县| 社旗县| 大悟县|