历史上的今天
今天是:2025年04月25日(星期五)
2019年04月25日 | STM32Cube的串口配置与使用
2019-04-25 来源:eefocus
1、串口的配置
1)首先打开你的工程,在STM32Cube里面找到USART1,此时串口默认是Disanle的,我们要使能它,选择Asynchronous.

2)然后点击Configuration,就会有一个串口的配置图框,点进去配置串口,如果需要用到中断,选择NVIC进去进行相关配置。

串口配置:

串口中断使能:

--------------------------------------------------------------------------------------------------------------------------------------------------------------------
2、查看串口内的函数API
Keil工程内选择{ }Functions,然后选择你需要查看的目标源文件,展开既是该源码内的函数

串口的发送接收函数:
HAL_UART_Transmit();//串口轮询模式发送,使用超时管理机制
HAL_UART_Receive();//串口轮询模式接收,使用超时管理机制
HAL_UART_Transmit_IT();//串口中断模式发送
HAL_UART_Receive_IT();//串口中断模式接收
HAL_UART_Transmit_DMA();//串口DMA模式发送
HAL_UART_Receive_DMA();//串口DMA模式接收
串口相关的中断函数:
HAL_UART_TxHalfCpltCallback()://一半数据(half transfer)发送完成后,通过中断处理函数调用。
HAL_UART_TxCpltCallback()://发送完成后,通过中断处理函数调用。
HAL_UART_RxHalfCpltCallback()://一半数据(half transfer)接收完成后,通过中断处理函数调用。
HAL_UART_RxCpltCallback():///接收完成后,通过中断处理函数调用。
HAL_UART_ErrorCallback():/传输过程中出现错误时,通过中断处理函数调用。
串口有三种通信模式:
第一种是轮询的模式。CPU不断查询IO设备,如设备有请求则加以处理。例如CPU不断查询串口是否传输完成,如传输超过则返回超时错误。轮询方式会占用CPU处理时间,效率较低。
第二种就是中断控制方式。当I/O操作完成时,输入输出设备控制器通过中断请求线向处理器发出中断信号,处理器收到中断信号之后,转到中断处理程序,对数据传送工作进行相应的处理。
第三种就是直接内存存取技术(DMA)方式。所谓直接传送,即在内存与IO设备间传送一个数据块的过程中,不需要CPU的任何中间干涉,只需要CPU在过程开始时向设备发出“传送块数据”的命令,然后通过中断来得知过程是否结束和下次操作是否准备就绪。
--------------------------------------------------------------------------------------------------------------------------------------------------------------------
3、在main.c文件添加printf支持
/* USER CODE BEGIN 1 */
#ifdef __GNUC__
/* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
set to 'Yes') calls __io_putchar() */
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */
/**
* @brief Retargets the C library printf function to the USART.
* @param None
* @retval None
*/
PUTCHAR_PROTOTYPE
{
/* Place your implementation of fputc here */
/* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
return ch;
}
/* USER CODE END 1 */

--------------------------------------------------------------------------------------------------------------------------------------------------------------------
4、单独串口中断的使用
1)在main函数前面添加两个数组变量
uint8_t aTxStartMessage[] = "rn UART-communication based on IT rn";
uint8_t aRxBuffer[20];
/* USER CODE END PV */
2)在main函数中添加语句接收数据10个字符,保存在数组aRxBuffer中。
HAL_UART_Receive_IT(&huart1, (uint8_t *)aRxBuffer, 10);//串口接收中断使能,如果要循环使用就放到while(1)里面

3)在main.c文件添加中断接收完成回调函数。中断回调函数中将接收到的数据又通过串口发送回去。
/* USER CODE BEGIN 4 */
/**
* @brief Rx Transfer completed callbacks
* @param huart: uart handle
* @retval None
*/
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
/* Prevent unused argument(s) compilation warning */
UNUSED(huart);
/* NOTE : This function should not be modified, when the callback is needed,
the HAL_UART_RxCpltCallback can be implemented in the user file
*/
HAL_UART_Transmit(&huart1, (uint8_t *)aRxBuffer, 10,0xFFFF);//发送10个数据给串口1
HAL_UART_Receive_IT(&huart1,aRxBuffer,10); // 重新使能串口1接收中断
}
/* USER CODE END 4 */
----------------------------------------------------------------------------------------------------------------
5、多个串口同时使用
1)定义串口1和串口3的接收数据变量

2)中断回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
/* Prevent unused argument(s) compilation warning */
UNUSED(huart);
/* NOTE : This function should not be modified, when the callback is needed,
the HAL_UART_RxCpltCallback can be implemented in the user file
*/
if(huart->Instance == USART1)//串口1做调试
{
// HAL_UART_Transmit(&huart1, (uint8_t *)aRxBuffer1, 10,0xFFFF);
RECV_FLAG1 = 1;
HAL_UART_Receive_IT(&huart1,aRxBuffer1,10); // 再次串口接收中断使能
}
else if(huart->Instance == USART2)//串口2接蓝牙
{
HAL_UART_Transmit(&huart1, (uint8_t *)aRxBuffer2, 3,0xFFFF);
RECV_FLAG2 = 1;
HAL_UART_Receive_IT(&huart2,aRxBuffer2,3); //再次串口接收中断使能
}
}

3)主函数编写
Int mai(void)
{
While(1)
{
if(RECV_FLAG2 == 1)
{
RECV_FLAG2= 0;
Car_contrl(aRxBuffer2[0]); //控制协议cmd[3]:cmd[0]=控制码 cmd[1]=0xD cmd[2]= 0xA
}
HAL_UART_Receive_IT(&huart1, (uint8_t *)aRxBuffer1, 10); //串口1接收中断使能
HAL_UART_Receive_IT(&huart2, (uint8_t *)aRxBuffer2, 3); //串口3接收中断使能,所以大小为3:0D 0A 01
}
}

-----------------------------------------------------------------------END--------------------------------------------------------------------------
---------------------
史海拾趣
|
请教大家/我是一个刚开始学rotel dxp2004软件的。我应该从什么方面入手,学的过程应该注意些什么问题,大家有什么好的学习经验。对我们初学者指点下… 查看全部问答> |
|
本帖最后由 paulhyde 于 2014-9-15 09:28 编辑 各位大侠,有没有人做过含贴片元件的印制电路板?是怎么打印到转印纸上的,怎么设置?我的pcb画在了toplayer上的 … 查看全部问答> |
|
WinCE5.0的一个EDB应用程序Debug版可以运行Release版就是老出错 如题: WinCE5.0的一个EDB应用程序Debug版可以运行Release版就是老出错, 痛苦啊! 而且EDB容量还是比较小的,这是烦死了 … 查看全部问答> |
|
急!!!怎么用platform builder生成lib文件! 手上已经有源码,请问怎么用PB5.0生成lib文件呢!!!很急!!!知道该怎么做的大哥大姐能不能把具体流程给我写一下!!!谢谢啦!!!… 查看全部问答> |
|
一个基于DDS的可移相双通道任意波形发生器的设计,可以出波形,我给的锁相环的频率是100MHz,按理论上来说,输出频率应该可以达到0.4*100MHz=40MHz,但是实际出的波形的频率却只有大概20MHz。我想请问各位大侠利用流水线设计的相位累加器可以提高输 ...… 查看全部问答> |




