在RD8T37中有三选一通用串行接口UCSI,用户可以将它配置成SPI、TWI(可以看作I2C)和UART中的任意一种通讯模式,使用新定义提供的库函数可以简单地完成配置和数据收发
先来看看串口的使用,UCSI作为串口使用时可以工作在模式0(8位半双工同步通信),模式1(10位全双工一步通信),模式2(11位全双工异步通信)
在TBK-RD8T3x开发板上集成了一个USB转串口的功能用来ISP烧录使用,省去了另外找USB转串口的麻烦,接下来用这个串口简单做一个串口收发测试,使用中断接收PC发过来的数据然后原样返回
这一组对应的是UCSI1,添加TBK-RD8T3x Demo Code\FWLib\RD8_Lib\src中的rd8_USCI1.c到工程中,接下来要用到这个文件中的方法配置和控制串口
在SC_Init.c的SC_Init方法中添加SC_USCI1_Init();
在SC_USCI1_Init中添加串口初始化代码,使用新定义提供的库函数可以方便直观地进行配置,不用再查寄存器的配置了,将串口RX和TX对应的IO设置为上拉输入模式,设置串口波特率为115200
void SC_USCI1_Init(void)
{
GPIO_Init(GPIO1, GPIO_PIN_1, GPIO_MODE_IN_PU);
GPIO_Init(GPIO1, GPIO_PIN_3, GPIO_MODE_IN_PU);
USCI1_UART_Init(32000000,115200,USCI1_UART_Mode_10B,USCI1_UART_RX_ENABLE);
USCI1_ITConfig(ENABLE,HIGH);
}
其中串口配置函数解释:
USCI1_UART_Init(uint32_t UART1Fsys, uint32_t BaudRate, USCI1_UART_Mode_TypeDef Mode,USCI1_UART_RX_TypeDef RxMode)
此方法将USCI1初始化为串口,UART1Fsys为串口时钟频率,BaudRate为串口波特率,Mode为UART1工作模式(8位 10位 11位),RxMode为是否开启接收
USCI1_ITConfig(FunctionalState NewState, PriorityStatus Priority)
设置串口中断,NewState(ENABLE DISABLE)开启或关闭中断,Priority(HIGH,LOW)中断优先级
接下来在SC_it.c中处理串口中断,接收中断触发后读取串口数据并将接收的数据通过原样发送回去,使用一个变量作为发送完成的标识,发送中断触发后发送完成标识置1
extern uint8_t txfin;
void USCI1Interrupt() interrupt 15
{
uint8_t rxdata = 0;
if(USCI1_GetFlagStatus(USCI1_UART_FLAG_RI) == SET)
{
rxdata = USCI1_UART_ReceiveData8();
USCI1_UART_SendData8(rxdata);
USCI1_ClearFlag(USCI1_UART_FLAG_RI);
}
if(USCI1_GetFlagStatus(USCI1_UART_FLAG_TI) == SET)
{
USCI1_ClearFlag(USCI1_UART_FLAG_TI);
txfin = 1;
}
}
运行效果
接下来重定向printf到串口输出,这样就能方便地输出调试信息,RD8T37是51内核的MCU,可以参考其他51内核的MCU重定向printf的方法,包含stdio.h这个头文件,然后重写putchar方法,在putchar方法调用串口发送,在主循环中用printf打印一个自增的数值来测试
#include "SC_Init.h"
#include "SC_it.h"
#include "..\Drivers\SCDriver_list.h"
#include "HeadFiles\SysFunVarDefine.h"
#include <stdio.h>
uint32_t count = 0;
void main(void)
{
SC_Init();
TouchKeyInit();
while(1)
{
Sys_Scan();
if(count%0x40000 == 0)
{
printf("串口printf测试:%ld",count/0x40000);
}
count += 1;
}
}
uint8_t txfin = 0;
char putchar(char c)
{
USCI1_UART_SendData8(c);
while(txfin == 0);
txfin = 0;
return c;
}
运行效果
|