您的位置 首页 软件

STM32单片机完成外部中止的过程及办法

STM32单片机实现外部中断的步骤及方法-和配置NVIC一样,这也是EXTI配置的一般步骤:清除相应中断线标志位(这个很重要,刚开始一直没找到这个问题),联结端口与中断线(也可以在GPIO初始化时配置),选择中断线,设置中断模式,中断方式,使能等;

先从最简略的问题开端,用STM32外部中止的办法完成PB.0按键操控PA.0LED灯:

先总的说下完成中止的过程:

1,装备NVIC寄存器(函数),设置中止为第几组,占先优先级和次优先级;

函数办法:

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);

}

以上为装备优先级的一般过程:设置优先级分组,设置中止通道,别离设置先占优先级,次占优先级,使能等;

STM32单片机完成外部中止的过程及办法

2,装备EXTI寄存器及(函数),设置中止线,中止办法,等;

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装备的一般过程:铲除相应中止线标志位(这个很重要,刚开端一向没找到这个问题),联合端口与中止线(也能够在GPIO初始化时装备),挑选中止线,设置中止形式,中止办法,使能等;

3,写中止服务函数

中止服务程序一般写在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.联合相应端口与中止线;

3.按键端口设置成上拉输入;

4.在装备EXTI时铲除中止标志位;

按键部分的短路自己连的:

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

1.GPIO初始化:这儿只需留意GPIOB.0设置成上拉输入(不光要设置GPIOB-》CRL=0X08,还要设置GPIOB-》ODR=0X01,为了和下拉区别)

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初始化

和用函数办法差不多,设置几个寄存器;有点不明白的是这儿如同能够不必铲除标志位;

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);

}

}

}

下面是整个用函数代码:

#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

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qianrushi/ruanjian/346777.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部