28335串口中断收发程序编写步骤及注意事项

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

最后附上代码

https://download.csdn.net/download/baodewang/12487781

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值