请选择 进入手机版 | 继续访问电脑版
    查看: 290|回复: 3

    [单片机资料] 基于IMX6的UART添加详解

    [复制链接]

    签到天数: 414 天

    [LV.9]元老将成

    发表于 2018-9-13 22:31:18 | 显示全部楼层 |阅读模式
    初次使用i.MX6进行项目开发的时候,对于很多人来说就是找不到BSP对应源码文件的位置,下面使用怎么添加UART串口的步骤,对这些比较重要的BSP文件进行讲解,如果需要添加其他设备或者接口,一下方法也可以作为参考。(测试的项目板子为珠海鼎芯的i.MX6开发板)

    IMX6一共支持5个UART,下面对如何在软件上初始化这5个UART的方法进行举例说明:

    1.     初始化UART口涉及到3个文件:

    (1)  arch/arm/mach-mx6/board-mx6q_sabresd.h此文件用来定义初始化IMX6对应需要用到的IO口的功能。

    (2)  arch/arm/mach-mx6/board-mx6q_sabresd.c此文件为IMX6的板级初始化文化,UART也在此文件进行初始化,默认已经初始化了UART1和UART3.

    (3)  arch/arm/plat-mxc/include/mach/iomux-mx6q.h此文件为IMX6所有IO及其每个IO所有功能的定义集合,用户可通过此文件来查询某个IO的功能定义。

    2.     对board-mx6q_sabresd.h文件的修改

    在iomux_v3_cfg_t mx6q_sabresd_pads中已经对UART1和UART3进行了定义:

    MX6Q_PAD_CSI0_DAT10__UART1_TXD,

    MX6Q_PAD_CSI0_DAT11__UART1_RXD,

    MX6Q_PAD_EIM_D24__UART3_TXD,

    MX6Q_PAD_EIM_D25__UART3_RXD,



    下面举例说明增加UART2的定义,以接受脚RXD为例:

    (1)  在iomux-mx6q.h中搜索uart2(使用sourceinsight搜索源码):

    此为部分搜索的结果。

    (2)  对照核心板原理图UART2的接收脚为管脚EIM_D27,对照搜索结果可得到UART2的接收脚为MX6Q_PAD_EIM_D27__UART2_RXD,对应此管脚功能有如下:

    可以看到uart功能只是EIM_D27此管脚的其中一种功能。



    (3)  把MX6Q_PAD_EIM_D27__UART2_RXD此定义添加到

    iomux_v3_cfg_t mx6q_sabresd_pads中,如下:

    static iomux_v3_cfg_t mx6q_sabresd_pads[] ={

      /*AUDMUX */

    ············

    ············

    MX6Q_PAD_CSI0_DAT10__UART1_TXD,

    MX6Q_PAD_CSI0_DAT11__UART1_RXD,



    MX6Q_PAD_EIM_D27__UART2_RXD,



    MX6Q_PAD_EIM_D24__UART3_TXD,

    MX6Q_PAD_EIM_D25__UART3_RXD,

       `·················

       };



    (4)  同理可以得到UART2的其他管脚对应定义,下面为UART2对应所有管脚定义:

    MX6Q_PAD_EIM_D26__UART2_TXD,

    MX6Q_PAD_EIM_D27__UART2_RXD,

    MX6Q_PAD_EIM_D28__UART2_CTS,

    MX6Q_PAD_EIM_D29__UART2_RTS,

       都增加到iomux_v3_cfg_t mx6q_sabresd_pads中。



    (5)  确保在board-mx6q_sabresd.h中没有把EIM_D27定义成其他功能,比如

    MX6Q_PAD_EIM_D27__GPIO_3_27,如果有请注释掉。UART2的其他3种功能引脚也是一样,确保对应IMX6的管脚只进行了一种功能定义。





    3.     对board-mx6q_sabresd.c文件的修改

    (1)  在此文件开始,会对IMX6定义成普通IO,也就是GPIO的引脚进行再定义,如下图:



    IMX_GPIO_NR(,)这个用来定义IMX6管脚为GPIO,

    如果把UART2的RXD脚,也就是EIM_D27管脚定义为GPIO,对应iomux-mx6q.h中的定义为MX6Q_PAD_EIM_D27__GPIO_3_27,则在这个文件中定义为IMX_GPIO_NR(3,27).

    所以在board-mx6q_sabresd.c文件开头部分,要确保没有出现IMX_GPIO_NR(3,27),如果有,请注释掉。

    EIM_D27已经定义为UART接收功能,不能再次同时定义为GPIO的功能。



    对应UART2的其他引脚也是一样,确保在这里没有给定义为GPIO



    (2)  增加对uart2的初始化。

    Board-mx6q_sabresd.c中初始化uart函数为:

    如图,此函数已经对UART1和UART2进行了初始化,

    imx6q_add_imx_uart(0, NULL);对应UART1

    imx6q_add_imx_uart(2, NULL);对应UART3



    在这个函数增加对UART2的初始化,为:

    static inline voidmx6q_sabresd_init_uart(void)

    {

    imx6q_add_imx_uart(2,NULL);

    imx6q_add_imx_uart(1, NULL);

    imx6q_add_imx_uart(0,NULL);

    }



    (3)  确保在此文件中没有其他地方对uart的初始化



    做完以上步骤,软件中对UART2的初始化就完成了。

    如想添加对其他UART的支持,可按照以上方法来进行。



    注:1.一定要确保IO口功能定义的唯一性,就是一次只能定义一种功能

        2.确保初始化的唯一性,不要对同一个功能(如UART2)在同一个文件里面进行重复的初始化。

    签到天数: 693 天

    [LV.9]元老将成

    发表于 2018-9-14 13:37:37 | 显示全部楼层
    不错的资料
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    返回顶部