3685|0

1246

帖子

19

TA的资源

五彩晶圆(初级)

楼主
 

9、Beaglebone外围电路设计第三周:串口4的调试 [复制链接]

我的zigbee模块好似通过串口4和控制芯片通讯的,所以我首先调试的是串口4的功能!
ti官方提供的AM335X_StarterWare_02_00_00_07中的UART历程都是串口0的配置方式,二串口1到5的配置方式和0是不同的!
官方给的库函数有好多都只是对某种功能的一个端口的配置(如I2C、mcasp、uart等),好多初始函数不全,我只能参考手册里寄存器的介绍,增加我需要使用的功能函数和相应寄存器地址!好在每一种功能初始化的配置过程大致相同,而且比较容易理解!
我自己建立了一个“mybeaglebone”文件夹,将改动的驱动库和例子函数放在里面,以方便管理。
配置串口的过程很简单:
1:在platform\mybeaglebone\ uart.c中添加UART1和UART4的适当的时钟配置代码:

/**
* \brief   This function will configure the required clocks for UART4 instance.
*
* \return  None.
*  
* \ date:2012.10.14
*/
void UART4ModuleClkConfig(void)
{
    HWREG(SOC_PRCM_REGS + CM_PER_L3S_CLKSTCTRL) |=
                             CM_PER_L3S_CLKSTCTRL_CLKTRCTRL_SW_WKUP;

    while((HWREG(SOC_PRCM_REGS + CM_PER_L3S_CLKSTCTRL) &
     CM_PER_L3S_CLKSTCTRL_CLKTRCTRL) != CM_PER_L3S_CLKSTCTRL_CLKTRCTRL_SW_WKUP);

    HWREG(SOC_PRCM_REGS + CM_PER_L3_CLKSTCTRL) |=
                             CM_PER_L3_CLKSTCTRL_CLKTRCTRL_SW_WKUP;

    while((HWREG(SOC_PRCM_REGS + CM_PER_L3_CLKSTCTRL) &
     CM_PER_L3_CLKSTCTRL_CLKTRCTRL) != CM_PER_L3_CLKSTCTRL_CLKTRCTRL_SW_WKUP);

    HWREG(SOC_PRCM_REGS + CM_PER_L3_INSTR_CLKCTRL) |=
                             CM_PER_L3_INSTR_CLKCTRL_MODULEMODE_ENABLE;

    while((HWREG(SOC_PRCM_REGS + CM_PER_L3_INSTR_CLKCTRL) &
                               CM_PER_L3_INSTR_CLKCTRL_MODULEMODE) !=
                                   CM_PER_L3_INSTR_CLKCTRL_MODULEMODE_ENABLE);

    HWREG(SOC_PRCM_REGS + CM_PER_L3_CLKCTRL) |=
                             CM_PER_L3_CLKCTRL_MODULEMODE_ENABLE;

    while((HWREG(SOC_PRCM_REGS + CM_PER_L3_CLKCTRL) &
        CM_PER_L3_CLKCTRL_MODULEMODE) != CM_PER_L3_CLKCTRL_MODULEMODE_ENABLE);

    HWREG(SOC_PRCM_REGS + CM_PER_OCPWP_L3_CLKSTCTRL) |=
                             CM_PER_OCPWP_L3_CLKSTCTRL_CLKTRCTRL_SW_WKUP;

    while((HWREG(SOC_PRCM_REGS + CM_PER_OCPWP_L3_CLKSTCTRL) &
                              CM_PER_OCPWP_L3_CLKSTCTRL_CLKTRCTRL) !=
                                CM_PER_OCPWP_L3_CLKSTCTRL_CLKTRCTRL_SW_WKUP);

    HWREG(SOC_PRCM_REGS + CM_PER_L4LS_CLKSTCTRL) |=
                             CM_PER_L4LS_CLKSTCTRL_CLKTRCTRL_SW_WKUP;

    while((HWREG(SOC_PRCM_REGS + CM_PER_L4LS_CLKSTCTRL) &
                             CM_PER_L4LS_CLKSTCTRL_CLKTRCTRL) !=
                               CM_PER_L4LS_CLKSTCTRL_CLKTRCTRL_SW_WKUP);

    HWREG(SOC_PRCM_REGS + CM_PER_L4LS_CLKCTRL) |=
                             CM_PER_L4LS_CLKCTRL_MODULEMODE_ENABLE;

    while((HWREG(SOC_PRCM_REGS + CM_PER_L4LS_CLKCTRL) &
      CM_PER_L4LS_CLKCTRL_MODULEMODE) != CM_PER_L4LS_CLKCTRL_MODULEMODE_ENABLE);
//uart4
    HWREG(SOC_PRCM_REGS + CM_PER_UART4_CLKCTRL) =
                             CM_PER_UART4_CLKCTRL_MODULEMODE_ENABLE;

    while((HWREG(SOC_PRCM_REGS + CM_PER_UART4_CLKCTRL) &
      CM_PER_UART4_CLKCTRL_MODULEMODE) != CM_PER_UART4_CLKCTRL_MODULEMODE_ENABLE);

    while(!(HWREG(SOC_PRCM_REGS + CM_PER_L3S_CLKSTCTRL) &
            CM_PER_L3S_CLKSTCTRL_CLKACTIVITY_L3S_GCLK));

    while(!(HWREG(SOC_PRCM_REGS + CM_PER_L3_CLKSTCTRL) &
            CM_PER_L3_CLKSTCTRL_CLKACTIVITY_L3_GCLK));

    while(!(HWREG(SOC_PRCM_REGS + CM_PER_OCPWP_L3_CLKSTCTRL) &
           (CM_PER_OCPWP_L3_CLKSTCTRL_CLKACTIVITY_OCPWP_L3_GCLK |
            CM_PER_OCPWP_L3_CLKSTCTRL_CLKACTIVITY_OCPWP_L4_GCLK)));
//UART4
    while((CM_PER_UART4_CLKCTRL_IDLEST_FUNC <<
           CM_PER_UART4_CLKCTRL_IDLEST_SHIFT)!=
          (HWREG(SOC_CM_PER_REGS + CM_PER_UART4_CLKCTRL) &
           CM_PER_UART4_CLKCTRL_IDLEST));

}
前面已经说了,只有UART0的配置较为特殊,而1到5则配置过程相同,所以我只写UART4作为代表!
2:配置UART4的引脚功能:
这个地方是一个很有意思的配置:
查看AM335x 的手册,我们可以看到(拿UART4举例):

