NXP iMX7 M4核心PWM驱动开发

2024-04-19 11:08
文章标签 开发 驱动 核心 pwm m4 nxp imx7

本文主要是介绍NXP iMX7 M4核心PWM驱动开发,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

By Toradex秦海

1). 简介

在早先的一篇文章已经介绍过基于NXP iMX7 异构多核架构进行开发调试,本文就延续这一篇文章的介绍,以PWM功能为示例着重介绍在iMX7 多核架构里面的M4核心上面开发驱动的方式。

 

而本文所演示的ARM平台同样来自于Toradex 基于NXP iMX7 ARM处理器的Colibri iMX7 ARM嵌入式平台。

 

2. 准备

a). Colibri iMX7S ARM核心版配合Colibri Evaluation Board,分别连接A7核心默认调试串口UART1(载板X27)和M4核心默认调试串口UART2(载板X25上)到开发主机方便调试,另外由于iMX7S只支持一个USB接口,需要通过载板X30连接一个USB Hub后来扩展键盘鼠标外设。更多关于Colibri iMX7的说明请参考Datasheet和Linux开发上手指南。

 

b). Colibri iMX7 A7核心系统使用Toradex官方发布的Embedded Linux,更新方法请参考这里。

 

c). 另外,由于本文演示示例使用到了载板上面PWM驱动LED和按键资源,需要连接如下:

X10 SODIMM-28 -> X21 LED1

X10 SODIMM-133 -> X21 SW6

 

d). SEGGER J-Link 仿真器,USB一端连接开发主机,JTAG一端连接载板X13。

 

 

3). Colibri iMX7 M4核心FreeRTOS基本资料

a). Colibri iMX7 架构基本说明请参考如下:

   https://developer.toradex.cn/knowledge-base/freertos-on-the-cortex-m4-of-a-colibri-imx7

 

b). 本示例中M4核心运行FreeRTOS v8系统,相关的源代码和sample程序请从下面git下载:

http://git.toradex.cn/cgit/freertos-toradex.git/

 

c). 基本的SDK配置和编译请参考如下:

https://developer.toradex.cn/knowledge-base/freertos-on-the-cortex-m4-of-a-colibri-imx7#Linux_support

 

d). 编译好的M4 firmware如何在Colibri iMX7上面加载运行请参考如下:

https://developer.toradex.cn/knowledge-base/freertos-on-the-cortex-m4-of-a-colibri-imx7#Running_a_Firmware_on_CortexM4

 

e). 几个自带的sample代码简单说明请参考如下:

https://developer.toradex.com/knowledge-base/freertos-on-the-cortex-m4-of-a-colibri-imx7#Examples

 

 

4). Colibri iMX7 M4核心FreeRTOS PWM驱动开发

a). 在上一章节中提到的iMX7 M4 FreeRTOS源代码中,已经包含了一些接口的驱动示例,比如GPIO,UART,I2C,Flexcan等,但并没有包含PWM部分,因此我们需要手动添加PWM驱动。

 

b). 首先我们要找到提供iMX7芯片核心寄存器定义的macro code文件,获取PWM相关寄存器定义以及做细微调整。

./ 文件为 platform/devices/MCIMX7D/include/MCIMX7D_M4.h

这个文件是整个iMX7 M4 FreeRTOS代码最核心的文件之一,里面定义了所有芯片寄存器macro code,具体的寄存器功能说明需要参照 NXP iMX7 Reference Manual文档。

./ 在这个文件里面,如下 ”PWM Peripheral Access Layer”开始的部分定义了PWM相关的寄存器,是最关键的部分。

-----------------------------

   -- PWM Peripheral Access Layer

/** PWM - Register Layout Typedef */

typedef struct {

  __IO  uint32_t PWMCR;                                  /**< PWM Control Register, offset: 0x0 */

  __IO  uint32_t PWMSR;                                  /**< PWM Status Register, offset: 0x4 */

  __IO  uint32_t PWMIR;                                  /**< PWM Interrupt Register, offset: 0x8 */

  __IO  uint32_t PWMSAR;                                 /**< PWM Sample Register, offset: 0xC */

  __IO  uint32_t PWMPR;                                  /**< PWM Period Register, offset: 0x10 */

  __I   uint32_t PWMCNR;                                 /**< PWM Counter Register, offset: 0x14 */

} PWM_Type, *PWM_MemMapPtr;

-----------------------------

./ 在这里,为了后面PWM驱动配置方便,我们做了如下patch

