我是靠谱客的博主 花痴大侠,最近开发中收集的这篇文章主要介绍杰理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通信模块所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复