[其他ST产品] STM32CubeMX——串口通信

[复制链接]
 楼主| 王派oo 发表于 2023-1-26 16:19 | 显示全部楼层 |阅读模式
功能实现:
  • 上电后,周期发送hello world 给串口调试助手
  • 通过串口调试助手发送字符串"1" 开启LED灯,发送字符串"0" 关闭LED灯
准备工作:

    1、STM32开发板(我的是STM32F103VET6)
    2、STM32CubeMx软件、 IDE: Keil软件
    3、按键管脚 : PA0   PC13   
    4、LED管脚 : PB0   PB1   PB5

新建工程
1.1 New Project

    1 搜索芯片型号
    2选择芯片
    3创建工程

892863d23776c6de3.png



评论

———————————————— 版权声明:本文为CSDN博主「lcp0633」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/lcp0633/article/details/110959154  发表于 2023-1-28 11:50
———————————————— 版权声明:本文为CSDN博主「lcp0633」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/lcp0633/article/details/110959154  发表于 2023-1-26 16:20
 楼主| 王派oo 发表于 2023-1-26 16:21 | 显示全部楼层
1.2设置时钟源RCC  

    系统时钟源选择外部晶振时钟源
5182963d237d1f2e86.png
 楼主| 王派oo 发表于 2023-1-26 16:21 | 显示全部楼层
1.3 设置GPIO

    设置PB0和PB1为输出模式

6614763d23800e21f5.png
 楼主| 王派oo 发表于 2023-1-26 16:23 | 显示全部楼层
串口设置
3880363d238278cf2f.png
 楼主| 王派oo 发表于 2023-1-26 16:26 | 显示全部楼层
使能串口中断
4906663d2387a4359a.png
 楼主| 王派oo 发表于 2023-1-26 16:31 | 显示全部楼层
设置时钟
500163d23a57baa76.png
 楼主| 王派oo 发表于 2023-1-26 16:32 | 显示全部楼层
项目文件设置

    1 设置项目名称
    2 选择所用IDE
8354463d23a6939e06.png
 楼主| 王派oo 发表于 2023-1-26 16:35 | 显示全部楼层
生成代码

    为每个功能生成独立的.c和.h文件
    生成代码
2623663d23b4782e16.png
 楼主| 王派oo 发表于 2023-1-26 16:37 | 显示全部楼层
代码部分
HAL库UART函数库介绍

UART结构体定义

  1. UART_HandleTypeDef huart1;
 楼主| 王派oo 发表于 2023-1-26 16:38 | 显示全部楼层
UART的名称定义,这个结构体中存放了UART所有用到的配置。

在usart.c文件中定义了结构体的实例huart1,同时对结构体初始化
  1. UART_HandleTypeDef huart1;

  2. /* USART1 init function */

  3. void MX_USART1_UART_Init(void)
  4. {

  5.   huart1.Instance = USART1;
  6.   huart1.Init.BaudRate = 115200;
  7.   huart1.Init.WordLength = UART_WORDLENGTH_8B;
  8.   huart1.Init.StopBits = UART_STOPBITS_1;
  9.   huart1.Init.Parity = UART_PARITY_NONE;
  10.   huart1.Init.Mode = UART_MODE_TX_RX;
  11.   huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  12.   huart1.Init.OverSampling = UART_OVERSAMPLING_16;
  13.   if (HAL_UART_Init(&huart1) != HAL_OK)
  14.   {
  15.     Error_Handler();
  16.   }

  17. }
 楼主| 王派oo 发表于 2023-1-26 16:41 | 显示全部楼层
与串口相关的常用的函数,找到stm32f1xx_hal_uart.h文件



    HAL_StatusTypeDef  HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);
    HAL_StatusTypeDef  HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
    void  HAL_UART_IRQHandler(UART_HandleTypeDef *huart);
    void  HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);

串口发送/接收数据,一般是发送数据采用阻塞式方式,也就是直接发送,二接收数据采用非阻塞式,就是中断方式
 楼主| 王派oo 发表于 2023-1-26 20:50 | 显示全部楼层
下面简单介绍每个函数

串口发送函数:

           HAL_StatusTypeDef  HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);
 楼主| 王派oo 发表于 2023-1-26 20:52 | 显示全部楼层
功能:串口发送指定长度的数据。如果超时没发送完成,则不再发送,返回超时标志(HAL_TIMEOUT)。

参数:

    UART_HandleTypeDef *huart      UATR的别名    如 :   UART_HandleTypeDef huart1;   别名就是huart1  
    *pData      需要发送的数据
    Size    发送的字节数
    Timeout   最大发送时间,单位ms,发送数据超过该时间退出发送  
 楼主| 王派oo 发表于 2023-1-28 11:48 | 显示全部楼层
举例:

    uint8_t send_data[] = "hello world\r\n";
    HAL_UART_Transmit(&huart1, send_data , sizeof(send_data), 1000);
 楼主| 王派oo 发表于 2023-1-28 11:50 | 显示全部楼层
中断接收函数:

       HAL_StatusTypeDef  HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);

功能:串口中断接收,以中断方式接收指定长度数据。
大致过程是,设置数据存放位置,接收数据长度,然后使能串口接收中断。接收到数据时,会触发串口中断。
再然后,串口中断函数处理,直到接收到指定长度数据,而后关闭中断,进入中断接收回调函数,不再触发接收中断。(只触发一次中断)
 楼主| 王派oo 发表于 2023-1-28 11:51 | 显示全部楼层
参数:

    UART_HandleTypeDef *huart      UATR的别名    如 :   UART_HandleTypeDef  huart1;   别名就是huart1  
    *pData      接收到的数据存放地址
    Size    接收的字节数
 楼主| 王派oo 发表于 2023-1-28 11:52 | 显示全部楼层
注意:此函数需在main函数的初始化开启中断接收,如果一直接收数据,必须在回调函数中再调用一次
 楼主| 王派oo 发表于 2023-1-28 12:08 | 显示全部楼层
串口中断处理函数

      void  HAL_UART_IRQHandler(UART_HandleTypeDef *huart);

功能:如果串口发生中断,则直接进入此函数,具体的接收数据的处理,一般不写在此函数中,此函数可以写一些调试的代码,判断串口是否进入此中断
 楼主| 王派oo 发表于 2023-1-28 12:09 | 显示全部楼层
  1. void USART1_IRQHandler(void)
  2. {
  3.   /* USER CODE BEGIN USART1_IRQn 0 */
  4.        
  5.   /* USER CODE END USART1_IRQn 0 */
  6.   HAL_UART_IRQHandler(&huart1);
  7.   /* USER CODE BEGIN USART1_IRQn 1 */
  8.        
  9.   /* USER CODE END USART1_IRQn 1 */
  10. }
 楼主| 王派oo 发表于 2023-1-28 12:21 | 显示全部楼层
串口接收中断回调函数:

     void  HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);

功能:HAL库的中断进行完之后,并不会直接退出,而是会进入中断回调函数中,用户可以在此函数中处理相关的数据,

此函数为虚函数,需要用户重写该函数,一般在main.c文件中重写该函数。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

19

主题

308

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部