一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

[轉(zhuǎn)載]STM學習筆記(15)-外部引腳中斷使用

 cuizb2583 2014-11-17
這里描述的僅僅只是諸多可能性中的一種,并不表示以下內(nèi)容全部正確,因為Contex的中斷和8位單片機的相比,真的是太復雜了。

      我想要實現(xiàn)的功能

       PD0,PD1,PD2作為輸入管腳,使用它們的下降沿觸發(fā),分別令PD8,PD9,PD10管腳上的電平取反。

      實現(xiàn)的過程

       (1)管腳配置:這個不復雜,分別把PD0…PD2配置成Float Input,將PD8…PD10配置成推挽輸出即可,這里不再寫出源代碼。

       (2)外部中斷線配置:

       這里需要說明,在STM32內(nèi)部有19條外部中斷線,但是它們并不完全確定連接到哪些位置。其中EXTI0線可以和以下這些引腳連接:

[轉(zhuǎn)載]STM學習筆記(15)-外部引腳中斷使用

       其他的就不一一列舉了,16條線分別可能和一組I/O中的16條引線連接在一起。這是通過EXTIO[3:0]這組寄存器來設置的。那么用STM32的庫編程的話,庫函數(shù)是什么,在什么位置呢?(以3.1.2庫為例)

       設置管腳與中斷線連接的函數(shù)不在stm32f10x_exti.c中,而是在stm32f10x_gpio.c中。

void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource)

{……

}

       參數(shù)是兩個字節(jié)型變量,分別指定端口,及端口中指定的管腳,這些當然也是有預定義的。這些預定義在stm32f10x_gpio.h頭文件中。

下面給出的例子:

 

       GPIO_EXTILineConfig(GPIO_PortSourceGPIOD, GPIO_PinSource0)    ;

       GPIO_EXTILineConfig(GPIO_PortSourceGPIOD, GPIO_PinSource1)    ;

       GPIO_EXTILineConfig(GPIO_PortSourceGPIOD, GPIO_PinSource2)    ;

看了例子,如果要配置其他的管腳,應該可以依葫蘆畫瓢了。[轉(zhuǎn)載]STM學習筆記(15)-外部引腳中斷使用

這樣19條外中斷線就清楚了。

(3)對EXTI各引線如何中斷進行設置

       這些先直接給出代碼:

void Exti_Config(void)

    EXTI_InitTypeDef  EXTI_InitStructure;

       EXTI_InitStructure.EXTI_Line = EXTI_Line0|EXTI_Line1|EXTI_Line2;

//哪些線將被配置

       EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;

//中斷模式還是事件模式

 

       EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿觸發(fā)

 

       EXTI_InitStructure.EXTI_LineCmd = ENABLE; //中斷線使能

如果沒有這行,那么設置就無法進行了,看一看XTI_Init的代碼:

void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct)

{

       ……

        if (EXTI_InitStruct->EXTI_LineCmd != DISABLE)

      {……各種設置都在下面的代碼中進行,而執(zhí)行到的條件是上面那行程序;

       }

*/

       EXTI_Init(&EXTI_InitStructure);              //初始化中斷

 

       EXTI_GenerateSWInterrupt(EXTI_Line0|EXTI_Line1|EXTI_Line2);

 

#define EXTI_Line1       ((uint32_t)0x00002) 

#define EXTI_Line2       ((uint32_t)0x00004) 

*/

所以綜合起來,這么寫就是允許這三條線中斷

}

(4)還要對NVIC寄存器進行配置

void NVIC_Configuration(void)

{     NVIC_InitTypeDef NVIC_InitStructure;

       

      NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);

 

       #ifdef  VECT_TAB_RAM 

        

         NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);

       #else 

        

         NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);  

       #endif

 

 

       NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; //中斷通道

       NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 7;//優(yōu)先級設定

       NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //次優(yōu)先級

       NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //通道中斷使能

       NVIC_Init(&NVIC_InitStructure);                           //初始化中斷

////允許EXTI1中斷

       NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn; //中斷通道

       NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 7;//優(yōu)先級設定

       NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //次優(yōu)先級

       NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //通道中斷使能

       NVIC_Init(&NVIC_InitStructure);                           //初始化中斷

