STM32标准库

整理笔记时发现自己如果列举代码,会更加有效。但插入代码块到其中会比较繁琐,而且各个知识的代码的耦合性较强,反复列举较为麻烦,所以开一个新的文章,专门记录整理标准库代码。仅记录个人常用,建议参考手册,或直接跳转函数定义,浏览官方说明。

时钟控制

时钟就像人的心跳,人的运动先需要跳动心脏。STM32的片上外设也是一样,如果要使用外设,例如:GPIO,NVIC,ADC等等,需要先开启外设挂载的总线时钟。

以下是标准库中对时钟控制函数的定义:

1
2
3
4
5
6
//AHB总线时钟控制
void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState);
//APB2总线时钟控制
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);
//APB1总线时钟控制
void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState);

第一个参数为外设,例如APB2的外设:RCC_APB2Periph_GPIOA,RCC_APB2Periph_GPIOB,RCC_APB2Periph_TIM1等,

第二个参数为使能或者失能。(ENABLE/DISABLE)

比如开启APB2的GPIOA为例:

1
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

外设的使用必须先开启时钟。

GPIO

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
//指定GPIO初始化为默认值
void GPIO_DeInit(GPIO_TypeDef* GPIOx);
//功能复用,重新映射事件控制
void GPIO_AFIODeInit(void);
//用结构体参数初始化GPIO
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
//将结构体的变量,赋为初始值
void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct);
//读取指定输入GPIO口的值,返回0/1
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
//读取指定输入GPIO组的数据端口
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
//读取指定输出GPIO口的值,返回0/1
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
//读取指定输出GPIO组的数据端口
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);
//指定端口输出为高电平
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
//指定端口输出为低电平
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
//指定GPIO组的某个GPIO并赋值(高低电平)。
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);
//指定GPIO组,并写入端口输出数据寄存器(ODR寄存器)的值。
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);
//锁定GPIO管脚配置寄存器
void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
//选择用作事件输出的GPIO引脚
void GPIO_EventOutputConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);
//使能输出事件
void GPIO_EventOutputCmd(FunctionalState NewState);
//改变指定管脚的映射,为了更大利用IO口,部分IO口可以进行复用或者映射。
void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState);
//选择 GPIO 管脚用作外部中断源
void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);
//选择以太网媒体接口
void GPIO_ETH_MediaInterfaceConfig(uint32_t GPIO_ETH_MediaInterface);

结构体

1
2
3
4
5
6
typedef struct
{
uint16_t GPIO_Pin; //选择GPIO口
GPIOSpeed_TypeDef GPIO_Speed; //选择运行速度
GPIOMode_TypeDef GPIO_Mode; //配置G
}GPIO_InitTypeDef;

GPIO模式

1
2
3
4
5
6
7
8
9
10
typedef enum
{ GPIO_Mode_AIN = 0x0, //模拟输入
GPIO_Mode_IN_FLOATING = 0x04, //浮空输入
GPIO_Mode_IPD = 0x28, //下拉输入
GPIO_Mode_IPU = 0x48, //上拉输入
GPIO_Mode_Out_OD = 0x14, //开漏输出
GPIO_Mode_Out_PP = 0x10, //推挽输出
GPIO_Mode_AF_OD = 0x1C, //复用开漏
GPIO_Mode_AF_PP = 0x18 //复用推挽
}GPIOMode_TypeDef;

NVIC

1
2
3
4
void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);                  //设置中断优先级分组
void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct); //用结构体参数配置NVIC
void NVIC_SetVectorTable(uint32_t NVIC_VectTab, uint32_t Offset); //设置中断向量表
void NVIC_SystemLPConfig(uint8_t LowPowerMode, FunctionalState NewState); //系统低功耗配置

EXIT

1
2
3
4
5
6
7
8
void EXTI_DeInit(void);              	                   //清除EXTI配置
void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct); //用结构体参数配置EXTI
void EXTI_StructInit(EXTI_InitTypeDef* EXTI_InitStruct); //给结构体赋予默认值
void EXTI_GenerateSWInterrupt(uint32_t EXTI_Line); //软件触发外部中断
FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line); //获取指定的的中断标志位
void EXTI_ClearFlag(uint32_t EXTI_Line); //清除中断标志位
ITStatus EXTI_GetITStatus(uint32_t EXTI_Line); //在中断函数里获取标志位
void EXTI_ClearITPendingBit(uint32_t EXTI_Line); //在中断函数里清除标志位

结构体

1
2
3
4
5
6
7
typedef struct
{
uint32_t EXTI_Line; //指定配置的中断线
EXTIMode_TypeDef EXTI_Mode; //指定中断模式
EXTITrigger_TypeDef EXTI_Trigger; //指定配置的中断线
FunctionalState EXTI_LineCmd; //指定触发中断的模式
}EXTI_InitTypeDef;

TIM

过长,具体参考STM32固件函数库手册。

