YTM32的LINFlexD实现UART功能详解

news2024/11/25 14:35:28

文章目录

    • 引言
    • 简介
    • 原理与机制
      • 同UART模式相关的寄存器
      • 时钟与波特率
      • 数据缓冲区
      • 发送过程
      • 接收过程
    • 软件
    • 参考文献

引言

初看YTM32B1ME的手册时,一眼看上去,竟然没有找到UART模块的章节,心想这车规MCU的产品定义也太激进了,直接把工业和消费类微控制器中最常用的通信外设给整没了,但想想手头上的EVB-YTM32B1ME-Q144板子上,确实有通过CH340转接出来的串口接口。一顿上下求索之后,才发现,是用LINFlexD外设模块"兼容"了UART的功能。本文将从LINFlexD外设模块的介绍中,专门抽出同UART相关的内容,结合笔者调试过程中整理的知识点形成一份材料,对YTM32微控制器平台上基于LINFlexD实现UART外设功能的专题详解。

YTM32微控制器平台的LINFlexD外设,是专用于汽车电子系统中常用的LIN通信协议而设计的通信引擎,但因LIN通信协议中的“字节域”格式同UART相同,因此在硬件设计上,从而为LIN通信引擎兼容UART通信引擎提供了可能。实际上,在一些没有专门设计LIN通信引擎的微控制器平台上,大多是通过更常见的UART通信引擎配合软件来模拟LIN通信引擎实现LIN通信的。

简介

当配置LINFlexD的寄存器LINFlexD_UARTCR[UART]=1之后,LINFlexD变身为UART外设,可以支持常规的UART功能:

  • 全双工通信。
  • 除了最常用的 8-bit 数据帧,还支持 9-bit13-bit16-bit17-bit
  • 在校验位上支持偶校验、奇数校验、固定0电平、固定1电平。
  • 波特率可编程,支持过采样,实现高达4Mbps的通信。

原理与机制

同UART模式相关的寄存器

当配置LINFlexD的寄存器LINFlexD_UARTCR[UART]=1之后,LINFlexD变身为UART引擎,LINFlexD模块中,很多LIN引擎专属的寄存器,就不再起作用了,对应地,一些专属UART引擎的寄存器开始发挥作用。当然,还有一些寄存器,是LIN引擎和UART引擎共用的。实际上,当变身成UART引擎后,LINFlexD外设原本众多的寄存器,仅有少数会被用到,如图x所示。
在这里插入图片描述

图x LINFlexD的UART功能寄存器

其中,UART功能的配置寄存器LINFlexD_UARTCR中,设计了配置UART属性的绝大多数寄存器位,当不适用特殊功能(波特率的过采样、超时控制)的情况下,也仅需配置一小部分寄存器位,即可把UART功能用起来。如图x所示。
在这里插入图片描述

图x LINFlexD_UARTCR寄存器中的UART配置位

在寄存器LINFlexD_UARTSR中,能在UART模式下用到的状态标志位也比较简单,由于实际可用的缓冲区长度仅为1,所以实际能用的标志位也只有两个,分别对应发送缓冲区空和接收缓冲区满。如图x所示。

在这里插入图片描述

图x LINFlexD_UARTSR寄存器中状态标志位

另外,在寄存器LINFlexD_LINIER中,还可以通过寄存器位LINFlexD_LINIER[DTIE]LINFlexD_LINIER[DRIE]分别启用对应的中断触发开关。

计算UART波特率的方式同LIN引擎相同。LINFlexD虽然为UART引擎设计了数据缓冲区的FIFO模式,甚至DMA功能,如果用户对应用性能要求不高的情况下,稳妥起见,可使用数据缓冲区的Buffer模式,并配合中断或者轮询方式工作。详见下文有具体阐述。

还要特别注意的是,LINFlexD的“初始化模式”的安全机制仍在起作用,很多配置寄存器仍仅在初始化模式下才能配置,配置完毕后切回正常工作模式,之前的配置才正式生效。

时钟与波特率

在手册中IPC(IP Controller)章节里,表格Table 13.1: IP Clock Control Table 的备注中,有明确说明,LINFlexD的波特率时钟源来自于FAST_BUS_CLK。同LIN引擎计算波特率的方式相同,大体上是使用LINFlexD_LINIBRRLINFlexD_LINFBRR两个寄存器作为波特率时钟的分频器,最终算得UART通信过程中的波特率。

如果不使用可编程的过采样功能(即使用固定16位的过采样率),计算UART波特率的功能将非常简单。在绝大多数应用中,固定16位的过采样足够满足用户需求。此时为了获得波特率f_baudrate,可以配置:

  • LINFlexD_LINIBBR = (f_fast_bus_clk / f_baudrate ) / 16
  • LINFlexD_LINFBBR = (f_fast_bus_clk / f_baudrate) % 16

若要达到更高的波特率,或者在时钟源频率被降低后,仍要保持较高的波特率,就需要减少过采样点的数量,可以通过配置LINFlexD_UARTCR[ROSE]=1LINFlexD_UARTCR[OSR],来选择使用8次、6次、5次甚至4次过采样,并且可通过LINFlexD_UARTCR[CSP]指定采样点的位置。此时,计算波特率的公式就要引入过采样次数OSR,取代之前固定的16,另外,表示波特率分频因子分数部分的LINFlexD_LINFBBR寄存器也就不再生效了:

  • LINFlexD_LINIBBR = (f_fast_bus_clk / f_baudrate ) / OSR

还需要注意的是,在LIN模式下,可以基于LIN通信帧的同步段实现硬件自动同步波特率的功能,在UART模式下也是不生效的(硬件上没有测量的依据)。

数据缓冲区

LINFlexD为LIN通信设计了8个字节的数据帧缓冲区,刚好够LIN通信的应答数据包存放8字节的数据负载。在UART模式下,也复用了这8个字节的缓冲寄存器,作为UART通信的数据缓冲区。但是,在UART模式下使用这8个字节的数据缓冲区,有一些需要特别注意的地方。

阅读手册可知,使用LINFlexD_DATA[]缓冲区有两种模式,字面上称为FIFOBuffer模式,可通过寄存器LINFlexD_UARTCR[TDFL_TFC]配置。当LINFlexD变身为UART后,这个8字节缓冲区就变成了两个4字节的缓冲区,分别对应发送缓冲区和接收缓冲区。如图x所示。

在这里插入图片描述

图x UART模式下的LINFlexD_DATA

值得注意的是,这里4字节的缓冲区,其实就是1个常规的32位寄存器,这样看起来,就同一般普通的UART数据寄存器没差别了。但这里还额外设计了一个LINFlexD_UARTCR[TDLF_TFC]字段,配置其中有效的数据长度(8字节、16字节或是32字节),这相当于指定了将发送数据寄存器从低位开始串行送上总线的时钟脉冲数量,或者说设定了当使用32位数据寄存器时,有效的数据段长度。

当配置为FIFO模式时,锁死了可配置的数据长度为1字节,然后由硬件利用这块存储空间实现了一个先入先出的机制,可以从DATA0这个入口一直“压弹”。这种固定数据入口地址的机制比较适合同DMA搭配使用,但如果是多字节的FIFO,还需要设计可产生DMA触发的阈值。但实际上,此时可以利用的LINFlexD_UARTCR[TDLF_TFC]字段,竟然变成了只读属性,而并不是配置触发阈值。这样算下来,届时能触发DMA的,只有缓冲区空这个事件了,并可约定每次触发连续搬运4个字节(直接将缓冲区填满)并要小心处理最后小于4个字节的部分(需要人为计算最后实际要搬运的数据量),或者不厌其烦地让DMA每次仅搬运一个数,相对于有FIFO数量阈值提前触发的方式,这样都有“断线”的风险。但对于小传输负载的应用,目前实现的简单的FIFO(相当于还是Buffer)已经足够应对了。

发送过程

仅当LINFlexD_UARTCR[TxEN]=1时,UART引擎才能发送数据。然后,通过向寄存器BRD0(DATA0)写数,触发传输过程。如果一次要传输多个字节,则需要先写寄存器BRD1-BRD3(需要提前配置好LINFlexD_UARTCR[TDLF_TFC],激活可以发送更多的数据位),最后写寄存器BRD0以启动传输。

发送缓冲区中所有的数据发送完毕后,发送数据缓冲区被清空,LINFlexD_UARTSR[DTF]标志位由硬件自动置位。

但需要注意是,再次向发送数据缓冲区中写数,并不能自动清零LINFlexD_UARTSR[DTF]标志位。在写新数之前,需要人工清发送完成标志位。如此看来,这个标志位并不是缓冲区的状态标志位,而是事件的标志位(类似于LIN通信帧的管理机制)。

在手册中有限的描述中,也未细分数据从缓冲区送至发送数据的串行移位器之间的时序(通常人为发送缓冲区空的时候就可以向其中送入新数,而不必等移位器把数移到总线之后再启动新的写数过程),这可能会在实际传输过程中插入很多间隙,从而损失传输效率。

当发送缓冲区为FIFO模式时,写数入口固定为BRD0寄存器,并且固定写数的长度为1字节。根据手册描述,此时,当FIFO被数据填满后,LINFlexD_UARTSR[DTF]表示发送缓冲区满???这个功能仅作为调试功能使用。如果是这样,笔者心中不免冒出一个疑问,当发送FIFO中的数据即将清空之际,用什么信号触发DMA搬运新数补充FIFO呢?

The LINFlexD uses a single transmit DMA channel (0) to move data from RAM to the UART transmit buffer. To enable DMA for UART transmit mode, both DMATXE[0] and input signal dma_enb_req_tx[0] must be asserted.

In response to assertion of ipd_req_tx[0], the DMA controller transfers up to 4 bytes or 2 halfwords from RAM to the UART transmit FIFO through successive writes to the DATA0~DATA3 registers.

In the cycle after the data phase of the last write for the transfer, the DMA controller must assert both dma_done_lw_tx[n] and dma_ipd_complete_tx[n] to acknowledge the DMA request.

FIFO配合轮询和中断模式,可用的触发事件和标志位略显单薄,FIFO模式在设计之初似乎就是给DMA使用的。

接收过程

接收过程同发送过程类似。仅当LINFlexD_UARTCR[RxEN]=1时,UART引擎才能监控总线上的信号,一旦检测到START信号就开始启动接收过程,向接收缓冲区中送数。当接收缓冲区中有数后,标志位LINFlexD_UARTSR[DRF_RFE]起来,软件要么用中断,要么用轮询,赶紧把接收缓冲区中的数读走,否则新数来了之后会触发缓冲区溢出错误的同时会丢数(根据LINFlexD_LINCR1[RBLM]配置确定覆盖旧数还是抛弃新数)。

接收缓冲区寄存器是从LINFlexD_DATA[4]开始的。另外,接收缓冲区同发送缓冲区一样,也有数据缓冲区长度的说法。发送过程的节奏是由MCU自己控制的,所以设置多少,只要符合自己需要,就都可以。但接收缓冲区的长度是不好确定的,其接收过程是由外部的发送方决定的。因此,建议的做法是,在约定使用8位数据格式的情况下,始终将接收缓冲区的有效长度设置为1字节(如果约定基本的通信单元是16位,也可以设置数据长度为2字节),就是收到一个单元的数据就直接触发接收事件。

将接收缓冲区中的数读走之后,硬件也不会自动清零标志位LINFlexD_UARTSR[DRF_RFE],也需要软件清零,这个要注意一下。

另外,关于FIFO模式和DMA,与发送过程相似,尚待笔者亲自验证。

软件

YTMicro-SDK中设计了linflexd_uart驱动,但并未提供专门的uart应用样例(轮询收发、中断收发、DMA收发),可通过hello_world工程了解 linflexd_uart驱动的用法。

参考文献

  • YTM32B1ME0x_RM.pdf

  • YTM32B1Mx_SDK_RTM_1.0.4.zip

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1040511.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

阿里云服务器使用教程(从购买到配置再到搭建自己的网站)

阿里云服务器使用教程包括云服务器购买、云服务器配置选择、云服务器开通端口号、搭建网站所需Web环境、安装网站程序、域名解析到云服务器公网IP地址,最后网站上线全流程,阿小云分享阿里云服务器详细使用教程: 目录 阿里云服务器使用教程 …

Python爬虫爬取豆瓣电影短评(爬虫入门,Scrapy框架,Xpath解析网站,jieba分词)

声明:以下内容仅供学习参考,禁止用于任何商业用途 很久之前就想学爬虫了,但是一直没机会,这次终于有机会了 主要参考了《疯狂python讲义》的最后一章 首先安装Scrapy: pip install scrapy 然后创建爬虫项目&#…

广东MES系统实现设备管理的方法与功能

在生产车间中,可以借助MES系统来完成设备管理。下面来看看借助MES系统实现设备管理比较常见的具体方法与功能: 1.在线监控和数据采集:MES系统能够与车间设备相连接,在线实时监控设备的运行状态和运行指标。凭借传感器、物联网产品…

【教程】Ubuntu自动查看有哪些用户名与密码相同的账户,并统一修改密码

转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 目录 背景说明 开始操作 修改密码 背景说明 有些用户为了图方便或者初始创建用户默认设置等原因,会将密码设置为与用户名相同,但这就使得非常不安全。甚至如果该用户具有sudo权限&#…

力扣26:删除有序数组中的重复项

26. 删除有序数组中的重复项 - 力扣(LeetCode) 题目: 给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 …

virtualbox安装的linux虚拟机安装并启动Tomcat过程(结合idea操作)记录,并使用宿主机访问页面

virtualbox安装的linux虚拟机安装并启动Tomcat过程(结合idea操作)记录,并使用宿主机访问页面 参考教程地址linux版本Tomcat下载地址上传解压 启动TomcatVirtualBox虚拟机本地可访问宿主机尚未可以访问关闭防火墙宿主机可以访问 参考教程地址 …

构建自己的物料解决方案——构建物料库,实现前端设计

