<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > STM8L外部中斷 為何 死循環(huán) 寄存器操作

          STM8L外部中斷 為何 死循環(huán) 寄存器操作

          作者: 時(shí)間:2016-11-20 來源:網(wǎng)絡(luò) 收藏
            STM8L 系列單片機(jī)是 ST公司推出的低功耗單片機(jī),與STM8S系列相比功耗降低了很多,但內(nèi)部結(jié)構(gòu)也刪減了很多,使用時(shí)一定要仔細(xì)閱讀手冊(cè)。 這是第一次使用STM8,實(shí)現(xiàn)功能不是很復(fù)雜就沒想研究庫函數(shù),準(zhǔn)備直接控制寄存器操作,沒想到本人 因?yàn)橹袛鄦栴}糾結(jié)了大半天。

          外部中斷中這一點(diǎn)很不同, STM8S自動(dòng)清除外部中斷,而STM8L是需要軟件清除, 清除標(biāo)志位的寄存器根據(jù)設(shè)置而不同,下面有說明。

          本文引用地址:http://www.ex-cimer.com/article/201611/318680.htm

          下面以STM8L外部中斷 PB1為例 說明外部中斷 寄存器操作

          設(shè)置外部中斷有下面幾步:

          第一步、設(shè)置IO口為中斷輸入 通過設(shè)置 (PB_DDR = 0X00;PB_CR1 = 0X02;PB_CR2 = 0X02;)

          第二步、設(shè)置中斷觸發(fā)方式(00: Falling edge and low level;01: Rising edge only;10: Falling edge only;11: Rising and falling edge)

          第三步、更改中斷向量表 (stm8_interrupt_vector.c 文件中)

          第四步、編寫中斷處理函數(shù),記住在函數(shù)里面清除中斷


          第一步、設(shè)置IO口為中斷輸入

          PB_DDR = 0X00; // 輸入

           PB_CR1 = 0X02; // 0_0010

           PB_CR2 = 0X02; // 0_0010 CR1與CR2結(jié)合確定為 上拉外部中斷輸入

          第二步、設(shè)置中斷觸發(fā)方式STM8L中 PB 與 PD 端口比較特殊可以有兩種觸發(fā)模式

           EXTI_CONF= 0x00;

          這兩種觸發(fā)模式通過寄存器EXTI_CONF 進(jìn)行設(shè)置

          第一種方式 與A,C port一樣通過下面兩個(gè)寄存器設(shè)置觸發(fā)模式 設(shè)置 寄存器EXTI_CONF[0]為0 ,表示Port B[3:0] 使用第一種方式(我在此命名為普通方式)

            EXTI_CR1 寄存器設(shè)置Port A, B, C and/or D external interrupts 的 3、2、1、0引腳

            EXTI_CR2 寄存器設(shè)置Port A, B, C and/or D external interrupts 的 7、6、5、4引腳

          第二種方式 通過EXTI_CR3寄存器設(shè)置觸發(fā)模式EXTI_CONF[0]為1,表示Port B[3:0] 使用第二種方式(我在此命名為特殊方式)

            EXTI_CR3 寄存器的 [3:2] 位 設(shè)置 端口D 的觸發(fā)模式

            EXTI_CR3 寄存器的 [1:0] 位 設(shè)置 端口B 的觸發(fā)模式

          第三步、更改中斷向量表

            {0x82, KEY_Interrupt}, /* irq9 */

            PB1普通模式中斷向量號(hào)為9 ,其中KEY_Interrupt 可以根據(jù)實(shí)際命名, 只要和后面寫的中斷函數(shù)名一致就可以。

            為什么選擇為9 看下面的圖片就知道了。

          第四步、編寫中斷處理函數(shù)

            @far @interrupt void KEY_Interrupt(void)
            {
              LED1 = !LED1;
              //EXTI_SR2 = 0x01; // 如果設(shè)置為 特殊模式 通過此寄存器清除 中斷標(biāo)志位
              EXTI_SR1 =0x02; // 如果設(shè)置為 普通模式通過此寄存器清除 中斷標(biāo)志位

            }

          在這一步驟中有兩點(diǎn) 說明:

          1、如果中斷執(zhí)行函數(shù)不想在stm8_interrupt_vector.c 文件中編寫,需要在stm8_interrupt_vector.c 文件中添加這樣一個(gè)函數(shù)

            @far @interrupt void KEY_Interrupt(void);

          2、EXTI_SR2 = 0x01; // 如果設(shè)置為 特殊模式 通過此寄存器清除 中斷標(biāo)志位
            EXTI_SR1 =0x02; // 如果設(shè)置為 普通模式通過此寄存器清除 中斷標(biāo)志位


          中斷向量等級(jí):

          通過下面的第一個(gè)表格 可以知道 如果我們用普通中斷模式 端口B1的中斷 屬于 EXTI1 (如果是PB2 屬于EXTI2), 特殊模式 端口B的中斷屬于EXTIB and EXTID,

          知道這點(diǎn) 后我們結(jié)合手冊(cè)中的中斷向量 表就知道 我們應(yīng)該在哪個(gè)位置寫中斷 入口函數(shù)名了。



          評(píng)論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();