L110的UART模式2的波特率是不可编程的,也不需要定时器,是根据当前主频计算得到,如下公式
而且模式2的数据格式为:起始位、停止位、8个数据位,还有一个TB8或者RB8
样例是串口助手先发送6个字节,MCU收到6个字节之后,往串口助手回复6个字节
uint8_t u8RxData[6];
uint8_t u8RxRB8;
uint8_t u8RxCnt=0;
uint8_t RxFinished;
uint8_t u8TxData[6];
uint8_t u8TxTB8;
uint8_t u8TxCnt=0;
void INTHanlder_UART0()
{
//Uart_IRQHandler(0);
if(1 == M0P_UART0->ISR_f.RI)
{
u8RxData[u8RxCnt] = M0P_UART0->SBUF_f.SBUF; //接收数据
u8RxRB8 = M0P_UART0->SCON_f.RB8; //接收RB8位
u8TxData[u8RxCnt] = u8RxData[u8RxCnt]; //TX存储RX数据,用于返回相同的接收数据,仅为演示
u8RxCnt++;
if(u8RxCnt >= 6)
{
u8RxCnt = 0;
RxFinished = 1;
}
M0P_UART0->ICR_f.RICLR = 0;
}
}
int32_t main(void)
{
//Clk_SwitchTo(ClkRCL);
//Clk_SetRCHFreq(ClkFreq24Mhz);
//Clk_SwitchTo(ClkRCH);
M0P_CLOCK->PERI_CLKEN_f.BASETIM = 1;
M0P_CLOCK->PERI_CLKEN_f.UART0 = 1;
M0P_CLOCK->PERI_CLKEN_f.GPIO = 1;
Gpio_SetFunc_UART0TX_P35();
Gpio_SetFunc_UART0RX_P36();
M0P_UART0->SCON_f.DBAUD = 0; //单倍波特率
//M0P_UART0->SCON_f.DBAUD = 1; //双倍波特率
/*
BaudRate = ((SCON_f.DBAUD + 1) * freq) / 64
因为freq = 4M,所以波特率为62500
*/
//UART初始化
M0P_UART0->SCON_f.SM01 = 0x2; //模式2
M0P_UART0->SCON_f.SM2 = 0; //多主机通信disable
M0P_UART0->ICR_f.RICLR = 0;
M0P_UART0->ICR_f.TICLR = 0;
M0P_UART0->SCON_f.TIEN = 0; //发送中断不使能
M0P_UART0->SCON_f.RIEN = 1; //接受中断使能
EnableNvic(UART0_IRQn, 3u, TRUE);
M0P_UART0->SCON_f.REN = 1;
while(1)
{
if(RxFinished == 1) //接收6个字节后,返回6个字节
{
for(u8TxCnt = 0; u8TxCnt < 6; u8TxCnt++)
{
M0P_UART0->SCON_f.TB8 = u8TxTB8; //TB8位,根据需要在发送前 编程每一个待发送字节的TB8位,此处仅仅是演示
M0P_UART0->SBUF_f.SBUF = u8TxData[u8TxCnt]; //查询发送
while(0 == M0P_UART0->ISR_f.TI);
M0P_UART0->ICR_f.TICLR = 0;
}
RxFinished = 0;
}
}
}
|