////允許EXTI2中斷

      NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn; //中斷通道

       NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 7;//優(yōu)先級設定

       NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; //次優(yōu)先級

       NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //通道中斷使能

       NVIC_Init(&NVIC_InitStructure); //初始化中斷

}

此外,這里要提醒一點:

      NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn; //中斷通道

       這其中的:EXTI2_IRQn是新版本的庫中所使用的符號,在2.0版本(也許還有其他版本)中,是這么樣來寫的:

       NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQChannel;

至此,配置工作完成。

       (5)我的中斷程序在哪里?

       隨便找個st的例子程序,打開stm32f10x_it.c可以看到里面已先寫好了一些中斷處理程序,如:[轉(zhuǎn)載]STM學習筆記(15)-外部引腳中斷使用

       如果是51單片機的話,會有個關鍵字:interrupt 后加個數(shù)字來說明究竟是哪一級中斷,這樣,中斷函數(shù)的名字可以隨便起??墒?,這里看來,這些函數(shù)就像是普通的函數(shù),并沒有什么特別的,那么我們要增加的3 個中斷處理函數(shù)起什么名字呢?這回用到的工具是:Fined in File,就是下面的對話框:[轉(zhuǎn)載]STM學習筆記(15)-外部引腳中斷使用

以SysTick_Handler為關鍵字在文件中搜一下,找到線索了,原來在這里:[轉(zhuǎn)載]STM學習筆記(15)-外部引腳中斷使用

那么我們在stm32f10x_it.c中寫上:

void EXTI0_IRQHandler(void)

//這個就是處理外中斷線0(目前連到PD0上)中斷的代碼的

   

    EXTI_ClearITPendingBit(EXTI_Line0);      //0.17US

       GPIO_WriteBit(GPIOD, GPIO_Pin_8, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOD, GPIO_Pin_8))); //0.5US

}

余者不多言,相差無幾。

至此,該解決的問題都已解決,下面就運行一下,看一看效果了。

進行軟件仿真,打開Peripherals->External Interrupt,可見下面的圖:[轉(zhuǎn)載]STM學習筆記(15)-外部引腳中斷使用

單步執(zhí)行到所有設置代碼完成,可以看到變成這樣:[轉(zhuǎn)載]STM學習筆記(15)-外部引腳中斷使用

這里的變化,對照著數(shù)據(jù)手冊上的變化,可以一一解讀,并不困難,這里就不再說明了。

       接下來的軟件仿真和硬件測試都能夠達到當初的設計目標,但程序是否最優(yōu),是否存在著不合理之處,很不好說,因為STM32的中斷實在是夠復雜的。這個留著后面繼續(xù)學習的螺旋式上升中提高吧!


    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    亚洲熟女熟妇乱色一区| 亚洲国产色婷婷久久精品| 中国黄色色片色哟哟哟哟哟哟| 亚洲国产精品久久琪琪| 久久永久免费一区二区| 五月综合婷婷在线伊人| 福利新区一区二区人口| 在线欧洲免费无线码二区免费| 欧美大粗爽一区二区三区| 1024你懂的在线视频| 高清一区二区三区不卡免费| 午夜直播免费福利平台| 中文字幕乱码亚洲三区| 中日韩美一级特黄大片| 五月婷婷六月丁香在线观看| 99精品国产一区二区青青 | 日韩在线视频精品中文字幕| 欧美激情视频一区二区三区| 午夜成年人黄片免费观看| 欧美一区二区三区不卡高清视| 久久热麻豆国产精品视频| 国产又粗又猛又爽又黄的文字| 五月综合激情婷婷丁香| 五月激情婷婷丁香六月网| 99久只有精品免费视频播放| 精品午夜福利无人区乱码| 日韩丝袜诱惑一区二区| 国产欧美一区二区另类精品| 日韩精品区欧美在线一区| 午夜小视频成人免费看| 午夜精品一区免费视频| 国产精品免费视频久久| 狠狠干狠狠操在线播放| 精品一区二区三区乱码中文| 国产精品免费精品一区二区| 插进她的身体里在线观看骚| 国产亚洲神马午夜福利| 好吊日在线视频免费观看| 欧美一级不卡视频在线观看| 婷婷开心五月亚洲综合| 91人妻人澡人人爽人人精品|