我是靠谱客的博主 花痴大侠,最近开发中收集的这篇文章主要介绍杰理AC692x与MCU进行UART串口通信1.UART寄存器2.了解sdk的uart流程以及函数3.写属于自己的UART通信模块,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

1.UART寄存器

typedef struct {
    __RW __u16 CON0;
    __RW __u16 CON1;
    __WO __u16 BAUD;
    __RW __u8  BUF;
    __RW __u32 OTCNT;
    __RW __u32 TXADR;
    __WO __u16 TXCNT_HRXCNT;
    //__RO __u16 HRXCNT;
    __RW __u32 RXSADR;
    __RW __u32 RXEADR;
    __RW __u32 RXCNT;
} JL_UART_TypeDef;

这里就不说每个寄存器的功能是啥了,大家自己去看看芯片手册哈。上面的代码就是对应程序里面的UART寄存器的定义了。

2.了解sdk的uart流程以及函数

2.1uart的设定函数

在这里插入图片描述

void uart_module_init()
{
    uart_module_on();
#ifdef __DEBUG
    uart_debug_int(DEBUG_UART_RATE);
#endif

#if (BT_MODE == TEST_FCC_MODE)
    fcc_test_uart_init(UART_FCC_RAE);
#endif

#if (BT_MODE == TEST_BQB_MODE) && (BLE_BREDR_MODE&BT_BLE_EN)
    dut_test_uart_init(UART_BQB_RAE);
#endif

#if EQ_UART_DEBUG
    eq_uart_debug_init(EQ_DEBUG_UART_RATE);
#endif

#if UART_UPDATA_EN
    uart_update_init();
#endif
#if CHIP_UART_EN
    comm_uart_int(SINGLE_CHIP_UART_RATE); //这个是我自己添加的UART通信
#endif // CHIP_UART_EN
    /* uart1_rtx_cts(); */
}

参数是波提率。

2.2以EQ的串口在线调试函数为例

static s32 eq_uart_debug_init(u32 baud)
{
    u32 status = 0;
#if (EQ_DEBUG_UART_SEL == UART1_TXPB0_RXPB1)
    JL_IOMAP->CON1 &= ~(BIT(3) | BIT(2));
    JL_PORTB->OUT |= BIT(0) ;
    JL_PORTB->DIR |= BIT(1) ;
    JL_PORTB->DIR &= ~BIT(0) ;
#elif (EQ_DEBUG_UART_SEL == UART1_USB_TXDP_RXDM)
    JL_IOMAP->CON1 |= BIT(3) | BIT(2);
    JL_USB->CON0 |= BIT(0);
    JL_USB->IO_CON0 = BIT(9) | BIT(10) | BIT(11);   //IO_MODE & default DP_DIE DM_DIE
    JL_USB->IO_CON0 |= BIT(0); //TX DP
    JL_USB->IO_CON0 |= BIT(3);//RX DM
    JL_USB->IO_CON0 &= ~BIT(2);//tx dp
    JL_USB->IO_CON0 &= ~BIT(5);//DM下拉
    JL_USB->IO_CON0 &= ~BIT(7);//DM上拉
#else
#error "EQ uart debug not config uart port IO"
#endif

    JL_UART1->BAUD = (UART_CLK / baud) / 4;;
    uart_info[1].callback_fun = eq_uart_debug_isr_callback;

    IRQ_REQUEST(IRQ_UART1_IDX, uart1_isr_fun);
    rx_uart1_buf = eq_uart_recv_buf;
    ut_dma_wr_cnt[1] = sizeof(eq_uart_recv_buf);

    JL_UART1->RXCNT = (u32)ut_dma_wr_cnt[1];
    JL_UART1->RXSADR = (u32)rx_uart1_buf;
    JL_UART1->RXEADR = (u32)(rx_uart1_buf + ut_dma_wr_cnt[1]);
    JL_UART1->OTCNT = 20000 * 1000;

    JL_UART1->CON0 =  BIT(13) | BIT(12) | BIT(10) | BIT(6) | BIT(5) | BIT(7) | BIT(3) | BIT(0);

    return 0;
}

我们可以了解到,要使用UART的话,需要设定那几个参数。就可以开始仿写了。

3.写属于自己的UART通信模块

3.1 UART端口的设置

AC692X有三路UART,可选的端口也很多,所以建议使用宏定义去选择对应的对端口,便于后面的扩展修改。

3.2 对应寄存器功能的开启

