打印
[STM32G0]

STM32G030C8T6:USART串口通信(中断)

[复制链接]
892|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本小节的目标是,系统主频64 MHZ,采用高速外部晶振,通过芯片PB6,PB7 的USART1 口,实现串口通信。
原理:电脑上的串口调试器软件通过USB转TTL模块发数据给板子,板子把收到的数据发送给模块,数据在串口调试器软件上显示。
涉及到的知识:配置UART引脚,串口通信,STM32CubeMX的使用
我是将PB7作为RX,PB6作为TX,使用USART1,如果你要使用其他引脚,或者使用USART2,换成其他引脚即可;

新建工程

点击File 菜单下的New Project

选择芯片型号,如下图所示先输入芯片型号,目前这边输入STM32G030C8,

双击选择,就确定了芯片型号,界面会变成如下图所示





使用特权

评论回复
沙发
大鹏2365|  楼主 | 2024-3-28 16:06 | 只看该作者
配置SWD下载引脚
如下图所示,在Pinout&Configuration 栏目的System Core 下,先点击SYS,再勾选Serial Wire 框,
配置好SWD 下载引脚设置:


使用特权

评论回复
板凳
大鹏2365|  楼主 | 2024-3-28 16:07 | 只看该作者
配置USART
因为STM32G030C8T6默认的USART1引脚为PA9和PA10,所以如果直接在STM32CubeMX上点USART1,那么点亮的引脚会是PA9和PA10,而我是要使用PB6和PB7,因此,先点击PB6,PB7,将其配置为UART口,如下所示:

先点击PB6,将其配置为USART1_TX



然后点击PB7,将其配置为USART1_RX:





使用特权

评论回复
地板
大鹏2365|  楼主 | 2024-3-28 16:07 | 只看该作者
按照下图1.2.3的步骤进行配置USART1



配置完成后,PB6和PB7均被点亮:

然后使能中断,如下图所示:

使用特权

评论回复
5
大鹏2365|  楼主 | 2024-3-28 16:07 | 只看该作者
配置RCC
如下图,先点击RCC,在HSE 配置中选择Crystal/Ceramic Resonator 外部晶振设

使用特权

评论回复
6
大鹏2365|  楼主 | 2024-3-28 16:08 | 只看该作者
设置系统主频
如下图, 先点击Clock Configuration 栏目,按下图的1,2,3,4 步骤完成系统64MHZ 主频设置:

使用特权

评论回复
7
大鹏2365|  楼主 | 2024-3-28 16:09 | 只看该作者
生成工程
按照下图的步骤,进行项目配置,项目名称和路径设置等,生成项目的类型选择STM32CubeIDE(我这里以STM32CubeIDE为例,如果你要试用keil5,那就选择MDK-RAM,如果要使用makefile,就选择Makefile),注意项目名称和路径不要有中文名;

使用特权

评论回复
8
大鹏2365|  楼主 | 2024-3-28 16:09 | 只看该作者
最后全部设置完毕后点击create code,生成项目代码:

使用特权

评论回复
9
大鹏2365|  楼主 | 2024-3-28 16:09 | 只看该作者
生成的工程如下图所示:

使用特权

评论回复
10
大鹏2365|  楼主 | 2024-3-28 16:10 | 只看该作者
增加代码实现串口收发
如下图实现数组的定义,数据接收回调函数定义,接收数据,发送数据。


uint8_t aTxBuffer[] = "HelloWorld";//定义发送数组的内容,长度10字节
        #define COUNTOF(__BUFFER__)   (sizeof(__BUFFER__) / sizeof(*(__BUFFER__)))
        #define TXBUFFERSIZE                      (COUNTOF(aTxBuffer) - 1)//计算长度宏定义
/* Size of Reception buffer */
#define RXBUFFERSIZE                      TXBUFFERSIZE//定义接收数据的长度
        uint8_t aRxBuffer[RXBUFFERSIZE];//定义接收数组
        __IO ITStatus UartReady = RESET;//状态控制位,SET说明收到数据

//串口接受回调函数,接收到数据,状态位置位
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
  /* Prevent unused argument(s) compilation warning */
         UartReady = SET;
  /* NOTE : This function should not be modified, when the callback is needed,
            the HAL_UART_RxCpltCallback can be implemented in the user file.
   */
}

使用特权

评论回复
11
大鹏2365|  楼主 | 2024-3-28 16:10 | 只看该作者
        if (HAL_UART_Receive_IT(&huart1, (uint8_t *)aRxBuffer, RXBUFFERSIZE) != HAL_OK)//接收中断使能
  {
  }
         while(UartReady != SET)//判断是否有接收到数据,没有则一直等待
  {
  }
        if(HAL_UART_Transmit_IT(&huart1, (uint8_t *)aRxBuffer, TXBUFFERSIZE) != HAL_OK)//发送数据
  {
                UartReady=RESET;//状态清0
  }

使用特权

评论回复
12
大鹏2365|  楼主 | 2024-3-28 16:10 | 只看该作者

使用特权

评论回复
13
大鹏2365|  楼主 | 2024-3-28 16:10 | 只看该作者

使用特权

评论回复
14
大鹏2365|  楼主 | 2024-3-28 16:10 | 只看该作者
测试:
按图1连接,板子的PA9,PA10,GND分别跟USB转TTL模块的RXD,TXD,GND相连,板子上电,用串口调试器发送Helloworld,板子能返回Helloworld,说明板子串口收发OK。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

47

主题

656

帖子

0

粉丝