博客專欄

        EEPW首頁 > 博客 > NXP iMX7 M4核心PWM驅動開發

        NXP iMX7 M4核心PWM驅動開發

        發布人:toradex 時間:2019-01-11 來源:工程師 發布文章

        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的說明請參考DatasheetLinux開發上手指南

         

        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源代碼中,已經包含了一些接口的驅動示例,比如GPIOUARTI2CFlexcan等,但并沒有包含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). 然后是關于CCMClock 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 Keyexamples里面已經配置的 ” 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的管腳配置添加進來,如下面patchGPIO管腳的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 – 硬件初始化,boardGPIO/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中斷Handlermain主程序完成了對GPIOPWM初始化配置后,在每次按鍵的時候將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 treedisable,以免發生資源沖突。有兩種方法如下:

        ./ 參考這里下載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,相對于直接配置寄存器就更直觀寫,代碼也更具備靈活性和重用性。


        *博客內容為網友個人發布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。



        關鍵詞:

        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 福建省| 全南县| 阿荣旗| 广南县| 高要市| 上虞市| 陇川县| 永靖县| 本溪市| 肥西县| 綦江县| 石阡县| 那坡县| 普定县| 徐闻县| 内黄县| 铜山县| 巴林左旗| 清水河县| 曲靖市| 海阳市| 晋州市| 改则县| 文登市| 南皮县| 武鸣县| 肥城市| 河间市| 招远市| 舟曲县| 利辛县| 黄大仙区| 大田县| 封开县| 元江| 内乡县| 莒南县| 兴安县| 镇远县| 普格县| 星子县|