Thread 中讨论的其他器件: SYSBIOS
工具/软件:TI-RTOS
我在 TM4C123GH6PM 上使用 TI-RTOS 2.16.00.08。 我正在尝试使用一些计时器模块 PWM。 添加行时、我遇到的第一个问题是在安装文件中:
#include #include PWMTimerTiva_Object pwmTimerTivaObjects[SCU_REV_A_PWMCOUNT]; const PWMTimerTiva_HWAttrs pwmTimerTivaHWAttrs[]={ { baseAddr = Timer1_base、 定时器=定时器_A }、 { baseAddr = Timer1_base、 定时器=定时器_B }、 { baseAddr = WTIME2_BASE、 定时器=定时器_A }、 { baseAddr = WTIME2_BASE、 定时器=定时器_B }、 { baseAddr = WTIMER3_base、 定时器=定时器_A }、 { baseAddr = WTIMER3_base、 计时器= Timer_B } };
由于 driverlib/timer.h 未包含在任何文件中、因此未定义 TIME_A。 我通过添加"#include"修复了这个问题 "添加到 PWMTimerTiva.h 文件中。 我只想检查这是最佳解决方案还是有更好的解决方法? 另外、如果下载了驱动程序文件、则应该修复此问题。
我遇到的下一个问题是宽定时器不会启动并返回 NULL。 PWMTimerTiva.c 中的以下行出现问题:
kernelTimerID = 1 <<(hwAttrs->baseAddr >> 12)& 0xF); timerPairEnabledBit =(timer_both &(~hwAttrs->timer))和 (TIMER_CTL_TAEN | TIMER_CTL_TBEN); if (kernelTimerID & Timer_getAvailMask()){ /*未使用计时器、从内核获取计时器*/ kernelTimerID =(~kernelTimerID)& 0x0F; Timer_setAvailMask (Timer_getAvailMask ()& kernelTimerID); } 否则、如果(!(HWREG (hwAttrs->baseAddr + timer_O_CTL)& timerPairEnabledBit){ 使用且未被另一半计时器初始化的/*计时器*/ Hwi_restore (key); 返回(NULL); }
Timer_getAvailMask()返回0b111100,Timer_getNumTimer()返回6。 这似乎表明只有前6个驱动程序在 BIOS 中启动、这会使宽定时器无法访问。 是否有方法可以更改此设置、以便可以访问其余的计时器模块、或者 BIOS 是否已经使用它们、因此无法将它们用于 PWM?
除了 kernelTimerID = 1 <<(hwAttrs->baseAddr >> 12)和0xF 之外;仅适用于 TIMER0、TIMER1、TIMER2、TIMER3、TIMER4、 TIMER5、可能是 WTIMEER0和 WTIMEER1、我没有尝试全部。 这是因为定时器的基址存在中断、并且 kernelTimerID 与基址相关。 来自 hw_memmap.h 的定时器基址如下:
#define TIMER0_BASE 0x40030000 // Timer0 #define Timer1_base 0x40031000 // Timer1 #define TIMER2_base 0x40032000 // Timer2 #define TIMER3_base 0x40033000 // Timer3 #define TIMER4_base 0x40034000 // Timer4 #define TIMER5_base 0x40035000 // Timer5 #define WTIMEER0_BASE 0x40036000 //宽 Timer0 #define WTIMER1_BASE 0x40037000 //宽 Timer1 #define WTIMEer2_base 0x4004C000 //宽 Timer2 #define WTIMEer3_base 0x4004D000 //宽 Timer3 #define WTIMER4_BASE 0x4004E000 //宽 Timer4 #define WTIME5_BASE 0x4004F000 //宽 Timer5 #define TIMER6_BASE 0x400E0000 //通用定时器 #define TIMER7_BASE 0x400E1000 //通用定时器
最后、检查以确保 BIOS 中的定时器模块尚未打开似乎是不够的。 如果在 Timer_getAvailMask()中使用该模块,则如果启动了 Timer_A,它将检查是否正在使用 Timer_B 模块。 如果它正在使用中、则假定模块是由模块的 TIMER_B 部分启动的、但它不会检查 TIMER_A 是否已经启动、因此可能会尝试通过 Wright 进行之前的启动。 如果 BIOS 已经将模块作为一个完整的32位(在16/32位模块中)启动、那么它将检查是否启动了 Timer_A、这将是正确的、这也可能发生在 Timer_B 被启动的情况下。 然后、它将通过 Wright 使用半计时器完成计时。 是否有其他人遇到过这些问题、我不熟悉 TI-RTOS、不确定这是否是实际问题? 这些问题是否有任何解决方法?