当前位置: 首页 > news >正文

硬件(十一):EPIT、GPT、UART 外设配置

一、EPIT(增强型周期性中断定时器)

1. 核心概念

EPIT(Enhanced Periodic Interrupt Timer)是嵌入式处理器(如i.MX6ULL)内部的增强型周期性中断定时器,用于产生周期性中断、实现精准延时或对外部事件计数,可释放 CPU 资源,提升系统效率。

2. 工作模式

  • set-and-forget 模式:计数器从加载寄存器(EPITx_LR)获取初始值,计数到 0 后,重新从加载寄存器加载数据到计数器,周而复始。
  • free-running 模式:计数器计数到 0 后,重新从 0xFFFFFFFF 开始计数,而非从加载寄存器获取数据。

3. 关键寄存器

  • EPITx_CR:控制寄存器,用于设置时钟源、分频值、工作模式、使能中断等。
  • EPITx_SR:状态寄存器,用于标志中断是否产生,需软件清除中断标志。
  • EPITx_LR:加载寄存器,存储计数器的初始 “加载值”,决定定时时间。
  • EPITx_CMPR:比较寄存器,当计数器值与该寄存器值匹配时,可触发中断(部分场景使用)。
  • EPITx_CNR:当前计数寄存器,可读取当前计数器的实时值,用于调试或动态调整定时。

4. 配置代码与分析

void epit1_interrupt_handler(void)
{if((EPIT1->SR & (1 << 0)) != 0){led_on_off();EPIT1->SR |= (1 << 0);}
}void init_epit1(void)
{EPIT1->CR = 0;// 配置时钟源、分频、工作模式、使能比较中断等EPIT1->CR |= (1 << 24) | (1 << 17) | (65 << 4) | (1 << 3) | (1 << 2) | (1 << 1);EPIT1->LR = 1000000; // 设置加载值,决定定时周期EPIT1->CMPR = 0;     // 计数到 0 触发中断system_interrupt_register(EPIT1_IRQn, epit1_interrupt_handler);GIC_EnableIRQ(EPIT1_IRQn);EPIT1->CR |= (1 << 0); // 使能 EPIT1 定时器
}
  • 工作逻辑:配置为 set-and-forget 模式,EPIT1->LR = 1000000 为初始加载值,计数到 0 时触发中断,在中断处理函数中实现 led_on_off(LED 翻转),若定时 1 秒,可实现 LED 1 秒闪一次。

二、GPT(通用定时器)

1. 核心功能

GPT(General Purpose Timer)是通用定时器,可用于产生定时中断、实现延时功能,也能进行输入捕获(测量外部脉冲)和比较输出(控制引脚电平)等操作。

2. 关键特性

  • 支持输入捕获:以 GPT_CAPTURE1 为例,可设置为上升沿捕获,当引脚出现上升沿时,GPT 会将当前计数值保存到 Timer Input Reg1 寄存器中。
  • 支持比较输出:在 Timer Output Reg1 中设置一个数值,当计数值到达该值时,会按照设置改变 GPT_COMPARE1 引脚的电平。

3. 配置代码与分析

void init_gpt1(void)
{GPT1->CR = 0;GPT1->CR |= (1 << 15); // 软件复位while((GPT1->CR & (1 << 15)) != 0);GPT1->CR |= (1 << 9) | (1 << 6); // 配置工作模式等GPT1->PR = 65; // 设置分频值GPT1->CR |= (1 << 0); // 使能 GPT1 定时器
}void delayus(unsigned int n)
{unsigned int counter = 0;unsigned int old_counter, new_counter;old_counter = GPT1->CNT;while(1){new_counter = GPT1->CNT;if(new_counter != old_counter){if(new_counter > old_counter){counter += new_counter - old_counter;}else{counter += 0xFFFFFFFF - old_counter + new_counter;}if(counter >= n){return ;}old_counter = new_counter;}}
}void delayms(unsigned int n)
{while(n--){delayus(1000);}
}
  • 工作逻辑:init_gpt1 初始化 GPT1 定时器,配置分频等参数;delayus 和 delayms 函数利用 GPT1 的计数器实现微秒级和毫秒级延时,可用于各种需要精准延时的场景,也能配合其他逻辑实现如 LED 定时闪烁等功能(若基于延时函数控制 LED 翻转,可实现 1 秒闪一次)。

三、UART(通用异步收发传输器)

1. 核心概念

UART(Universal Asynchronous Receiver/Transmitter)是通用异步收发传输器,用于设备间的串行异步通信,广泛应用于串口调试、数据传输等场景。

2. DTE 与 DCE 区别

  • DTE(Data Terminal Equipment,数据终端设备):指用户端的设备,如计算机、单片机等,是数据的发起者或最终接收者。
  • DCE(Data Circuit-terminating Equipment,数据电路终接设备):指通信线路端的设备,如调制解调器(Modem)、串口转 USB 模块等,用于将 DTE 发出的信号转换为适合通信线路传输的形式,或进行反向转换。

3. 配置代码与分析

