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.

[参考译文] CCS/LAUNCXL-CC1350:TimerIntRegister();冻结应用程序

Guru**** 2558250 points
Other Parts Discussed in Thread: CC1350, SYSBIOS

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/588957/ccs-launchxl-cc1350-timerintregister-freeze-the-application

部件号:LAUNCXL-CC1350
“Thread:CC1350SysBIOS”中讨论的其它部件

工具/软件:Code Composer Studio

您好,

如果我使用 TimerIntRegister(),它将冻结应用程序,程序将不会运行。代码如下所示:-

TimerConfigure(GPT3_BASE,TIMER_CFG_B_Periodic);
TimerPrescaleSet (GPT3_BASE,TIMER_B,0);
TimerLoadSet (GPT3_BASE,TIMER_B, 4.8万);
TimerIntRegister (GPT3_BASE,TIME_B,GPT3_B_ISR);
TimerIntEnable (GPT3_BASE,TIME_TIMB_TIMEOUT);

TimerIntClear (GPT3_base,timer_TIMB_timeout);
TimerEnable (GPT3_base,timer_B); 


无错误

一个警告:  

说明资源路径位置类型
#1.0247万-D创建输出节".vtable_ram"而不使用节规范rfWsnDmNode_CC1350_LAUNCHXL_TI_CC1350F128 C/C++1350 C/C++问题

我认为在创建计时器ISR时,向量表存在问题。 但我是CC studio的新手。 还请告诉我如何将矢量表切换为ROM。

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

    如果将以下内容添加到项目的链接器命令文件(.cmd)中的部分,它将指示链接器将.vtable_ram部分放在ram中,这样应删除警告并允许 TimerIntRegister()运行:

    .vtable_ram :> SRAM 

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

    切斯特

    感谢您的回复。 它删除了警告。但执行现在冻结在TimerConfigure();还要查看我的链接器文件。

    /*
    ========= CC1350_LAUNCHXL.cmd =========
    用于Code Composer Studio
    */*
    
    的CC26x0F128 PG2链接器配置文件覆盖默认入口点。 */
    --entry_point ResetISR
    /*允许main()接受参数 */
    --args 0x8
    /*禁止警告和错误: */*-1.0063万
    :关于入口点不是_c_int00的警告 */*
    - 1.6011万,1.6012万:8字节对齐错误。 使用
    Keil (ARM编译器)编译的对象*//*文件中的链接时观察到 */
    --diag_suppress=1.0063万,16011,16012
    
    /*1.6011万 /*应用1.6012万应用程序的起始地址。 通常,中断向量*/*
    必须位于应用程序的开头。 */
    #define flash_base 0x0
    #define flash_size 0x2万
    #define RAM_BASE 0x2000万
    #define RAM_SIZE 0x5000
    
    /*系统内存映射*/
    
    内存
    {
    /*存储在中并从内部闪存*/执行的应用程序
    Flash (RX):origin = flash_base,length = flash_size
    /*应用程序使用内部RAM存储数据*/
    SRAM (rwx):origin = RAM_BASE,length = RAM_SIZE
    }/*
    
    内存中的节分配*/
    
    节
    {
    文本 :>闪烁
    。const :>闪烁
    .constdata :>闪烁
    .rodata :>闪烁
    cinit :>闪烁
    。销钉 :>闪烁
    init_array :>闪烁
    .EMB文本 :>闪烁
    ccfg. :>闪存(高)
    
    #ifdef __TI_Compiler_version__
    #if __TI_Compiler_version__>= 1500.9万
    .ti.ramfunc :{} load=flash, run=sRAM, table(BINIT)
    #endif
    #endif
    数据 :> SRAM
    BSS :> SRAM
    sysmem :> SRAM
    堆栈 :> SRAM (高)
    nonretenvar :> SRAM
    .vtable_ram :> SRAM
    } 

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

    MAN MCU 说:
    它删除了警告。但执行现在在TimerConfigure()停止;还要查看我的链接器文件。

    我看不到链接器文件有任何明显的问题。

    查看CC1350文档时, GPT3的时钟在设备重置时被禁用,尝试访问已禁用时钟的外围设备将产生总线故障。

    在调用 TimerConfigure()之前,我认为需要以下代码来确保启用GPT3时钟:

    /*如果尚未打开,请打开Periph域*/
    如果(PRCMPowerDomainStatus(PRCM_DOMAIN_Periph)!=
    PRCM_DOMAIN_POWER_ON){
    PRCMPowerDomainOn(PRCM_DOMAIN_Periph);
    while (PRCMPowerDomainStatus(PRCM_DOMAIN_Periph)!=
    PRCM_DOMAIN_POWER_ON){};
    }
    
    /*现在启用GPT时钟*/
    PRCMPeripheralRunEnable(PRCM_Periph_TIMER3);
    PRCMPeripheralSleepEnable (PRCM_Periph_TIMER3);
    PRCMPeripheralDeepSleepEnable (PRCM_Periph_TIMER3);
    PRCMLoadSet();
    while (!PRCMLoadGet ()){}; 

    [以上代码取自TI-RTOS计时器驱动程序tirtos_cc13xx_cc26xx_2_21_00_06\products\BIOS_6_46_01_37\packages\ti\SysBIOS\family\arm\lm4\Timer.c]

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

    上述解决方案运行良好,但ISR未受到影响。 修改后的源如下所示。

    //系统时钟=48MHz

    void TimerInit()
    {
    
    如果(PRCMPowerDomainStatus(PRCM_DOMAIN_Periph)!= PRCM_DOMAIN_POWER_ON)
    {
    
    PRCMPowerDomainOn(PRCM_DOMAIN_Periph);
    
    while (PRCMPowerDomainStatus(PRCM_DOMAIN_Periph)!= PRCM_DOMAIN_POWER_ON);
    
    }
    
    /*现在启用GPT时钟*/
    
    PRCMPeripheralRunEnable(PRCM_Periph_TIMER3);
    
    PRCMPeripheralSleepEnable(PRCM_Periph_TIMER3);
    
    PRCMPeripheralDeepSleEnable(PRCM_Periph_TIMER3);
    
    PRCMLoadSet();
    
    While (!PRCMLoadal_TIME)
    
    TimerConfigure(GPT3_BASE,TIMER_CFG_B_Periodic);
    
    TimerPrescaleSet (GPT3_BASE,TIMER_B,0);
    
    TimerLoadSet (GPT3_BASE,TIMER_B, 4.8万);
    
    TimerIntRegister (GPT3_BASE,TIME_B,GPT3_B_ISR);
    
    TimerIntEnable (GPT3_BASE,TIME_TIMB_TIMEOUT);
    
    TimerIntClear (GPT3_BASE,TIMER_TIMB_TIMEOUT);
    
    counter=0;
    
    TimerEnable(GPT3_base, timer_B);
    
    }
    
    void GPT3_B_ISR(void)
    {
    
    IF(TimerIntStatus(GPT3_base, true)=timer_TIMB_timeout)
    {
    
    TimerIntClear (GPT3_BASE,TIMER_TIMB_TIMEOUT);
    
    counter++;
    
    }
    
    } 

    请告诉我可能会出什么问题。