This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
我是嵌入式编程的初学者。 我在使用 TM4C129 计时器创建延迟时遇到问题、 是否有人可以帮助我解决此问题? 。 使用的 IDE 是 keiluV5、代码构建过程成功。 我将一个切换值写入 GPIO,且在函数中提供了延迟(1ms、10ms 等)(在示波器中使用相同的代码监视 GPIO,而不使用'while (DelaySet_Flag)'; ' ,并在主代码等待开始之前调用函数 while (); 计时器工作正常)。 在主代码结束时、同一代码在等待过程中不起作用。
请找到以下代码
谢谢
----------------------------------------------------------------------
空延迟(uint32_t delay_value)
{
uint32_t Timer_Count;
Timer_Count =(120000 * DELAY_VALUE);//以毫秒为单位计算值
ROM_SysCtlPeripheralEnable (SYSCTL_Periph_TIMER3);
while (!SysCtlPeripheralReady (SYSCTL_Periph_TIMER3)){}
ROM_TimerConfigure (TIMER3_base、TIMER_CFG_PERIODICASE);
ROM_TimerLoadSet (TIMER3_base、timer_A、g_ui32SysClock); // 120MHz
ROM_IntEnable (INT_TIMER3A);
ROM_TimerIntEnable (TIMER3_base、TIMER_TINA_TIMEOUT);
ROM_TimerLoadSet (TIMER3_base、INT_TIMER3A、Timer_Count);
ROM_TimerEnable (TIMER3_base、TIMER_A);
DelaySet_FLAG = 0x01;
while (DelaySet_Flag); //中断处理程序中,DelaySet_Flag=0x00,DelaySet 标志是一个全局变量
DelaySet_FLAG = 0x01;
}
库里安
您的中断实现中可能有一些内容、您没有发送该部分。 您是否测试了是否发生了中断?
此外、在代码上、您将使用系统时钟加载计时器。 您需要为其加载您正在寻找的暂停周期。 如果它只是单次触发计数、对于暂停、则周期不是最佳选项、因为您将在下次调用函数时重新配置计时器。 另一个细节、"每次调用函数时"禁用和重新启用计时器外设可能不太好。
但是、您提供的代码会阻止 while (DelaySet)循环上的处理器。 在设置标志之前、您将无法执行任何其他操作-这不是很有用;您应力求设置某种信标、并根据这些情况决定代码执行。 在等待期间、您将处于睡眠状态或将处理器用于其他重要任务...
Rgds
感谢 Amit 和 Bruno。
中断正在发生、我已经使用断点对它进行了分析。 考虑到上述几点、对定时器配置和中断处理程序的修改如下。 但问题是、这些代码正在详细调试分析的执行中。 但延迟函数不会返回到调用的位置。 在测试时、发现使用'ROM_SysCtlDelay()'继续执行一个1ms 延迟切换 I/O 写入正在工作、但延迟函数 cal 不工作。
///----------------------------------------------
ROM_SysCtlPeripheralEnable (SYSCTL_Periph_TIMER3);
while (!SysCtlPeripheralReady (SYSCTL_Periph_TIMER3)){}
ROM_TimerConfigure (TIMER3_base、TIMER_CFG_ONE_SHOT);
ROM_TimerLoadSet (TIMER3_base、timer_A、g_ui32SysClock); // 120MHz
//--------------------------------------------------------------
空延迟(uint32_t delay_value)
{
uint32_t Timer_Count;
Timer_Count =(120000 * DELAY_VALUE);//以毫秒为单位计算值
ROM_IntEnable (INT_TIMER3A);
ROM_TimerIntEnable (TIMER3_base、TIMER_TINA_TIMEOUT);
ROM_TimerLoadSet (TIMER3_base、INT_TIMER3A、Timer_Count);
ROM_TimerEnable (TIMER3_base、TIMER_A);
while (DelaySet_Flag <1){} //delayset 标志最初为0
DelaySet_FLAG = 0;
ROM_TimerIntDisable (TIMER3_base、TIMER_A);//禁用 Timer3中断
ROM_TimerDisable (TIMER3_base、TIMER_A);//禁用 Timer3
}
----------------------------------------------------------------------
空 Timer3IntHandler (空)
{
INTERRUPT_Flag =(Interrupt_Flag | Timer3_interrupt);
ROM_TimerIntClear (TIMER3_base、TIMER_TINA_TIMEOUT);
DelaySet_Flag++;
}
KurianThomas 说:delay 函数不会返回到调用它的位置
您是否说它将返回错误的内存执行位置? 或者它是否滞留在您的某个条件循环中?
您可能会持续返回到计时器 ISR 中、因为您只清除一个特定的中断标志(TIMER_TINA_TIMEOUT)、并且可能还有其他一些标志处于活动状态? 请参阅 API 示例、通常在需要清除标志的任何 IRS 中、顺序是:将所有标志读取到一个变量中、清除所有中断、并根据变量中存储的每个中断原因采取适当的措施。