AB32VG1系列之UART

发布于 2021-03-16 22:16:10

AB32VG1 -UART串口测评

硬件介绍

CPU: AB5301A, 主频120M,

从芯片手册上可以知道,一共有3个UART, UART0, UART1, UART2.

UART2基本没有找到相关的资料,目前驱动完成的是UART0和UART1.

默认板载的通过UART来,默认的USB是用的是UART0.

值得注意的是这个UART0比较特殊:

UART0 用的是PA7

UART1用的是PA3 (RX), PA4(TX)

板载电路

image-20210314193842057.png

从电路中的TXD, RXD 转到update看到,PC接过来的TX和RX都接到一根线上了,这里接的是update, R3其实没有焊电阻,这边采用单根通信。

UART GPIO引脚配置

观察了以下代码,hal_uart_mspinit 函数应该是配置GPIO引脚功能的地方:

void hal_uart_mspinit(struct uart_handle *huart)
{
    struct gpio_init gpio_init;

    if (huart->instance == UART0_BASE) {
        gpio_init.pin       = GPIO_PIN_7;
        gpio_init.pull      = GPIO_PULLUP;
        gpio_init.dir       = GPIO_DIR_INPUT;
        gpio_init.de        = GPIO_DIGITAL;
        gpio_init.alternate = GPIO_AF_MAP_Gx(UT0TXMAP_AF, GPIO_AF_G1) | UT0RXMAP_TX;
        gpio_init.af_con    = GPIO_AFEN | GPIO_AFCON0 | UT0TXMAP_AF;
        hal_gpio_init(GPIOA_BASE, &gpio_init);
    } else if (huart->instance == UART1_BASE) {
        gpio_init.pin       = GPIO_PIN_4;
        gpio_init.dir       = GPIO_DIR_OUTPUT;
        gpio_init.de        = GPIO_DIGITAL;
        gpio_init.alternate = GPIO_AF_MAP_Gx(UT1TXMAP_AF, GPIO_AF_G2);
        gpio_init.af_con    = GPIO_AFEN | GPIO_AFCON0 | UT1TXMAP_AF;
        hal_gpio_init(GPIOA_BASE, &gpio_init);

        gpio_init.pin       = GPIO_PIN_3;
        gpio_init.pull      = GPIO_PULLUP;
        gpio_init.dir       = GPIO_DIR_INPUT;
        gpio_init.de        = GPIO_DIGITAL;
        gpio_init.alternate = GPIO_AF_MAP_Gx(UT1RXMAP_AF, GPIO_AF_G2);
        gpio_init.af_con    = GPIO_AFEN | GPIO_AFCON0 | UT1RXMAP_AF;
        hal_gpio_init(GPIOA_BASE, &gpio_init);
        /* Interrupt */
    }
}

从注释中可以观察到。GPIO会有G1,G2,G3,G4...这些配置:

对于UART而言,有以下几种引脚配置,根据alternate后面的GPIO_AF_G2来选择第几种配置

/**
 * UART0:
 * G1: tx:PA7 rx:PA6
 * G2: tx:PB2 rx:PB1
 * G3: tx:PB3 rx:PB4
 * G4: tx:PE7 rx:PE6
 * G5: tx:PA1 rx:PA0
 * G6: tx:PE0 rx:PE1
 * G7: tx:PF2 rx:map to tx
 * 
 * UART1:
 * G1: tx:PA7 rx:PA6
 * G2: tx:PA4 rx:PA3
 * G3: tx:PF2 rx:map to tx
 */

UART0选择的是G1, UART1选择的是G2

测评

由于UART0的TX和RX短接起来了,所以当串口通过PC发送一个字节的时候,这个字节通过对端的TX RX相连,所以PC会收到一次自己发的数据,外加一次console口回显的数据,会收到两次数据,所以如果要正常使用console口的话,请使用官方的tool Downloader.exe

image-20210316213600756.png

这边我尝试打开UART1测试了一下,发现可以正常使用,不过需要打开下面的注释的代码

     if(hal_uart_getflag(UART1_BASE, UART_FLAG_RXPND))       //RX one byte finish
     {
         rt_hw_serial_isr(&(uart_obj[UART1_INDEX].serial), RT_SERIAL_EVENT_RX_IND);
     }

这样的话,如果外接一颗FT232的话,可以正常的使用console。

不过还是有一点问题,当一个字节一个字节输入的时候,是正常的没有问题,当如果是多个字节输入的时候,例如可以用PC复制一个help 4个字节,然后在console里面粘贴,会发现这里的数据是不对的。
help.gif

理论上讲,这里应该是需要正常显示的。但是这边看起来数据不对的。

我有尝试修改驱动得到正确的结果,无奈资料实在太少,查询相关寄存器,也只有RX接收一个字节中断,没有FIFO相关资料。这边推荐以下解决方案。

  • UART不知道是否支持DMA,可以采取支持DMA的方式来接收数据
  • UART FIFO如果有的话可以启用
  • UART idle中断如果有的话,可以启用。

中断

这边中断UART0~UART2都是采用的一个中断向量IRQ_UART0_2_VECTOR

1 条评论

发布
问题