Thread 中讨论的其他器件: SYSBIOS
工具/软件:TI-RTOS
大家好、
我正在尝试使用 SYSBIOS 为 TMS320F28379D 创建一个程序来响应中断。 中断来自我已设置为 UART 的 sci 模块、当 FIFO 缓冲区中有8个字符时、中断将触发。 我认为我已经正确设置了中断、因为我可以在中断中设置一个断点、当我从终端程序发送第8个字符时会触发中断。 我可以单步执行中断并逐步退出中断、而不会出现任何问题。
该问题在我步出中断后发生。 如果我继续步进、当 BIOS 的 HWI 堆栈突然开始增长和增长时、它可能会运行30个步进(进入我看不到的代码)、并且当它超过 Hwi 堆栈大小时、它会导致 RTOS 崩溃。 这仅在我触发中断后发生、如果我从未触发中断、系统运行正常。
有关我如何设置和尝试以下内容的随机注释:
*我已经尝试修改了中断中的代码、但即使我有一个空中断、问题仍然会出现。 表明问题在某种程度上位于中断代码外部。
*在 SYSBIOS 中设置中断。 中断号为96、scia_Rx 中断。 我在启动时有启用的复选标记、并标记了自动确认 PIE 中断。 具有自我屏蔽选项。
我的项目中的代码片段:
void setUartRegisters (volatile struct sci_regs * regsToSet、unsigned long cpuFrequency、unsigned long baudRateToSet) { 无符号长整型 LSPCLK; 无符号长整型 brr; //regsToSet->SCIFFTX.all = 0xE040;// OLD,下面替换此行 regsToSet->SCIFFTX.bit.SCIRST = 1;//可以恢复发送 regsToSet->SCIFFTX.bit.SCIFFENA = 1;//启用 FIFO 增强功能 regsToSet->SCIFFTX.bit.TXFIFORESET = 1;//重新启用 FIFO 操作 regsToSet->SCIFFTX.bit.TXFFINTCLR = 1;//清除 FIFO 中断标志 regsToSet->SCIFFTX.bit.TXFFIENA = 1;//启用 FIFO 中断 //regsToSet->SCIFFRX.ALL = 0x2044;// OLD,下面替换此行 regsToSet->SCIFFRX.bit.RXFIFORESET = 1;//重新启用 FIFO 操作 regsToSet->SCIFFRX.bit.RXFFINTCLR = 1;//清除 FIFO 中断标志 regsToSet->SCIFFRX.bit.RXFFIENA=1;//启用 FIFO 中断 regsToSet->SCIFFRX.bit.RXFFIL = 0x08;//在 FIFO 状态(RXFFST[4:0])与该值匹配时生成中断 //五位值,最大11111 regsToSet->SCIFFCT.all = 0x00;//关闭自动波特率填充 regsToSet->SCICCR.all = 0x0007;// 1停止位,无回路 //无奇偶校验,8个字符位, //异步模式,空闲线协议 //regsToSet->SCICTL1.all = 0x0003;//启用 TX、RX、内部 SCICLK、 //禁用 RX ERR、睡眠、TXWAKE regsToSet->SCICTL1.bit.RXENA=1;//启用 RX regsToSet->SCICTL1.bit.TXENA=1;//启用 TX regsToSet->SCICTL2.bit.TXINTENA=1;//启用 TX 中断 regsToSet->SCICTL2.bit.RXBKINTENA=1;//启用 RX 中断 //********* // sprug75a.pdf 中的公式表2-5 //1/4 SYSCLK = LSPCLK // 200MHz SYSCLK = 50MHz LSPCLK // 200MHz 9600波特 HBAUD = 0x02且 LBAUD = 0x8B。 // 120MHz 9600波特 HBAUD = 0x01且 LBAUD = 0x86。 // 200MHz 115200波特 HBAUD = 0x00、LBAUD = 0x35。 LSPCLK = cpuFrequency / 4; BRR =(LSPCLK /(BaudRateToSet * 8))- 1; //屏蔽位并分配寄存器 regsToSet->SCIHBAUD。all = brr >> 8;//屏蔽顶部字节 regsToSet->SCILBAUD.ALL = brr & 0xFF;//底部字节掩码 //********* regsToSet->SCICTL1.all = 0x0023;//从复位中撤回 SCI regsToSet->SCIFFTX.bit.TXFIFORESET = 1; regsToSet->SCIFFRX.bit.RXFIFORESET = 1; }
//********* 静态 char rxIsrBuffer[32]; 静态 int putRxBuffer=0; void sciaRxFifoIsr (void) { // FIFO 中有数据时 while (SCI_A_Regs.SCIFFRX.bit.RXFFST!= 0) { rxIsrBuffer[putRxBuffer]= SCI_A_Regs.SCIRXBUF.ALL;//读取数据 ++putRxBuffer; } SCI_A_Regs.SCIFFRX.bit.RXFFOVRCLR=1;//清除溢出标志 SCI_A_Regs.SCIFFRX.bit.RXFFINTCLR=1;//清除中断标志 }
//*********
我对如何诊断此问题的想法不多。 我将尝试设置其他中断、以查看我现在是否遇到相同的问题。
感谢您的帮助!
Scott


