工具/软件:
我对 UART 使用 SCI-A 中断
我正在使用器件库
SCI_setFIFO InterruptLevel (SCIA_BASE、SCI_FIFO_TX2、SCI_FIFO_RX1);
设置 SCI_FIFO_RX1后、我收到垃圾值
设置 SCI_FIFO_RX0获得正确的输出、但 DUW 持续进入该中断、而 while (1)内不工作
我会附上我的代码、请检查并告诉我问题
#include "driverlib.h"
#include "device.h"
#include "string.h"
//
//全局
//
uint16_t 循环计数器= 0;
bool newStringReceived = false;//指示已接收到完整字符串的标志
Volatile bool transmitComplete = true;//指示发送已就绪的标志
//消息缓冲区
Volatile char txBuffer[100];//发送缓冲器
Volatile uint16_t txLength = 0;//要发送的数据长度
Volatile uint16_t txIndex = 0;//发送缓冲器中的当前位置
Volatile char rxBuffer[100];//接收缓冲器
Volatile uint16_t rxIndex = 0;//接收缓冲区中的当前位置
Volatile char processedString[100];//完整接收字符串的缓冲区
//函数原型
__ interrupt void sciaRXISR (void);
__ interrupt void sciaTXISR (void);
void initSCI (void);
void sendMessage (const char *msg);
static bool startCapture = false;
void UART_init (void)
{
//
// GPIO28是 SCI Rx 引脚。
//
GPIO_setControllerCore (DEVICE_GPIO_PIN_SCIRXDA、GPIO_CORE_CPU1);
GPIO_setPinConfig (DEVICE_GPIO_CFG_SCIRXDA);
GPIO_setDirectionMode (DEVICE_GPIO_PIN_SCIRXDA、GPIO_DIR_MODE_IN);
GPIO_setPadConfig (DEVICE_GPIO_PIN_SCIRXDA、GPIO_PIN_TYPE_STD);
GPIO_setQualificationMode (DEVICE_GPIO_PIN_SCIRXDA、GPIO_QUAL_ASYNC);
//
// GPIO29是 SCI Tx 引脚。
//
GPIO_setControllerCore (DEVICE_GPIO_PIN_SCITXDA、GPIO_CORE_CPU1);
GPIO_setPinConfig (DEVICE_GPIO_CFG_SCITXDA);
GPIO_setDirectionMode (DEVICE_GPIO_PIN_SCITXDA、GPIO_DIR_MODE_OUT);
GPIO_setPadConfig (DEVICE_GPIO_PIN_SCITXDA、GPIO_PIN_TYPE_STD);
GPIO_setQualificationMode (DEVICE_GPIO_PIN_SCITXDA、GPIO_QUAL_ASYNC);
}
void UART_interruptInit (void)
{
INTERRUPT_enablePIE();
INTERRUPT_REGISTER (INT_SCIA_RX、sciaRXISR);
INTERRUPT_REGISTER (INT_SCIA_TX、sciaTXISR);
initSCI();
INTERRUPT_ENABLE (INT_SCIA_RX);
INTERRUPT_ENABLE (INT_SCIA_TX);
interrupt_enableInCPU (INTERRUPT_CPU_INT9);
INTERRUPT_enablePIE();
INTERRUPT_CLEARACKGROUP (INTERRUPT_ACK_group9);
}
//
//初始化 SCI 以进行基于中断的操作
//
void initSCI (void)
{
//
//重置并配置 SCI
//
Sci_performSoftwareReset (SCIA_BASE);
//
//将 SCIA 配置为9600波特、8-N-1
//
SCI_setConfig (SCIA_BASE、DEVICE_LSPCLK_FREQ、9600、(SCI_CONFIG_WLEN_8 |
SCI_CONFIG_STOP_ONE |
SCI_CONFIG_PAR_NONE));
//
//重置通道和 FIFO
//
sci_resetChannels (SCIA_BASE);
SCI_resetRxFIFO (SCIA_BASE);
SCI_resetTxFIFO (SCIA_BASE);
//
//清除任何挂起的中断
//
SCI_clearInterruptStatus (SCIA_BASE、SCI_INT_TXFF | SCI_INT_RXFF);
//
//启用 FIFO
//
SCI_enableFIFO (SCIA_BASE);
//
//设置 FIFO 中断级别
//
SCI_setFIFO InterruptLevel (SCIA_BASE、SCI_FIFO_TX2、SCI_FIFO_RX1);
//
//启用仅接收中断(需要时将启用发送)
//
SCI_enableInterrupt (SCIA_BASE、SCI_INT_RXFF);
//
//禁用错误中断;;;;;;;;;;;;;
//
SCI_disableInterrupt (SCIA_BASE、SCI_INT_RXERR);
//
//启用 SCI 模块
//
SCI_enableModule (SCIA_BASE);
while (SCI_getRxFIFOStatus (SCIA_BASE)> 0)
{
SCI_readCharNonBlocking (SCIA_BASE);
}
SCI_writeCharNonBlocking (SCIA_BASE、'\r');
SCI_writeCharNonBlocking (SCIA_BASE、'\n');
}
//
//发送以 null 结尾的消息字符串
//
void sendMessage (常量字符*msg)
{
//等待任何正在进行的传输完成
while (!transmitComplete);
//将消息复制到发送缓冲区
uint16_t i = 0;
while (msg[i]!='\0'&& i < sizeof (txBuffer)-1)
{
txBuffer[i]= msg[i];
I++;
}
//设置消息长度和重置索引
txLength = I;
txIndex = 0;
//将传输标记为进行中
transmitComplete = false;
//启用发送中断以开始发送
SCI_enableInterrupt (SCIA_BASE、SCI_INT_TXFF);
}
//
// SCI-A 接收 FIFO ISR
//
__中断 void sciaRXISR (void)
{
uint16_t availableChars;
已接收字符字符;
uint16_t j、i;
//获取 FIFO 中的字符数
availableChars = SCI_getRxFIFOStatus (SCIA_BASE);
//处理所有可用字符
for (i = 0;i < availableChars;i++)
{
//读取一个字符
receivedChar = SCI_readCharNonBlocking (SCIA_BASE);
//回显字符、以便用户可以看到他们正在键入的内容
SCI_writeCharNonBlocking (SCIA_BASE、receivedChar);
//处理接收到的字符
if (receivedChar ='\r'|| receivedChar ='\n')
{
//行末-填写字符串
//用空格填充剩余的缓冲区
rxBuffer[rxIndex]='\0';
/*对于(j = rxIndex+1;j < 50;j++)
rxBuffer[j]='';*/
//用空终结符填充缓冲区的其余部分
//memset (&rxBuffer[rxIndex + 1]、'\0'、100 -(rxIndex + 1));
memset (&rxBuffer[rxIndex]、'\0'、100 -(rxIndex + 1));
//复制到已处理的缓冲区
strcpy (processedString、rxBuffer);
//下一个字符串的复位缓冲器
rxIndex = 0;
//设置接收完整字符串的标志
newStringReceived = true;
}
Else if (receivedChar =='\b'|| receivedChar == 127)
{
//退格-如果缓冲区不为空、则删除最后一个字符
if (rxIndex > 0)
{
rxIndex--;
//发送退格序列以擦除终端上的字符
SCI_writeCharNonBlocking (SCIA_BASE、");
SCI_writeCharNonBlocking (SCIA_BASE、'\b');
}
}
Else if (rxIndex < sizeof (rxBuffer)- 1)
{
//如果未满、则将字符存储在缓冲区中
rxBuffer[rxIndex]= receivedChar;
rxIndex++;
}
/* if (receivedChar =='G')//使用任何适当的起始字符
{
//开始新消息
rxIndex = 0;
startCapture = true;
//如果你不想保存起始字符,请不要保存它
}
Else if (startCapture &&(receivedChar ='\r'|| receivedChar ='\n'))
{
//消息结束-正在处理的过程
rxBuffer[rxIndex]='\0';
memset (&rxBuffer[rxIndex]、'\0'、100 - rxIndex);
strcpy (processedString、rxBuffer);
rxIndex = 0;
startCapture = false;
newStringReceived = true;
}
Else if (startCapture && rxIndex < sizeof (rxBuffer)- 1)
{
//仅在看到起始字符后存储字符
rxBuffer[rxIndex]= receivedChar;
rxIndex++;
}*/
}
//检查溢出
IF (SCI_getOverflowStatus (SCIA_BASE)))
{
SCI_clearOverflowStatus (SCIA_BASE);
}
//清除中断标志
SCI_clearInterruptStatus (SCIA_BASE、SCI_INT_RXFF);
INTERRUPT_CLEARACKGROUP (INTERRUPT_ACK_group9);
}
//
// SCI-A 发送 FIFO ISR
//
__ interrupt void sciaTXISR (void)
{
uint16_t i;
Uint16_t charsToSend = 0;
//计算我们可以发送的字符数(最多 FIFO 深度)
while ((txIndex + charsToSend < txLength)&&(charsToSend < 16))
{
字符 ToSend++;
}
//发送字符
for (I = 0;I < charsToSend;I++)
{
SCI_writeCharNonBlocking (SCIA_BASE、txBuffer[txIndex+]);
}
//检查是否已发送所有字符
if (txIndex >= txLength)
{
//禁用发送中断
SCI_disableInterrupt (SCIA_BASE、SCI_INT_TXFF);
//将变速箱标记为完成
transmitComplete = true;
}
//清除中断标志
SCI_clearInterruptStatus (SCIA_BASE、SCI_INT_TXFF);
INTERRUPT_CLEARACKGROUP (INTERRUPT_ACK_group9);
}