适用于280x、281x、2801x、2804x、2807x、28002x、28003x、28004x、280013x、280015x、2823x、2833x、2834x、2837xD、2837xS、2838x、M35x、M36x的机型
- 具体情况请参考F280049的用户指南。
- 此项目实现了16 级 FIFO串口通讯,发送、接收功能以及接收中断。
具体配置如下:
/*
* ds_usart.c
*
* Created on: 2023年9月19日
* Author: chends
*/
#include "ds_usart.h"//此头文件自己定义一个,用来声明下面的函数即可
#include "F28x_Project.h"
//GPIO口配置
void InitSciaGpio(void)
{
EALLOW;
GpioCtrlRegs.GPAPUD.bit.GPIO28 = 0; // Enable pull-up for GPIO28 (SCIRXDA)
GpioCtrlRegs.GPAPUD.bit.GPIO29 = 0; // Enable pull-up for GPIO29 (SCITXDA)
GpioCtrlRegs.GPAQSEL2.bit.GPIO28 = 3; // Asynch input GPIO28 (SCIRXDA)
GpioCtrlRegs.GPAMUX2.bit.GPIO28 = 1; // Configure GPIO28 for SCIRXDA operation
GpioCtrlRegs.GPAMUX2.bit.GPIO29 = 1; // Configure GPIO29 for SCITXDA operation
EDIS;
}
/*
* 内部生成的串行时钟由低速外设时钟(LSPCLK)信号和两个波特选择寄存器决定。
* SCI 使用这些寄存器的 16 位值为通信模式选择 64K 串行时钟速率之一。
* BRR = (SCIHBAUD << 8) + (SCILBAUD)
* SCI 波特率的计算公式如下: SCI 异步波特率 = LSPCLK / ((BRR + 1) *8)
* 或者,
* BRR = LSPCLK / (SCI 异步波特率 * 8) - 1
* 注意,上述公式仅适用于 0 < BRR < 65536 的情况。
* 如果 BRR = 0,则 SCI 异步波特 = LSPCLK / 16
* 其中BRR = 波特选择寄存器中的 16 位值(十进制)
*/
void sciA_init(Uint32 baud,Uint16 RxFrameLength)
{
Uint16 _BRR;
RxFrameLength=RxFrameLength > 16 ? 16 : RxFrameLength;
InitSciaGpio();
EALLOW;
PieVectTable.SCIA_RX_INT= &dasen_SciARxIRQn;
CpuSysRegs.PCLKCR7.bit.SCI_A=1;//使能SCI_A时钟
EDIS;
SciaRegs.SCICCR.bit.STOPBITS=0;//0-停止位:1位;1-停止位:2位
SciaRegs.SCICCR.bit.PARITYENA=0;//0-不使能校验;1-使能校验
SciaRegs.SCICCR.bit.LOOPBKENA=0;//回环测试模式:0-disable;1-enable。
SciaRegs.SCICCR.bit.SCICHAR=7;//字符长度控制位:7h (R/W) = SCICHAR_LENGTH_8
SciaRegs.SCICTL1.bit.RXERRINTENA=0;//SCI接收错误中断:0-disable;1-enable。
SciaRegs.SCICTL1.bit.SWRESET=1;//SCI软件复位(低电平有效)。不影响配置位,会影响SCI的工作标志。
//0h (R/W) = 将 0 写入该位可将 SCI 状态机和操作标志(寄存器 SCICTL2 和 SCIRXST)初始化为复位状态。
//1h (R/W) = 系统复位后,向该位写入 1,重新启用 SCI。
SciaRegs.SCICTL1.bit.TXENA=1;//SCI发送器使能位:0-disable;1-enable。
SciaRegs.SCICTL1.bit.RXENA=1;//SCI接收机使能位:0-disable;1-enable。
_BRR =(Uint16)((SCI_LSPCLK/(baud * 8))-1);
SciaRegs.SCIHBAUD.bit.BAUD=_BRR>>8;
SciaRegs.SCILBAUD.bit.BAUD=(_BRR&0XFF);
SciaRegs.SCICTL2.bit.RXBKINTENA=1;//使能RXRDY或BRKDT中断。SCIFFENA=1时,无效。
SciaRegs.SCICTL2.bit.TXINTENA=0;//禁用TXRDY中断
SciaRegs.SCIFFTX.bit.SCIRST=1;//写入 0 重置 SCI 发送和接收通道。SCI FIFO 寄存器配置位将保持不变。1-SCI FIFO 可以恢复发送或接收。
SciaRegs.SCIFFTX.bit.SCIFFENA=1;//SCI FIFO enable: 0-禁用SCI FIFO增强功能;1-启用SCI FIFO增强功能
SciaRegs.SCIFFTX.bit.TXFIFORESET=1;//发送 FIFO 复位 0h (R/W) = 将 FIFO 指针复位为零并保持复位状态 1h (R/W) = 重新启用传输 FIFO 操作
SciaRegs.SCIFFTX.bit.TXFFINTCLR=1;//写1清除TXFFINT位(发送FIFO中断标志位)
SciaRegs.SCIFFTX.bit.TXFFIENA=0;//0-禁用TX FIFO中断;1-使能TX FIFO中断
SciaRegs.SCIFFTX.bit.TXFFIL=5;//当TXFFST小于等于TXFFIL时,会产生中断信号。TXFFIL不能超过FIFO深度16.
SciaRegs.SCIFFRX.bit.RXFFOVRCLR=1;//写1清除RXFFOVF位(接收FIFO溢出标志位)
SciaRegs.SCIFFRX.bit.RXFIFORESET=1;//接收FIFO复位 0h (R/W) = 写 0 将 FIFO 指针复位为零,并保持复位状态。1h (R/W) = 重新启用接收 FIFO 操作
SciaRegs.SCIFFRX.bit.RXFFINTCLR=1;//写1清除RXFFINT位(接收FIFO中断标志位)
SciaRegs.SCIFFRX.bit.RXFFIENA=1;//使能RX FIFO 中断,只要接收 FIFO 状态 (RXFFST) 位匹配(等于或大于)中断触发电平位 RXFFIL(4-0 位),就会触发该中断。
SciaRegs.SCIFFRX.bit.RXFFIL=RxFrameLength;//当RXFFST大于等于RXFFIL时,会产生中断信号。RXFFIL不能超过FIFO深度16.
SciaRegs.SCIFFCT.bit.FFTXDLY=0;//FIFO传输延时
SciaRegs.SCIPRI.bit.FREESOFT=2;//0h (R/W) = 挂起时立即停止 1h (R/W) = 停止前完成当前接收/发送序列 2h (R/W) = 自由运行 3h (R/W) = 自由运行
IER |= M_INT9;
PieCtrlRegs.PIEIER9.bit.INTx1=1;
PieCtrlRegs.PIEACK.bit.ACK9=1;
//使能总中断
EINT;
ERTM;
}
//FIFO有空位时,写1个字节数据到发送缓存寄存器中
void UARTa_SendByte(Uint16 a)
{
while (SciaRegs.SCIFFTX.bit.TXFFST > 15);
SciaRegs.SCITXBUF.all=a;
}
//发送字符串
void UARTa_SendString(char * msg)
{
int i=0;
while(msg[i] != '\0')
{
UARTa_SendByte(msg[i]);
i++;
}
}
char* msg;
Uint16 recvdata;
Uint16 len=0,n;
Uint16 RecvData[100];
//自定义的接收中断函数,当RXFFST大于等于RXFFIL时进入此中断。
interrupt void dasen_SciARxIRQn(void)
{
//把FIFO中接收到的数据全部读出
while(SciaRegs.SCIFFRX.bit.RXFFST > 0)
{
recvdata = SciaRegs.SCIRXBUF.all;
RecvData[len]=recvdata;
len++;
}
//把接收到的数据发送回去
msg = " You sent: \0";
UARTa_SendString(msg);
for(n=0;n<len;n++)
{
UARTa_SendByte(RecvData[n]);
}
UARTa_SendString("\r\n\0");
len=0;
//清除相关中断标志位
SciaRegs.SCIFFRX.bit.RXFFOVRCLR=1;
SciaRegs.SCIFFRX.bit.RXFFINTCLR=1;
PieCtrlRegs.PIEACK.bit.ACK9=1;
}
SCI_LSPCLK是LSPCLK的频率,默认是CPU频率的四分之一。我这里CPUCLK是100MHZ,所以SCI_LSPCLK=25000000。
使用如下
sciA_init(115200,8);//baudrate-115200,接收一帧长度为8,接收到8个数据后会进入到中断处理
UARTa_SendString("SCIA test!\r\n");