网站开发费 税率,南充房产信息,wordpress 设置显示中文字体,四川省建设厅的注册中心网站首页大家好#xff0c;我是痞子衡#xff0c;是正经搞技术的痞子。今天痞子衡给大家介绍的是i.MXRT1010上的普通GPIO与高速GPIO极限翻转频率。上一篇文章 《聊聊i.MXRT1xxx上的普通GPIO与高速GPIO差异及其用法》#xff0c;痞子衡从原理上介绍了 i.MXRT1xxx 系列里普通 GPIO 和 … 大家好我是痞子衡是正经搞技术的痞子。今天痞子衡给大家介绍的是i.MXRT1010上的普通GPIO与高速GPIO极限翻转频率。上一篇文章 《聊聊i.MXRT1xxx上的普通GPIO与高速GPIO差异及其用法》痞子衡从原理上介绍了 i.MXRT1xxx 系列里普通 GPIO 和 HSGPIO 差异今天我们就来实测它们的极限翻转频率看看它们实际表现差别到底有多大。本次选择的测试芯片是 i.MXRT1010这颗芯片从功能上来说是目前 i.MXRT1xxx 系列里的小兄弟但别小看它因为是后面推出的型号恩智浦的设计团队为它在某些方面做了特殊的性能优化包括 HSGPIO 性能。话不多说开测一、测试准备工作1.1 测试板卡及测试点选定的板卡是恩智浦官方 MIMXRT1010-EVK板卡上连接 LED 灯的是 GPIO_11翻看芯片参考手册这个 PAD 既可以配到普通 GPIOGPIO1[11] 也可以配到 HSGPIOGPIO2[11]正是理想的 PAD我们就选择这个 PAD 做测试。此外最终 I/O 输出波形形态跟外围驱动电路也有关联所以这里也有必要交待清楚1.2 I/O 翻转测试代码测试工程我们可以直接在 \SDK_2.11.0_EVK-MIMXRT1010\boards\evkmimxrt1010\driver_examples\gpio\led_output 例程上修改为了尽力展示 GPIO 极限性能不受其他瓶颈因素干扰这里选择代码执行性能最高的工程 build即代码段在 ITCM 里数据段在 DTCM 里。I/O 初始化代码很简单在 《普通GPIO与高速GPIO差异及其用法》 文章里都介绍清楚了。这里仅有一点注意为了统一最终 I/O 输出效果不管是用于普通 GPIO 还是 HSGPIO我们都直接将测试 PAD 配置到最快的 200MHz 运行频率PAD 支持的 50/100/150/200MHz 运行频率配置不同有何影响文章最后会交待void io_test_init(bool useNormalGpio)
{gpio_pin_config_t led_config {kGPIO_DigitalOutput, 0, kGPIO_NoIntmode};CLOCK_EnableClock(kCLOCK_Iomuxc); IOMUXC_SetPinMux(IOMUXC_GPIO_11_GPIOMUX_IO11, 0U); // Fast Slew Rate, R0/6, 200MHzIOMUXC_SetPinConfig(IOMUXC_GPIO_11_GPIOMUX_IO11, 0x70F9U);if (useNormalGpio){// GPIO1IOMUXC_GPR-GPR26 ~(1u 11);GPIO_PinInit(GPIO1, 11, led_config);}else{// GPIO2IOMUXC_GPR-GPR26 | (1u 11);GPIO_PinInit(GPIO2, 11, led_config);}
}在 GPIO 模块里跟电平输出控制相关的寄存器有两个一个是 DR 寄存器另一个是 DR_TOGGLE 寄存器都可用于实现输出电平翻转。有如下代码所示的三种常见电平翻转方法在低翻转频率情况下这三种方法是等效的但是在极限翻转频率情况下这三种方法表现不完全一致下一节实测结果会告诉你void io_test_run(void)
{io_test_init(false);while (1){// 电平翻转方法一异或位操作//GPIO2-DR ^ 0x800;// 电平翻转方法二直接切换位//GPIO2-DR 0x800;//GPIO2-DR 0x000;// 电平翻转方法三利用 TOGGLE 位GPIO2-DR_TOGGLE 0x800;}
}1.3 芯片系统时钟配置《普通GPIO与高速GPIO差异及其用法》 一文里讲了普通 GPIO 时钟源是 IPG Bus而 HSGPIO 时钟源是 AHB Bus因此测试工程里 AHB/IPG 时钟配置会影响最终 I/0 翻转极限频率。下图是 i.MXRT1010 内核结构里的 HSGPIO 通路它和 i.MXRT1060/1170 内核结构里 HSGPIO 通路其实有点小区别这也是 i.MXRT1010 上的优化之处。led_output 例程里的默认系统时钟配置AHB/Core 时钟来自于 PLL6 - 500MHzAHB_PODF 设 0 即不分频而 IPG Bus 时钟源固定来自于 AHB/Core且只能在其基础上做 1/2/3/4 分频我们知道 IPG Bus 最高仅支持 150MHz因此在这种情况下 IPG_PODF 只能设 3四分频IPG 时钟实际是 125MHz显然 HSGPIO 访问可以得到最优性能但普通 GPIO 达不到最优性能。为了测试普通 GPIO 的最优性能我们需要同时再测试一种新的系统时钟配置AHB/Core 时钟源选用 PLL2_PFD3将这个源配置为 452.6 MHzAHB_PODF 依旧设 0这样 IPG_PODF 设 2三分频可以得到 150.8MHz 的 IPG 时钟这时普通 GPIO 访问可以得到最优性能不过 HSGPIO 访问就要损失点性能了。二、测试波形结果准备工作都做完了现在就是示波器连上板卡开始实测了根据组合一共有时钟配置x2* I/O 类型x2* 翻转方法x3总计 12 个结果这里仅贴出 HSGPIO 在 500MHz AHB/Core 时钟频率下的三种翻转方法所得到的波形结果全部测试结果见最后一节。首先是 GPIO-DR 寄存器异或位操作得到的波形结果为了减少 while(1) 的执行对翻转频率的影响毕竟这一句指令也是要消耗 CPU 周期的我们在 while(1) 里加十次翻转代码统计结果时也是取 10 个波形周期最终得到翻转频率为 22.946 MHz效果似乎一般。汇编窗口来看这句 C 代码异或操作被翻译成了三条指令先 LDR 指令读出 GPIO-DR 寄存器当前值然后 EOR 指令做异或操作最后再 STR 指令写入 GPIO-DR 寄存器应该是 LDR 回读指令耗时较长。再来看 GPIO-DR_TOGGLE 置位操作和 GPIO-DR 的直接写入操作结果实测下来发现这两种方法得到的翻转频率是一样的从汇编窗口来看两种翻转方法都是仅一条 STR 指令搞定都是 250MHz效果虽好但有点过头因为波形里看到的不是标准幅值的方波受200MHz带宽示波器限制而是减半幅值的正弦波也不排除 PAD 最大运行速度是 200MHz它只能保证在低于 200MHz 的情况下有很好的电压幅值响应表现超过这个频率波形频率值不受影响但电压幅值响应表现不能保证。三、完整结果统计现在我们来看一下全部的结果因为三种 I/O 翻转方法里有两种效果是一样的所以我们省略了 GPIO-DR 直接写入这种方法的结果最终得到了 8 个结果。根据实测结果我们得到了如下结论总结1PAD配置里的运行频率并不限制最终输出翻转频率只是无法保证超过设置频率后的波形幅值响应表现总结2置位 GPIO-DR_TOGGLE 寄存器可获得最佳 I/O 翻转性能总结3普通 GPIO 最大翻转频率是 20.614MHz约是时钟源 IPG Bus 的 1/7.5总结4HSGPIO 最大翻转频率是 250MHz约是时钟源 AHB Bus 的 1/2AHB/Core时钟频率IPG总线时钟频率I/O PAD配置I/O翻转方法普通GPIO极限翻转频率高速GPIO极限翻转频率500MHz125MHzFast Slew, 200MHz异或GPIO-DR5.214MHz 标准幅度方波22.946MHz 标准幅度方波500MHz125MHzFast Slew, 200MHz置位GPIO-DR_TOGGLE15.533MHz 标准幅度方波250MHz 减半幅度正弦波452.6MHz150.8MHzFast Slew, 200MHz异或GPIO-DR6.309MHz 标准幅度方波18.864MHz 标准幅度方波452.6MHz150.8MHzFast Slew, 200MHz置位GPIO-DR_TOGGLE20.614MHz 标准幅度方波226.244MHz 减半幅度正弦波四、一个有趣的问题最后再留一个开放问题在痞子衡旧文 《以GPIO模块为例谈谈中断处理函数(IRQHandler)的标准流程》 里提到过 ARM Errata 838869 即在 Cortex-M4/7 上如果 CPU 执行速度远远高于 GPIO 外设寄存器写入速度如果代码逻辑里涉及 GPIO 寄存器回读一般需要在 GPIO 寄存器写入操作后额外插入 DSB 指令来保证同步。我们现在在 500MHz AHB/Core 时钟频率下 HSGPIO 翻转代码里额外插入 DSB 指令看看有什么影响结果翻转频率从 250MHz 一下子降到了 35.8MHz。至此i.MXRT1010上的普通GPIO与高速GPIO极限翻转频率痞子衡便介绍完毕了掌声在哪里~~~推荐阅读专辑|Linux文章汇总专辑|程序人生专辑|C语言我的知识小密圈关注公众号后台回复「1024」获取学习资料网盘链接。欢迎点赞关注转发在看您的每一次鼓励我都将铭记于心~