日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當前位置:首頁 > 單片機 > 單片機
[導讀]先從最簡單的問題開始,用STM32外部中斷的方法實現(xiàn)PB.0按鍵控制PA.0LED燈:先總的說下實現(xiàn)中斷的步驟:1,配置NVIC寄存器(函數(shù)),設置中斷為第幾組,占先優(yōu)先級和次優(yōu)先級; 函數(shù)方法: void NVIC_Configuration()

先從最簡單的問題開始,用STM32外部中斷的方法實現(xiàn)PB.0按鍵控制PA.0LED燈:

先總的說下實現(xiàn)中斷的步驟:

1,配置NVIC寄存器(函數(shù)),設置中斷為第幾組,占先優(yōu)先級和次優(yōu)先級;

函數(shù)方法:

void NVIC_Configuration()
{
NVIC_InitTypeDef NVIC_InitStruct;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStruct.NVIC_IRQChannel=EXTI0_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=0;
NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;
NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStruct);
}

以上為配置優(yōu)先級的一般步驟:設置優(yōu)先級分組,設置中斷通道,分別設置先占優(yōu)先級,次占優(yōu)先級,使能等;



2,配置EXTI寄存器及(函數(shù)),設置中斷線,中斷方式,等;


voidEXTI_Configuration()

{

EXTI_InitTypeDefEXTI_InitStructure;

EXTI_ClearITPendingBit(EXTI_Line0);

GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource0);

EXTI_InitStructure.EXTI_Line=EXTI_Line0;

EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;

EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;

EXTI_InitStructure.EXTI_LineCmd=ENABLE;

EXTI_Init(&EXTI_InitStructure);

}

和配置NVIC一樣,這也是EXTI配置的一般步驟:清除相應中斷線標志位(這個很重要,剛開始一直沒找到這個問題),聯(lián)結(jié)端口與中斷線(也可以在GPIO初始化時配置),選擇中斷線,設置中斷模式,中斷方式,使能等;


3,寫中斷服務函數(shù)

中斷服務程序一般寫在STM32F10X_it.c文件里:


voidEXTI0_IRQHandler(void)

{

if(EXTI_GetITStatus(EXTI_Line0)==SET)

{

EXTI_ClearITPendingBit(EXTI_Line0);

if(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_0)==Bit_RESET)

{

GPIO_SetBits(GPIOA,GPIO_Pin_0);

}

else

{

GPIO_ResetBits(GPIOA,GPIO_Pin_0);

}

}

}

其中最重要的一點:需要注意進入服務程序后清除中斷標志位;


說幾點容易忽略的地方:

1.中斷服務程序一定要清除中斷標志位;

2.聯(lián)結(jié)相應端口與中斷線;

3.按鍵端口設置成上拉輸入;

4.在配置EXTI時清除中斷標志位;

按鍵部分的短路自己連的:



下面是直接操作寄存器的方法:

1.GPIO初始化:這里只要注意GPIOB.0設置成上拉輸入(不光要設置GPIOB->CRL=0X08,還要設置GPIOB->ODR=0X01,為了和下拉區(qū)分)


voidGPIO_Config()

{

GPIOA->CRL=0X03;

GPIOA->ODR=0X01;

GPIOB->CRL=0X08;

GPIOB->ODR=0X01;

}


2. NVIC 初始化:

直接上代碼:


voidNVIC_Configuration()

{

u32temp;

temp=SCB->AIRCR;

temp&=0x0000f8ff;

temp|=0x05fa0000;

temp|=0x0700;

SCB->AIRCR=temp;

NVIC->ISER[0]=1<<6;

NVIC->IP[1]=0;

}

3. EXTI初始化

和用函數(shù)方法差不多,設置幾個寄存器;有點不明白的是這里好像可以不用清除標志位;


voidEXTI_Configuration()

{

AFIO->EXTICR[0]=0X0001;

EXTI->IMR=0X01;

EXTI->RTSR=0X01;

}


然后是中斷服務程序:

voidEXTI0_IRQHandler(void)

{

if(EXTI_GetITStatus(EXTI_Line0)==SET)

{

EXTI->PR=0X01;

if(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_0)==Bit_RESET)

{

GPIO_SetBits(GPIOA,GPIO_Pin_0);

}

else

{

GPIO_ResetBits(GPIOA,GPIO_Pin_0);

}

}

}



下面是整個用函數(shù)代碼:


#include"stm32f10x.h"

voidGPIO_Config();

voidNVIC_Configuration();

voidEXTI_Configuration();

voidSysclkConfiguration();

intmain()

{

SysclkConfiguration();

GPIO_Config();

EXTI_Configuration();

NVIC_Configuration();

while(1);

return0;

}

voidSysclkConfiguration()

{

RCC_DeInit();

RCC_HSEConfig(RCC_HSE_ON);

if(RCC_WaitForHSEStartUp()==SUCCESS)

{

RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);

RCC_PLLCmd(ENABLE);

while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);

RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

while(RCC_GetSYSCLKSource()!=0X08);

RCC_HCLKConfig(RCC_SYSCLK_Div1);

RCC_PCLK1Config(RCC_HCLK_Div2);

RCC_PCLK2Config(RCC_HCLK_Div1);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE);

}

}

voidGPIO_Config()

{

GPIO_InitTypeDefGPIO_InitStructure;

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz;

GPIO

本站聲明: 本文章由作者或相關機構(gòu)授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權益,請及時聯(lián)系本站刪除( 郵箱:macysun@21ic.com )。
換一批
延伸閱讀
關閉