杰理AC692X学习-uart串口配置及debug

杰理692x一共有3个uart,ide不支持在线仿真,所以要使用串口debug
bebug
先到sdk_cfg.h文件下,选择debug的串口,和io口,以及波特率,如上注释(从sdk_const_define.h复制),默认配置 8bit 1stop 无奇偶校验
杰理AC692X学习-uart串口配置及debug_第1张图片
包含头文件uart.h,配置好之后就可以printf进行串口打印了
串口配置
如果工程中需要使用到串口,则需要到uart.c中进行配置,个人不喜欢杰理的封装,将代码抽出来写成了自己的串口配置函数,将cpu目录下的uart.c打开,找到这个函数s32 uart_debug_int(u32 baud_rate),以这个内容做参考修改杰理AC692X学习-uart串口配置及debug_第2张图片
下面uart0的中断函数

void uart0_isr_fun()
{
    u8 uto_buf;
    if ((JL_UART0->CON0 & BIT(3)) && (JL_UART0->CON0 & BIT(14))) {
        uto_buf = JL_UART0->BUF;
        JL_UART0->CON0 |= BIT(12);
        if (uart_info[0].callback_fun) {
            uart_info[0].callback_fun(uto_buf, rx_uart0_buf, UART_ISR_TYPE_DATA_COME);
        }
    }
    /* 发送完成中断 */
    if ((JL_UART0->CON0 & BIT(2)) && (JL_UART0->CON0 & BIT(15))) {  //TX PND
        JL_UART0->CON0 |= BIT(13);     //清TX PND
        if (uart_info[0].callback_fun) {
            uart_info[0].callback_fun(0, NULL, UART_ISR_TYPE_WRITE_OVER);
        }
    }
    if (JL_UART0->CON0 & BIT(11)) {    //OTCNT PND
        JL_UART0->CON0 |= BIT(10);    //清OTCNT PND
        JL_UART0->CON0 |= BIT(7);     //RDC
        asm volatile("nop");   //写RDC立刻读JL_UART1->HRCNT会有问题
        JL_UART0->CON0 |= BIT(12);    //清RX PND(这里的顺序不能改变,这里要清一次)
        if (uart_info[0].callback_fun) {
            uart_info[0].callback_fun(0, NULL, UART_ISR_TYPE_TIMEOUT);
        }
        if (rx_uart0_buf != NULL) {
            JL_UART0->RXSADR = (u32)rx_uart0_buf;
            JL_UART0->RXCNT = (u32)ut_dma_wr_cnt[0];;
        }
    }
}

下面是修改之后的内容,使用起来方便多了

/* 串口接收中断函数 */
void user_uart1_isr_fun(void)
{
    u8 uto_buf;
    if ((JL_UART1->CON0 & BIT(3)) && (JL_UART1->CON0 & BIT(14))) {
        uto_buf = JL_UART1->BUF;
        JL_UART1->CON0 |= BIT(12);
        
	}
}
/* 中断注册函数 */
IRQ_REGISTER(IRQ_UART1_IDX, user_uart1_isr_fun);
/* 初始化函数,需要使用哪个io就解除注释,参数波特率 */
void user_uart1_init(u32 baud_rate)
{

//  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) ;

// UART1_TXPC0_RXPC1)
    // JL_IOMAP->CON1 &= ~(BIT(3) | BIT(2));
    // JL_IOMAP->CON1 |= BIT(2);
    // JL_PORTC->OUT |= BIT(0) ;
    // JL_PORTC->DIR |= BIT(1) ;
    // JL_PORTC->DIR &= ~BIT(0) ;

// 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) ;

// UART1_USB_TXDP_RXDM
    JL_IOMAP->CON1 |= BIT(3) | BIT(2);

    JL_USB->CON0 = (BIT(0));//USB_PHY_ON
    JL_USB->IO_CON0 = (BIT(11) | BIT(10) | BIT(9)); //USB_IO_MODE	//DMDIE	//DPDIE

    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上拉

// UART1_OUTPUT_CHAL)
    // JL_IOMAP->CON3 &= ~BIT(7);
    // //JL_IOMAP->CON3 &= ~(BIT(22) | BIT(21) | BIT(20));
    // JL_IOMAP->CON1 &= ~(BIT(8) | BIT(9) | BIT(10) | BIT(11));
    // JL_IOMAP->CON1 |= BIT(8);

    // JL_PORTA->DIR &= ~BIT(11);
    // JL_PORTA->DIE &= ~BIT(11);
    // JL_PORTA->PD |= BIT(11);
    // JL_PORTA->PU |= BIT(11);

    JL_UART1->BAUD = (UART_CLK / baud_rate) / 4 - 1;
    JL_UART1->CON0 = BIT(13) | BIT(12) | BIT(10)| BIT(3) | BIT(0);
	IRQ_REQUEST(IRQ_UART1_IDX, user_uart1_isr_fun); //中断
}
u8 user_uart1_get_byte(void)
{
	u8 get_byte = 0;
	if ((JL_UART1->CON0 & BIT(14))) {
		get_byte = JL_UART1->BUF;
		JL_UART1->CON0 |= BIT(12);
		JL_UART1->CON1 |= BIT(13);
	}
	return get_byte;
}
/* 串口发送函数 */
void user_uart1_send_byte(u8 send_byte)
{
    JL_UART1->BUF = send_byte;
    __asm__ volatile("csync");

    while ((JL_UART1->CON0 & BIT(15)) == 0);    //TX IDLE
}
void user_uart1_send_string(u8 _buff[] ,u8 _len)
{
    for (u8 i = 0; i < _len; i++){
		user_uart1_send_byte(_buff[i]);
	}	
}

