常用的是推挽输出和上拉输入

代码写在各个begin和end之间,才不会在重新生成工程的时候被清除掉

操作io

读引脚,返回值为GPIO_PIN_RESET 和GPIO_PIN_SET //可以直接写成0和1
GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
写引脚,GPIO_PinState的可用性为GPIO_PIN_RESET 和GPIO_PIN_SET //可用性最好不要写0和1
void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);
翻转引脚电平
void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);

外部中断

1.将引脚配置为GPIO_EXTI13,配置后在RCC选项中还要去使能NVIC
2.重写中断回调函数的实现,写在main函数外的begin和end之间
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {
if(GPIO_Pin == GPIO_PIN_13) { //判断是否为对应的外部中断引脚
//写逻辑
}

if(GPIO_Pin == GPIO_PIN_5) { //不同引脚的外部中断写在用一个回调函数里面
//写逻辑
}
}

定时器

1.设置时钟源clock source 为 internal clock
2.设置参数prescaler与counter period,定时时间=(prescaler+1 * period+1)/时钟频率
例:(31999+1 * 499+1 )/32000000=定时时间为0.5s
3.使能NVIC 设置

4.重写定时器回调函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {
if(htim->Instance == TIM2) { //写定时器2的逻辑函数
//写逻辑
}

if(htim->Instance == TIM3) { //不同定时器的逻辑函数写在用一个回调函数里面
//写逻辑
}
}

5.启动定时器,写在定时器初始化后的注释中
HAL_TIM_Base_Start_IT(&htim2);

串口

1.connectivity-USART1配置串口
模式Asynchronous(异步)
配置好波特率以及串口的模式(发送与接收)
2.使能NVIC 设置
3.初始化发送与接收数据的位置,写在串口初始化的后面
HAL_UART_Transmit(&huart1, Tx_str1, sizeof(Tx_str1), 10000);//阻塞式发送
HAL_UART_Receive_IT(&huart1, &Rx_dat, 1);//非阻塞式接收
3.重写发送或接收完毕中断回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {//接收完毕中断回调函数
if(huart->Instance == USART1) {
if(Rx_dat == 0x51) {
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_SET);
}
}
}

串口常用函数

HAL库中串口发送的重要函数
■阻塞式发送函数(初学者,推荐使用)
HAL_Status TypeDef HAL_UART_Transmit(UART_Handle TypeDef *huart,
uint8_t *pData,
uint16_t Size,
uint32_t Timeout);
■非阻塞式发送函数
HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_Handle TypeDef *huart,
uint8_t *pData,
uint16_t Size);
■发送完毕中断回调函数
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart);
void HAL_UART_TxHalfCpltCallback(UART_Handle TypeDef *huart);

HAL库中串口接收的重要函数
■阻塞式接收函数
HAL_StatusTypeDef HAL_UART_Receive(UART_Handle' TypeDef *huart,
uint8_t *pData,
uint16_t Size,
uint32_t Timeout);
■非阻塞式接收函数(推荐使用)
HAL_StatusTypeDef HAL_UART_Receive_JT(UART_Handle TypeDef *huart,
uint8_t *pData,
uint16_t Size);
■接收完毕中断回调函数
void HAL_UART_RxCpltCallback(UART_Handle TypeDef *huart);
void HAL_UART_RxHalfCpltCallback(UART_Handle TypeDef *huart);

ADC

从PA0到PB1有十个通道可供选择(f103)
如需要使用中断要打开中断使能

查询法
void ADC_GetValue() {
HAL_ADC_Start(&hadc1); //开启adc
LED_ON();
if(HAL_OK == HAL_ADC_PollForConversion(&hadc1, 10)) {//转换查询adc是否转换ok
ADC_Value = HAL_ADC_GetValue(&hadc1);
ADC_Volt = ADC_Value * 3300 / 4096; //电压值 = 采样值 * 3.3v / 2的12次方
}
UART_SendInfo();
LED_OFF();
HAL_ADC_Stop(&hadc1); //关闭adc
}


中断法
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc) {
if(hadc->Instance == ADC1) {
ADC_Value = HAL_ADC_GetValue(&hadc1);
ADC_Volt = ADC_Value * 3300 / 4096; //电压值 = 采样值 * 3.3v / 2的12次方
UART_SendInfo();
LED_OFF();
}
}
在主函数中执行adc的打开 HAL_ADC_Start_IT(&hadc1);

OLED

在头文件文件夹中有oled对应的stm32cube对应的头文件
确认好配置移植进工程就可以了

文件下载地址: 点击下载