HPM6750系列--第十一篇 Uart讲解(轮询模式)

一、目的

        在介绍完GPIO的相关内容下一个必须介绍的就是uart了,因为串口一个主要用途就是用于调试信息打印。

        HPM6750在uart的配置上也是相当炸裂,有17个串口;结合HPM6750的高主频高内存,完全可以作为一个串口服务器。

        ​​​​​​​

        

二、介绍

        1.框图 

        TX FIFO 包含待发送的数据,并将数据传送到 TX 移位寄存器。TX 移位寄存器为并行-串行转换器,把发送数据转换成串行的比特流。

        TXFIFO 的写入口是THR寄存器 (Transmitter Holding Register)。用户需要把FCR寄存器 (FIFO Control Reg- ister) 的 FIFOE 位置 1,来打开 TXFIFO。

        RX 控制器使用波特率控制模块生成的过采样时钟,对输入的每一位进行采样,并把收到的每一位移入 RX 移 位寄存器。RX 移位寄存器对数据进行串行-并行转换,并把数据存入 RX FIFO。RX FIFO 的读入口是RBR寄存器 (Receiver Buffer Register),用户需要把FCR寄存器 (FIFO Control Register)的 FIFOE 位置 1,来打开 RXFIFO。

         

        2.基本特征
  • 支持 5∼8 位数据长度
  • 可配置停止位:1 位,1.5 位或者 2 位
  • 可配置奇偶校验位:奇校验,偶校验,粘校验位
  • 支持 DMA 数据传输
  • 支持可配置波特率,支持独立的波特率生成时钟
  • 支持硬件流控
  • 支持奇偶校验错误,数据 FIFO 溢出等错误检测
  • 16 字节的 TXFIFO 和 RXFIFO
  • 支持各类中断
        3.功能时钟(输入时钟)、过采样率、波特率三者之间的关系

        在时钟章节我们讲到每个外设都可以八选一选择一个功能时钟,并且设置分频。 

         

         

        上图中我们通过clock_set_source_divider设置uart0选择clk_src_osc24m=24MHz时钟源,不分频,也就是说上图中的配置uart0输入时钟为24MHz。

        UART 时钟与波特率的比率就是过采样率OSC。    

        RX 控制器利用过采样时钟对输入数据进行采样。假设过采样率OSC为 16 当检测到输入信号第一个下降沿 时 (起始 START 位),计数器从 1 开始计数直到 16,在计数到 8 时,RX 控制器对输入数据采样。计数器在计数 到 16 后,会复位到 1,以此采样下一位数据,循环往复,直到停止 STOP 位。TX 控制器同样利用过采样时钟来 生成输出数据流。 

        uart外设内部还有一个时钟分频寄存器(16位)Divisor。分频值的 MSB 位于DLM寄存器 (Divisor Latch MSB),而 LSB 位于DLL寄存器 (Divisor Latch LSB)。

        三者之间的关系如下:

                  

        在SDK中有一个函数专门用于计算分频系数和过采样率,对于开发者来讲,只需要设置输入时钟和波特率即可。

         

       4.引脚配置(以uart0为例)

        由于uart0使用PY06/07作为TXD/RXD, 而PY06/07属于电源管理域的引脚,所以必须先通过HPM_PIOC先将引脚映射到HPM_IOC中,然后由HPM_IOC再将PY06/07复用为外设引脚。

        5.API接口说明 

        

typedef struct hpm_uart_config {uint32_t src_freq_in_hz;                    /**< Source clock frequency in Hz */uint32_t baudrate;                          /**< Baudrate */uint8_t num_of_stop_bits;                   /**< Number of stop bits */uint8_t word_length;                        /**< Word length */uint8_t parity;                             /**< Parity */uint8_t tx_fifo_level;                      /**< TX Fifo level */uint8_t rx_fifo_level;                      /**< RX Fifo level */bool dma_enable;                            /**< DMA Enable flag */bool fifo_enable;                           /**< Fifo Enable flag */uart_modem_config_t modem_config;           /**< Modem config */
#if defined(UART_SOC_HAS_RXLINE_IDLE_DETECTION) && (UART_SOC_HAS_RXLINE_IDLE_DETECTION == 1)uart_rxline_idle_config_t  rxidle_config;   /**< RX Idle configuration */
#endif
#if defined(UART_SOC_HAS_TXLINE_IDLE_DETECTION) && (UART_SOC_HAS_TXLINE_IDLE_DETECTION == 1)uart_rxline_idle_config_t  txidle_config;   /**< TX Idle configuration */
#endif
#if defined(UART_SOC_HAS_RXEN_CFG) && (UART_SOC_HAS_RXEN_CFG == 1)bool rx_enable;                             /**< RX Enable configuration */
#endif
} uart_config_t;

        各个字段含义:

