☰
【MT32F006】MT32F006之串口
2026/10/10 7:59:36 网站建设 项目流程

本文最后修改时间:2025年01月09日

一、本节简介

本文介绍如何使用MT32F006的串口。

二、实验平台

库版本:V1.0.0

编译软件:MDK5.37

硬件平台:MT32F006开发板(主芯片MT32F006)

仿真器:JLINK

三、版权声明

1)作者:甜甜的大香瓜

2)声明:喝水不忘挖井人,转载请注明出处。

3)本文出处:原创连载资料《简单粗暴学MT32F006》

四、实验前提

1、在进行本文步骤前,请先阅读以下章节:

1)《简单粗暴学MT32F006》的“第一章和第二章”章节​。

2、在进行本文步骤前,请先实现以下章节:

暂无

五、基础知识

暂无

六、硬件原理

MT32F006的串口有两组,分别是

1、PIO1_7(UART0_TX)和PIO2_0(UART0_RX)

2、PIO0_1(UART0_TX)和PIO0_2(UART0_RX)(本文使用这一组)

七、实验步骤

1、编写并添加驱动

//********************************************************************** //name: GUA_UART.c //introduce: 串口驱动 //author: 甜甜的大香瓜 //email: 897503845@qq.com //shop: opengua.taobao.com //changetime: 2022.12.29 //********************************************************************** #include "mt006.h" #include "GUA_UART.h" #include <string.h> /*********************宏定义************************/ #define GUA_UART0_CLOCK_DIV 1 /*********************全局变量************************/ uint8_t gnGUA_UART_rx_buf[GUA_UART_RX_SIZE] = {0}; uint8_t gnGUA_UART_tx_buf[GUA_UART_TX_SIZE] = {0}; //********************************************************************** //name: fputc //introduce: 将printf函数与串口对应起来 //parameter: ch:要发送的字符串 // *f:文件 //return: none //author: 甜甜的大香瓜 //email: 897503845@qq.com //shop: opengua.taobao.com //changetime: 2022.12.29 //********************************************************************** int32_t fputc(int32_t ch, FILE *f) { /* Place your implementation of fputc here */ /* e.g. write a character to the UART */ UART_SendData((uint8_t) ch); /* Loop until the end of transmission */ while (UART_GetFlagStatus(UART_FLAG_TXFE) == RESET) {} return ch; } //********************************************************************** //name: GUA_UART_Send //introduce: 串口发送 //parameter: nGUA_Data:串口发送数据 //return: none //author: 甜甜的大香瓜 //email: 897503845@qq.com //shop: opengua.taobao.com //changetime: 2022.12.29 //********************************************************************** void GUA_UART_Send(uint8_t *pGUA_Data, uint8_t nGUA_Len) { for(uint8_t i = 0; i<nGUA_Len; i++) { UART_SendData(pGUA_Data[i]); while(UART_GetFlagStatus(UART_FLAG_TXFE) == RESET); } } //********************************************************************** //name: GUA_UARTx_Reveive //introduce: 串口接收 //parameter: none //return: 返回接收的数据长度 //author: 甜甜的大香瓜 //email: 897503845@qq.com //shop: opengua.taobao.com //changetime: 2022.12.29 //********************************************************************** uint8_t GUA_UARTx_Reveive(void) { uint8_t i = 0; //接收数据超时中断 if(UART_GetITStatus(UART_IT_RTMIS) == SET) { // 清除接收中断标志位和接收超时标志位 UART_ClearITPendingBit(UART_IT_RTMIS); //清空接收缓冲区 memset(gnGUA_UART_rx_buf, 0, GUA_UART_RX_SIZE); while(UART_GetFlagStatus(UART_FLAG_RXFE) != SET) { //防止接收缓冲区溢出 if(i <= GUA_UART_RX_SIZE) { //读取数据 gnGUA_UART_rx_buf[i++] = UART_ReceiveData(); } } } //返回接收到的数据长度 return i; } //********************************************************************** //name: GUA_UART_Init //introduce: 串口初始化 //parameter: none //return: none //author: 甜甜的大香瓜 //email: 897503845@qq.com //shop: opengua.taobao.com //changetime: 2022.12.29 //********************************************************************** void GUA_UART_Init(void) { UART_InitTypeDef UART_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; //uart clk RCC_APBPeriphClockCmd(RCC_AHBCLKCTRL_UART0, ENABLE); RCC_UARTCLKSel(RCC_UARTCLK_SOURCE_12M_IRC); RCC_SETCLKDivider(RCC_CLOCKFREQ_UART0CLK, GUA_UART0_CLOCK_DIV); //PIO04 Rx、PIO05 Tx,注意不能同时初始化多个IO GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_2; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_6; //复用功能6,也就是串口 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(GPIO0, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; GPIO_Init(GPIO0, &GPIO_InitStructure); //uart init UART_DeInit(); UART_StructInit(&UART_InitStructure); //115200 UART_Init(&UART_InitStructure); //Enable Interrupt RX and RX timeout UART_FIFOLevelConfig(UART_TXIFLSEL_8 , UART_RXIFLSEL_8); UART_ClearITPendingBit(UART_IT_RXMIS | UART_IT_RTMIS | UART_IT_TXMIS); UART_ITConfig(UART_IT_RTIM, ENABLE); //这里用接收超时中断,而不用接收中断,是因为接收到1个bit就进中断会导致接收比发送快、导致丢包 NVIC_EnableIRQ(UART0_IRQn); //enable uart UART_Cmd(ENABLE); }

