3949|2

9

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

TM4C123 DMA串口接收求教 [复制链接]

用串口接收SBUS信号 只用中断的情况下已经试过接收SBUS了 但是100000的波特率用串口中断接收太占用CPU了 导致了一些任务不能执行
下面是DMA代码
 
点赞 关注

回复
举报

9

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
int main()
{
        SysCtlClockSet(SYSCTL_SYSDIV_2_5|SYSCTL_USE_PLL|SYSCTL_OSC_MAIN|SYSCTL_XTAL_8MHZ);
/*UART2 INIT*/         
        SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);
  SysCtlPeripheralEnable(SYSCTL_PERIPH_UART2);

  HWREG(GPIO_PORTD_BASE + GPIO_O_LOCK) = GPIO_LOCK_KEY;
  HWREG(GPIO_PORTD_BASE + GPIO_O_CR) = 0xFF;
       
  GPIOPinConfigure(GPIO_PD7_U2TX);
  GPIOPinConfigure(GPIO_PD6_U2RX);
  GPIOPinTypeUART(GPIO_PORTD_BASE,GPIO_PIN_7|GPIO_PIN_6);
  UARTConfigSetExpClk(UART2_BASE,SysCtlClockGet(),115200,UART_CONFIG_WLEN_8|UART_CONFIG_STOP_ONE|UART_CONFIG_PAR_NONE);
  UARTEnable(UART2_BASE);
/*UART4 INIT*/       
  SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);
        SysCtlPeripheralEnable(SYSCTL_PERIPH_UART4);
        GPIOPinConfigure(GPIO_PC4_U4RX);
  GPIOPinTypeUART(GPIO_PORTC_BASE,GPIO_PIN_4);
        UARTFIFOLevelSet(UART4_BASE,UART_FIFO_TX4_8,UART_FIFO_RX4_8);
        UARTConfigSetExpClk(UART4_BASE,SysCtlClockGet(),100000,
                            UART_CONFIG_WLEN_8|UART_CONFIG_STOP_TWO|UART_CONFIG_PAR_EVEN);

/*  DMA  */       
        SysCtlPeripheralEnable(SYSCTL_PERIPH_UDMA);
        uDMAEnable();
        uDMAControlBaseSet(DMAControlTable);
        uDMAChannelAssign(UDMA_CH18_UART4RX);
        uDMAChannelAttributeDisable(UDMA_CH18_UART4RX,
                                    UDMA_ATTR_USEBURST|
                                    UDMA_ATTR_HIGH_PRIORITY|
                                    UDMA_ATTR_ALTSELECT|
                                    UDMA_ATTR_REQMASK);
        uDMAChannelAttributeEnable(UDMA_CH18_UART4RX,UDMA_ATTR_ALTSELECT);
        uDMAChannelControlSet(UDMA_CH18_UART4RX|UDMA_PRI_SELECT,
                              UDMA_SIZE_8|
                              UDMA_SRC_INC_NONE|
                              UDMA_DST_INC_NONE|
                              UDMA_ARB_8);
        uDMAChannelControlSet(UDMA_CH18_UART4RX|UDMA_PRI_SELECT,
                              UDMA_SIZE_8|UDMA_SRC_INC_NONE|
                              UDMA_DST_INC_NONE|UDMA_ARB_8);
        uDMAChannelTransferSet(UDMA_CH18_UART4RX|UDMA_PRI_SELECT,
                               UDMA_MODE_PINGPONG,
                               (void*)(UART4_BASE+UART_O_DR),
                                                                                                 remote_dataA,13);
        uDMAChannelTransferSet(UDMA_CH18_UART4RX|UDMA_PRI_SELECT,
                                                                                                 UDMA_MODE_PINGPONG,
                                                                                                 (void*)(UART4_BASE+UART_O_DR),
                                                                                                 remote_dataB,12);
        uDMAChannelEnable(UDMA_CH18_UART4RX);       
       
  IntMasterEnable();
        UARTDMAEnable(UART4_BASE,UART_DMA_RX);
        UARTEnable(UART4_BASE);       
        IntEnable(INT_UART4);
        UARTIntEnable(UART4_BASE,UART_INT_RX);                                                                                                 
        while(1)
        {
                data_send(remote_dataA,13);
                data_send(remote_dataB,12);
                data_send(remote_data,25);
        }
}

/*  UART IRQ  */
void UART4_Handler(void)
{
        uint32_t status,mode;
        status=UARTIntStatus(UART4_BASE,true);
        UARTIntClear(UART4_BASE,status);
        mode=uDMAChannelModeGet(UDMA_CH18_UART4RX|UDMA_PRI_SELECT);
        if(mode==UDMA_MODE_STOP)
        {
                uDMAChannelTransferSet(UDMA_CH18_UART4RX|UDMA_PRI_SELECT,
                               UDMA_MODE_PINGPONG,
                               (void*)(UART4_BASE+UART_O_DR),
                                                                                                 remote_dataA,13);
        }
       
        mode=uDMAChannelModeGet(UDMA_CH18_UART4RX|UDMA_ALT_SELECT);
        if(mode==UDMA_MODE_STOP)
        {
                uDMAChannelTransferSet(UDMA_CH18_UART4RX|UDMA_PRI_SELECT,
                                                                                                 UDMA_MODE_PINGPONG,
                                                                                                 (void*)(UART4_BASE+UART_O_DR),
                                                                                                        remote_dataB,12);
        }
       
        uDMAChannelEnable(UDMA_CH18_UART4RX);
       
        for(uint8_t j=0;j<13;j++)
        {
                remote_data[j]=remote_dataA[j];
        }
       
        for(uint8_t k=14;k<26;k++)
        {
                remote_data[k]=remote_dataB[k-14];
        }
}
 
 

回复

9

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
用串口4接收SBUS信号 再用串口2传到电脑上
用的是乒乓模式 sbus前13个字节存在remote_dataA里面 后12个字节存在remote_dataB里面 在中断里面整合进remote_data
现在电脑上只能收到一段0 就收不到了 我进DEBUG调试一旦串口中断使能了 程序就一直在中断里面循环回不到主程序了 所以想咨询下代码问题出在哪里
 
 
 

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

随便看看
查找数据手册?

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
快速回复 返回顶部 返回列表