如果 F28386的计时器示例将其设置为单次触发并在计数结束时触发中断、我将不胜感激。
谢谢、
JH
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.
如果 F28386的计时器示例将其设置为单次触发并在计数结束时触发中断、我将不胜感激。
谢谢、
JH
您好、John、
没有 单次触发计时器的示例、但我已经编写了一个 main.c 文件、您可以根据 CPU 计时器的现有示例使用该文件。 您需要在计数结束时启用中断、并且在中断服务例程中禁用中断以防止其再次触发。 我希望这对您有所帮助:
#include "driverlib.h" #include "device.h" uint16_t reached = 0; __interrupt void cpuTimer0ISR(void); void initCPUTimer(void); void configCPUTimer(uint32_t cpuTimer, uint32_t period); void main(void) { Device_init(); Interrupt_initModule(); Interrupt_initVectorTable(); Interrupt_register(INT_TIMER0, &cpuTimer0ISR); initCPUTimer(); configCPUTimer(CPUTIMER0_BASE, 100); CPUTimer_enableInterrupt(CPUTIMER0_BASE); Interrupt_enable(INT_TIMER0); CPUTimer_startTimer(CPUTIMER0_BASE); EINT; ERTM; while(1); } void initCPUTimer(void) { CPUTimer_setPeriod(CPUTIMER0_BASE, 0xFFFFFFFF); CPUTimer_setPreScaler(CPUTIMER0_BASE, 0); CPUTimer_stopTimer(CPUTIMER0_BASE); CPUTimer_reloadTimerCounter(CPUTIMER0_BASE); } void configCPUTimer(uint32_t cpuTimer, uint32_t period) { CPUTimer_setPeriod(cpuTimer, period); CPUTimer_setPreScaler(cpuTimer, 0); CPUTimer_stopTimer(cpuTimer); CPUTimer_reloadTimerCounter(cpuTimer); CPUTimer_setEmulationMode(cpuTimer, CPUTIMER_EMULATIONMODE_STOPAFTERNEXTDECREMENT); CPUTimer_enableInterrupt(cpuTimer); } __interrupt void cpuTimer0ISR(void) { reached = reached + 1; CPUTimer_disableInterrupt(CPUTIMER0_BASE); Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP1); }
此致、
Omer Amir
您好、John、
要在计时器结束时重新启用 ISR 以触发、可以使用"CPUTimer_enableInterrupt (CPUTIMER 0_BASE);"。 在技术上、计数器仍在后台运行、这是我忘了说明的问题。 我已经更新了我的代码、现在改为禁用中断中的计数器、并在 while 循环中重新启用它(在这两种情况下都需要重新启用中断)。
我不确定如何调用 ISR 两次、当我运行代码时、"reached"变量只会设置为1 (每当它到达 ISR 时、它将递增"reached")。 修改后的 while 循环假定"已达到"会被重置、但情况并非如此、因此"高速缓存副本"将始终递增。 这可能是为什么您的 ISR 似乎多次被调用的原因。
#include "driverlib.h" #include "device.h" uint16_t reached = 0; __interrupt void cpuTimer0ISR(void); void initCPUTimer(void); void configCPUTimer(uint32_t cpuTimer, uint32_t period); void main(void) { Device_init(); Interrupt_initModule(); Interrupt_initVectorTable(); Interrupt_register(INT_TIMER0, &cpuTimer0ISR); initCPUTimer(); configCPUTimer(CPUTIMER0_BASE, 100); CPUTimer_enableInterrupt(CPUTIMER0_BASE); Interrupt_enable(INT_TIMER0); CPUTimer_startTimer(CPUTIMER0_BASE); EINT; ERTM; while(1) { if(reached) { CPUTimer_enableInterrupt(CPUTIMER0_BASE); CPUTimer_startTimer(CPUTIMER0_BASE); } } } void initCPUTimer(void) { CPUTimer_setPeriod(CPUTIMER0_BASE, 0xFFFFFFFF); CPUTimer_setPreScaler(CPUTIMER0_BASE, 0); CPUTimer_stopTimer(CPUTIMER0_BASE); CPUTimer_reloadTimerCounter(CPUTIMER0_BASE); } void configCPUTimer(uint32_t cpuTimer, uint32_t period) { CPUTimer_setPeriod(cpuTimer, period); CPUTimer_setPreScaler(cpuTimer, 0); CPUTimer_stopTimer(cpuTimer); CPUTimer_reloadTimerCounter(cpuTimer); CPUTimer_setEmulationMode(cpuTimer, CPUTIMER_EMULATIONMODE_STOPAFTERNEXTDECREMENT); CPUTimer_enableInterrupt(cpuTimer); } __interrupt void cpuTimer0ISR(void) { reached = reached + 1; CPUTimer_stopTimer(CPUTIMER0_BASE); Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP1); }
此致、
Omer Amir
感谢你的帮助。
抱歉给了我们一个坏的 while 循环。 我只是误复制了一部分、然后下一个错误是添加了两个闭合花括号。 在 if (到达)条件的末尾、变量 REACH 被复位。 很棒的地方
我在第31行设置了一个断点、在第一个停止时、达到的值为2。 我将第18行中的值从100更改为100000、然后再次运行。 达到的时间为1。 这样就可以将其清除。
您能否告诉我为什么在 init 函数中调用的所有函数也会在 config 函数中调用? 此外,我还没有使用 CPUTimer_reloadTimerCounter(),因为 CPUTimer_setPeriod()似乎设置了该值。 文档有点少、因此该函数的实际作用是什么、何时需要?
再次感谢、
John
您好、John、
[引用 userid="152282" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1175652/tms320f28386s-timer-examples/4426143 #4426143)]您能告诉我为什么在 init 函数中调用的所有函数也会在 config 函数中调用? 此外,我还没有使用 CPUTimer_reloadTimerCounter(),因为 CPUTimer_setPeriod()似乎设置了该值。 文档内容比较少、因此该函数的实际作用是什么以及何时需要?我复制了 timer_ex1_cputimers 示例中的代码。 看一下、initCPUTimers 似乎会将所有 CPU 计时器初始化为基准/默认配置。 然后、通过 configCPUTimer 函数、您可以配置特定的 CPU 计时器(0、1或2)并设置其频率/周期(我对其进行了修改以仅配置 CPU 计时器周期)。
我已经在您创建的另一个帖子中回答了您问题的下一部分、因此我将在下面添加我的回答:
"使用 CPUTimer_setPeriod ()函数设置周期的值、但 CPUTimer_reloadTimerCounter ()函数设置 TCR 寄存器中的 TRB 位。 这会将周期加载到定时器计数器 TIMH:TIM 中、以便它基本上从开始(计数器递减加载的周期值)开始计数器。 该位还使用定时器分频 TDDRH:TDDR 值加载预分频计数器 PSCH:PSC。"
有关详细信息、请参阅技术参考手册的"CPUTIME_REGS 寄存器"部分(第3.14.8节)。 如果您有任何其他问题、请告诉我。
此致、
Omer Amir