uart2同理,个人开发的时候uart0一直都是用来debug,所以没有写uart0的,有需要可以参考uart.c中的内容自己修改

void user_uart2_isr_fun(void)
{
    u8 uto_buf;
    if ((JL_UART2->CON & BIT(3)) && (JL_UART2->CON & BIT(14))) {
        uto_buf = JL_UART2->BUF;
        JL_UART2->CON |= BIT(12);/* 清除中断标志位 */
    }
}
IRQ_REGISTER(IRQ_UART2_IDX, user_uart2_isr_fun);
void user_uart2_init(u32 baud_rate)
{
	//  UART2_TXPA3_RXPA4)
    JL_IOMAP->CON1 &= ~(BIT(15) | BIT(14));
    JL_PORTA->OUT |= BIT(3) ;
    JL_PORTA->DIR |= BIT(4) ;
    JL_PORTA->DIR &= ~BIT(3) ;

// UART2_TXPA9_RXPA10)
    // JL_IOMAP->CON1 &= ~(BIT(15) | BIT(14));
    // JL_IOMAP->CON1 |= BIT(14);
    // JL_PORTA->OUT |= BIT(9) ;
    // JL_PORTA->DIR |= BIT(10) ;
    // JL_PORTA->DIR &= ~BIT(9) ;

// UART2_TXPB2_RXPB3)
    // JL_IOMAP->CON1 &= ~(BIT(15) | BIT(14));
    // JL_IOMAP->CON1 |= BIT(15);
    // JL_PORTB->OUT |= BIT(2) ;
    // JL_PORTB->DIR |= BIT(3) ;
    // JL_PORTB->DIR &= ~BIT(2) ;

// UART2_TXPC4_RXPC5)
    // JL_IOMAP->CON1 |= BIT(15) | BIT(14);
    // JL_PORTC->OUT |= BIT(4) ;
    // JL_PORTC->DIR |= BIT(5) ;
    // JL_PORTC->DIR &= ~BIT(4) ;

// UART2_OUTPUT_CHAL)
    // JL_IOMAP->CON3 &= ~BIT(11);
    // JL_IOMAP->CON1 &= ~(BIT(8) | BIT(9) | BIT(10) | BIT(11));
    // JL_IOMAP->CON1 |= 0x07 << 8;
    // JL_PORTA->DIR &= ~BIT(11);
    // JL_PORTA->DIE &= ~BIT(11);
    // JL_PORTA->PD |= BIT(11);
    // JL_PORTA->PU |= BIT(11);
//end of UART2 IO SEL
    JL_UART2->BAUD = (UART_CLK / baud_rate) / 4 - 1;
    JL_UART2->CON = BIT(13) | BIT(12) | BIT(10) | BIT(3) | BIT(0);

	IRQ_REQUEST(IRQ_UART2_IDX, user_uart2_isr_fun); //中断
}
u8 user_uart2_get_byte(void)
{
	u8 get_byte = 0;
	 if ((JL_UART2->CON & BIT(14))) {
        get_byte = JL_UART2->BUF;
        JL_UART2->CON |= BIT(12);
    }
	return get_byte;
}

void user_uart2_send_byte(u8 send_byte)
{

    JL_UART2->BUF = send_byte;
    __asm__ volatile("csync");

    while ((JL_UART2->CON & BIT(15)) == 0);    //TX IDLE
}
void user_uart2_send_string(u8 _buff[] ,u8 _len)
{
    for (u8 i = 0; i < _len; i++){
		user_uart2_send_byte(_buff[i]);
	}	
}

你可能感兴趣的:(杰理AC692x学习)