参考文章《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个数据如下: