大家帮我分析下这个关于LM3S9B96的UART的中断函数有些什么问题



下面是我参考资料写的一个UART中断函数,大家帮我看看哪里有问题

#include  "hw_types.h"

#include  "hw_memmap.h"

#include  "hw_ints.h"

#include  "sysctl.h"

#include  "gpio.h"

#include  "uart.h"

#include  "uartGetPut.h"

#include  "stdio.h"

#include "interrupt.h"

void UART0_ISR(void) //中断服务子程序

{

//消除中断标志

   unsigned long ulStatus;

   ulStatus = UARTIntStatus(UART0_BASE, true);

   UARTIntClear(UART0_BASE, ulStatus);

//进入中断怎返回‘s’

   UARTCharPut(UART0_BASE,'S');

}

void UARTSend(const unsigned char *pucBuffer, unsigned long ulCount)

{  while(ulCount--)

  { // 通过字符串指针发送数据

    UARTCharPutNonBlocking(UART0_BASE, *pucBuffer++);

   }

}

void uartInit(void)

{

   SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);            //  使能UART0模块

   SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);            //  使能RX/TX所在的GPIO端口

   GPIOPinTypeUART(GPIO_PORTA_BASE,                       //  配置RX/TX所在管脚为

                   GPIO_PIN_0 | GPIO_PIN_1);               //  UART收发功能

   UARTConfigSetExpClk(UART0_BASE,SysCtlClockGet(),                              //  配置UART端口

                 9600,                                     //  波特率:9600

                 UART_CONFIG_WLEN_8 |                      //  数据位:8

                 UART_CONFIG_STOP_ONE |                    //  停止位:1

                 UART_CONFIG_PAR_NONE);                    //  校验位:无

   UARTEnable(UART0_BASE);                                 //  使能UART端口

}

int main(void) //  主函数(程序入口)

{

//char str[10],string[10];

SysCtlClockSet(SYSCTL_USE_OSC |                         //  系统时钟设置

                  SYSCTL_OSC_MAIN |                        //  采用主振荡器

                  SYSCTL_XTAL_16MHZ |                      //  外接16MHz晶振

                  SYSCTL_SYSDIV_1);                        //  不分频

       uartInit();                                        //  UART初始化

IntMasterEnable();                                    //开总中断

IntEnable(INT_UART0); //使能UART中断

UARTIntEnable(UART0_BASE,UART_INT_RT | UART_INT_RX);   //使能接收中断和接收超时中断

UARTSend((unsigned char *)"Enter text: ", 12);

   while(1)

   {

   }

}

  • 我的UART_Init()

    {

    ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);

    ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);

    GPIOPinConfigure(GPIO_PA0_U0RX);

    GPIOPinConfigure(GPIO_PA1_U0TX);

    ROM_GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);

    ROM_UARTConfigSetExpClk(UART0_BASE, ROM_SysCtlClockGet(), 38400,

                               (UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE |

                                UART_CONFIG_PAR_NONE));

    }

    初始化的时候,是不是要加上GPIOPinConfigure

  • 是呀,GPIOPinConfigure的作用是将IO管脚选择做为第几个外设功能。建议你去查看一下GPIOPinConfigure

    的源码就知道了,这个函数只是设置了port control(PCTL)这个寄存器

  • 恩,这些设置我在主函数的 uartInit(); 函数里初始化过了。

    现在我已经调试出来了,谢谢!