Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
串口
M2354
【NuMaker-M2354试用】串口——基本收发功能演示
发布于 2021-12-17 21:23:34 浏览:875
订阅该版
[tocm] #### 环境介绍 Keil : 版本5.34.0.0 编译器V6 官方SDK版本:Nuvoton.NuMicro_DFP.1.3.12 RT_THREAD -3.15 nano 请在KEil 的Run-Time Environment环境进行下载, 需要自行实现systick定时器的中断定时器功能 #### 外设硬件特性 该芯片提供6路通用异步接收/发送(UART)。UART控制器执行正常速度UART,支持流量控制功能。UART控制器对从外设接收的数据执行串行到并行的转换,并对从CPU传输的数据执行并行到串行的转换。每个UART控制器通道支持十种类型的中断。UART控制器还支持IrDA SIR、LIN和RS-485功能模式和autobaud速率测量功能。 M23554的串口比ST的芯片多了一些高级的功能, - 带有16个字节的 缓冲区,减少CPU干预时间, - 自动波特率,波特率补偿功能 - 支持RS485 自动流控制 #### 例程功能介绍 电脑发送0x01 绿灯亮,并返串口回灯状态信息 电脑发送0x02 绿灯灭,并返串口回灯状态信息 把接收到字符返回,没有做FIFO溢出检查,所以一次不能超16字节,否则丢包,只做演示。 #### 硬件配置: - 使能时钟 - 确认外设时钟源,以及频率,设置预分频器。 - 设置工作模式 ,以及波特率 - 配置引脚 - 设置传输数据参数 收发功能寄存器是默认使能的 时钟源可以选项,和操作函数CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL2_UART0SEL_HIRC, CLK_CLKDIV0_UART0(1)); ![1639722948763.png](https://oss-club.rt-thread.org/uploads/20211217/842e2edaf57c54b72d23c257ccfd4fe1.png.webp) 波特率的设置依据 我们要求的是115200; 外设频率已经是12MHZ,设置模式2, UART_BAUD.BRD = 102 UART_BAUD.EDIVM1 = 0 波特率 = 12000 000/(102+2) = 115,384 设置模式1, UART_BAUD.BRD = 6 UART_BAUD.EDIVM1 = 12 波特率 = 12000 000/(12+1)*(6+2) = 115,384 当然实际SDK提供相关的函数可以直接调用,这样做是熟悉相关产平线的外设特性。查看代码却只发现有模式0 和模式2的宏定义,自行测试模式1的配置运行ok. ![1639724478707.png](https://oss-club.rt-thread.org/uploads/20211217/c15d95ec642e57f57c8f5255fca1536e.png.webp) 配置数据格式的是寄存 UART_LINE ``` UART0->LINE = UART_PARITY_NONE | UART_STOP_BIT_1 | UART_WORD_LEN_8; ``` 波特率补偿: 我们发现我们计算的波特率是有误差的,当然很小的时候是可以容错的,当时过大就需要补偿了,CAN通信这么稳,就有这个机制存在 那手册上的例子分析一下 UART 的外设时钟 = 32.768 kHz,波特率为 9600 bps,我们需要设置相关的 参数让他的波特率等于9600, 32.768 kHz / 9600 hz = 3.413 ,因为设置的参数只能是整数(stm32支持分数波特率计算),我们最后就得到了每周期0.413 个时钟的偏差。 矫正寄存器 UART_BRCOMP 详细功能看查看手册 BRCOMPDEC (UART_BRCOMP[31]) = 0,为每一位正补偿,多一位模块时钟将附加在补偿位中。如BRCOMPDEC (UART_BRCOMP[31]) = 1,则为每一位负补偿,补偿位减少一个模块时钟。 #### 工作原理: 发送: 通过向寄存器写入一个字节,数据字节将存储在发送器FIFO中。UART控制器将通过UART_TXD发送存储在发送器FIFO顶部位置的数据。再由移位寄存器发出 XEMPTYF (UART_FIFOSTS [28]) TX FIFO (UART_DAT) 是否为空 TXOVIF(UART_FIFOSTS [24]) TX FIFO 是否溢出检查 可生成中断 TXFULL(UART_FIFOSTS [23]) TX FIFO是否满了 TXEMPTY(UART_FIFOSTS [22]) TX FIFO是否为空 TXPTR(UART_FIFOSTS [22]) TX FIFO当前位置指针 接收: 接收到的数据存入接收FIFO,通过读 UART_DAT 取这个寄存器,UART控制器将从接收器FIFO返回一个8位数据。 当RX FIFO中的字节数等于RFITL(UART_FIFO[7:4])时,将设置RDAIF(UART_INTSTS[0])。 如果启用了RDAIEN (UART_INTEN[0]),则会产生RDA中断。 注意:该位是只读的,当RX FIFO的未读字节数低于阈值水平(RFITL(UART_FIFO[7:4])时,该位将被清除。 UART_FUNCSEL 寄存器进行外设的工作模式的选着以及 对应的接收FIFO的信息更多再 UART_FIFO ,重要的有RFITL(UART_FIFO[7:4]),接收收到个数触发中断阈值设置 如果接收或者发送快速的话就需要是由中断或者DMA进行收发了。 **代码:** 初始化函数: ``` void UART0_Init(void) { //配置步骤6.19.4 Basic Configuration TRM_M2354_Series_EN_Rev1.01 CLK_EnableModuleClock(UART0_MODULE); CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL2_UART0SEL_HIRC, CLK_CLKDIV0_UART0(1)); SYS->GPA_MFPL = (SYS->GPA_MFPL & (~(UART0_RXD_PA6_Msk | UART0_TXD_PA7_Msk))) | UART0_RXD_PA6 | UART0_TXD_PA7; UART0->LINE = UART_PARITY_NONE | UART_STOP_BIT_1 | UART_WORD_LEN_8; UART0->BAUD = UART_BAUD_MODE2 | UART_BAUD_MODE2_DIVIDER(__HIRC, 115200); } ``` 应用线程: ``` //SDK 有发送数据包的函数 static void rt_led_thread_entry(void* parameter) { uint8_t u8InChar = 0xFF; uint8_t butter =0; while(1) { if(UART0->INTSTS &0x00000001) //RX FIFO 收到预设数(1个)量数据 { butter = (uint8_t)UART_READ(UART0); UART_WRITE(UART0, butter); printf("接收到的数据 = %d\n",butter); if(butter == 0x01) //亮 { LED_GREEN = 0; printf("亮灯 \n"); } else if(butter == 0x02)//灭 { LED_GREEN = 1; printf("灭灯 \n"); } else { } } rt_thread_delay(10); } } ``` ![image.png](https://oss-club.rt-thread.org/uploads/20211217/2c2a70a2e8112b42630141a14737f688.png) 这个做的有点坎坷,板载调试器再使用过程中,出现串口不能正常工作的情况,接收数据,怀疑自己的代码有问题,主控发热?!,自己外接一个串口测试 代码https://gitee.com/z-day-by-day/nu-maker-m2354
0
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
wenkit
这家伙很懒,什么也没写!
文章
3
回答
0
被采纳
0
关注TA
发私信
相关文章
1
串口DMA发送数据时,数据被覆盖
2
关于串口DMA模式下rt_device_close问题
3
利用stm32f427实现usb转串口,电脑端什么也没有识别到
4
finsh 控制台 适配 RS 485请大神指点????
5
uart_sample.c 中,读串口设备时偏移量pos要设置为-1而不是0?
6
【结贴】at_device软件包中对串口接收数据缺少判断导致数据接收异常
7
串口无法接受数据,但可以发送
8
串口如何有效的清除掉接收缓冲,而不必一个一个的去读取
9
串口接收使用方式问题
10
雅特力FINSH问题
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
UART
WIZnet_W5500
ota在线升级
freemodbus
PWM
flash
cubemx
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
编译报错
Debug
rt_mq_消息队列_msg_queue
SFUD
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
踩姑娘的小蘑菇
4
个答案
1
次被采纳
红枫
4
个答案
1
次被采纳
张世争
4
个答案
1
次被采纳
Ryan_CW
4
个答案
1
次被采纳
xiaorui
1
个答案
1
次被采纳
本月文章贡献
catcatbing
3
篇文章
5
次点赞
qq1078249029
2
篇文章
2
次点赞
xnosky
2
篇文章
1
次点赞
Woshizhapuren
1
篇文章
5
次点赞
YZRD
1
篇文章
2
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部