函数名 描述
TIM_DeInit 将外设 TIMx 寄存器重设为缺省值
TIM_TimeBaseInit 根据 TIM_TimeBaseInitStruct 中指定的参数初始化 间基数单位
TIM_OCInit 根据 TIM_OCInitStruct 中指定的参数初始化外设
TIM_ICInit 根据 TIM_ICInitStruct 中指定的参数初始化外设 T
TIM_TimeBaseStructInit 把 TIM_TimeBaseInitStruct 中的每一个参数按缺省
TIM_OCStructInit 把 TIM_OCInitStruct 中的每一个参数按缺省值填
TIM_ICStructInit 把 TIM_ICInitStruct 中的每一个参数按缺省值填入
TIM_Cmd 使能或者失能 TIMx 外设
TIM _ITConfig 使能或者失能指定的 TIM 中断
TIM_DMAConfig 设置 TIMx 的 DMA 接口
TIM_DMACmd 使能或者失能指定的 TIMx 的 DMA 请求
TIM_InternalClockConfig 设置 TIMx 内部时钟
TIM_ITRxExternalClockConfig 设置 TIMx 内部触发为外部时钟模式
TIM_TIxExternalClockConfig 设置 TIMx 触发为外部时钟
TIM_ETRClockMode1Config 配置 TIMx 外部时钟模式 1
TIM_ETRClockMode2Config 配置 TIMx 外部时钟模式 2
TIM_ETRConfig 配置 TIMx 外部触发
TIM_SelectInputTrigger 选择 TIMx 输入触发源
TIM_PrescalerConfig 设置 TIMx 预分频
TIM_CounterModeConfig 设置 TIMx 计数器模式
TIM_ForcedOC1Config 置 TIMx 输出 1 为活动或者非活动电平
TIM_ForcedOC2Config 置 TIMx 输出 2 为活动或者非活动电平
TIM_ForcedOC3Config 置 TIMx 输出 3 为活动或者非活动电平
TIM_ForcedOC4Config 置 TIMx 输出 4 为活动或者非活动电平
TIM_ARRPreloadConfig 使能或者失能 TIMx 在 ARR 上的预装载寄存器
TIM_SelectCCDMA 选择 TIMx 外设的捕获比较 DMA 源
TIM_OC1PreloadConfig 使能或者失能 TIMx 在 CCR1 上的预装载寄存器
TIM_OC2PreloadConfig 使能或者失能 TIMx 在 CCR2 上的预装载寄存器
TIM_OC3PreloadConfig 使能或者失能 TIMx 在 CCR3 上的预装载寄存器
TIM_OC4PreloadConfig 使能或者失能 TIMx 在 CCR4 上的预装载寄存器
TIM_OC1FastConfig 设置 TIMx 捕获比较 1 快速特征
TIM_OC2FastConfig 设置 TIMx 捕获比较 2 快速特征
TIM_OC3FastConfig 设置 TIMx 捕获比较 3 快速特征
TIM_OC4FastConfig 设置 TIMx 捕获比较 4 快速特征
TIM_ClearOC1Ref 在一个外部事件时清除或者保持 OCREF1 信号
TIM_ClearOC2Ref 在一个外部事件时清除或者保持 OCREF2 信号
TIM_ClearOC3Ref 在一个外部事件时清除或者保持 OCREF3 信号
TIM_ClearOC4Ref 在一个外部事件时清除或者保持 OCREF4 信号
TIM_UpdateDisableConfig 使能或者失能 TIMx 更新事件
TIM_EncoderInterfaceConfig 设置 TIMx 编码界面
TIM_GenerateEvent 设置 TIMx 事件由软件产生
TIM_OC1PolarityConfig 设置 TIMx 通道 1 极性
TIM_OC2PolarityConfig 设置 TIMx 通道 2 极性
TIM_OC3PolarityConfig 设置 TIMx 通道 3 极性
TIM_OC4PolarityConfig 设置 TIMx 通道 4 极性
TIM_UpdateRequestConfig 设置 TIMx 更新请求源
TIM_SelectHallSensor 使能或者失能 TIMx 霍尔传感器接口
TIM_SelectOnePulseMode 设置 TIMx 单脉冲模式
TIM_SelectOutputTrigger 选择 TIMx 触发输出模式
TIM_SelectSlaveMode 选择 TIMx 从模式
TIM_SelectMasterSlaveMode 设置或者重置 TIMx 主/从模式
TIM_SetCounter 设置 TIMx 计数器寄存器值
TIM_SetAutoreload 设置 TIMx 自动重装载寄存器值
TIM_SetCompare1 设置 TIMx 捕获比较 1 寄存器值
TIM_SetCompare2 设置 TIMx 捕获比较 2 寄存器值
TIM_SetCompare3 设置 TIMx 捕获比较 3 寄存器值
TIM_SetCompare4 设置 TIMx 捕获比较 4 寄存器值
TIM_SetIC1Prescaler 设置 TIMx 输入捕获 1 预分频
TIM_SetIC2Prescaler 设置 TIMx 输入捕获 2 预分频
TIM_SetIC3Prescaler 设置 TIMx 输入捕获 3 预分频
TIM_SetIC4Prescaler 设置 TIMx 输入捕获 4 预分频
TIM_SetClockDivision 设置 TIMx 的时钟分割值
TIM_GetCapture1 获得 TIMx 输入捕获 1 的值
TIM_GetCapture2 获得 TIMx 输入捕获 2 的值
TIM_GetCapture3 获得 TIMx 输入捕获 3 的值
TIM_GetCapture4 获得 TIMx 输入捕获 4 的值
TIM_GetCounter 获得 TIMx 计数器的值
TIM_GetPrescaler 获得 TIMx 预分频值
TIM_GetFlagStatus 检查指定的 TIM 标志位设置与否
TIM_ClearFlag 清除 TIMx 的待处理标志位
TIM_GetITStatus 检查指定的 TIM 中断发生与否
TIM_ClearITPendingBit 清除 TIMx 的中断待处理位