Cube是ST公司推出的图形编程软件,其简单易用,可快速配置单片机I/O,系统时钟等,自动生成配置代码,不需要程序员花费大量时间去阅读数据手册。
Cube主界面
配置USART,Mode选择Asynchronous
注意在配置Cube时,需要把SYS->Debug配置为Serial Wire,否则在烧录程序时不能进入调试,从而将芯片锁死。
调用HAL库,串口发送数据
调用HAL库发送函数HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
int Rewrite_Strlen(uint8_t* str)
{
if (str == NULL)
return NULL;
int len=0;
while((*str++)!='\0')
len++;
return len;
}
void UART3_Tx(uint8_t * str)
{
//用UART3发送str中的数据,最大发送时间为0xffff
HAL_UART_Transmit(&huart3,str,(Rewrite_Strlen(str)+1),0xffff);
return;
}
在使用串口打印调试信息的时候,可以对printf()函数重构,定义工程中int fputc(int ch, FILE *f)
,printf()不会执行标准输出到屏幕,而是进入你的驱动程序。但是使用printf()函数,需要配置全库函数。
//UART2_Tx已经重构为printf();
//对printf函数进行重构,将printf映射到串口输出。
//配置全库函数options->libray config->libray->full(全库)
//配置全库函数options->libray config->libray->Tiny(不能打印float/long型数据,适合字符串类打印)
int fputc(int ch, FILE *f)
{
//drive
HAL_UART_Transmit(&huart2, (uint8_t *)&ch, 1, 0xFFFF);
return (ch);
}
调用HAL库,串口发送数据
HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
为HAL串口接收库函数,可以一次接收Size个bit放入pData指针。
uint8_t g_uart1RxBuffer[BUFFSIZE];//定义接收buffer
stUart stUart1 = {
.pRear = g_uart1RxBuffer,
.pFront = g_uart1RxBuffer, //两个指针指向相同的地址空间
};
void UART1_Rx_Start()
{
//UART1串口接收中断开启。
HAL_UART_Receive_IT(&huart1,stUart1.pRear,1);
return;
}
HAL库的回调机制。
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle)
{
if (UartHandle == &huart1) {
UART1_RxCpltCallback(UartHandle);
}
}
void UART1_RxArray_Reset()
{
if (stUart1.pRear == (stUart1.pFront - 1))
return;
//将队列头指针、尾指针重新复位。
while ((stUart1.pFront) < stUart1.pRear) {
stUart1.pRear--;
}
//将huart3接收缓存区指向下一个地址拉回起始地址。
huart2.pRxBuffPtr = stUart1.pRear;
}
接收完成后除了需要清空buffer外,还需要将队列头指针、尾指针重新复位。
void UART1_RxArray_Reset()
{
if (stUart1.pRear == (stUart1.pFront - 1))
return;
//将队列头指针、尾指针重新复位。
while ((stUart1.pFront) < stUart1.pRear) {
stUart1.pRear--;
}
//将huart3接收缓存区指向下一个地址拉回起始地址。
huart2.pRxBuffPtr = stUart1.pRear;
}