1,初始化外设时钟
void InitPeripheralClocks(void)函数中
SysCtrlRegs.PCLKCR0.bit.SCIAENCLK = 1; // SCI-A
2,引脚复用配置
在PinMux函数中,
EALLOW;
GpioCtrlRegs.GPAMUX2.bit.GPIO28 = 1; // Configure GPIO28 for SCIRXDA operation
GpioCtrlRegs.GPAMUX2.bit.GPIO29 = 1; // Configure GPIO29 for SCITXDA operation
EDIS;
3,串口寄存器初始化并使能PIE中断
uart_init(&SciaRegs,LSPCLK_KHZ,9600);
void uart_init (volatile struct SCI_REGS *UART,uint32 busclk,uint32 baud)
{
uint16 BRR=0;
//Writing a 0 to this bit initializes the SCI statemachines
//and operating flags(registers SCICTL2and SCIRXST) to the reset condition.
UART->SCICTL1.bit.SWRESET =0;
/* Configure the UART for 8-bit mode, no parity , 1 stop*/
UART->SCICCR.bit.SCICHAR = 7;// 8-bit
UART->SCICCR.bit.PARITYENA= 0;//Parity disabled
UART->SCICCR.bit.STOPBITS = 0;//One stop bit
/* Calculate baud settings */
BRR = busclk*1000/baud/8-1;
UART->SCIHBAUD = (BRR>>8)&0xff;
UART->SCILBAUD = (BRR>>0)&0xff;
/* Enable receiver and transmitter */
UART->SCICTL1.bit.RXENA = 1;//Enable receiver
UART->SCICTL1.bit.TXENA = 1;//Enable transmitter
//enable rx interrupt
UART->SCICTL2.bit.RXBKINTENA =1;
//After a system reset,re-enable the SCI by writing a 1 to this bit.
UART->SCICTL1.bit.SWRESET = 1;
if(&SciaRegs == UART)
{
//rx interrupt,INT9.1
IER |= M_INT9;
PieCtrlRegs.PIEIER9.bit.INTx1= 1;
//tx interrupt,INT9.2
IER |= M_INT9;
PieCtrlRegs.PIEIER9.bit.INTx2= 1;
}
else if(&ScibRegs == UART)
{
}
}
4,中断服务函数编写
关于中断服务函数问题,在定时器中断部分有详细介绍,大家可以参考,这里就不详解。
// INT9.1
interrupt void SCIRXINTA_ISR(void) // SCI-A
{
PieCtrlRegs.PIEACK.all = PIEACK_GROUP9; //Writing 1 to clear flag,must be needed
uart_rx_isr(&SciaRegs);
}
// INT9.2
interrupt void SCITXINTA_ISR(void) // SCI-A
{
PieCtrlRegs.PIEACK.all = PIEACK_GROUP9; //Writing 1 to clear flag,must be needed
uart_tx_isr(&SciaRegs);
}
5,测试
1),中断发送函数
UART_INTSendMsg(&SciaRegs,&UART0_Data,"hello world\n",strlen("hello world\n"));
2),接收在串口中断中接收
6,注意事项
在调试串口程序时,在如下几点遇到问题,耽误了一些时间,特此记录,避免再出现类似错误。
1),串口初始化后,未调用UART->SCICTL1.bit.SWRESET = 1;导致串口不工作
2),进行串口中断发送程序时,无法进入发送中断,后发现28335如果想进入发送中断的话,需要先用其他方式来发送字符串的第一个字符来启动一次SCI的发送中断,然后才可以使用发送中断来发送其余的字符。这一点与cortex区别较大。
3),接收和发送中断都要加PieCtrlRegs.PIEACK.all = PIEACK_GROUP9; //Writing 1 to clear flag,must be needed
最后附上代码