*秋招自己老早就明白双非根本没机会算法岗,已经转AI模型部署了还是gg,没办法再换个行业吧,舍友和同门抬着我找嵌入式软开工作,自己也不能太拉了,不能辜负他们的好意,就陆续把自己记录一些STM32的知识设置为公开,大家共勉。
一、配置的相关函数
1、初始化函数
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
顾名思义,即初始化一个或者多个IO口的工作方式和速度0,是否复用模式、上下拉等情况
//参数说明 GPIOx:GPIOA~GPIOG
typedef struct
{
uint16_t GPIO_Pin; //指定要初始化的IO口
GPIOSpeed_TypeDef GPIO_Speed; //设置IO口输出速度,可以选择2M 10M 50M
GPIOMode_TypeDef GPIO_Mode; //设置工作模式:8种中的一个
}GPIO_InitTypeDef;
初始化函数示例,这里以GPIO0口,推挽输出模式,50Mhz为例
GPIO_InitTypeDef GPIO_InitStructure; //定义结构体变量
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0; //选择你要设置的IO口
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//设置推挽输出模式
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //设置传输速率
GPIO_Init(GPIOC,&GPIO_InitStructure);/* 初始化GPIO */
其中GPIO口的8种工作模式,4种输入模式分别为:模拟输入、浮空输入、输入上拉、输出下拉,4种输出模式为:开漏输出、推挽输出、开漏复用输出、推挽复用输出。
//定义8种模式
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;
#define IS_GPIO_MODE(MODE) (((MODE) == GPIO_Mode_AIN) || ((MODE) == GPIO_Mode_IN_FLOATING) || \
((MODE) == GPIO_Mode_IPD) || ((MODE) == GPIO_Mode_IPU) || \
((MODE) == GPIO_Mode_Out_OD) || ((MODE) == GPIO_Mode_Out_PP) || \
((MODE) == GPIO_Mode_AF_OD) || ((MODE) == GPIO_Mode_AF_PP))
二、设置管脚输出电平函数
1、设置某个IO口为高电平
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
示例,将E组12管脚设置输出高电压
GPIO_SetBits(GPIOE, GPIO_Pin_12);
2、设置某个IO口为低电平
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
3、两个不常用的的设置IO口输出电平
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);
三、读取管脚输入输出电平函数
1、读取端口中的某个管脚输入电平
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
示例:读取GPIOB.1的输入电平
GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1);
2、读取某组端口的输入电平
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
示例:读取GPIOB组的输入电平
GPIO_ReadInputData(GPIOB);
3、读取端口中的某个管脚输出电平
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
示例:读取GPIOB.1的输出电平
GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_1);
4、读取某组端口的输出电平
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);
示例:读取GPIOB组的输出电平
GPIO_ReadOutputData(GPIOB);
四、反转函数
翻转 IO 口输出电平
void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
例如翻转GPIOB.1的输出电平
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_1);
五、外部中断服务函数
外部中断服务函数,有两个功能,一、清除中断标志位,二、2是调用回调函数。在HAL库中,中断运行结束后不会立刻退出,而是会先进入相对应的中断回调函数,处理该函数中的代码之后,才会退出中断,所以在HAL库中我们一般将中断需要处理代码放在中断回调函数中,
HAL_GPIO_EXTI_IRQHandler();
例如:
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_3);
六、中断回调函数
中断函数具体要响应的动作
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)