你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32Cube的串口配置与使用

[复制链接]
STMCU小助手 发布时间:2022-5-17 21:00
一、串口的配置
1)首先打开你的工程,在STM32Cube里面找到USART1,此时串口默认是Disanle的,我们要使能它,选择Asynchronous.

`9~_`JB[)[BD{2{K7NO)`TO.png

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

}O[87W3U_`G0[F{DJI6]@LK.png

串口配置:

CX9P9I(33K}1`[RLAIS$I@U.png


串口中断使能:

20181128090413451.png

点击NVIC选项,设置优先级和分组

%_Y)~A)RVNEGF1WA[5ZWT~8.png

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

`58NA6Y2WF}WPFLQZ~{7@AY.png


串口的发送接收函数:

  1. HAL_UART_Transmit();//串口轮询模式发送,使用超时管理机制

  2. HAL_UART_Receive();//串口轮询模式接收,使用超时管理机制

  3. HAL_UART_Transmit_IT();//串口中断模式发送

  4. HAL_UART_Receive_IT();//串口中断模式接收

  5. HAL_UART_Transmit_DMA();//串口DMA模式发送

  6. HAL_UART_Receive_DMA();//串口DMA模式接收
复制代码

串口相关的中断函数:

  1. HAL_UART_TxHalfCpltCallback()://一半数据(half transfer)发送完成后,通过中断处理函数调用。

  2. HAL_UART_TxCpltCallback()://发送完成后,通过中断处理函数调用。

  3. HAL_UART_RxHalfCpltCallback()://一半数据(half transfer)接收完成后,通过中断处理函数调用。

  4. HAL_UART_RxCpltCallback():///接收完成后,通过中断处理函数调用。

  5. HAL_UART_ErrorCallback():/传输过程中出现错误时,通过中断处理函数调用。
复制代码

串口有三种通信模式:

第一种是轮询的模式。CPU不断查询IO设备,如设备有请求则加以处理。例如CPU不断查询串口是否传输完成,如传输超过则返回超时错误。轮询方式会占用CPU处理时间,效率较低。

第二种就是中断控制方式。当I/O操作完成时,输入输出设备控制器通过中断请求线向处理器发出中断信号,处理器收到中断信号之后,转到中断处理程序,对数据传送工作进行相应的处理。

第三种就是直接内存存取技术(DMA)方式。所谓直接传送,即在内存与IO设备间传送一个数据块的过程中,不需要CPU的任何中间干涉,只需要CPU在过程开始时向设备发出“传送块数据”的命令,然后通过中断来得知过程是否结束和下次操作是否准备就绪。

三、在main.c文件添加printf支持
  1. /* USER CODE BEGIN 1 */

  2. #ifdef __GNUC__

  3.        /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
  4.      set to 'Yes') calls __io_putchar() */

  5. #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)

  6. #else
  7.   #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)

  8. #endif /* __GNUC__ */

  9. /**
  10.   * @brief  Retargets the C library printf function to the USART.
  11.   * @param  None
  12.   * @retval None
  13.   */
  14. PUTCHAR_PROTOTYPE
  15. {
  16. /* Place your implementation of fputc here */
  17.   /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */
  18.   HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
  19.   return ch;
  20. }

  21. /* USER CODE END 1 */


复制代码

}9NCWZ)Z2XKQX]F$Y@)0]X8.png

四、单独串口中断的使用
1)在main函数前面添加两个数组变量

  1. uint8_t aTxStartMessage[] = "\r\n UART-communication based on IT \r\n";

  2. uint8_t aRxBuffer[20];
  3. /* USER CODE END PV */
复制代码

2)在main函数中添加语句接收数据10个字符,保存在数组aRxBuffer中。

  1. HAL_UART_Receive_IT(&huart1, (uint8_t *)aRxBuffer, 10);//串口接收中断使能,如果要循环使用就放到while(1)里面
复制代码

IGX`DZRO42[24L[O2YE$(%M.png

3)在main.c文件添加中断接收完成回调函数。中断回调函数中将接收到的数据又通过串口发送回去。

  1. /* USER CODE BEGIN 4 */
  2. /**
  3.   * @brief Rx Transfer completed callbacks
  4.   * @param huart: uart handle
  5.   * @retval None
  6.   */
  7. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
  8. {
  9.   /* Prevent unused argument(s) compilation warning */
  10.   UNUSED(huart);

  11.   /* NOTE : This function should not be modified, when the callback is needed,
  12.             the HAL_UART_RxCpltCallback can be implemented in the user file
  13.    */
  14.     HAL_UART_Transmit(&huart1, (uint8_t *)aRxBuffer, 10,0xFFFF);//发送10个数据给串口1
  15.     HAL_UART_Receive_IT(&huart1,aRxBuffer,10);      // 重新使能串口1接收中断  
  16. }

  17. /* USER CODE END 4 */
复制代码

五、多个串口同时使用

1)定义串口1和串口3的接收数据变量

20181128090413546.png

2)中断回调函数

  1. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
  2. {
  3. /* Prevent unused argument(s) compilation warning */
  4.   UNUSED(huart);

  5.   /* NOTE : This function should not be modified, when the callback is needed,
  6.             the HAL_UART_RxCpltCallback can be implemented in the user file
  7.    */
  8.         if(huart->Instance ==  USART1)//串口1做调试
  9.         {
  10.            // HAL_UART_Transmit(&huart1, (uint8_t *)aRxBuffer1, 10,0xFFFF);

  11.              RECV_FLAG1 = 1;

  12.             HAL_UART_Receive_IT(&huart1,aRxBuffer1,10);  // 再次串口接收中断使能
  13.         }

  14.         else if(huart->Instance ==  USART2)//串口2接蓝牙
  15.         {
  16.            HAL_UART_Transmit(&huart1, (uint8_t *)aRxBuffer2, 3,0xFFFF);

  17.              RECV_FLAG2 = 1;

  18.             HAL_UART_Receive_IT(&huart2,aRxBuffer2,3);  //再次串口接收中断使能  
  19.         }   
  20. }
复制代码


Z2GNG1FO2LDG%BU2]IC1FH4.png

3)主函数编写

  1. Int mai(void)
  2. {
  3.      While(1)
  4.     {
  5.         if(RECV_FLAG2 == 1)
  6.        {
  7.           RECV_FLAG2= 0;

  8.         Car_contrl(aRxBuffer2[0]);  //控制协议cmd[3]:cmd[0]=控制码  cmd[1]=0xD   cmd[2]= 0xA   
  9.        }

  10.     HAL_UART_Receive_IT(&huart1, (uint8_t *)aRxBuffer1, 10); //串口1接收中断使能

  11.     HAL_UART_Receive_IT(&huart2, (uint8_t *)aRxBuffer2, 3); //串口3接收中断使能,所以大小为3:0D 0A 01

  12.     }

  13. }
复制代码

B]M{9ZCX]IF_{G}Y67CP2T6.png


-----------------------------------------------------------------------END--------------------------------------------------------------------------


收藏 评论0 发布时间:2022-5-17 21:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版