stm32中断及串口通信进阶
前言
软件版本:
keil5: 5.24.2.0
硬件:
STM32F103C8T6
ST-Link V2
USB TO TTL
一、EXTI外部中断控制灯的亮灭
1、EXTI基本结构(也即中断流程
1)GPIO到AFIO
通过GPIO外设触发中断,进入AFIO中断引脚选择(注:不可以通过同一个GPIO_Pin引脚触发中断,如GPIOA-1与GPIOB-1只能选择同一个进入中断,虽然每个GPIO端都有16个接口到AFIO中断选择,但是一次只能选择一个进入,16的意思只是有16种可能性);
2)AFIO,以及四个其他通道到EXTI
一个引脚触发中断后会进入EXTI边沿检测及控制端,除引脚触发中断外还有4个通道进入EXTI,分别是PVD输出(将低功耗模式下的stm32唤醒),RTC闹钟(有时为了省电,定一个闹钟,stm32会进入停止模式,闹钟响时会借助外部中断,即PVD,唤醒stm32),USB唤醒(与RTC类似),ETH以太网唤醒(与RTC类似);
3)EXTI到NVIC,及其他外设
触发中断后,响应方式有中断响应(即申请中断,会进入NVIC排队)和事件响应(不会进入NVIC,会通向其他外设,触发其他外设操作);触发一般引脚中断后,进入NVIC,会根据响应优先级,将优先级高的先执行,一般抢占优先级优先于响应优先级,相同优先级根据取值排队,取值小的先响应。
2、使用标准库通过keil配置各端口
1)首先配置RCC时钟
注意GPIO与AFIO都是在APB2总线下
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
2)配置GPIO
GPIOB-14
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure);
GPIOA-7
GPIO_InitTypeDef GPIO_InitStructure2;
GPIO_InitStructure2.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure2.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure2.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure2);
3)配置AFIO
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource14);
4)配置EXTI
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_InitStructure.EXTI_Line = EXTI_Line14;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_Init(&EXTI_InitStructure);
5)配置NVIC
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2)
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;