TI的官方例程里面只给了SCIA的配置而没有给其他的SCI的配置方法 其实这些的配置都是一样的,下面以SCIB和SCID的配置为例并结合数据手册说明一下配置过程:至于一些参数为什么要向程序中那样配置可参考F28379的技术手册和博客最后面的截图(当然了也都是在技术手册中截的)
注:程序中红色的代表需要注意的部分,其他颜色的对应下面相同颜色的函数实现方式
/*****************系统配置*****************/
InitSysCtrl(); // 初始化系统
InitGpio(); // 初始化GPIO
SciIOCfg(); // 初始化SCI 引脚的初始化
/*中断配置*/
DINT; //关闭所有中断
InitPieCtrl(); //初始化PIE 控置寄存器到它们的默认状态。默认所有 PIE 被清除
//失能所有的CPU中断 并清除所有的CPU中断标志:
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();//用指向shell中断服务例程(ISR)的指针来初始化PIE 向量表。
/*中断向量配置*/
EALLOW;
PieVectTable.SCIB_RX_INT = &scibRxFifoIsr; //串口B接收中断
PieVectTable.SCID_RX_INT = &scidRxFifoIsr; //串口D接收中断
EDIS;
/*SCI带FIFO接收中断*/
scib_fifo_init(); //初始化SCI_B 的FIFO
scid_fifo_init(); //初始化SCI_D 的FIFO
PieCtrlRegs.PIECTRL.bit.ENPIE = 1; // Enable the PIE block
PieCtrlRegs.PIEIER9.bit.INTx3 = 1; // PIE Group 9, INT3,配置sciB 接收中断使能*/
PieCtrlRegs.PIEIER8.bit.INTx7 = 1; // PIE Group 8, INT7,配置sciD 接收中断使能*/
IER |= M_INT9|M_INT8; // Enable CPU INT
EINT; //启用全局中断INTM
下面结合上面的代码对配置过程进行详解:
首先是其中SCI初始化函数的配置程序:
1.SciIOCfg();
void SciIOCfg(void)
{
/*SCIB:配置GPIO为上拉和复用功能*/ //注意这里端口引脚的复用需要找数据表中 GPIO Muxed Pins端口复用引脚的第几种复用方式 SCIB为2
//RX--P19
GPIO_SetupPinMux(19, GPIO_MUX_CPU1, 2);
GPIO_SetupPinOptions(19, GPIO_INPUT, GPIO_PULLUP); //这里应该是GPIO_PULLUP ->1 例程错误 原本例程为GPIO_PUSHPULL ->0 正确应该是GPIO_PULLUP 启用上拉
//TX--18
GPIO_SetupPinMux(18, GPIO_MUX_CPU1, 2);
GPIO_SetupPinOptions(18, GPIO_OUTPUT, GPIO_ASYNC);
/*SCID:配置GPIO为上拉和复用功能*/ //注意这里端口引脚的复用需要找数据表中 GPIO Muxed Pins端口复用引脚的第几种复用方式 SCID为6
//RX--P105
GPIO_SetupPinMux(105, GPIO_MUX_CPU1, 6);
GPIO_SetupPinOptions(105, GPIO_INPUT, GPIO_PULLUP);
//TX--104
GPIO_SetupPinMux(104, GPIO_MUX_CPU1, 6);
GPIO_SetupPinOptions(104, GPIO_OUTPUT, GPIO_ASYNC);
}
FIFO初始化函数:scib_fifo_init(); (当然SCID只需把程序中的scib改成scid即可 这里不赘述SCID)
void scib_fifo_init(void)
{
ScibRegs.SCICCR.all = 0x0007; // 一个停止位 无回环
// 无奇偶校验位 ,8个字符位 ,
// async (空闲线)模式, 空闲线协议
ScibRegs.SCICTL1.all = 0x0003; // 使能 TX, RX, 内部 SCICLK(SCI时钟),
// Disable RX ERR, SLEEP, TXWAKE
//波特率高低位
ScibRegs.SCIHBAUD.all = 0x0000;
ScibRegs.SCILBAUD.all = SCI_PRD; // 配置波特率为SCI_PRD
ScibRegs.SCIFFTX.all = 0xE040; // 使能SCI的FIFO功能,重置SCI,发送重置
ScibRegs.SCIFFRX.bit.RXFFIENA = 1; // 使能SCI FIFO发送功能
ScibRegs.SCIFFRX.bit.RXFFIL = RXNUM; // 设定接受位数为RXNUM 0h-10h
ScibRegs.SCIFFRX.bit.RXFFINTCLR =1; // FIFO计数中断标志位清零
ScibRegs.SCIFFCT.all = 0x00;
ScibRegs.SCICTL1.all = 0x0023; // 重启sci
ScibRegs.SCIFFRX.bit.RXFIFORESET = 1; // 重启sci接收fifo
}
至于波特率的配置就需要对照官方例程了,注意:时钟为200兆时才正确 如何计算可以在技术手册中找到哦!SCI的官方例程中也是这样计算的
//波特率计算方式
#define CPU_FREQ 200E6
#define LSPCLK_FREQ CPU_FREQ/4
#define SCI_FREQ 115200
#define SCI_PRD (LSPCLK_FREQ/(SCI_FREQ*8))-1
附图 :
1.引脚复用
2.中断通道映射: