描述
首先用中断方式的DEMO程序,似乎无法调通,于是用自己的方式调试串口。首先看看datasheet。居然只有四个寄存器,非常容易上手。
1.用下载工具提供的串口助手发送给MCU,MCU再把数据打印出来。
///----System Init --------------------------------------------------------------------------
CLIC_Init();//系统中断配置
System_clock_Init();//系统时钟初始化
SYS_Interrupt_Enable();//CLIC开总中断
此部分仍采用demo程序。
//初始化串口
UART_Init_IT_case1(UART2);//中断模式
做一些简单修改,使能接收
UARTx->CTRL = 0<<25 //发送中断使能: 0-off,1-on
|1<<24 //接收中断使能:0-off,1-on
|0x0116<<8 //波特率(对应16M时钟):
//0x1a0b-2400,0x0683-9600,0x0341-19200,0x0116-57600,0x008b-115200
//0x0045-230400,0x0023-460800,0x0011-921600,0x000d-1128800
|1<<6 //模式选择:0-模式0,1-模式1,2/3-模式2
|0<<5 //多处理器使能
|1<<4 //接收使能
|0<<3 //发送数据bit8
|0<<2; //接收数据bit8
//写几行代码,处理发送和接收
发送数据:
void INE_vWriteData(uint8_t u8TxData)
{
uint32_t u32TempValue = 0;
u32TempValue = (1<< 25);
UART2->DATA = u8TxData;
UART2->CTRL = UART2->CTRL|u32TempValue;
}
先把数据放进寄存器,再使能发送
接收数据:
void UART1_IRQhandler(void)
{
uint32_t u32TempValue = 0;
uint32_t u32TempValue2 = 0;
uint8_t i = 0;
if(UART1->CTRL&0x1) //接收中断标志
{
//IRQ Hander......
INE_u8RecBuf[i++] = UART1->DATA;
//INE_u8RecBuf[0] = 2;
INE_u8Length = i;
//u32TempValue2 = (1<< 24);
///u32TempValue2 = ~u32TempValue;
//UART1->CTRL = UART1->CTRL&u32TempValue;
UART1->CTRL = (UART1->CTRL|0x01);//清除接收中断
}
if(UART1->CTRL&0x2) //发送中断标志
{
UART1->CTRL = (UART1->CTRL&0xfffffffe)|0x2;//清除发送中断
//IRQ Hander......
u32TempValue = (1<< 25);
u32TempValue = ~u32TempValue;
UART1->CTRL = UART1->CTRL&u32TempValue;
}
}
接收数据放在中断函数内部,同时清中断标志位。
对于发送来说,发送结束,同样清发送完成中断标志,并关闭发送使能位。
main函数打印数据
for (uint8_t i=0; i< INE_u8Length; i ++)
{
INE_vWriteData(INE_u8RecBuf); } INE_u8Length = 0;由于只想DEMO一下收发功能,所以支持收发一个字节。
2. 切换到串口2,修改代码并用串口调试助手发送数据,打印数据。
总结:
1. 串口寄存器简单易用,非常适合简单的应用场合。
2. 同时datasheet过于简单,甚至找不到串口内部的逻辑图。
3. 也正是由于过于简单,恐怕难以实现一些特殊的灵活应用。
打开APP阅读更多精彩内容