1)编写驱动GUA_UART.c(存放在“……\Projects\MT006_StdPeriph_Templates\GUA”)

2)编写驱动头文件GUA_UART.h(存放在“……\Projects\MT006_StdPeriph_Templates\GUA”)

//********************************************************************** //name: GUA_UART.h //introduce: 串口驱动的头文件 //author: 甜甜的大香瓜 //email: 897503845@qq.com //shop: opengua.taobao.com //changetime: 2022.12.29 //********************************************************************** #ifndef _GUA_UART_H_ #define _GUA_UART_H_ /*********************头文件************************/ #include <stdio.h> #include <stdint.h> /*********************宏定义************************/ //串口打开的宏,要注意与电池充电芯片引脚冲突,只用于调试 #define GUA_UART_OPEN 1 //如果有此宏则表示打开串口 //串口缓冲区大小 #define GUA_UART_RX_SIZE 128 #define GUA_UART_TX_SIZE 128 /*********************全局变量************************/ extern uint8_t gnGUA_UART_rx_buf[GUA_UART_RX_SIZE]; extern uint8_t gnGUA_UART_tx_buf[GUA_UART_TX_SIZE]; /*********************外部函数声明************************/ extern int32_t fputc(int32_t ch, FILE *f); extern void GUA_UART_Send(uint8_t *pGUA_Data, uint8_t nGUA_Len); extern uint8_t GUA_UARTx_Reveive(void); extern void GUA_UART_Init(void); #endif

3)工程中添加驱动文件

4)在MDK设置中添加驱动源文件路径

2、添加库的驱动

1)添加库的驱动文件(为了方便一次性都添加进来,已有则不用添加)

2)添加库的驱动头文件(mt006_conf.h 中)(为了方便一次性都添加进来,已有则不用添加)

3、在应用层中调用

1)添加驱动头文件(main.c中)

#include "GUA_UART.h"

2)添加驱动初始化代码(main.c的main函数中)

//串口初始化

GUA_UART_Init();

4、在应用层中调用

1)添加驱动头文件(mt006_it.c中)

#include “GUA_UART.h”

2)添加串口中断处理代码(mt006_it.c中)

//串口中断

void UART0_IRQHandler(void)

{

//数据接收

GUA_UARTx_Reveive();

//进入通信处理事件

//gnGUA_Function = FUNC_GUA_COMMUNICAION_PROCESS_EVT;

}

八、注意事项

暂无

九、实验结果

暂无

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询