src_freq_in_hz 输入时钟,八选一,并且可以分频(注意uart内部可以再次分频)
baudrate波特率
num_of_stop_bits

停止位

typedef enum num_of_stop_bits {
    stop_bits_1 = 0,
    stop_bits_1_5,
    stop_bits_2,
} num_of_stop_bits_t;

word_length

字长

typedef enum word_length {
    word_length_5_bits = 0,
    word_length_6_bits,
    word_length_7_bits,
    word_length_8_bits,
} word_length_t;

parity

奇偶校验位

typedef enum parity {
    parity_none = 0,
    parity_odd,
    parity_even,
    parity_always_1,
    parity_always_0,
} parity_setting_t;

tx_fifo_level发送触发阈值
rx_fifo_level接收触发阈值
dma_enable使能DMA
fifo_enable使能FIFO
modem_config

流控

typedef struct uart_modem_config {
    bool auto_flow_ctrl_en;     /**< Auto flow control enable flag */
    bool loop_back_en;          /**< Loop back enable flag */
    bool set_rts_high;          /**< Set signal RTS level high flag */
} uart_modem_config_t;

                uart_init函数用于设置波特率、字长、停止位、奇偶校验以及FIFO阈值。

hpm_stat_t uart_init(UART_Type *ptr, uart_config_t *config)
{uint32_t tmp;uint8_t osc;uint16_t div;/* disable all interrupts */ptr->IER = 0;/* Set DLAB to 1 */ptr->LCR |= UART_LCR_DLAB_MASK;if (!uart_calculate_baudrate(config->src_freq_in_hz, config->baudrate, &div, &osc)) {return status_uart_no_suitable_baudrate_parameter_found;}ptr->OSCR = (ptr->OSCR & ~UART_OSCR_OSC_MASK)| UART_OSCR_OSC_SET(osc);ptr->DLL = UART_DLL_DLL_SET(div >> 0);ptr->DLM = UART_DLM_DLM_SET(div >> 8);//设置奇偶校验/* DLAB bit needs to be cleared once baudrate is configured */tmp = ptr->LCR & (~UART_LCR_DLAB_MASK);tmp &= ~(UART_LCR_SPS_MASK | UART_LCR_EPS_MASK | UART_LCR_PEN_MASK);switch (config->parity) {case parity_none:break;case parity_odd:tmp |= UART_LCR_PEN_MASK;break;case parity_even:tmp |= UART_LCR_PEN_MASK | UART_LCR_EPS_MASK;break;case parity_always_1:tmp |= UART_LCR_PEN_MASK | UART_LCR_SPS_MASK;break;case parity_always_0:tmp |= UART_LCR_EPS_MASK | UART_LCR_PEN_MASK| UART_LCR_SPS_MASK;break;default:/* invalid configuration */return status_invalid_argument;}//设置停止位tmp &= ~(UART_LCR_STB_MASK | UART_LCR_WLS_MASK);switch (config->num_of_stop_bits) {case stop_bits_1:break;case stop_bits_1_5:tmp |= UART_LCR_STB_MASK;break;case stop_bits_2:if (config->word_length < word_length_6_bits) {/* invalid configuration */return status_invalid_argument;}tmp |= UART_LCR_STB_MASK;break;default:/* invalid configuration */return status_invalid_argument;}//设置字长ptr->LCR = tmp | UART_LCR_WLS_SET(config->word_length);//复位FIFO并设置FIFO阈值#if defined(UART_SOC_HAS_FINE_FIFO_THR) && (UART_SOC_HAS_FINE_FIFO_THR == 1)/* reset TX and RX fifo */ptr->FCRR = UART_FCRR_TFIFORST_MASK | UART_FCRR_RFIFORST_MASK;/* Enable FIFO */ptr->FCRR = UART_FCRR_FIFOT4EN_MASK| UART_FCRR_FIFOE_SET(config->fifo_enable)| UART_FCRR_TFIFOT4_SET(config->tx_fifo_level)| UART_FCRR_RFIFOT4_SET(config->rx_fifo_level)| UART_FCRR_DMAE_SET(config->dma_enable);#else/* reset TX and RX fifo */ptr->FCR = UART_FCR_TFIFORST_MASK | UART_FCR_RFIFORST_MASK;/* Enable FIFO */tmp = UART_FCR_FIFOE_SET(config->fifo_enable)| UART_FCR_TFIFOT_SET(config->tx_fifo_level)| UART_FCR_RFIFOT_SET(config->rx_fifo_level)| UART_FCR_DMAE_SET(config->dma_enable);ptr->FCR = tmp;/* store FCR register value */ptr->GPR = tmp;
#endifuart_modem_config(ptr, &config->modem_config);#if defined(UART_SOC_HAS_RXLINE_IDLE_DETECTION) && (UART_SOC_HAS_RXLINE_IDLE_DETECTION == 1)uart_init_rxline_idle_detection(ptr, config->rxidle_config);
#endif
#if defined(UART_SOC_HAS_RXEN_CFG) && (UART_SOC_HAS_RXEN_CFG == 1)if (config->rx_enable) {ptr->IDLE_CFG |= UART_IDLE_CFG_RXEN_MASK;}
#endifreturn status_success;
}

        读取字节