每个引脚都具有8种功能模式,因此配置引脚时要注意这个问题:
void UARTPinMuxSetup(unsigned int instanceNum)
{
     if(0 == instanceNum)
     {
          /* RXD */
          HWREG(SOC_CONTROL_REGS + CONTROL_CONF_UART_RXD(0)) =
          (CONTROL_CONF_UART0_RXD_CONF_UART0_RXD_PUTYPESEL |
           CONTROL_CONF_UART0_RXD_CONF_UART0_RXD_RXACTIVE);

          /* TXD */
          HWREG(SOC_CONTROL_REGS + CONTROL_CONF_UART_TXD(0)) =
           CONTROL_CONF_UART0_TXD_CONF_UART0_TXD_PUTYPESEL;
     }
     if(1 == instanceNum)
     {
          /* RXD */
          HWREG(SOC_CONTROL_REGS + CONTROL_CONF_UART_RXD(1)) =
          (CONTROL_CONF_UART1_RXD_CONF_UART1_RXD_PUTYPESEL |
           CONTROL_CONF_UART1_RXD_CONF_UART1_RXD_RXACTIVE);

          /* TXD */
          HWREG(SOC_CONTROL_REGS + CONTROL_CONF_UART_TXD(1)) =
           CONTROL_CONF_UART1_TXD_CONF_UART1_TXD_PUTYPESEL;
     }

   if(4 == instanceNum)//设置注意事项:选取用到的引脚的默认功能地址
     //如“CONTROL_CONF_GPMC_WAIT0”参考AM33xx的手册,然后选取对应的模式!
     {
       // RXD
          HWREG(SOC_CONTROL_REGS + CONTROL_CONF_GPMC_WAIT0) =
          (CONTROL_CONF_UART4_RXD_CONF_UART4_RXD_PUTYPESEL |
           CONTROL_CONF_UART4_RXD_CONF_UART4_RXD_RXACTIVE |
            CONTROL_CONF_MUXMODE(6) );

          // TXD
          HWREG(SOC_CONTROL_REGS + CONTROL_CONF_GPMC_WPN) =
          (CONTROL_CONF_UART4_TXD_CONF_UART4_TXD_PUTYPESEL  |
            CONTROL_CONF_MUXMODE(6) );

     }
     
}

3、接下来便是在主函数中对串口4进行一些列的初始化,包括FIFO,校验位,波特率的设置等,这些在官方例子都有,就不再详述了。
4、配置串口4的中断功能,并使能中断,编写中断服务子函数:
static void UARTIsr(void)
{
    static unsigned int txStrLength = sizeof(txArray);
    static unsigned int count = 0;
    unsigned char rxByte = 0;
    unsigned int intId = 0;

    /* Checking ths source of UART interrupt. */
    intId = UARTIntIdentityGet(SOC_UART_4_REGS);

    switch(intId)
    {
        case UART_INTID_TX_THRES_REACH:

            if(0 != txStrLength)
            {
                UARTCharPut(SOC_UART_4_REGS, txArray[count]);
                txStrLength--;
                count++;
            }
            else
            {
                /* Disabling the THR interrupt. */
                UARTIntDisable(SOC_UART_4_REGS, UART_INT_THR);
            }

        break;
        case UART_INTID_RX_THRES_REACH:
            rxByte = UARTCharGetNonBlocking(SOC_UART_4_REGS);
            UARTCharPutNonBlocking(SOC_UART_4_REGS, rxByte);
        break;

        case UART_INTID_RX_LINE_STAT_ERROR:
        case UART_INTID_CHAR_TIMEOUT:
            rxByte = UARTCharGetNonBlocking(SOC_UART_4_REGS);
        break;
   
        default:
        break;   
    }

}
其中:unsigned char txArray[] = "StarterWare AM335X UART Interrupt application\r\n";

编译完成后可直接进行仿真或将app放在SD卡里运行:



这样只要稍加修改就可以和zigbee模块进行串口通讯了!


点赞 关注
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表