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.

[参考译文] TMS320C5517:为什么我的计时器看起来不存在?

Guru**** 2905440 points

Other Parts Discussed in Thread: TMS320C5517

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/662704/tms320c5517-why-does-my-timer-seem-to-not-exist

器件型号:TMS320C5517

我有 一个由 Spectrum Digital Incorporated 制造的 TMS320C5517 EVM 开发板。 我想使用计时器0、但在 register.h 中看到计时器寄存器不存在、我感到很惊讶。 有人知道原因吗? 我自己也加入了这样的内容

#define T0CR *(ioport volatile uint16_t *) 0x1810
#define TIM0PRD1 *(ioport volatile uint16_t *) 0x1812
#define TIM0PRD2 *(ioport volatile uint16_t *) 0x1813
#define TIM0CNT1 *(ioport volatile uint16_t *) 0x1814
#define TIM0CNT2 *(ioport volatile uint16_t *) 0x1815
#define TISR *(ioport volatile uint16_t *) 0x1C3E 

但是、当我放入一个断点并在 Code Composer Studio 寄存器视图中查看寄存器值时、寄存器具有默认值。 有人知道什么问题吗? 可以在下面找到我的来源。

.sect "vector"
.def _VECSTART
.ref _timerIsr
.ref _dmaIsr
.ref _gpioIsr
.ref _communicationIsr
.ref _c_int00
.ref _dummyIsr
.align 256

;中断矢量定义
_VECSTART:
_RST: ivec _c_int00、use_RETA;复位/软件中断#0
NMI: ivec no_isr ;不可屏蔽中断
INT0: ivec no_isr ;外部用户中断#0
INT1: ivec no_isr ;外部用户中断#1
TINT0: ivec _timerIsr ;定时器#0/软件中断#4
PROG0: ivec no_isr ;可编程0中断
UART: ivec no_isr ; IIS #1接收中断
。 

。 #define system_clk_FREQ_Hz (((uint32_t) 196000000) uint16_t configAndRestorartTimer (uint16_t delayM、uint16_t timerIntCallbackPtr){ T0CR = 0x8000; //启用计时器 uint32_t timerFreq = system_clk_FREQ_Hz / 8192; uint32_t numNeedTimerTicks = timerFreq/(1000 *((uint32_t) delayM); TIM0PRD2 =(uint16_t)(numNeedTimerTicks >> 16);//设置计时器周期 TIM0PRD1 =(uint16_t)(numNeedTimerTicks >> 0);//设置计时器周期 TIM0CNT2 = 0; //重置计数值 TIM0CNT1 = 0; //重置计数值 TISR = 1; //定时器0中断被路由到 CPU 不可屏蔽中断(NMI)。 T0CR =(((uint16_t) 1) < 15)| //启用计时器 (((uint16_t) 0xC)<< 2)| // 8192作为预分频器。 这将提供一个196 MHz/8192 = 23.926 kHz 的定时器频率 (((uint16_t) 0) << 1)| //自动重载被禁用 (((uint16_t) 1) <<<<0); //启动计数器 返回0; } 中断 void timerIsr (void){ UART_SW_Tx_only_transmitNullTermString ("\r\ntimerIsr"); }
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    我已通知软件团队。 请说明您使用的是哪个 SDK、或者这是裸机代码吗?

    此致、
    Yordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我不知道 register.h 文件来自哪个 SDK、它可能已经有几年的历史了。 但是、我不介意自己添加这些代码行、但我更担心代码无法正常工作。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    user4463194、

    我们目前支持 C55x CSL、 可在 http://software-dl.ti.com/dsps/dsps_public_sw/dsps_swops_houston/C55X/latest/index_FDS.html 找到该软件 包、因此我们需要询问您使用的软件包。

    看一下 CSL 定时器驱动程序、可以看到 Timer0的定义

    /*********
    *定时器寄存器(0x1800 - 0x1896
    /
    #define IOPORT_REG_TIMER0_CONTROL (ioport_register (0x1810)
    )#define IOPORT_REG_TIMER0_PERIOD_0 (ioport_register (0x1812)
    )#define IOPORT_REG_TIMER0_PERIOD_1 (ioport_register (0x1813)
    )#define IOPORT_REG_TIMER0_COUNTER_0 (ioport_register (0x1814)
    )#define IOPORT_REG_TIMER0_COUNTER_1 (ioport_register (0x1815)) 

    您是否能够尝试这些示例以查看其是否适合您?

    C:\ti\c55_lp\c55_CSL_3.08\ccs_v6.x_examples\RTC

    Lali

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

    如果我包含这5行#defines、那么我会得到以下构建错误:

    错误#138:表达式必须是可修改的 lvalue

    我已经对代码进行了一些修改、但它仍然不起作用(我没有获得定时器中断)、并且寄存器值在调试窗口的"Register"视图中不会改变。 当我中断执行并查看寄存器值时、我会看到以下内容:

    TIMER0

      TCR      0x0000

      TIMPRD1 0xFFFF

      TIMPRD2 0x0000

      TIMCNT1 0xFFFF

      TIMCNT2 0x0000

      TINSF   0xFFFF

    我无法在调试器的“寄存器”视图中更改这些值,就像这些寄存器是只读的。

    #define SYSTEM_CLK_FREQ_Hz ((uint32_t) 196000000)
    
    #define T0CR *(ioport volatile uint16_t *) 0x1810
    #define TIM0PRD1 *(ioport volatile uint16_t *) 0x1812
    #define TIM0PRD2 *(ioport volatile uint16_t *) 0x1813
    #define TIM0CNT1 *(ioport volatile uint16_t *) 0x1814
    #define TIM0CNT2 *(ioport volatile uint16_t *) 0x1815
    #define TISR *(ioport volatile uint16_t *) 0x1C3E
    
    uint16_t configAndRestorartTimer (uint16_t delayM、uint16_t timerIntCallbackPtr){
    PCGCR1 &=~(0x0400);
    T0CR = 0x8000; //启用计时器
    uint32_t timerFreq = system_clk_FREQ_Hz / 8192;
    uint32_t numNeedTimerTicks = timerFreq/(1000 *((uint32_t) delayM);
    TIM0PRD2 =(uint16_t)(numNeedTimerTicks >> 16);//设置计时器周期
    TIM0PRD1 =(uint16_t)(numNeedTimerTicks >> 0);//设置计时器周期
    TIM0CNT2 = 0; //重置计数值
    TIM0CNT1 = 0; //重置计数值
    IER0 |= 0x0010;
    
    T0CR =(((uint16_t) 1) < 15)| //启用计时器
    (((uint16_t) 0xC)<< 2)| // 8192作为预分频器。 这将提供196MHz/8192 = 23.926kHz 的计时器频率(计时器周期:41.8微秒)
    (((uint16_t) 0) << 1)| //自动重载被禁用
    (((uint16_t) 1) <<<<0); //启动计数
    器}
    
    中断 void timerIsr (void){
    UART_SW_Tx_only_transmitNullTermString ("\r\ntimerIsr");
    } 
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    user4463194、

    不确定您为什么会看到该错误。

    刚才我们在同一页上、您是否可以尝试运行上面提到的 CSL 中的 GPT 示例?

    它位于 C:\ti\c55_lp\c55_CSL_3.08\ccs_v6.x_examples\gpt\cSL_gPTExample.

    这会使用代码中突出显示的 timer0。 您想知道该示例是否适用于您的设置。

    Lali