您的位置 首页 发布

STM32 按键EXTI方法 运用ST3.0.0库

把IO配置为EXTI中断的步骤:1:使能EXTILine时钟和第二功能时钟。2:配置EXTILine中断优先级(NVIC)3:配置EXTILineIO(哪个…

把IO装备为 EXTI中止的过程:

1:使能EXTI Line时钟和第二功用时钟。

2:装备EXTI Line中止优先级(NVIC

3:装备EXTI Line IO (哪个引脚,输入形式,初始化)

4:把引脚装备为EXTI Line的中止源(GPIO操作),装备IO口的作业形式

5:装备EXTI Line的作业形式。

==============================================================================

例如:

GPIO_InitTypeDef GPIO_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;

/* config the extiline(PB0) clock and AFIO clock 使能extiline IO时钟和第二功用时钟*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE);

/* config the NVIC(PB0) 装备extiline中止优先级*/
NVIC_Configuration();

/* EXTI line gpio config(PB0) 装备EXTI line gpio */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; // 上拉输入
GPIO_Init(GPIOB, &GPIO_InitStructure);

/* EXTI line(PB0) mode config 选定IO EXTI的IO线和IO口的中止形式 */
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource0); //选定PB0为中止源

EXTI_InitStructure.EXTI_Line = EXTI_Line0;//把PB0连接到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_Configuration
* 描绘 :装备嵌套向量中止控制器NVIC
* 输入 :无
* 输出 :无
* 调用 :内部调用
*/
static void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;

/* Configure one bit for preemption priority */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

/* 装备P[A|B|C|D|E]0为中止源 */
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}

接下来要写中止函数了

在stm32f10x_it.c中编写中止服务函数

/* I/O线中止,中止线为PB0 */
void EXTI0_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line0) != RESET) //保证是否产生了EXTI Line中止
{
// LED1 取反
GPIO_WriteBit(GPIOC, GPIO_Pin_3,
(BitAction)((1-GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_3))));
EXTI_ClearITPendingBit(EXTI_Line0); //铲除中止标志位
}
}

要注意的是在中止服务程序完结之后还要记住铲除中止标志位.

这儿要阐明一下中止的分陪

EXTI0

EXTI1

EXTI2

EXTI3

EXTI4

EXTI5-9

EXTI10-15

中止0-4是每个中止线各自用一个中止函数,5-9是共用一个中止函数,10-15共用一个中止函数。

关于中止服务函数的命名的编写办法是:

在startup_stm32f10x_hd.s文件中查找外部中止源

; External Interrupts
DCD WWDG_IRQHandler ; Window Watchdog
DCD PVD_IRQHandler ; PVD through EXTI Line detect
DCD TAMPER_IRQHandler ; Tamper
DCD RTC_IRQHandler ; RTC
DCD FLASH_IRQHandler ; Flash
DCD RCC_IRQHandler ; RCC
DCD EXTI0_IRQHandler ; EXTI Line 0
DCD EXTI1_IRQHandler ; EXTI Line 1
DCD EXTI2_IRQHandler ; EXTI Line 2
DCD EXTI3_IRQHandler ; EXTI Line 3
DCD EXTI4_IRQHandler ; EXTI Line 4
DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1
DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2
DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3
DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4
DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5
DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6
DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7
DCD ADC1_2_IRQHandler ; ADC1 & ADC2
DCD USB_HP_CAN1_TX_IRQHandler ; USB High Priority or CAN1 TX
DCD USB_LP_CAN1_RX0_IRQHandler ; USB Low Priority or CAN1 RX0
DCD CAN1_RX1_IRQHandler ; CAN1 RX1
DCD CAN1_SCE_IRQHandler ; CAN1 SCE
DCD EXTI9_5_IRQHandler ; EXTI Line 9..5
DCD TIM1_BRK_IRQHandler ; TIM1 Break
DCD TIM1_UP_IRQHandler ; TIM1 Update
DCD TIM1_TRG_COM_IRQHandler ; TIM1 Trigger and Commutation
DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare
DCD TIM2_IRQHandler ; TIM2
DCD TIM3_IRQHandler ; TIM3
DCD TIM4_IRQHandler ; TIM4
DCD I2C1_EV_IRQHandler ; I2C1 Event
DCD I2C1_ER_IRQHandler ; I2C1 Error
DCD I2C2_EV_IRQHandler ; I2C2 Event
DCD I2C2_ER_IRQHandler ; I2C2 Error
DCD SPI1_IRQHandler ; SPI1
DCD SPI2_IRQHandler ; SPI2
DCD USART1_IRQHandler ; USART1
DCD USART2_IRQHandler ; USART2
DCD USART3_IRQHandler ; USART3
DCD EXTI15_10_IRQHandler ; EXTI Line 15..10
DCD RTCAlarm_IRQHandler ; RTC Alarm through EXTI Line
DCD USBWakeUp_IRQHandler ; USB Wakeup from suspend
DCD TIM8_BRK_IRQHandler ; TIM8 Break
DCD TIM8_UP_IRQHandler ; TIM8 Update
DCD TIM8_TRG_COM_IRQHandler ; TIM8 Trigger and Commutation
DCD TIM8_CC_IRQHandler ; TIM8 Capture Compare
DCD ADC3_IRQHandler ; ADC3
DCD FSMC_IRQHandler ; FSMC
DCD SDIO_IRQHandler ; SDIO
DCD TIM5_IRQHandler ; TIM5
DCD SPI3_IRQHandler ; SPI3
DCD UART4_IRQHandler ; UART4
DCD UART5_IRQHandler ; UART5
DCD TIM6_IRQHandler ; TIM6
DCD TIM7_IRQHandler ; TIM7
DCD DMA2_Channel1_IRQHandler ; DMA2 Channel1
DCD DMA2_Channel2_IRQHandler ; DMA2 Channel2
DCD DMA2_Channel3_IRQHandler ; DMA2 Channel3
DCD DMA2_Channel4_5_IRQHandler ; DMA2 Channel4 & Channel5

============================================================================

void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource)

把IO引脚装备为 EXTI Line,把IO引脚作为EXTI中止线运用,是IO的第二功用。

GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource0); //选定PB0为中止源(中止线)

==============================================================================

获取中止线的状况

ITStatus EXTI_GetITStatus(uint32_t EXTI_Line)

例如:
if(EXTI_GetITStatus(EXTI_Line0) != RESET) //保证是否产生了EXTI Line中止,也能够不加这条if句子(自己的了解)
{
// LED1 取反
GPIO_WriteBit(GPIOC, GPIO_Pin_3,(BitAction)((1-GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_3))));
EXTI_ClearITPendingBit(EXTI_Line0); //铲除中止标志位
}

============================================================================================

void EXTI_ClearITPendingBit(uint32_t EXTI_Line)

例如:

EXTI_ClearITPendingBit(EXTI_Line0); //铲除中止标志位 Clears the EXTI line pending bits. 清EXTI Line0的中止标志位。

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

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

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

微信扫一扫关注我们

返回顶部