蜂鸟E203系列—— UART 设计

2020-07-24 14:21:23 浏览数 (1)

参考文章《UART》

原理图

GPIO 可以通过 IOF0 和 IOF1 功能,使得 SOC 中的外设能够复用 GPIO 的32根引脚与芯片外设进行通信,其接口分配表如下所示:

GPIO编号

IOF0

IOF1

GPIO0

-

PWM0_0

GPIO1

-

PWM0_1

GPIO2

QSPI1:SS0

PWM0_2

GPIO3

QSPI1:SD0/MOSI

PWM0_3

GPIO4

QSPI1:SD1/MISO

-

GPIO5

QSPI1:SCK

-

GPIO6

QSPI1:SD2

-

GPIO7

QSPI1:SD3

-

GPIO8

QSPI1:SS1

-

GPIO9

QSPI1:SS2

-

GPIO10

QSPI1:SS3

PWM2_0

GPIO11

-

PWM2_1

GPIO12

IIC:SDA

PWM2_2

GPIO13

IIC:SCL

PWM2_3

GPIO14

-

-

GPIO15

-

-

GPIO16

UART0:RX

-

GPIO17

UART0:TX

-

GPIO18

-

-

GPIO19

-

PWM1_1

GPIO20

-

PWM1_0

GPIO21

-

PWM1_2

GPIO22

-

PWM1_3

GPIO23

-

-

GPIO24

UART1:RX

-

GPIO25

UART1:TX

-

GPIO26

QSPI2:SS

-

GPIO27

QSPI2:SD0/MOSI

-

GPIO28

QSPI2:SD1/MISO

-

GPIO29

QSPI2:SCK

-

GPIO30

QSPI2:SD2

-

GPIO31

QSPI2:SD3

-

源码

嵌入式软件发送20个连续的递增数据给底层硬件

代码语言:javascript复制
#define DATA_SIZE 20
int8_t uxrt_tx_data[DATA_SIZE];

#define GPIO_UART1_RX 24
#define GPIO_UART1_TX 25

/**
 * 串口1 波特率115200 用于发送数据
 */

static void uart_init1(int8_t a[DATA_SIZE])
{
        int i=0;
        //IOF0:设置GPIO_UART1_RX和GPIO_UART1_TX的GPIO引脚为IOF0模式
        GPIO_REG(GPIO_IOF_SEL)  &= ~(0x1 << GPIO_UART1_RX) ;
        GPIO_REG(GPIO_IOF_SEL)  &= ~(0x1 << GPIO_UART1_TX) ;

        //IOF0使能:设置GPIO_UART1_RX和GPIO_UART1_TX的GPIO引脚为IOF0模式使能
        GPIO_REG(GPIO_IOF_EN)  |= (0x1 << GPIO_UART1_RX) ;
        GPIO_REG(GPIO_IOF_EN)  |= (0x1 << GPIO_UART1_TX) ;

        //使能UART1 TX发送
        UART1_REG(UART_REG_TXCTRL)  |=   (0x1 << 0) ;
        //UART1 的stop为1bit
        UART1_REG(UART_REG_TXCTRL)  &=   ~(0x1 << 1) ;

        //波特率设置:先将div寄存器清零,再进行赋值操作
        UART1_REG(UART_REG_DIV)  = 0;
        //波特率设置:设置波特率为 115200 时钟频率16M,div=(16M/115200)-1=138
        UART1_REG(UART_REG_DIV) = 138;

        for(i=0;i<DATA_SIZE;i=i 1){
            //当发送缓冲队列不满的时候进行发送数据
            while(UART1_REG(UART_REG_TXFIFO) & 0x80000000);
            UART1_REG(UART_REG_TXFIFO)  = a[i] ;
        }
}
void main(){

    int i=0;
    for(i=0;i<DATA_SIZE;i=i 1){
        uxrt_tx_data[i]=i;
    }
    printf("uart is start");
    uart_init1(uxrt_tx_data);
}

实验结果

在 verilog 中添加 UART 解串程序,也就是将 TX 发出来的 GPIO25 引脚进行解串。

通过加入ILA可以看到发送的20个数据如下:

0 人点赞