导图社区 stm32库函数总结
stm32单片机入门笔记思维导图版,可以帮助入门SM32单片机的同学快速首先STM32的开发流程。
编辑于2021-10-07 21:39:57STM32f407库函数总结
#include"stm32f4xx.h"
输入输出操控GPIO
硬件核心原理
硬件资源
16组16位的GPIO组
GPIOx(x=1、2、3……16)
硬件连接
所有GPIO组都接在AHB1总线上
GPIO的Pin除了输出或输入高低电平外,还有很多复用功能,具体可查看stm32f4数据手册,或原理图里芯片的引脚。
需引入库函数
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_rcc.h"
GPIOx组初始化步骤
1.定义初始化结构体
定义GPIOx初始化结构体
GPIO_InitTypeDef GpioInitStruct;
2.开启GPIOx组的时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOx, ENABLE);
3.配置GPIOx的初始化结构体各成员变量
配置工作模式
输出模式
GpioInitStruct.GPIO_Mode =GPIO_Mode_OUT;
输入模式
GpioInitStruct.GPIO_Mode =GPIO_Mode_IN;
复用功能
GpioInitStruct.GPIO_Mode =GPIO_Mode_AF;
模拟功能
GpioInitStruct.GPIO_Mode =GPIO_Mode_AN;
选择GPIO组的Pin脚
单独某一个Pin
GpioInitStruct.GPIO_Pin=GPIO_Pin_0;
GpioInitStruct.GPIO_Pin=GPIO_Pin_1;
GpioInitStruct.GPIO_Pin=GPIO_Pin_2;
…………………………
共有15个Pin脚和上面类似的写法,只是数字数字序号不同
组合多个Pin
用按位与连接
GpioInitStruct.GPIO_Pin=GPIO_Pin_1|GPIO_Pin_2;
所有GPIO
GpioInitStruct.GPIO_Pin =GPIO_Pin_All ;
筛去部分Pin
先按位取反再按位与
GpioInitStruct.GPIO_Pin=GPIO_Pin_All&(~GPIO_Pin_1);
是否接上拉下拉电阻
悬空(不接上下拉电阻)
GpioInitStruct.GPIO_PuPd=GPIO_PuPd_NOPULL;
接上拉
GpioInitStruct.GPIO_PuPd=GPIO_PuPd_UP;
接下拉
GpioInitStruct.GPIO_PuPd=GPIO_PuPd_DOWN;
选择输出类型
推挽输出(对高电平输出能力较强)
GpioInitStruct.GPIO_OType =GPIO_OType_PP;
开漏输出
GpioInitStruct.GPIO_OType.GPIO_OType_OD;
设置输出速度
低速
GpioInitStruct.GPIO_Speed =GPIO_Low_Speed;
同GPIO_Speed_2MHz
中速
GpioInitStruct.GPIO_Speed =GPIO_Medium_Speed;
同GPIO_Speed_25MHz
快速
GpioInitStruct.GPIO_Speed =GPIO_Fast_Speed;
同GPIO_Speed_50MHz
高速
GpioInitStruct.GPIO_Speed =GPIO_High_Speed;
同GPIO_Speed_100MHz
4.初始化GPIO
GPIO_Init(GPIOx, &GpioInitStruct);
常用函数
对GPIO组读取操作
读取GPIO组的某个Pin
读取Pin脚输入1位的数据
GPIO_ReadInputDataBit(GPIOx,GPIO_Pin_n);
函数返回值类型
uint8_t
读取Pin脚输出1位的数据
GPIO_ReadOutputDataBit(GPIOx,GPIO_Pin_n);
函数返回值类型
uint8_t
读取整个GPIO组数据
读取GPIOx16位的输入数据
GPIO_ReadInputData(GPIOx);
函数返回值类型
uint16_t
读取GPIO1x16位的输出数据
GPIO_ReadOutputData(GPIOx);
函数返回值类型
uint16_t
对GPIO组写操作
修改GPIO组的某个Pin的值
把某个Pin脚置0
GPIO_ResetBits(GPIOx, GPIO_Pin_n);
把某个Pin脚置1
GPIO_SetBits(GPIOx, GPIO_Pin_n);
把某个Pin修改为0或1
GPIO_WriteBit(GPIOx, GPIO_Pin_n,BitVal);
修改整个GPIO组数据
GPIO_Write( GPIOx, PortVal);
对GPIO组复用功能引脚进行配置
GPIO_PinAFConfig( GPIOx,GPIO_PinSource, GPIO_AF);
其他函数
GPIO_DeInit( GPIOx);
GPIO复位,简单来说就是开启对应GPIO组的RCC时钟后立即关闭时钟
将GPIOx外设寄存器初始化为其默认复位值
GPIO_StructInit(GPIO_InitStruct);
把GPIO初始化结构体的刚刚成员配置为其默认值
用其默认值填充每个GPIO_InitStruct成员
具体默认值可跳转到函数里查看配置
GPIO_PinLockConfig(GPIOx,GPIO_Pin);
锁定GPIO引脚配置寄存器
锁定的寄存器为GPIOx_MODER,GPIOx_OTYPER,GPIOx_OSPEEDR, *GPIOx_PUPDR,GPIOx_AFRL和GPIOx_AFRH。
锁定的GPIO引脚的配置无法再修改 *直到下一次重置。
串口通信USART
硬件核心原理
硬件资源
6组串口
4组USART
USART2
USARRT3
USART6
2组UART
UART4
UART5
硬件连接
UASRT1
接在APB2总线上
TXD发送Pin
PA9
PB6
RXD接收Pin
PA10
PB7
USART2
接在APB1总线上
TXD发送Pin
PA2
PD5
RXD接收Pin
PA3
PD6
USART3
接在APB1总线上
TXD发送Pin
PB10
PC10
PD8
RXD接收Pin
PB11
PC11
PD9
USART6
接在APB2总线上
TXD发送Pin
PC6
PG14
RXD接收Pin
PC7
PG9
UART4
接在APB1总线上
TXD发送Pin
PC10
PA0
RXD接收Pin
PC11
PA1
UART5
接在APB1总线上
TXD发送Pin
PC12
RXD接收Pin
PD2
需引入库函数
#include "stm32f4xx_usart.h"
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_rcc.h"
通用串口初始化步骤
1.定义初始化结构体
定义GPIOx初始化结构体
GPIO_InitTypeDef GpioInitStruct;
定义Usart初始化结构体
USART_InitTypeDef UsartInitStruct;
2.开启对应时钟
开启串口USART时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
开启GPIO组时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOx, ENABLE);
3.配置GPIO组初始化结构体为复用功能
GpioInitStruct.GPIO_Mode =GPIO_Mode_AF;
GpioInitStruct.GPIO_Pin=GPIO_Pin_TXD|GPIO_Pin_RXD;
GpioInitStruct.GPIO_PuPd=GPIO_PuPd_UP;
GpioInitStruct.GPIO_OType =GPIO_OType_PP;
GpioInitStruct.GPIO_Speed =GPIO_High_Speed;
同GPIO_Speed_100MHz
4.初始化GPIO组
GPIO_Init(GPIOx, &GpioInitStruct);
5.配置复用功能为串口
配置发送Pin
GPIO_PinAFConfig(GPIOx, GPIO_PinSource9, GPIO_AF_USART1);
配置接收Pin
GPIO_PinAFConfig(GPIOx, GPIO_PinSource10, GPIO_AF_USART1);
6.配置串口初始化结构体
配置波特率
UsartInitStruct.USART_BaudRate =115200;
配置硬件控制位
没有硬件控制位
UsartInitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
硬件控制RTS
UsartInitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_RTS;
硬件控制CTS
UsartInitStruct.USART_HardwareFlowControl =USART_HardwareFlowControl_CTS;
硬件控制RTS和CTS
UsartInitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_RTS_CTS;
设置工作模式
只发送
UsartInitStruct.USART_Mode = USART_Mode_Tx;
只接收
UsartInitStruct.USART_Mode = USART_Mode_Rx ;
发送和接收
UsartInitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
配置校验位
没有校验位
UsartInitStruct.USART_Parity = USART_Parity_No;
偶校验
UsartInitStruct.USART_Parity = USART_Parity_Even;
奇校验
UsartInitStruct.USART_Parity = USART_Parity_Odd;
配置停止位
0.5个停止位
UsartInitStruct.USART_StopBits =USART_StopBits_0_5 ;
1个停止位
UsartInitStruct.USART_StopBits = USART_StopBits_1;
1.5个停止位
UsartInitStruct.USART_StopBits = USART_StopBits_1_5;
2个停止位
UsartInitStruct.USART_StopBits =USART_StopBits_2;
设置数据长度
8位数据
UsartInitStruct.USART_WordLength = USART_WordLength_8b;
9位数据
UsartInitStruct.USART_WordLength = USART_WordLength_9b;
7.初始化串口
USART_Init(USART1, &UsartInitStruct);
8.使能串口
USART_Cmd (USART1, ENABLE)
串口获取接收数据
USART_ReceiveData( USART1);
函数返回值
uint16_t
串口发送数据
USART_SendData(USART1, Data);
串口发送字符串
定时器TIM
硬件核心原理
硬件资源
14个定时器
硬件分类
高级计时器:TIM1和TIM8
位数16位
支持向上向下中间对齐三种计时方式
可产生DMA请求
4个捕获通道
有互补输出(高级)
32位通用用计时器:TIM2和TIM5
位数32位
支持向上向下中间对齐三种计时方式
可产生DMA请求
4个捕获通道
16通用用计时器:TIM3和TIM4
位数16位
支持向上向下中间对齐三种计时方式
可产生DMA请求
4个捕获通道
16位限制的通用计时器:TIM9~TIM14
位数16位
只支持向上计时方式
不能产生DMA请求
2个捕获通道
基本计时器TIM6和TIM7
位数16位
支持向上向下中间对齐三种计时方式
主要用于驱动DAC
硬件连接
子主题
需引入库函数
#include "stm32f4xx_rcc.h"
#include "stm32f4xx_tim.h"
定时器初始化步骤
1.定义初始化结构体
定义TIMBase初始化结构体
TIM_TimeBaseInitTypeDef TimBaseInitStruct;
2.使能对应的时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
3.配置TIMBase初始化结构体
设置计数重载值即计数多少次
TimBaseInitStruct.TIM_Period=arr;
其实就是设置arr自动重装载寄存器的值
设置时钟频率分频系数
TimBaseInitStruct.TIM_Prescaler=Prescaler;
选择计数模式
向上递增计数
TimBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;
向下递减计数
TimBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Down;
向中对齐先递增后递减计数
中心计数模式1
TimBaseInitStruct.TIM_CounterMode =TIM_CounterMode_CenterAligned1;
计数器交替进行递增计数和递减计数。仅当计数器递减计数时,配置为 输出的通道(TIMx_CCMRx 寄存器中的 CxS=00)的输出比较中断标志才置 1。
中心计数模式2
TimBaseInitStruct.TIM_CounterMode =TIM_CounterMode_CenterAligned2;
计数器交替进行递增计数和递减计数。仅当计数器递增计数时,配置为 输出的通道(TIMx_CCMRx 寄存器中的 CxS=00)的输出比较中断标志才置 1。
中心计数模式3
TimBaseInitStruct.TIM_CounterMode =TIM_CounterMode_CenterAligned3;
计数器交替进行递增计数和递减计数。当计数器递增计数或递减计数 时,配置为输出的通道(TIMx_CCMRx 寄存器中的 CxS=00)的输出比较中断标志都会置 1。
4.初始化定时器TimBase
TIM_TimeBaseInit(TIM3,&TimBaseInitStruct);
5.定时器使能
TIM_Cmd(TIM3,ENABLE);
定时器输出PWM
定时器输入捕获
定时器输出比较
中断处理IRQ
需引入库函数
#include "misc.h"
中断优先级分组
硬件核心原理
4个位用于分配抢占优先级和子优先级
共4个位,2的4次方,最多16级的优先级
分组类型
分组0
0位抢占优先级4位子优先级
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
分组1
1位抢占优先级3位子优先级
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
分组2
2位抢占优先级2位子优先级
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
分组3
4位抢占优先级0位字优先级
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);
设置优先级分组只设置一次!多次设置会导致优先级混乱
外部中断
需引入库函数
#include "stm32f4xx_rcc.h"
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_syscfg.h"
#include "stm32f4xx_exti.h"
#include "misc.h"
外部中断初始化步骤
硬件核心原理
硬件资源
硬件连接
子主题
1.。定义初始化结构体
定义GPIOx初始化结构体
GPIO_InitTypeDef GpioInitStruct;
定义EXTI初始化结构体
GPIO_InitTypeDef ExtiInitStruct;
定义NVIC初始化结构体
GPIO_InitTypeDef NvicInitStruct;
2.开启对应的时钟
1.先开启重映射时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
2.开启GPIOx时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOx, ENABLE);
3.重映射把GPIOx_Pin_n接到外部中断线n
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA,EXTI_PinSource0);
4.配置GPIO为输入模式
GpioInitStruct.GPIO_Mode=GPIO_Mode_IN;
GpioInitStruct.GPIO_Pin=GPIO_Pin_0;
GpioInitStruct.GPIO_PuPd=GPIO_PuPd_DOWN;
5.初始化GPIO
GPIO_Init(GPIOx, &GpioInitStruct);
6.配置外部中断初始化结构体
选择外部中断线
多条线组合
ExtiInitStruct.EXTI_Line=EXTI_Line0|EXTI_Line1;
用按位或连接
单独某一条线
ExtiInitStruct.EXTI_Line=EXTI_Line0;
ExtiInitStruct.EXTI_Line=EXTI_Line1;
ExtiInitStruct.EXTI_Line=EXTI_Line2;
共有22条中断线类似和上面的写法只是数字序号不同
使能外部中断线
ExtiInitStruct.EXTI_LineCmd=ENABLE;
选择外部异常工作模式
事件模式
ExtiInitStruct.EXTI_Mode=EXTI_Mode_Event;
中断模式
ExtiInitStruct.EXTI_Mode=EXTI_Mode_Interrupt;
设置触发方式
上升沿触发
ExtiInitStruct.EXTI_Trigger=EXTI_Trigger_Rising;
下降沿触发
ExtiInitStruct.EXTI_Trigger=EXTI_Trigger_Falling;
边沿触发
ExtiInitStruct.EXTI_Trigger=EXTI_Trigger_Rising_Falling;
7.初始化外部中断
EXTI_Init(&ExtiInitStruct);
8.配置NVIC中断优先级结构体
选择中断频道
ExtiInitStruct.NVIC_IRQChannel=EXTI3_IRQn;
使能中断频道
ExtiInitStruct.NVIC_IRQChannelCmd=ENABLE;
设置中断抢占优先级
ExtiInitStruct.NVIC_IRQChannelPreemptionPriority=0x00;
设置中断子优先级
ExtiInitStruct.NVIC_IRQChannelSubPriority=0x01;
9.初始中断nvic优先级
NVIC_Init(&ExtiInitStruct);
10.编写外部中断服务函数
void EXTI3_IRQHandler (void) { }
中断函数末尾需清除对应中断线标志
EXTI_ClearFlag(EXTI_Line3);
中断函数名可在启动文件startup_stm32f40_41xxx.s中找到
串口中断
需引入库函数
#include "stm32f4xx_usart.h"
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_rcc.h"
#include "misc.h"
串口中断初始化步骤(略)
1.定义NVIC中断初始化结构体
GPIO_InitTypeDef NvicInitStruct;
2.首先调用上面写好的串口初始函数按通用串口初始化步骤走一遍(略)
3.在串口已经成功初始化的情况下
4.开对应类型的串口中断
开启串口接收中断
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
开启串口发送中断
USART_ITConfig(USART1, USART_IT_TXE, ENABLE);
开启串口校验错误中断
USART_ITConfig(USART1,USART_IT_ERR, ENABLE);
还有很多别的类型的串口中断,这里最常用的是上面这三个,其他可去看库函数源码研究
5.配置NVIC中断优先级结构体
选择中断频道
ExtiInitStruct.NVIC_IRQChannel=USART1_IRQn;
使能中断频道
ExtiInitStruct.NVIC_IRQChannelCmd=ENABLE;
设置中断抢占优先级
ExtiInitStruct.NVIC_IRQChannelPreemptionPriority=0x00;
设置中断子优先级
ExtiInitStruct.NVIC_IRQChannelSubPriority=0x01;
6编写中断服务函数
void USART1_IRQHandler (void) { }
中断函数末尾需清除对应中断标志
清除串口接收中断标志
USART_ClearITPendingBit(USART1,USART_FLAG_RXNE);
串口中断需要调用至少一次读取接收数据函数才能完全清除中断标志
USART_ReceiveData(USART1);
中断函数名可在启动文件startup_stm32f40_41xxx.s中找到
定时器中断
子主题
子主题