共计 3184 个字符,预计需要花费 8 分钟才能阅读完成。
GPIO的典型 HAL 函数
初始化引脚工作模式
void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init);
CubeMX设置中已图形化配置,不动。
引脚复位
void HAL_GPIO_DeInit(GPIO_Ty peDef *GPIOx, uint32_t GPIO_Pin);
初始化之后的引脚恢复成默认的状态,即各个寄存器复位时的值。
读取电平
GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
按键触发 :一端通过电阻上拉到高电平,一端接地。STM32 内部自带上拉电阻 (MX 中Input设为上拉)。持续扫描或外部中断。扫描需要延时去抖动。
翻转电平
void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
输出信号
void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);
其中,GPIOx为目标引脚端口号,GPIO_Pin为目标引脚编号,PinState为电平状态。高电平——GPIO_PIN_SET,低电平——GPIO_PIN_RESET。(和 CubeMX 默认设置无关?)
E.G.
if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_13)==GPIO_PIN_RESET)
{
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_9);
While(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_13)==GPIO_PIN_RESET)
}
宏定义
用定义缩写替代原命令
#define KEY2 HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_13)
中断系统
概念
中断、中断源、中断向量、优先级、服务函数
STM32中断通道、中断函数服务可能被多个中断源共用。在中断服务函数入口要设计判断机制。
每个中断都要指定 抢占优先级 和响应优先级。
每个中断源要给定中断号。内核提供嵌套向量中断控制器 NVIC 设备。
外部中断
外部中断 EXTI 是STM32芯片 实时处理外部事件 的一种机制,请求来自于 GPIO 引脚。
STM32有 16 个外部中断源 EXTI0~EXTI15,对应7 个中断向量。0-4专用,5-9共用,10-15共用。
EXTI0的连接引脚为PA0~PG0,以此类推。
触发条件:上升沿、下降沿、双边沿触发。不能配置为高 / 低电平触发。
传统外部中断程序设计:(1)GPIO初始化为输入端口;(2)配置引脚与中断线的映射关系;(3)设置引脚对应的中断触发条件;(4)配置NVIC,使能中断;(5)编写中断服务函数。
传统外部中断程序设计:(1)CubeMX中置顶引脚并配置中断初始化参数(GPIO_EXTI);(2)重写引脚对应的中断回调函数。/在 stm32xx_it.c 中找到 EXTI_IRQHandler 函数,右键寻源找到 CallBack,继续右键寻源找到虚函数。拷贝到main 中重写。
定时器
定时器资源
系统滴答定时器 SysTick,看门狗WatchDog,实时时钟RTC,基本定时器,TIM6、TIM7,通用定时器TIM2-5, 高级定时器 TIM1、TIM8。其中,SysTick 集成在 M 内核中,给 RTOS 提供时钟节拍做时间基准。通用定时器在基本定时器的基础上,实现输出比较、输入捕获、PWM生成、单脉冲模式输出等功能。
STM32通用定时器
可以对内部时钟或触发源以及外部时钟或触发源进行计数。本质为加法计数器。
定时时间 =(可编程预分频器Prescaler+1)x(主计数器Counter Period+1)x1/ 定时器时钟频率
TIM的 MX 配置过程:(1)设置 Clock 时钟源,一般使用内部时钟源;(2)在参数设置中设置 Prescaler 和Counter Period参数,如 Prescaler=31999,Counter=499,Mode=Up;(3)设置NVIC 嵌套向量中断控制器,使能。
定时器溢出回调虚函数:__weak void HAL_TOM_PeropdElapsedCallBack()
需要判断定时器实例:if(htim->Instance == TIM2)
在 main() 函数中启动相应的定时器,虚函数为 stm32c8xx_hal_tim.c 中HAL_TIM_BASE_START。
实例名称在 tim.c 中,如htim2、htim3。
串口收发
CubeMX配置
串口发送
阻塞式发送函数:HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, unint16_t Size, uint32_t Timeout);推荐
非阻塞式发送函数:HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, unint16_t Size);
发送完毕中断回调函数:void HAL_UART_TxCpltCallBack(UART_Handle TypeDef *huart);
发送一半中断回调函数:void HAL_UART_TxHalfCallBack(UART_Handle TypeDef *huart);
非阻塞发送EG
uint8_t Tx_str1[] = ‘Hello World!\r\n’;
HAL_UART_Transmit_IT(&huart1, Tx_str1, sizeof(Tx_str1));
void HAL_UART_TxCpltCallBack(UART_Handle TypeDef *huart)
{
if(huart->Instance == USART1)
{
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_13);
}
}
阻塞发送EG
HAL_UART_Transmit(&huart1, dat_Txd, 5,10000);
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_13);
串口接收
阻塞式接收函数:HAL_StatusTypeDef HAL_UART_Recieve(UART_HandleTypeDef *huart, uint8_t *pData, unint16_t Size, uint32_t Timeout);
非阻塞式接收函数:HAL_StatusTypeDef HAL_UART_Recieve_IT(UART_HandleTypeDef *huart, uint8_t *pData, unint16_t Size); 推荐
接收完毕中断回调函数:void HAL_UART_RxCpltCallBack(UART_Handle TypeDef *huart);
接收一半中断回调函数:void HAL_UART_RxHalfCallBack(UART_Handle TypeDef *huart);
非阻塞 接收EG
uint8_t dat_Rxd = 0;
HAL_UART_Recieve_IT(&huart1, dat_Rxd, 1);
void HAL_UART_RxCpltCallBack(UART_Handle TypeDef *huart)
{
if(huart->Instance == USART1)
{
if(dat_Rxd == 0x5A)
{
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_13);
}
}
}
sprinf函数
#include “stdio.h”
uint8_t Str_buff[64];
sprintf((char*)Str_buff,”温度为:%d摄氏度“,tmp);
虽然看不懂,但是看起来很牛逼的样子就对了 :drooling:
前置笔记,正在试着自己做焊台和红外成像系统