系统相关函数
获取当前系统运行时间函数:返回当前系统运行时间
__weak uint32_t HAL_GetTick(void)
{
return uwTick;
}
延时函数:以毫秒为单位进行延时
__weak void HAL_Delay(uint32_t Delay)
{
//获取当前系统运行时间
uint32_t tickstart = HAL_GetTick();
uint32_t wait = Delay;
if (wait < HAL_MAX_DELAY)
{
wait += (uint32_t)(uwTickFreq);
}
while((HAL_GetTick() - tickstart) < wait)
{
}
}
定时器函数
由于包括定时器函数在内的其他函数内部实现相较GPIO而言比较复杂,因此在此不作解读,只是给出常用函数作为参考
//定时器基础功能开启
HAL_StatusTypeDef HAL_TIM_Base_Start(TIM_HandleTypeDef *htim);
//定时器基础功能关闭
HAL_StatusTypeDef HAL_TIM_Base_Stop(TIM_HandleTypeDef *htim);
//定时器中断功能开启
HAL_StatusTypeDef HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim);
//定时器中断功能关闭
HAL_StatusTypeDef HAL_TIM_Base_Stop_IT(TIM_HandleTypeDef *htim);
//定时器输出比较开启
HAL_StatusTypeDef HAL_TIM_OC_Start(TIM_HandleTypeDef *htim, uint32_t Channel);
//定时器输出比较关闭
HAL_StatusTypeDef HAL_TIM_OC_Stop(TIM_HandleTypeDef *htim, uint32_t Channel);
//定时器输出比较中断开启
HAL_StatusTypeDef HAL_TIM_OC_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel);
//定时器输出比较中断关闭
HAL_StatusTypeDef HAL_TIM_OC_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel);
//PWM输出开启
HAL_StatusTypeDef HAL_TIM_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel);
//PWM输出关闭
HAL_StatusTypeDef HAL_TIM_PWM_Stop(TIM_HandleTypeDef *htim, uint32_t Channel);
注意:记得在使用定时器相关功能之前先打开对应的功能,否则在查了一天的bug之后发现自己没开对应功能的那种感觉真的终生难忘。
串口函数
//串口发送函数
HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);
//串口接收函数(阻塞模式)
HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);
//串口中断发送函数
HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
//串口中断接收函数(非阻塞模式)
HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
//串口DMA模式发送函数
HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
//串口DMA模式接收函数
HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
注意:串口接收函数就像scanf函数一样,会阻塞程序的运行,而串口中断函数则不会阻塞程序的运行。
关于串口重定向
MDK环境下的串口重定向:
//printf的重定向
int fputc(int ch, FILE *f){
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
return ch;
}
//scanf的重定向
int fgetc(FILE *f){
uint8_t ch = 0;
HAL_UART_Receive(&huart1, &ch, 1, 0xffff);
return ch;
}
gcc环境下的串口重定向:
//头文件包含
#include "stdio.h"
#include "stdarg.h"
//printf重定向
int UART_printf(UART_HandleTypeDef *huart, const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
int length;
char buffer[128];
length = vsnprintf(buffer, 128, fmt, ap);
HAL_UART_Transmit(huart, (uint8_t *)buffer, length, HAL_MAX_DELAY);
va_end(ap);
return length;
}
更详细的方法在这篇文章里面有说过,感兴趣的话可以看看。