一、前言
1、STM32芯片组成
ARM内核+ST设计的外围电路
2、系统结构
3、工程架构
二、GPIO
1、GPIO简介
1、GPIO通用输入输出口
2、引脚电平:0~3.3V
3、输出模式:输出高低电平、驱动LED、蜂鸣器等
4、输入模式:读取端口电平、ADC电压采集、读取按键输入等
2、GPIO基本结构
GPIO挂载在APB2总线上
3、GPIO八种模式
4、GPIO程序步骤
1、使用RCC开启GPIO的时钟
作用:使能(开启)或失能(关闭)APB2外设时钟
RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)
参数 | 说明 | 示例 |
RCC_APB2Periph | 指明需要开启的是哪一个APB2外设 | RCC_APB2Periph_AFIO, RCC_APB2Periph_GPIOA, RCC_APB2Periph_GPIOB, RCC_APB2Periph_GPIOD, RCC_APB2Periph_GPIOE, RCC_APB2Periph_GPIOF, RCC_APB2Periph_GPIOG, RCC_APB2Periph_ADC1, RCC_APB2Periph_ADC3, RCC_APB2Periph_USART1, RCC_APB2Periph_SPI1, RCC_APB2Periph_TIM1, RCC_APB2Periph_TIM16, RCC_APB2Periph_TIM17, RCC_APB2Periph_TIM10, RCC_APB2Periph_TIM11 |
NewState | NewState:指定外设时钟的新状态 | ENABLE(打开) DISABLE(关闭) |
2、使用GPIO_Init函数初始化GPIO
作用:根据GPIO_InitStruct中的指定参数初始化GPIOx外设
GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)
参数 | 说明 | 示例 |
GPIOx | 其中x可以为(A…G)选择GPIO外设。 | GPIOA, GPIOB, GPIOD, GPIOE, GPIOF, GPIOG, |
GPIO_InitStruct | 指向GPIO InitTypeDef结构的指针,该结构包含指定GPIO外设的配置信息。 | typedef struct {
|
参数说明:
3、使用输出或者输入的函数控制GPIO口
写引脚:
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal); //可以对16个端口同时写入
读引脚:
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); //读取某一位
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx); //读取整个寄存器
翻转:
if(GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_5)==0) //读输出引脚
{
GPIO_SetBits(GPIOB, GPIO_Pin_5); //翻转
}
else
{
GPIO_ResetBits(GPIOB, GPIO_Pin_5);
}
三、外部中断EXIT
1、中断简介
主程序运行中,发生中断时,使CPU暂停当前正在运行的程序,转去处理中断程序,处理完后又返回原来被暂停的位置继续运行
有68个可屏蔽中断源,包括了EXIT、TIM、ADC、USART、SPI、I2C、RTC等多个外设
2、NVIC简介
NVIC:嵌套向量中断控制器。用来管理中断
NVIC基本结构:
NVIC优先级分组:
3、EXIT简介
外部中断,检测GPIO口的电平,当指定的GPIO发生变化,向NVIC发送中断信号,产生中断
触发方式:1、上升沿
2、下降沿
3、双边沿
4、软件触发
支持的GPIO口:所有GPIO口。但不同组的相同Pin不能同时触发。例如:PA0、PB0、PC0等
触发方式:中断响应(触发中断) / 事件响应(不触发中断,中断信号不传给CPU处理,而是触发其他外设)
4、EXIT基本结构
5、AFIO复用IO口
作用:复用引脚重映射、中断引脚选择
6、EXIT程序步骤
1、配置RCC,将程序涉及外设的时钟都打开(有GPIO和AFIO)
RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)
2、使用GPIO_Init函数初始化GPIO
GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)
3、配置AFIO
作用:选择硬件所用的那一路GPIO,连接到后面的EXTI作用。
void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource)
参数 | 说明 | 示例 |
GPIO_PortSource | 选择要用作EXTI线路源的GPIO端口 | GPIO_PortSourceGPIOA, GPIO_PortSourceGPIOB, GPIO_PortSourceGPIOD, GPIO_PortSourceGPIOE, GPIO_PortSourceGPIOF, GPIO_PortSourceGPIOG, |
GPIO_PinSource | GPIO_PinSource:要配置的EXTI线路 | GPIO_PinSource0 GPIO_PinSource1 ...... GPIO_PinSource15 |
4、配置EXTI
作用:1、选择边沿触发方式,比如上升沿、下降沿或者双边沿,还有选择触发响应方式,可以选择中断响应和事件响应
2、根据EXTI InitStruct中的指定参数初始化EXTI外设
void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct)
参数说明:
参数 | 说明 | 示例 |
EXTI_InitStruct | 指向EXTI InitTypeDef结构体的指针包含EXTI外设的配置信息。 | typedef struct {
|
5、配置NVIC
1.1、配置优先级分组,抢占优先级和响应优先级
void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)
参数说明:
参数 | 说明 | 示例 |
NVIC_PriorityGroup | 指定优先级分组位长度。 | NVIC_PriorityGroup_0(0位抢占,4位响应) NVIC_PriorityGroup_1(1位抢占,3位响应) NVIC_PriorityGroup_2(2位抢占,2位响应) NVIC_PriorityGroup_3(3位抢占,1位响应) NVIC_PriorityGroup_4(4位抢占,0位响应) |
1.2、初始化NVIC
void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct)
参数说明:
6、实现中断函数
中断向量表:
根据中断向量表,找到所需中断函数,这里面以IRQHandler结尾的字符串就是中断函数的名字,再根据名字写中断函数。
void EXTI3_IRQHandler(void)
{
if(EXTI_GetITStatus(uint32_t EXTI_Line)==1) //判断中断标志位是否设置
{
/*
中断执行的任务
*/
}
EXTI_ClearITPendingBit(uint32_t EXTI_Line); //最后要清除中断标志位,结束中断
}
常用的EXIT函数:
EXTI_GetITStatus(uint32_t EXTI_Line); //检查指定的外部中断上的中断标志是否被设置。
EXTI_ClearITPendingBit(uint32_t EXTI_Line); //清除中断标志位,结束中断
四、TIM定时中断
1、TIM简介
STM32的定时器拥有16位计数器、预分频器、自动重装载寄存器的时基单元,在72MHZ计数时钟下可以实现最大59.65s的定时
不仅具备基本定时中断功能,还包括内外时钟源选择、输入捕获、输出比较、主从触发等模式
通用、基本、高级定时器基本频率都是72MHZ
2、定时器类型
3、定时器中断基本结构
4、时钟树
5、定时器中断程序步骤
1.1、定时器内部时钟
1、开启定时器的RCC时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //开启TIM2时钟