最近我在一个项目中使用了新唐(Nuvoton) 的MCU进行开发,碰到了需要用UART串口进行数据传输的场景,刚好借此机会整理了一下代码,希望对大家有帮助。这次选用的是新唐的M0系列MCU,操作简单,性价比高。
项目需求:通过UART与PC进行数据通信,将从PC接收到的指令回传给PC,并在调试串口上显示出来。
硬件环境:- 新唐Nuvoton NUC029系列MCU
- USB转UART模块
- PC端串口调试工具
软件环境:- Keil MDK
- Nuvoton BSP(板级支持包)
代码实现步骤:- UART初始化
首先,我们需要配置UART的波特率、数据位、停止位和校验位等参数。使用Keil中的BSP库可以简化这个过程。#include "NUC029xAN.h"
void UART_Init(void)
{
// 配置UART时钟
CLK_EnableModuleClock(UART0_MODULE);
CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UARTSEL_HXT, CLK_CLKDIV_UART(1));
// 配置UART引脚
SYS->GPB_MFP &= ~(SYS_GPB_MFP_PB0_Msk | SYS_GPB_MFP_PB1_Msk);
SYS->GPB_MFP |= (SYS_GPB_MFP_PB0_RXD0 | SYS_GPB_MFP_PB1_TXD0);
// 初始化UART,波特率设置为115200
UART_Open(UART0, 115200);
}
- 发送数据函数
为了让MCU向PC发送数据,我们可以编写一个简单的函数,用来传输字符或字符串。void UART_SendString(char *str)
{
while(*str)
{
UART_WRITE(UART0, *str++);
}
}
接收数据并回显
接下来我们通过中断方式接收从PC端发送过来的数据,并将其回显。void UART0_IRQHandler(void)
{
uint8_t u8InChar = 0xFF;
if (UART_GET_INT_FLAG(UART0, UART_INTSTS_RDAINT_Msk)) // 检查是否有接收到数据
{
u8InChar = UART_READ(UART0); // 读取接收到的数据
UART_WRITE(UART0, u8InChar); // 回显收到的数据
}
}
主函数
最后,将上面的初始化函数和中断使能放入主函数中。int main(void)
{
// 系统初始化
SYS_UnlockReg();
SYS_Init();
UART_Init();
SYS_LockReg();
// 开启UART接收中断
UART_EnableInt(UART0, UART_INTEN_RDAIEN_Msk);
NVIC_EnableIRQ(UART0_IRQn);
// 主循环
while(1);
}
总结:这个简单的UART通信示例展示了如何使用新唐的MCU通过串口与PC进行交互。整个过程非常流畅,新唐的BSP库极大地简化了开发流程。希望对你们有所帮助,有任何问题欢迎讨论!
|