二、串口功能开发
板上有一个CH340芯片,R7FA4M2的串口9接到此芯片上面。
按照之前介绍的方法,在上一章节工程的基础上打开RASC工具,配置串口
依次点击Pins > Peripherals > Connectivity:SCI > SCI9,然后选择功能,如果选择的是异步串口,则只需要配置两个引脚,在Input/Output里面的TXD9 RXD9选择需要设置的引脚编号。
如果此时直接选,会报错,那我们来看下它跟谁冲突了。
在Pins找到P109的定义,可以看到DEBUG0_TDO使用了此引脚,单击Link那里的箭头,跳转过去
然后可以看到是DEBUG功能占用了此引脚
这里如果不用JTAG调试模式,而是用SWD的时候,就不会占用109 110引脚,而笔者手上的STLINK确实只有SWD接口,并没有JTAG。因此这里改下配置
之后可以看到没有冲突了
然后可以新建一个线程来操作这个串口,按照上一章介绍的方式,首先新建一个thread,然后配置线程名称,栈大小
然后把串口相关的配置加入工程里面。依次点击New Stack > Connectivity > UART
然后配置一下串口。这里它默认是串口0,改了配置之后就会变了。修改通道号为9,名称改为g_uart9
另外还要配置一个中断回调函数
其他保持默认即可,波特率默认是115200,需要调整的话可以直接到代码里面改。然后点击
生成工程。
然后在keil下面可以看到,多了一个uart_test_entry.c的源文件,里面有个uart_test_entry函数,就是新增的freertos线程入口。在此线程中使用
R_SCI_UART_Open (&g_uart9_ctrl, &g_uart9_cfg);
初始化串口。它还有关闭串口的API,不过这种系统通常用不到。
然后发送API是R_SCI_UART_Write (&g_uart9_ctrl, (unsigned char*)uart9_data, uart9_data_len)。这个API是立即返回的,串口里面应该内置了缓冲,要等到发送完成中断触发之后,才算发送成功。
接收没有API,默认在中断里面接收,一个字节产生一次中断
写一个demo验证一下串口收发的功能。这个demo把收到的数据发出去。代码部分截取如下。
首先初始化串口,建立一个全局的buffer,用于缓冲接收到的数据,然后隔一段时间读取一次buffer的长度,如果长度大于0,则是有数据,就把这些数据发出去。这个发送要额外用一个g_uart9_transmit_complete来标识上一次是否发送完成。
这里是对中断的处理,如果是UART_EVENT_RX_CHAR说明收到数据,把数据取出来。如果是UART_EVENT_TX_DATA_EMPTY,说明上一次发送已经完成。中间这里还有一段,是使用乒乓进行接收,放入缓冲区的操作。
按照上面步骤修改代码后,下载到板上。然后使用串口工具测试。
在调试模式下,可以看到数据接收发送都是正确的。