打印
[应用方案]

TBK-RD8T3x的UCSI串口的使用

[复制链接]
208|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
在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;
}
运行效果


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

85

主题

450

帖子

4

粉丝