【发布时间】:2017-09-26 04:35:02
【问题描述】:
我是一个编程新手,我无法让我的中断按照我希望它们为我的应用程序工作的方式工作。我想通过 UART 向 PSoC 发送串行数据,每秒存储一次值,然后回显存储的值。我正在使用 RX 中断(RX FIFO 不为空,优先级 2)和带有 TC 的定时器中断(优先级 3)。附件是 TopDesign 配置。目前,我正试图让这个代码工作(只是一个示例代码,看看我是否能让中断正常工作)。我向 PSoC 发送了一个包含字符“o”的字符串,我应该只读取“o”和“-”,但代码总是卡在其中一个中断中,而另一个则永远无法工作。谁能告诉我我做错了什么?非常感激! 开发板是CY8CKIT-042。
#include <project.h>//Contains
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
uint16 ms_count = 0;
uint8 ch;
CY_ISR_PROTO(Timer_ISR);
CY_ISR_PROTO(RX_ISR);
CY_ISR(Timer_ISR){//Every millisecond, the code goes here
ms_count++;
if (ms_count == 1000){//Every second
ms_count = 0;
LED_Write(!LED_Read());
while(ch != 'o')UART_UartPutChar('-');
}
}
CY_ISR(RX_ISR){
uint8 status = UART_rx_ClearInterrupt();//Clear interrupt flag
uint8 sub;
sub = UART_UartGetChar();
if (sub != 0u){//Make sure grabbed character is not an empty
ch = sub;
if (ch == 'o'){
UART_UartPutChar(ch);
}
}
}
int main()
{
/* Start SCB UART TX+RX operation */
Timer_1_Start();
Time_ISR_StartEx(Timer_ISR);
RX_ISR_StartEx(RX_ISR);
CyGlobalIntEnable;
/* Start SCB UART TX+RX operation */
UART_Start();
UART_UartPutString("fdssf\n");
for(;;)
{
}
}
【问题讨论】:
-
那个while循环是个坏主意。一旦计时器滴答作响,它就会进入禁用中断的循环,节目结束。你必须重新考虑这一点。
-
它会自行重置中断标志吗?
-
感谢您的回答。有没有办法在进入 ISR 时重新启用中断?此外,我希望能够跳过字符,直到达到某个字符,而 while 循环是我能想到的让它等待正确字符的唯一方法。有什么建议吗?
-
是的,定时器中断重新启动。我能够让 LED 定期闪烁,而无需 while 循环。