https://github.com/simonqin09/iMX7_M4_PWM_Driver/blob/master/MCIMX7D_M4.patch

 

c). 然后是关于CCM(Clock Control Module)驱动配置头文件,添加PWM所需要的clock源

./ 文件为 - platform/drivers/inc/ccm_imx7d.h

 

./ 如下patch,增加PWM所需clock gate

https://github.com/simonqin09/iMX7_M4_PWM_Driver/blob/master/ccm_imx7d.patch

 

d). 接下来就是在 ”plaftform/drivers/inc” 和 ”platform/drivers/src” 下分别增加PWM驱动头文件 ”pwm_imx.h” 和源文件 ”pwm_imx.c”,完成PWM相关基本寄存器的读写操作等基本功能函数的实现。

./ pwm_imx.h 文件代码如下

https://github.com/simonqin09/iMX7_M4_PWM_Driver/blob/master/pwm_imx.h

 

./ pwm_imx.c 文件代码如下

https://github.com/simonqin09/iMX7_M4_PWM_Driver/blob/master/pwm_imx.c

 

 

5). Colibri iMX7 M4核心FreeRTOS PWM驱动应用示例

a). 在上面章节基本驱动配置好之后,我们就可以调用驱动进行示例开发了。本文就简单演示通过一个GPIO按键来动态调整PWM输出占空比的示例。本示例所使用的GPIO Key为examples里面已经配置的 ” BOARD_GPIO_KEY_CONFIG”,PWM使用为PWM2。

 

b). 首先进入 “examples/imx7_colibri_m4” 目录,对几个基本文件进行修改适配

./ board.h – 这个文件定义了当前examples下所有示例所涉及到的接口,中断,clock等定义,因此需要将PWM2相关定义添加进来,如下面patch。

https://github.com/simonqin09/iMX7_M4_PWM_Driver/blob/master/board.patch

 

./ pin_mux.h 和pin_mux.c – 定义了除了GPIO之外的所有示例所涉及的接口功能的对应管脚的Pin Mux配置,这里我们将PWM2的管脚配置添加进来,如下面patch。GPIO管脚的Pin Mux配置在gpio_pins.h/gpio_pins.c 中定义。

https://github.com/simonqin09/iMX7_M4_PWM_Driver/blob/master/pin_mux.patch

 

c). 然后再创建 ”pwm_imx” 目录,为了方便,可以复制同一目录下的 gpio_imx目录后进行修改。

./ hardware_init.c – 硬件初始化,board,GPIO/PWM RDC/Clock 等,代码如下

https://github.com/simonqin09/iMX7_M4_PWM_Driver/blob/master/pwm_imx/hardware_init.c

 

./ main.c – 主程序文件,包含三个子程序和main主程序,三个子程序分别负责GPIO初始化,GPIO Key按键响应处理以及PWM中断Handler,main主程序完成了对GPIO和PWM初始化配置后,在每次按键的时候将PWM输出占空比从25%-50%-75%之间循环,具体代码如下:

https://github.com/simonqin09/iMX7_M4_PWM_Driver/blob/master/pwm_imx/main.c

 

./ 最后修改 “armgcc/CMakeLists.txt” 文件,将所有新创建的文件包含进去,然后进行编译,具体内容如下:

https://github.com/simonqin09/iMX7_M4_PWM_Driver/blob/master/pwm_imx/armgcc/CMakeLists.txt

 

./ 对iMX7 M4 FreeRTOS代码进行debug的方法请参考这里,本文就不再赘述。

 

 

6). Colibri iMX7 M4 PWM驱动示例部署

a). 在部署之前,首先需要确保将本文所使用的 PWM2 从 iMX7 A7 核心 Linux device tree中disable,以免发生资源冲突。有两种方法如下:

./ 参考这里下载A7 Linux kernel源代码,再参考这里修改device tree后重新编译部署。

 

./ 可以直接在uboot中通过 ”fdt_fixup” 环境变量来临时禁止某个外设

-----------------------------

/* read device tree file and print details */

# ubi part ubi

# ubi read ${fdt_addr_r} dtb

# fdt addr ${fdt_addr_r}

# fdt list

/* find PWM2 related setting */

# fdt list /soc/aips-bus@30400000/pwm@30670000

/* set fdt_fixup variable with UARTB and PWM2 disable */

# setenv fdt_fixup ‘fdt addr ${fdt_addr_r} && fdt rm /soc/aips-bus@30800000/spba-bus@30800000/serial@30890000 && fdt rm /soc/aips-bus@30400000/pwm@30670000’