使能DMA模式,OT中断使能,RDC使能,接收中断使能,uart使能等等。
s32 comm_uart_int(u32 baud)
{
       u32 status = 0;
#if (SINGLE_CHIP_UART_SEL == UART1_TXPB0_RXPB1)
    JL_IOMAP->CON1 &= ~(BIT(3) | BIT(2));
    JL_PORTB->OUT |= BIT(0) ;
    JL_PORTB->DIR |= BIT(1) ;
    JL_PORTB->DIR &= ~BIT(0) ;
#elif (SINGLE_CHIP_UART_SEL == UART1_USB_TXDP_RXDM)
    JL_IOMAP->CON1 |= BIT(3) | BIT(2);
    JL_USB->CON0 |= BIT(0);
    JL_USB->IO_CON0 = BIT(9) | BIT(10) | BIT(11);   //IO_MODE & default DP_DIE DM_DIE
    JL_USB->IO_CON0 |= BIT(0); //TX DP
    JL_USB->IO_CON0 |= BIT(3);//RX DM
    JL_USB->IO_CON0 &= ~BIT(2);//tx dp
    JL_USB->IO_CON0 &= ~BIT(5);//DM下拉
    JL_USB->IO_CON0 &= ~BIT(7);//DM上拉
#elif (SINGLE_CHIP_UART_SEL ==  UART1_TXPA1_RXPA2)
    JL_IOMAP->CON1 &= ~(BIT(3) | BIT(2));
    JL_IOMAP->CON1 |= BIT(3);
    JL_PORTA->OUT |= BIT(1) ;
    JL_PORTA->DIR |= BIT(2) ;
    JL_PORTA->DIR &= ~BIT(1) ;
#endif
     JL_UART1->BAUD = (UART_CLK / baud) / 4;
     uart_info[1].callback_fun = comm_uart_isr_callback; //回调函数
    IRQ_REQUEST(IRQ_UART1_IDX, uart1_isr_fun);  //中断函数
    rx_uart1_buf = comm_uart_recv_buf;
    ut_dma_wr_cnt[1] = sizeof(comm_uart_recv_buf);

    JL_UART1->RXCNT = (u32)ut_dma_wr_cnt[1]; //1指的是uart1。接收数据字节数
    JL_UART1->RXSADR = (u32)rx_uart1_buf;    //MDA的起始地址
    JL_UART1->RXEADR = (u32)(rx_uart1_buf + ut_dma_wr_cnt[1]);//MDA的结束地址
    JL_UART1->OTCNT = 20000 * 1000;

    //清空TX/RX/OT标志,使能DMA模式,OT中断使能,RDC使能,接收中断使能,uart使能
    JL_UART1->CON0 =  BIT(13) | BIT(12) | BIT(10) | BIT(6) | BIT(5) | BIT(7) | BIT(3) | BIT(0);

    return 0;
}

3.3回调函数

static s32 eq_uart_debug_init(u32 baud) 这个函数是我用来处理接收到的串口数据的。这个是比较重要的。这个函数也是同样参考EQ的eq_uart_debug_isr_callback写的。其中比较重要的就是接收标志还有超时处理。把下面的这个添加到你的回调函数的末尾就行了。

void comm_uart_isr_callback(u8 uto_buf, void *p, u8 isr_flag)
{
    u8 *rx_buf = p;
    if ((UART_ISR_TYPE_DATA_COME == isr_flag) ) {//接收标志位
     //接收处理
   }

   if (UART_ISR_TYPE_TIMEOUT == isr_flag) {
        JL_UART1->RXCNT = (u32)ut_dma_wr_cnt[1];
        JL_UART1->RXSADR = (u32)rx_uart1_buf;
        JL_UART1->RXEADR = (u32)(rx_uart1_buf + ut_dma_wr_cnt[1]);

    }
    JL_UART1->OTCNT = 20000 * 1000;
}
接收的数据存储在 rx_buf 这个数组里面

3.4发送函数

接收处理函数在回调函数里面,发送函数单独的,需要的时候在调用。和其他MCU一样,把发送的数据送到BUF里面就会启动发送串口数据了。

u8 comm_uart_tx_buf[4] __attribute__((aligned(4)));
void user_uart_tx(char c)
{
    JL_UART1->BUF = c;
    __asm__ volatile("csync");
     while ((JL_UART1->CON0 & BIT(15)) == 0);    //TX IDLE
}

最后

以上就是花痴大侠为你收集整理的杰理AC692x与MCU进行UART串口通信1.UART寄存器2.了解sdk的uart流程以及函数3.写属于自己的UART通信模块的全部内容,希望文章能够帮你解决杰理AC692x与MCU进行UART串口通信1.UART寄存器2.了解sdk的uart流程以及函数3.写属于自己的UART通信模块所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(46)

评论列表共有 0 条评论

立即
投稿
返回
顶部