HAL笔记

串口通信

char buf[100];
printf("\r\nYour name: ");
scanf("%s", buf);
printf("\r\nHello, %s!\r\n", buf);

使能串口

__HAL_RCC_USB_CLK_ENABLE(); //开启串口
__HAL_RCC_USB_CLK_DISABLE();  //关闭串口

使能串口中断

HAL_UART_Receive_IT(&UART1_Handler, (u8 *)aRxBuffer, RXBUFFERSIZE);
· HAL_UART_Transmit();串口发送数据,使用超时管理机制
· HAL_UART_Receive();串口接收数据,使用超时管理机制
· HAL_UART_Transmit_IT();串口中断模式发送
· HAL_UART_Receive_IT();串口中断模式接收
· HAL_UART_Transmit_DMA();串口DMA模式发送
· HAL_UART_Transmit_DMA();串口DMA模式接收
· HAL_UART_IRQHandler(UART_HandleTypeDef *huart);  //串口中断处理函数
· HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart);  //串口发送中断回调函数
· HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart);  //串口发送一半中断回调函数(用的较少)
· HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);  //串口接收中断回调函数
· HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart);//串口接收一半回调函数(用的较少)
· HAL_UART_ErrorCallback();串口接收错误函数

端口控制

写入

HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_RESET);

读取

GPIO_PinState pc13pinstate = HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_13);

注意

需要将对应的端口上下拉

中断

mode设置

GPIO_MODE_IT_RISING(外部中断上升沿触发)GPIO_MODE_IT_FALLING(外部中断下降沿触发)
GPIO_MODE_IT_RISING_FALLING(外部 中断双边沿触发)

__weak修饰

__weak void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)

表示可以重写

看门狗

看门狗溢出时间=(分频值×重装值)/ IWDG时钟频率
(图中设置4×4095/32000=0.51s)

img

img

喂狗

HAL_IWDG_Refresh(&hiwdg); //在主程序循环中进行喂狗

看门狗区别

独立看门狗(IWDG) 窗口看门狗(WWDG)
专用的低速时钟(LSI)驱动,能够完全独立工作 APB1时钟分频后得到时钟驱动
避免程序跑飞,死循环,对时间精度要求低的场合 适合那些要求看门狗在精确计时窗口起作用的程序
没有中断,直接复位 有中断,可做复位前操作
计数值<重装值,喂狗 0x40<计数值<窗口值,喂狗

定时器

开启中断

HAL_TIM_Base_Start_IT(&htim2);


void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
    {
        if(htim->Instance == TIM2)
        {
            //用户代码
        }
}

PWM

普通定时器

HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1);
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1,500);
//设置占空比

高级定时器

  • 当Channel1选择 PWM Generation CH1时,使用的函数同普通定时器一样
HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1,500);//设置捕获/比较寄存器的值,是个宏定义
__HAL_TIM_GET_COMPARE也是一个宏定义。 
//在stm32f4xx_hal_tim.h文件中可以找到。其作用是获取定时器某一通道的捕获/比较寄存器值
//等价于 :  HAL_TIM_ReadCapturedValue(&htim5,TIM_CHANNEL_1);
  • 当Channel1选择 PWM Generation CH1N时,需改变启动函数
HAL_TIMEx_PWMN_Start(&htim1,TIM_CHANNEL_1);
  • 当Channel1选择 PWM Generation CH1N时,使用(1)(2)中的函数,此时,会生成两路互补的PWM,
HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);
HAL_TIMEx_PWMN_Start(&htim1,TIM_CHANNEL_1);

编码器

HAL_TIM_Encoder_Start(&htim4,TIM_CHANNEL_1 | TIM_CHANNEL_2);

使用HAL读取编码器数值

int Direction = __HAL_TIM_IS_TIM_COUNTING_DOWN(&htim4);   //读取电机转动方向
int CaptureNumber =	(short)__HAL_TIM_GET_COUNTER(&htim4);//读取编码器数据
__HAL_TIM_GET_COUNTER(&htim4) = 0;							  //计数器值重新置位
————————————————
版权声明:本文为CSDN博主「杰尼君」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_44444810/article/details/120706435

使用寄存器读取编码器数值

int CaptureNumber= (short)TIM4 -> CNT; //读取定时器2的计数值
    TIM4 -> CNT=0;                   	   //清零计数

输入捕获

【STM32】HAL库 STM32CubeMX教程八—定时器输入捕获_Z小旋的博客-CSDN博客_hal库读取定时器的计数值

HAL_TIM_IC_Start_IT()     //函数用于使能定时器某一通道的输入捕获功能,并使能相应的中断
HAL_TIM_IC_Stop_IT()      //函数和开启功能相反,是关闭定时器某一通道的输入捕获功能和相应中断
__HAL_TIM_SET_CAPTUREPOLARITY//修改捕获极性,它不是函数,而是底层操作的一个宏定义
/*————————————————
版权声明:本文为CSDN博主「Z小旋」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/as480133937/article/details/99407485*/

回调函数

void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)

#stm32 #HAL