hpm_stat_t uart_receive_byte(UART_Type *ptr, uint8_t *byte)
{uint32_t retry = 0;while (!(ptr->LSR & UART_LSR_DR_MASK)) {if (retry > HPM_UART_DRV_RETRY_COUNT) {break;}retry++;}if (retry > HPM_UART_DRV_RETRY_COUNT) {return status_timeout;}*byte = ptr->RBR & UART_RBR_RBR_MASK;return status_success;
}

        不断查询LSR寄存器的UART_LSR_DR_MASK是否置位(存在有效的接收数据时该位置 1),如果置位说明可读,此时RBR寄存器存储的就是当前可读字节。

        写入字节

hpm_stat_t uart_send_byte(UART_Type *ptr, uint8_t c)
{uint32_t retry = 0;while (!(ptr->LSR & UART_LSR_THRE_MASK)) {if (retry > HPM_UART_DRV_RETRY_COUNT) {break;}retry++;}if (retry > HPM_UART_DRV_RETRY_COUNT) {return status_timeout;}ptr->THR = UART_THR_THR_SET(c);return status_success;
}

         不断查询LSR寄存器的UART_LSR_THRE_MASK是否置位(发送FIFO空),如果置位说明可写,此时写入THR寄存器就会传送给TX FIFO。

三、实战

        VScode打开工程并进入调试窗口,在

cd ~/workspace/work/hpm/hello_world
code .
uart0引脚配置

 

uart0串口寄存器配置

 

                以上就是uart的基本内容,包括功能说明、引脚配置、时钟配置、轮询读写。 

         

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

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

相关文章

智能优化算法应用:基于天牛须算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于天牛须算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于天牛须算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.天牛须算法4.实验参数设定5.算法结果6.参考文…

MLOps在极狐GitLab 的现状和前瞻

什么是 MLOps 首先我们可以这么定义机器学习&#xff08;Machine Learning&#xff09;&#xff1a;通过一组工具和算法&#xff0c;从给定数据集中提取信息以进行具有一定程度不确定性的预测&#xff0c;借助于这些预测增强用户体验或推动内部决策。 同一般的软件研发流程比…

如何用 Redis 中的 HyperLogLog 统计页面 UV?

HyperLogLog&#xff08;HLL&#xff09;是 Redis 中一种用于基数估计的数据结构&#xff0c;适合用于统计唯一值&#xff08;Unique Values&#xff09;。在页面 UV 统计中&#xff0c;可以使用 HyperLogLog 来估算唯一访客的数量。以下是一个简单的示例&#xff1a; 安装 Red…

Web程序设计期末测试练习题

一、单选题 1、下列选项不是动态网站开发技术的是&#xff08;C&#xff09;。 A. ASP B. PHP C. CSS D. JSP 2、在一个动态网站项目中&#xff0c;可以放置一些外部类库的地方是&#xff08;B&#xff09;。 A. /WEB-INF/Iib 放置已经编译的类文件 B. /WEB-INF/lib …

如何进行性能优化和算法优化?

性能优化和算法优化是编程中至关重要的方面&#xff0c;特别是在涉及大规模数据处理、实时系统或资源受限环境下。C语言作为一种底层、高性能的编程语言&#xff0c;对性能的优化有着显著的影响。在本文中&#xff0c;我们将深入探讨如何在C语言中进行性能和算法优化的方法和技…

【lesson17】MySQL表的基本操作--表去重、聚合函数和group by

文章目录 MySQL表的基本操作介绍插入结果查询&#xff08;表去重&#xff09;建表插入数据操作 聚合函数建表插入数据操作 group by&#xff08;分组&#xff09;建表插入数据操作 MySQL表的基本操作介绍 CRUD : Create(创建), Retrieve(读取)&#xff0c;Update(更新)&#x…

【TB作品】STM32 PWM之实现呼吸灯,STM32F103RCT6,晨启

文章目录 完整工程参考资料实验过程 实验任务&#xff1a; 1&#xff1a;实现PWM呼吸灯&#xff0c;定时器产生PWM&#xff0c;控制实验板上的LED灯亮灭&#xff1b; 2&#xff1a;通过任意两个按键切换PWM呼吸灯输出到两个不同的LED灯&#xff0c;实现亮灭效果&#xff1b; 3&…

alma linux配置ntp客户端和服务端

