欢迎大家来到IT世界,在知识的湖畔探索吧!
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);
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/86583.html