[N32G430] 基于国民技术N32G430R8T7 MCU的串口通信应用

[复制链接]
1680|13
 楼主| 帛灿灿 发表于 2024-10-11 09:22 | 显示全部楼层 |阅读模式

国民技术的N32G430R8T7是一款基于ARM Cortex-M4内核的32位微控制器,支持丰富的外设功能,广泛应用于物联网、工业自动化、智能家居等领域。本文将介绍如何基于N32G430R8T7实现串口通信,通过UART外设与PC进行数据交换。串口通信是嵌入式开发中非常常见的应用,能够帮助开发者在调试阶段快速获取设备状态信息。

应用场景在嵌入式系统中,串口通信常用于设备间的数据传输或与PC通信。通过串口,嵌入式系统可以将采集的数据或设备状态实时发送给上位机,也可以通过串口接收上位机发送的命令。
本次示例将在N32G430R8T7上实现通过UART串口发送和接收数据,利用PC上的串口工具与MCU通信,观察数据收发情况。

硬件设计硬件上,我们使用N32G430R8T7的UART1接口与PC相连,通过USB转TTL模块将MCU的TX、RX引脚连接到PC的USB接口。

代码实现以下是基于N32G430R8T7的串口通信代码,实现MCU向PC发送数据以及接收PC发送的数据。
  1. #include "n32g430.h"
  2. #include "usart.h"
  3. #include "gpio.h"
  4. #include "rcc.h"
  5. #include "nvic.h"

  6. // 定义串口波特率
  7. #define UART_BAUDRATE 115200

  8. // 初始化函数声明
  9. void SystemClock_Config(void);
  10. void UART_Init(void);
  11. void UART_SendString(char* str);

  12. int main(void) {
  13.     // 系统时钟初始化
  14.     SystemClock_Config();
  15.     // 串口初始化
  16.     UART_Init();
  17.    
  18.     // 向PC发送字符串
  19.     UART_SendString("Hello, PC! UART communication is working.\r\n");
  20.    
  21.     // 主循环
  22.     while (1) {
  23.         // 检查是否有数据接收
  24.         if (USART_GetFlagStatus(USART1, USART_FLAG_RXNE)) {
  25.             // 读取接收到的数据
  26.             uint8_t data = USART_ReceiveData(USART1);
  27.             // 将接收到的数据发送回PC
  28.             USART_SendData(USART1, data);
  29.             // 等待发送完成
  30.             while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
  31.         }
  32.     }
  33. }

  34. // 系统时钟配置
  35. void SystemClock_Config(void) {
  36.     // 配置系统时钟为72MHz
  37.     RCC_APB2PeriphClockCmd(RCC_APB2ENR_AFIOEN, ENABLE);
  38.     RCC_APB2PeriphClockCmd(RCC_APB2ENR_USART1EN | RCC_APB2ENR_IOPAEN, ENABLE);
  39. }

  40. // 串口初始化配置
  41. void UART_Init(void) {
  42.     GPIO_InitTypeDef GPIO_InitStruct;
  43.     USART_InitTypeDef USART_InitStruct;
  44.    
  45.     // 配置PA9为USART1 TX (传输)
  46.     GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;
  47.     GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
  48.     GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
  49.     GPIO_Init(GPIOA, &GPIO_InitStruct);
  50.    
  51.     // 配置PA10为USART1 RX (接收)
  52.     GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;
  53.     GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  54.     GPIO_Init(GPIOA, &GPIO_InitStruct);
  55.    
  56.     // USART配置
  57.     USART_InitStruct.USART_BaudRate = UART_BAUDRATE;
  58.     USART_InitStruct.USART_WordLength = USART_WordLength_8b;
  59.     USART_InitStruct.USART_StopBits = USART_StopBits_1;
  60.     USART_InitStruct.USART_Parity = USART_Parity_No;
  61.     USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  62.     USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  63.    
  64.     // 初始化USART1
  65.     USART_Init(USART1, &USART_InitStruct);
  66.    
  67.     // 使能USART1
  68.     USART_Cmd(USART1, ENABLE);
  69. }

  70. // 串口发送字符串
  71. void UART_SendString(char* str) {
  72.     while (*str) {
  73.         USART_SendData(USART1, *str++);
  74.         // 等待发送完成
  75.         while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
  76.     }
  77. }

