专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
NXP
NXP iMX7 M4核心PWM驱动开发
2019-07-12 12:11
发布
生成海报
站内文章
/
NXP MCU
14946
0
1703
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等可以看到亮的时间比灭的时间较短。
./ 然后按动载板按键 SW6一次,PWM2 输出周期不变,占空比会变成50%。
./ 再次按动载板按键 SW6一次,PWM2 输出周期不变,占空比会变成75%。
./ 以后每次按键都会循环上述过程。
7).
总结
如上述示例,iMX7 M4 核心可以非常方便的开发外设驱动并进行调用,尤其是基于FreeRTOS,相对于直接配置寄存器就更直观写,代码也更具备灵活性和重用性。
Ta的文章
更多
>>
射频电路板设计常见的问题分析和解决办法
0 个评论
NXP iMX7 M4核心PWM驱动开发
0 个评论
给单片机初学者一个建议:不要简单贴源代码
0 个评论
热门文章
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