【荔枝派Nano】F1C100S的串口
一颗功力尚浅的菜菜
编辑于 2021年02月20日 01:10
收录于文集
共8篇

        但凡接触过单片机的人,对串口都不会陌生,相信串口那极其重要的地位已经可以让我不用在这里对它再过多赘述了,所以这篇文章只填填坑。串口相关的例程都在https://gitee.com/cai_xl/F1C100S_examples

cut-off

        先看配置

        每个串口都支持各64字节的收/发FIFO、支持DMA、具有多种中断源。

        F1C100S有三个串口:UART0、UART1、UART2,其中UART0没有流控信号(RTS,CTS),其他两个串口都有流控信号。UART1支持全模式调制-解调信号。

        串口方面最大的坑就是寄存器映射的问题

        前7个寄存器存在地址共用,有的寄存器甚至功能大相径庭,在前三个偏移量为0x00的寄存器中,RBR是接收数据寄存器,THR是发送数据寄存器,前者只读,后者只写,没什么问题。但是第三个寄存器DLL,是用于搭配DLH寄存器设置通讯波特率的,需要将一个寄存器的DLAB位设置成1才能访问。偏移为0x04和0x08的寄存器也是类似的。在F1C100S_MDK的模板里,访问寄存器是使用write32和read32这两个函数进行访问的,也就是通过物理地址进行指针访问,并不能很明显得看出使用了哪个寄存器。

        在这7个寄存器的编址方面,为了和手册保持同步,就只能用共用体强行把几个寄存器放在同一个地址上,就像这样:

        剩下的小坑是寄存器功能有点分散,分成了Line和Modem两大部分,不过影响不大。

cut-off

        代码参考{F1C100S_MDK}/SRC/machine/sys-uart.c编写,大体上分GPIO重映射、开时钟、配置串口三个部分。其中并没有很明显的使能串口这一步的操作,所以使能串口可能是在开时钟这一步就完成的。

        串口目前有两个例程,分别是{F1C100S_examples}/examples/UART和{F1C100S_examples}/examples/UART_FIFO,前者是三个串口发送数据的测试,后者是使用UART0测试FIFO,代码比较简单,这里就只给出一部分。

        串口配置的部分一共分为禁用所有中断、重置调制解调器、设置波特率、设置停止位、校验位、数据长度这几步。

cut-off

        用make write TARGET=UART命令可以将{F1C100S_examples}/examples/UART编译后写入SPIFlash中。

        之后连接逻辑分析仪读IO上的波形。

        可以看到F1C100S成功输出了Hello from F1C100S这个字符串,最后一个字节是换行符所以显示不出来。

        FIFO测试是在串口测试的基础之上,每次向串口写入一个字节,就翻转一次IO电平,例程中使用PE0和PE1作为串口引脚,使用PE2指示写入操作。如果不启用FIFO,PE2的对照波形是这样的:

        上面的波形是PE1(UART0_Tx)的,下面的波形是PE2的。

        PE2的第一个上升沿是在发送字符串之前复位这个信号。考虑到串口的结构,复位PE2之后快速跳变两次是因为THR和移位缓存器的结构可以快速写入两次,从第三次跳变开始,表示需要等到前一个字节发送完成,THR中的内容才可以被传送到移位缓存器、THR才可以接收新数据。

        当使能FIFO之后,因为发送FIFO有64字节,可以一次性容纳全部数据,所有数据可以被快速写入FIFO中,PE2波形会快速跳变,就像这样:

        PE2上所有跳变沿全部集中在了一起。