板子:Nucleo-F411RE
官方例程:
STM32CubeF4-master\Projects\STM32F411RENucleo\Examples\UART\UART_Printf\MDK-ARM
作用:
把代码里的printf和UART连起来,代码printf的字符串可以PC终端软件上打印。
实际使用问题:
1.自己用CubeMX创建例程,printf不能打印字符,最后是发现没有在魔术棒 / Targer 选项页中勾选use MicroLIB(printf函数的问题)
STM32开发---Keil中使用printf 卡死的解决办法_果果小师弟的博客-CSDN博客
2.我在搞串口时,希望通过PC的串口小助手把字符串发送到单片机UART2(PA2:TX,PA3:RX),然后单片机再打印到电脑。
现象是:发送的字符数一直不对,有时只发送1个,有时只发送2个字符。如下图:
---------------------------------------------
函数说明
1.HAL_UART_Receive_IT(&huart1, proRxBuffer, 3);
函数说明:
通过huart1 接收3个元素(uint8_t 或uint16_t),存在proRxBuffer中,接收3个元素后,执行回调函数HAL_UART_RxCpltCallback函数。
2.HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
函数说明:
阻塞式,在timeout时间内,代码停在原地方。
例如:
HAL_UART_Receive(&huart1, proRxBuffer, 3, 0xffff);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); //亮灯
串口助手依次发送1,2,3,接收到3后,灯才会亮,并且不会执行HAL_UART_RxCpltCallback函数。
小结:
HAL_UART_Receive和HAL_UART_Receive_IT是单片机接收的函数,区别是:
1.HAL_UART_Receive是阻塞的,HAL_UART_Receive_IT不是阻塞的
2.HAL_UART_Receive接收完后,不会调用HAL_UART_RxCpltCallback,
HAL_UART_Receive_IT接收完Size个数据后会调用HAL_UART_RxCpltCallback函数。
题外话:
看到的很多博客上size参数都是1,接收单个数据,然后callback函数里面又调用HAL_UART_Receive_IT接收一个数据。看那博客上写的"开启接收中断",个人觉得这种说法不对或者很难理解。
后面想了下为什么那样写。因为HAL_UART_Receive和HAL_UART_Receive_IT是一次性接收size个字符,而串口助手里面不知道"玩家"实际会输入几个字符,所以采用了单个字符接收,用callback函数嵌套调用HAL_UART_Receive_IT接收,每接收一个元素完又自动调用HAL_UART_RxCpltCallback。
-----------
先写到这儿