一、配置客户端&#xff1a; dnf 是即将到来的继yum之后的一个rpm包管理器&#xff0c;先检查一下是否安装了任务计划chrony&#xff1a; dnf list installed | grep chrony 无则安装、加入开机启动&#xff1a; dnf install chrony systemctl enable chronyd 将以下行添加…

Axure的案例演示

增删改查&#xff1a; 在中继器里面展示照片

创建型模式之抽象工厂模式

一、概述 1、抽象工厂模式&#xff1a;提供一个创建一系列相关或相互依赖对象的接口&#xff0c;而无需指定它们具体的类。 2、抽象工厂模式&#xff1a;一个工厂可以生产一系列产品&#xff08;一族产品&#xff09;&#xff0c;极大减少了工厂类的数量 3、抽象工厂模式&am…

众和策略:加强经济监测预测预警 加大宏观调控力度

12月17日至18日&#xff0c;全国展开和革新作业会议在京举行&#xff0c;整理总结2023年展开革新作业&#xff0c;组织布置2024年展开革新关键使命。会议指出&#xff0c;中心经济作业会议对本年经济作业作了全面体系总结&#xff0c;侧重我国经济全体上升向好&#xff0c;全年…

选择合适教育管理软件:必须考虑的10个关键问题

随着教育行业的迅速数字化&#xff0c;学校要能够提供最新的管理和教育方法。大家逐渐意识到技术让运营变得更容易、更有效率。 不过首先我们需要找到一个能满足需求的应用程序。面对众多的选择&#xff0c;你该如何选择一个合适的平台呢&#xff1f;当然&#xff0c;没有人想…

MYSQL中使用IN,在xml文件中怎么写?

MYSQL&#xff1a; Spring中&#xff1a; mysql中IN后边的集合&#xff0c;在后端中使用集合代替&#xff0c;其他的没有什么注意的&#xff0c;还需要了解foreach 语法即可。

Spark编程实验一:Spark和Hadoop的安装使用

目录 一、目的与要求 二、实验内容 三、实验步骤 1、安装Hadoop和Spark 2、HDFS常用操作 3、Spark读取文件系统的数据 四、结果分析与实验体会 一、目的与要求 1、掌握在Linux虚拟机中安装Hadoop和Spark的方法&#xff1b; 2、熟悉HDFS的基本使用方法&#xff1b; 3、掌…

SCADA助力食品加工数字化变革:未来产业的智慧引擎

一、背景介绍 当前&#xff0c;在国际市场竞争加剧、消费者个性化需求突出的背景下&#xff0c;我国食品加工行业面临着诸多挑战&#xff1a;越发严苛的食品安全标准、追求供应链的透明度和效率、进一步提高产品质量和降低成本等等。 为了应对上述挑战&#xff0c;我国食品加…

亚马逊,速卖通,shein卖家如何准确有效的测评补单

一、合理规划测评时间和数量 卖家需要合理规划测评的时间和数量。如果卖家过于频繁地进行测评&#xff0c;或者在短时间内进行大量的测评&#xff0c;这可能会被视为恶意行为&#xff0c;从而触犯风控机制。因此&#xff0c;卖家需要根据自己的销售情况和市场需求&#xff0c;…

RPC通信编解码库对比:json、flatbuf、protobuf、MessagePack

JSON: 1、JSON是纯文本。 2、JSON具有良好的自我描述性&#xff0c;便于阅读。 优点 1 简单易用开发成本低 2 跨语言 3 轻量级数据交换 4 非冗长性&#xff08;对比xml标签简单括号闭环&#xff09; 缺点 1 体积大&#xff0c;影响高并发 2 无版本检查&#xff0c;自己做…

如何确保对称密钥管理的存储安全?

确保对称密钥管理的存储安全是保障信息安全的重要一环。以下是一些建议&#xff0c;以确保对称密钥管理的存储安全&#xff1a; 使用安全存储设备&#xff1a;选择使用经过验证的安全存储设备来存储对称密钥。这些设备通常具有高度的物理安全性&#xff0c;可以防止未经授权的访…

Ubuntu共享文件夹到Windows上

两个电脑互传数据通过U盘还是比较繁琐&#xff0c;对于日常小文件的传输需求来看&#xff0c;可以将Ubuntu上某个文件夹设为共享&#xff0c;在Windows上将该共享文件夹映射为磁盘。于是&#xff0c;通过一个Win和Ubuntu都能打开的一个文件夹实现数据的互通有无。 实际上&…

vp与vs联合开发-通过CogAcqFifoTool工具连接相机

1.完成相机硬件配置后 2.完成vp与vs联合开发配置功能后 1.创建winform 项目 目的 : 搭建 界面应用 2. 1. vpp文件存入 项目的debug 目录中 目的&#xff1a; 在项目中加载本地vpp文件 读取相机工具 1.控件CogRecordDisplay 用于显示相机拍摄照片和实施显示的窗口 2和3 …