-----------------------------

 

b). 然后就可以参考上面的相关文档或者之前的文章进行加载M4 firmware运行了

./ 程序开始运行,如下示波器测量数据所示,PWM2输出周期为500ms(周期来自main主函数文件里面的配置),占空比为25%,从LED等可以看到亮的时间比灭的时间较短。

       

1547179516408258.png

 

./ 然后按动载板按键 SW6一次,PWM2 输出周期不变,占空比会变成50%。

1547179516271155.png

 

./ 再次按动载板按键 SW6一次,PWM2 输出周期不变,占空比会变成75%。

1547179516534264.png

 

./ 以后每次按键都会循环上述过程。

 

 

7). 总结

如上述示例,iMX7 M4 核心可以非常方便的开发外设驱动并进行调用,尤其是基于FreeRTOS,相对于直接配置寄存器就更直观写,代码也更具备灵活性和重用性。

这篇关于NXP iMX7 M4核心PWM驱动开发的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/917364

相关文章

基于Python开发电脑定时关机工具

《基于Python开发电脑定时关机工具》这篇文章主要为大家详细介绍了如何基于Python开发一个电脑定时关机工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 简介2. 运行效果3. 相关源码1. 简介这个程序就像一个“忠实的管家”,帮你按时关掉电脑,而且全程不需要你多做

Java中的Opencv简介与开发环境部署方法

《Java中的Opencv简介与开发环境部署方法》OpenCV是一个开源的计算机视觉和图像处理库,提供了丰富的图像处理算法和工具,它支持多种图像处理和计算机视觉算法,可以用于物体识别与跟踪、图像分割与... 目录1.Opencv简介Opencv的应用2.Java使用OpenCV进行图像操作opencv安装j

基于Qt开发一个简单的OFD阅读器

《基于Qt开发一个简单的OFD阅读器》这篇文章主要为大家详细介绍了如何使用Qt框架开发一个功能强大且性能优异的OFD阅读器,文中的示例代码讲解详细,有需要的小伙伴可以参考一下... 目录摘要引言一、OFD文件格式解析二、文档结构解析三、页面渲染四、用户交互五、性能优化六、示例代码七、未来发展方向八、结论摘要

在 VSCode 中配置 C++ 开发环境的详细教程

《在VSCode中配置C++开发环境的详细教程》本文详细介绍了如何在VisualStudioCode(VSCode)中配置C++开发环境,包括安装必要的工具、配置编译器、设置调试环境等步骤,通... 目录如何在 VSCode 中配置 C++ 开发环境:详细教程1. 什么是 VSCode?2. 安装 VSCo

C#图表开发之Chart详解

《C#图表开发之Chart详解》C#中的Chart控件用于开发图表功能,具有Series和ChartArea两个重要属性,Series属性是SeriesCollection类型,包含多个Series对... 目录OverviChina编程ewSeries类总结OverviewC#中,开发图表功能的控件是Char

鸿蒙开发搭建flutter适配的开发环境

《鸿蒙开发搭建flutter适配的开发环境》文章详细介绍了在Windows系统上如何创建和运行鸿蒙Flutter项目,包括使用flutterdoctor检测环境、创建项目、编译HAP包以及在真机上运... 目录环境搭建创建运行项目打包项目总结环境搭建1.安装 DevEco Studio NEXT IDE

Python开发围棋游戏的实例代码(实现全部功能)

《Python开发围棋游戏的实例代码(实现全部功能)》围棋是一种古老而复杂的策略棋类游戏,起源于中国,已有超过2500年的历史,本文介绍了如何用Python开发一个简单的围棋游戏,实例代码涵盖了游戏的... 目录1. 围棋游戏概述1.1 游戏规则1.2 游戏设计思路2. 环境准备3. 创建棋盘3.1 棋盘类

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

Andrej Karpathy最新采访:认知核心模型10亿参数就够了,AI会打破教育不公的僵局

夕小瑶科技说 原创  作者 | 海野 AI圈子的红人,AI大神Andrej Karpathy,曾是OpenAI联合创始人之一,特斯拉AI总监。上一次的动态是官宣创办一家名为 Eureka Labs 的人工智能+教育公司 ,宣布将长期致力于AI原生教育。 近日,Andrej Karpathy接受了No Priors(投资博客)的采访,与硅谷知名投资人 Sara Guo 和 Elad G