01: 数据拦截简化数据获取流程 /** * 响应拦截器: * 服务端返回数据之后,前端 .then 之前被调用 */ service.interceptors.response.use((response) > {const { success, message, data } response.dataif (success) {return data}// TODO&#xff…

顺序读写函数的介绍:fscanf fprintf

目录 函数介绍: fprintf: 将结构体变量s的成员列表内容写入文件中: 文件效果:已经进行了格式化,3.140000是最明显的效果,因为float需要补齐0来补充精度 和printf的对比: 不同之处&#xff…

基础排序算法

插入排序(insertion sort) 插入排序每次循环将一个元素放置在适当的位置。像抓牌一样。手里的排是有序的,新拿一张牌,与手里的牌进行比较将其放在合适的位置。 插入排序要将待排序的数据分成两部分,一部分有序&#…

ddd扬帆

简介 读取了一篇“产品代码都给你看了,可别再说不会DDD”较为清晰了解了:领域驱动设计,整洁架构和事件驱动架构的架构思想落地实践,特做记录读后感,可以直接跳到正文阅读原文 正文 以下正文... 构建自己的软件大厦 …

【C++】C++11——可变参数模板和emplace

可变参数模板的定义方式可变参数模板的传值计算可变参数模板参数个数参数包展开方式递归展开参数包逗号表达式展开参数包 emplace插入 可变参数模板是C11新增的最强大的特性之一,它对参数高度泛化,能够让我们创建可以接受可变参数的函数模板和类模板。 在…

(a)Spring注解式开发,注册组件的@Repository,@Service,@Controller,@Component使用及说明

注解扫描原理 通过反射机制获取注解 Target(value {ElementType.TYPE})// 设置Component注解可以出现的位置,以上代表表示Component注解只能用在类和接口上 Retention(value RetentionPolicy.RUNTIME)// 设置Component注解的保持性策略,以上代表Comp…

社区团购美团和多多买菜小程序购物车

概述 微信小程序购物车列表demo 详细 需求 显示食物名称、价格、数量。 点击相应商品增加按钮,购买数量增加1,点击食物减少按钮,购买数量减一 显示购买总数和总金额 查看当前购买的商品 效果图(数据来自本地模拟) 目录结构 实现过程 主要wxml <view classfoods>…

工具篇 | H2数据库的使用和入门

引言 1.1 H2数据库概述 1.1.1 定义和特点 H2数据库是一款以 Java编写的轻量级关系型数据库。由于其小巧、灵活并且易于集成&#xff0c;H2经常被用作开发和测试环境中的便利数据库解决方案。除此之外&#xff0c;H2也适合作为生产环境中的嵌入式数据库。它不仅支持标准的SQL…

饮料生产线Modbus协议转换网关的应用介绍

在饮料生产线设备数据采集和控制系统中&#xff0c;MODBUS网关是一种非常重要的设备。它可以将不同设备之间的通讯协议转换为统一的MODBUS协议&#xff0c;从而实现数据采集和指令下达。在本文中&#xff0c;我们将介绍如何使用MODBUS网关采集饮料生产线设备数据并下达指令。 在…

知识库搭建保姆级教程,如何从0到1完成知识库搭建

在这个信息爆炸的时代&#xff0c;如何获取、整理和应用知识成为了我们个体价值和企业核心竞争力打造的重要表现&#xff0c;搭建一个高效的知识库可以提升我们企业的竞争力&#xff0c;必要时还能快速切换赛道&#xff0c;开展一个新的领域。 今天我们将结合HelpLook 来与你一…

基于C++实现的3D野外赛车驾驶游戏源码+项目文档+汇报PPT

项目介绍&#xff1a;本项目实现了一个户外场景下的赛车游戏&#xff0c;可以通过键盘控制赛车的移动&#xff0c;视角为第二人称视角。场景中有汽车&#xff0c;建筑&#xff0c;道路&#xff0c;天空等物体&#xff0c;拥有光照和阴影的效果。通过粒子系统模拟尾气效果&#…

Kubernetes组件和架构简介

目录 一.概念简介 1.含义&#xff1a; 2.主要功能&#xff1a; 3.相关概念&#xff1a; 二.组件和架构介绍 1.master&#xff1a;集群的控制平面&#xff0c;管理集群 2.node&#xff1a;集群的数据平面&#xff0c;为容器提供工作环境 3.kubernetes简单架构图解 一.概…

Windows迁移文件的快速方法

文章目录 1.简单比较2.传输方法介绍&#xff1a;有线&#xff08;直连网络&#xff09;3.传输方法介绍&#xff1a;无线热点传输4. 共享文件夹的设置5.挂载共享文件夹 1.简单比较 方法传输速度有线传输接近900Mb无线热点传输接近500MbU盘传输基本上不超过100Mb 2.传输方法介绍…

小程序-uniapp:URL Link / 适用于在移动端 从短信、邮件、微信外网页 等场景打开小程序任意页面

一、背景介绍 小程序URL Scheme、URL Link是微信小程序后台生成的一种地址&#xff0c;适用于从短信、邮件、微信外网页 等场景打开小程序任意页面。所以&#xff0c;适用性极强。可与微信扫码携带参数跳转到小程序指定页面技术互补 若在微信外打开&#xff0c;用户可以在浏览…