一.配置中斷優先級函式
void EXTI_NVIC_Config(void)
{
NVIC_InitTypeDef NVIC_InitStruct;
/*初始化NVIC結構體 */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
/*設定優先級分組為組一,組的區別具體在教材P133 */
NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn;
/*選擇中斷源為EXTI0(EXTI Line0的中斷源) */
/*注意:*/
/*EXTI0 EXTI1 EXTI2 EXTI3 EXTI4 對應中斷源分別為 EXTI0_IRQn EXTI1_IRQn EXTI2_IRQn EXTI3_IRQn EXTI4_IRQn */
/*EXTI5 EXTI6 EXTI7 EXTI8 EXTI9 對應中斷源分別為 EXTI9_5_IRQn */
/*EXTI10 EXTI11 EXTI12 EXTI13 EXTI14 EXTI15 對應中斷源分別為 EXTI15_10_IRQn */
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;
/* 主優先級(搶占優先級)設定為1 (優先級數字越小,優先級越高) */
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;
/* 子優先級(回應優先級)設定成1 */
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
/*使能NVIC總中斷 */
NVIC_Init(&NVIC_InitStruct);
}
二.GPIO初始化函式(需要包含stm32f10x_gpio.h頭檔案)
1.GPIO初始化函式程式
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/*初始化GPIO結構體 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOx,ENABLE);
/*打開APB2外設GPIOx埠的時鐘 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_標號|GPIO_Pin_標號;
/*管腳位置定義,標號可以是NONE、ALL、 0至15 */
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
/*最高輸出速度為50MHz */
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
/*推挽輸出*/
GPIO_Init(GPIOx,&GPIO_InitStructure); /*GPIOx初始化 */
/*注:以上四行代碼為一組,每組GPIO屬性必須相同,默認的GPIO引數為:ALL,2MHz,FLATING,如果其中任意一行與前一組相應設定相同,那么那一行可以省略,由此推論如果前面已經將此行引數設定為默認引數(包括使用GPIO_InitTypeDefGPIO_InitStructure代碼),本組應用也是默認引數的話,那么也可以省略,以下重復這個程序直到所有應用的管腳全部被定義完畢,*/
}
2.GPIO_Mode的四種輸入、四種輸出模式:
(1)輸入(GPIO調成輸入后不用設定速度)
GPIO_Mode_IPU /*上拉輸入 */
GPIO_Mode_IPD /*下拉輸入 */
GPIO_Mode_AIN /*模擬輸入 */
GPIO_Mode_IN_FLOATING /*浮空輸入(GPIO的 默認電平由外部決定) */
(2)輸出
GPIO_Mode_Out_PP /*普通推挽輸出 */
GPIO_Mode_Out_OD /*普通開漏輸出 */
GPIO_Mode_AF_PP /*復用推挽輸出 */
GPIO_Mode_AF_OD /*復用開漏輸出 */
三.EXTI初始化函式(需要包含stm32f10x_exti.h頭檔案)
void EXTI_Configuration(void)
{
EXTI_InitTypeDef EXTI_InitStruct;
/*初始化EXTI結構體*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
/*打開APB2外設AFIO的時鐘*/
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);
/*配置中斷事件(輸入線選擇PA0作為中斷標志位)*/
EXTI_InitStruct.EXTI_Line = EXTI_Line0;
/*輸入線選擇EXTI_Line0(EXTI_Linex,當x屬于0-15時,代表GPIOx_(0~15))*/
EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt;
/*配置模式為中斷模式*/
/*模式有兩種:*/
/*中斷模式 EXTI_Mode_Interrupt */
/*事件模式 EXTI_Mode_Event */
EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Rising;
/*選擇是上升沿還是下降沿觸發中斷*/
/*觸發方式有三種:*/
/*上升沿 EXTI_Trigger_Rising */
/*下降沿 EXTI_Trigger_Falling */
/*上升沿和下降沿 EXTI_Trigger_Rising_Falling*/
EXTI_InitStruct.EXTI_LineCmd = ENABLE;
/*使能中斷屏蔽事件暫存器*/
EXTI_Init(&EXTI_InitStruct);
}
四.撰寫中斷服務函式
void EXTI0_IRQHandler(void)
/*起名規律:因為使用的是EXTI0的中斷,所以起名為EXTI0的中斷服務函式*/
{
if(EXTI_GetITStatus(EXTI_Line0) == 1)
{
GPIOB->ODR ^= GPIO_Pin_0;
}
/*判斷中斷標志位有沒有置位,如果產生中斷(即條件為真),令PB0翻轉*/
EXTI_ClearITPendingBit(EXTI_Line0);
/*清除中斷標志位,防止一直在中斷里面*/
}
五.主函式
int main(void)
{
EXTI_NVIC_Config(); /*配置中斷優先級*/
GPIO_Configuration(); /*初始化GPIO*/
EXTI_Configuration(); /初始化EXTI*/
EXTI0_IRQHandler(); /*撰寫中斷服務函式*/
}
注意!!
中斷服務函式
void EXTI0_IRQHandler(void)
的函式名不能更改
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/196420.html
標籤:其他