代码解析
  • 系统时钟配置:在SystemClock_Config函数中,配置了系统时钟并使能USART1所需的外设时钟。时钟频率设置为72MHz,确保串口通信稳定进行。
  • 串口初始化:UART_Init函数中,配置了UART的TX引脚为PA9,RX引脚为PA10,波特率设置为115200。USART模式设置为8位数据位、1个停止位、无校验位,支持发送和接收功能。
  • 串口发送数据:通过UART_SendString函数,MCU可以发送字符串至PC。该函数逐个发送字符并等待发送完成。
  • 数据接收与回显:在主循环中,MCU检测是否有接收数据。当数据到达时,MCU读取数据并立即将其发送回PC,实现简单的回显功能。这种方式常用于测试通信是否正常。


代码运行结果将N32G430R8T7通过USB转TTL模块与PC连接,使用串口调试工具(如SecureCRT、PuTTY或XCom)设置波特率为115200。当代码运行后,MCU会向PC发送“Hello, PC! UART communication is working.”消息,并且当PC端发送任意数据时,MCU会回显相同的数据。

扩展应用本例展示了如何利用N32G430R8T7的UART外设进行简单的串口通信。在实际项目中,串口通信可以扩展用于数据采集系统、无线模块(如GPRS、Wi-Fi、蓝牙)通信等。通过串口接收外部设备的数据指令,或向上位机报告设备状态,能够实现更复杂的应用场景。

总结本文详细介绍了国民技术N32G430R8T7 MCU的串口通信应用,通过实际代码实现MCU与PC之间的数据通信。串口通信是嵌入式开发中的基础功能,掌握它可以为后续项目的扩展打下良好的基础。

公羊子丹 发表于 2024-10-11 09:22 | 显示全部楼层
看了这篇文章,感觉串口调试真的很实用,项目开发少不了。
周半梅 发表于 2024-10-11 09:23 | 显示全部楼层
N32G430这款芯片性价比挺高的,用来做物联网项目也不错。
童雨竹 发表于 2024-10-11 09:23 | 显示全部楼层
串口通信是个好东西,特别是在开发时用来调试很方便。
万图 发表于 2024-10-11 09:23 | 显示全部楼层
刚好我有个项目需要用到串口,正好可以参考这个例子。
Wordsworth 发表于 2024-10-11 09:24 | 显示全部楼层
串口波特率115200是比较常见的,我也经常用这个波特率。
Bblythe 发表于 2024-10-11 09:24 | 显示全部楼层
有没有更复杂的应用,比如通过串口控制设备动作的例子?
Pulitzer 发表于 2024-10-11 09:24 | 显示全部楼层
每次通过串口调试,看到数据成功发送回来,感觉很有成就感。
Uriah 发表于 2024-10-11 09:25 | 显示全部楼层
国民技术这款MCU有点意思,打算试试看它的其他外设功能。
Clyde011 发表于 2024-10-11 09:25 | 显示全部楼层
代码写得挺清楚的,特别是串口初始化那部分,学习到了。
suncat0504 发表于 2024-10-29 15:42 | 显示全部楼层
自从串口设备被弄出来以后,就一直是最有力的调试工具。无论半导体技术怎么发展,都没有被淘汰。
suncat0504 发表于 2024-10-29 15:43 | 显示全部楼层
基本上所有单片机都配有串口设备,算得上是标配了吧。
地瓜patch 发表于 2024-10-29 18:22 来自手机 | 显示全部楼层
这个片子几个串口啊
申小林一号 发表于 2024-10-30 20:48 | 显示全部楼层
串口是基础
您需要登录后才可以回帖 登录 | 注册

本版积分规则

169

主题

6229

帖子

0

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