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.

[参考译文] RTOS/TM4C123GH6PM:PWMTimerTiva 驱动程序的问题

Guru**** 2445440 points
Other Parts Discussed in Thread: TM4C123GH6PM, SYSBIOS

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/630509/rtos-tm4c123gh6pm-issues-with-pwmtimertiva-drivers

器件型号:TM4C123GH6PM
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、不确定这是否是实际问题? 这些问题是否有任何解决方法?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Carl、

    这是您添加的一些有趣的计时器配置代码。 如果没有误认为一个 RTOS 定时器是一个内置函数、请调用、您可以为 BIOS SysTick 分配牺牲的 GPTM 数。 查看内核内幕消息的最佳方法是进入 CCS 调试并启动 ROV、然后暂停 ICDI 调试以查看所有内核寄存器。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我没有添加任何代码、只使用 PWMTimerTiva.h 文件中已有的代码(TI-RTOS 中已有的驱动程序之一)、并对其进行了修改、使其能够与我想要的计时器模块配合使用。 我不是想将它们用作计时器、而是用作 PWM。 问题是 TI-RTOS 附带的代码看起来不起作用。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您仍然需要  使用 来自[/driverlib/timer.c ]的 Tivaware 指令为 PWM 模式配置 GPTM。  我所有六个 GPTM 都在 RTOS 中工作 、但在 BIOS 行为设置的*。CFG 文件中牺牲了 GPTM5的 BIOS [Clock_tick]。 可能需要 在您的主应用的顶部添加#include、以便使用 Tivaware 配置计时器。

    也许 GPTM 定时器模块在启用 LM4之前会受到限制?

    例如 、时钟模块允许您定义 在 Swi (软件中断)线程的上下文中运行的一个或多个周期函数。

    计时器模块提供 LM4特定的计时器服务、这些服务扩展了通用 ti.sysbios.hal.计时 器模块提供的服务。

    VAR 计时器= xdc.useModule('ti.sysbios.family.arm.lm4.Timer');

    此 GPTM 配置在 RTOS 中运行良好、可产生25kHz PWM:

    /* EKTM4C129XL-PWM PL4:TM0CCP0 BP1-X9-pin9 / X11-pin 65 */
    ROM_GPIOPinConfigure (GPIO_PL4_T0CCP0);
    ROM_GPIOPINTypeTimer (GPIO_PORTL_AHB_BASE、GPIO_PIN_4);
    
    
    /*********
    * GPTM-0A:半宽定时器
    *配置 GPTMTbMR 16位倒计数
    *用于 PWM 中断处理程序的 CCP0输出边沿检测
    *用于占空比控制更新。
    (二 /
    //*禁用 GPTM-A0 */
    HWREG (TIMER0_BASE + TIMER_O_CTL)&&~(TIMER_CTL_TAEN);
    
    /*配置 GPTM-0 16MHz 62.5us 时钟源。*/
    ROM_TimerClockSourceSet (TIMER0_BASE、TIMER_CLOCK PIOSC);
    
    /*配置 GPTM0 16MHz 62.5us 时钟源*/
    寄存器
    
    
    0 * 16位寄存器:0 + PWM0 *针对周期寄存器设置 PWM0 +计数 边沿计数模式。
    *在 CCP0输出引脚事件正边沿上设置中断*/
    HWREG (TIMER0_BASE + TIMER_O_TAMR)|=
    (TIMER_CFG_A_PWM|TIMER_TAMS_TAAMS|TIMER_TAMR_TAPWMIE|
    Timer_TAMR_TAILD|TIMER_TAMR_TAMRSU);
    
    /*设置加载定时器 GPTMTaILR 值0x12C0/4800*8.333ns=40US/25kHz */
    ROM_TimerLoadSet (TIMER0_BASE、TIMER_A、0x280);//640d
    /*将初始 PWM 占空比设置为50%*/
    ROM_TimerMatchSet (TIMER0_BASE、TIMER_A、0x140);//320D
    /*为 CCP0配置边沿极性捕获事件。 *
    ROM_TimerControlEvent (TIMER0_BASE、TIMER_A、TIMER_EVENT_POS_EDGE);
    /*在控制器中注册全局中断*/
    TimerIntRegister (TIMER0_BASE、TIMER_A、TMCCP0FANPWMInt);
    /*设置 PWM 调制器重新加载中断的值*/
    ROM_TimerIntEnable (TIMER0_BASE、TIMER_CAP_EVENT);
    /*现在禁用 GPTM-0A PWM CCP0边沿捕获中断*/
    ROM_IntDisable (INT_TIMER0A);
    /*设置 TMaEN=1、PWM 递减计数匹配设置 TMaEN=1 */
    ROM_TimerEnable (TIMER0_BASE、TIMER_A); 

     

     

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    如果您查看提供的 PWMTimerTiva.c 文件、则该文件似乎是为了设置模块。 我同意上述方法是一种解决方法、但我尝试使用 TI 提供的驱动程序。 但是、由于它们无法正常工作、我将尝试上述方法。 也许 TI 的某个人可以查看所提供的驱动程序并尝试使其正常工作。

    在上面的代码中、你如何让内核知道正在使用 GPTM、这样它就不会尝试将其用于其中一个函数、或者内核只使用.cfg 文件中分配给它的 GPTM? 您还说过、所有六个计时器模块都在工作、宽计时器如何?

    另外、 为什么当 TM4C123GH6PM 有12个 GPTM 时内核只具有6个定时器的定义?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="Carl Engelmann"]如果查看提供的 PWMTimerTiva.c 文件,则该文件似乎是为了设置模块

    可能是 信号量中断所需的 BIOS Clock_tick。  您不必配置 BIOS (Clock_Tick)或牺牲 任何 GPTM、但在逻辑上知道、  如果  BIOS 已经在使用该 GPTM#、则不会将其用于代码中。

    [引用 user="Carl Engelmann"]当 TM4C123GH6PM 具有12个 GPTM 时、为什么内核仅具有6个计时器的定义?

    您 确定 是否有12 - 32位 GPTM 或6 - 32位全宽定时器可将其减半?  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    有6个32位(可以拆分为12个16位)和6个64位(可以拆分为12个32位)。 我已经完成了我需要的工作。
    感谢你的帮助。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很高兴看到您在 RTOS 中产生了 PWM、BTW 您现在正是12个 GPTM、而16/24位、总共12个 CCP 捕获引脚。 第二个负载值(//)针对120MHz GPTM 时钟源、但误差百分比在 PWM 边沿计数中似乎会增加。

    我设置 M3 NVIC 模块并在*。CFG 文件中输入所有外设 INT 以供内核监视。 可方便地使用 ROV 故障排除 IRQ 处理程序进行调试。 然后、我们不再需要在(startup.ccs.c)文件中注册每个 IRQ、似乎获得了在运行任务中添加的内核 M3异常处理。 由于对 LWIP1.4.1和其他正在运行的软件中断进行信标 IRQ 处理、似乎选择 M3 SHI、但所有硬件中断必须在实例页面上逐一输入。