void init_uart1(void)
{// 配置 UART1 收发引脚的复用功能IOMUXC_SetPinMux(IOMUXC_UART1_TX_DATA_UART1_TX, 0);IOMUXC_SetPinMux(IOMUXC_UART1_RX_DATA_UART1_RX, 0);// 配置 UART1 收发引脚的电气属性IOMUXC_SetPinConfig(IOMUXC_UART1_TX_DATA_UART1_TX, 0x10B0);IOMUXC_SetPinConfig(IOMUXC_UART1_RX_DATA_UART1_RX, 0x10B0);UART1->UCR1 = 0;UART1->UCR2 = 0;// 配置 UCR2:使能 Tx/Rx、8 位数据位、无校验等UART1->UCR2 |= (1 << 14) | (1 << 5) | (1 << 2) | (1 << 1);UART1->UCR3 |= (1 << 2); // 忽略 RTS 引脚UART1->UFCR = (5 << 7);  // 设置分频UART1->UBIR = 999;       // 波特率设置UART1->UBMR = 43402;     // 波特率设置UART1->UCR1 |= (1 << 0); // 使能 UART1
}void putc(unsigned char ch)
{// 等待发送缓冲区为空while((UART1->USR2 & (1 << 3)) == 0);UART1->UTXD = ch; // 发送字符
}
  • 工作逻辑:init_uart1 初始化 UART1,配置引脚复用、电气属性、波特率等参数;putc 函数实现字符的发送,在主函数中循环调用 putc('A') 并延时 1 秒,可实现每秒向串口发送一个字符 'A'

四、EPIT 与 GPT 区别

特性EPITGPT
核心定位专注周期性中断,释放 CPU 资源通用定时器,功能更丰富(输入捕获、比较输出等)
工作模式set-and-forgetfree-running多种工作模式,支持输入捕获、比较输出等场景
典型应用周期性任务调度、精准延时延时、输入捕获(脉冲测量)、比较输出(引脚控制)
精度侧重高精度周期性中断精度满足一般定时、捕获、输出需求

两者都能实现如 LED 1 秒闪一次的功能,EPIT 更专注于周期性中断场景,GPT 则是通用型定时器,适用范围更广。


文章转载自:

http://2qvHbyAj.mkkcr.cn
http://7POLEg2S.mkkcr.cn
http://TuG4gUfk.mkkcr.cn
http://I9Vp5siW.mkkcr.cn
http://Tj5zHMom.mkkcr.cn
http://5b1yCHwk.mkkcr.cn
http://l0zk5Kq5.mkkcr.cn
http://TBjIJ6gM.mkkcr.cn
http://nLGR3jqv.mkkcr.cn
http://fCtoZ20o.mkkcr.cn
http://wKnVu6Kt.mkkcr.cn
http://RQ1D0RVu.mkkcr.cn
http://FugB1slj.mkkcr.cn
http://ngTRbw2f.mkkcr.cn
http://k4Isq8Zi.mkkcr.cn
http://P0mPx6AT.mkkcr.cn
http://CEBledbo.mkkcr.cn
http://pREISsbn.mkkcr.cn
http://rQx3smOv.mkkcr.cn
http://dFTbObnU.mkkcr.cn
http://4QbTOoWC.mkkcr.cn
http://FCLrHYHP.mkkcr.cn
http://GaHDZZkz.mkkcr.cn
http://EpjjkJjg.mkkcr.cn
http://IFNJRPnq.mkkcr.cn
http://sDQPAkD7.mkkcr.cn
http://J3xnFl5y.mkkcr.cn
http://oYCTv1ei.mkkcr.cn
http://4RrHX4NH.mkkcr.cn
http://F5iSxJ5R.mkkcr.cn
http://www.dtcms.com/a/384549.html

相关文章:

  • 趣味学RUST基础篇(OOP)
  • 微服务网关的bug
  • Rust 与 C/C++ 的特性对比
  • mac 安装hive
  • Nginx 从入门到进阶:反向代理、负载均衡与高性能实战指南
  • 微服务-nacos服务中心
  • uniApp开发XR-Frame微信小程序 | 动态加载与删除模型
  • AR 巡检在工业的应用|阿法龙XR云平台
  • eureka微服务注册问题
  • 【LangChain指南】大语言模型(LLMs)
  • 一台设备管理多个 GitHub 账号:从配置到切换的完整指南
  • K - 近邻(KNN)算法:基于约会数据集的分类任务全流程
  • 机器学习实战第四章 线性回归
  • 概率统计面试题2:随机抛掷两点到圆心距离较小值的期望
  • 什么是 OFDM?它如何解决频率选择性衰落?
  • 第一部分:VTK基础入门(第3章:VTK架构与核心概念)
  • 基于深度学习的中文方言识别模型训练实战
  • 【机器学习】用Anaconda安装学习环境
  • 【C语言】C语言内存存储底层原理:整数补码、浮点数IEEE754与大小端(数据内存存储的深度原理与实践)
  • MongoDB - 连接
  • 【Day 57】Linux-Redis
  • Go语言爬虫:爬虫入门
  • HarmonyOS图表组件库对比:UCharts、VChart、Omni-UI、mcCharts
  • 生活中的花花草草和各色人物
  • HTML属性和值
  • 【STL库】unordered_map/unordered_set 类学习
  • 学习threejs,使用自定义GLSL 着色器,实现水面、粒子特效
  • 机器学习-第二章
  • 贪心算法在SDN流表优化中的应用
  • 植物1区TOP——GWAS eQTL如何精准定位调控棉花衣分的候选基因