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/CC2650:CC2650 SysTick 中断

Guru**** 2564565 points
Other Parts Discussed in Thread: CC2650

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/741555/ccs-cc2650-cc2650-systick-interrupt

器件型号:CC2650

工具/软件:Code Composer Studio

您好!

我正在努力让 SysTick 中断在 CC2650上工作。  我的目标是设置一个1ms 中断、用于系统计时。  我已经使用 rfPacketRx 示例项目启动了我的项目并进行了相应的修改。  下面是我随修改后的向量映射创建的函数。  目前,我无法使用 SysTickIntRegister()调用获取要编译的回叫(中断服务例程)。  你能帮助我朝着正确的方向前进吗?

谢谢、
Dan

rfPacketrx.c 文件中的//初始化函数

void TickTimerInit (void){

SysTickDisable();
SysTickIntRegister (&TickTimerISR);
SysTickPeriodSet (48000);// 1ms 中断时序
SysTickIntEnable();
SysTickEnable();
// HWREG (CPU_SCS_O_STCSR)= 0;//配置前禁用计时器
// HWREG (CPU_SCS_O_STCSR)= 0x00000003;//启用计时器和中断
// HWREG (CPU_SCS_O_STRVR)= 48000;//加载计数器寄存器
// HWREG (CPU_SCS_NVIC_ISER0_SETENA14)= 1;//启用中断

}//end of void TickTimerInit (void){

//矢量映射和 ISR 函数位于 startup_css.c 文件中

extern void TickTimerISR (void);

#pragma DATA_SECTION (g_pfnVectors、".intvecs")
void (* const g_pfnVectors [])(void)=

(void (*)(void)((unsigned long)&_stack_end)、
//初始堆栈指针
ResetISR、//复位处理程序
NmiSR、// NMI 处理程序
FaultISR、//硬故障处理程序
IntDefaultHandler、// MPU 故障处理程序
IntDefaultHandler、//总线故障处理程序
IntDefaultHandler、//用法故障处理程序
0、//保留
0、//保留
0、//保留
0、//保留
IntDefaultHandler、// SVCall 处理程序
IntDefaultHandler、//调试监视器处理程序
0、//保留
IntDefaultHandler、// PendSV 处理程序
TickTimerISR、// SysTick 处理程序
IntDefaultHandler、// AON 边沿检测
IntDefaultHandler、// I2C
IntDefaultHandler、//射频内核命令和数据包引擎1.
IntDefaultHandler、// AON Spiave Rx、Tx 和 CS
IntDefaultHandler、// AON RTC
UART0_ISR、// UART0 Rx 和 Tx
IntDefaultHandler、// AUX 软件事件0
IntDefaultHandler、// SSI0 Rx 和 Tx
IntDefaultHandler、// SSI1 Rx 和 Tx
IntDefaultHandler、//射频内核命令和数据包引擎0
IntDefaultHandler、//射频内核硬件
IntDefaultHandler、//射频内核命令确认
IntDefaultHandler、// I2S
IntDefaultHandler、// AUX 软件事件1.
IntDefaultHandler、//看门狗计时器
IntDefaultHandler、//计时器0子计时器 A
IntDefaultHandler、// Timer 0子计时器 B
IntDefaultHandler、//计时器1子计时器 A
IntDefaultHandler、//计时器1子计时器 B
IntDefaultHandler、//计时器2子计时器 A
IntDefaultHandler、//计时器2子计时器 B
IntDefaultHandler、//计时器3子计时器 A
IntDefaultHandler、//计时器3子计时器 B
IntDefaultHandler、//加密内核结果可用
IntDefaultHandler、// uDMA 软件
IntDefaultHandler、// uDMA 错误
IntDefaultHandler、//闪存控制器
IntDefaultHandler、//软件事件0
IntDefaultHandler、// AUX 组合事件
IntDefaultHandler、// AON 可编程0
IntDefaultHandler、//动态可编程中断
//源(默认值:PRCM)
IntDefaultHandler、// AUX 比较器 A
IntDefaultHandler、// AUX ADC 新样本或 ADC DMA
//完成、ADC 下溢、ADC 溢出
IntDefaultHandler // TRNG 事件
};

void TickTimerISR (void){
//清除中断
CLK_TICK++;//1ms 计数器变量
}//结束 void TickTimerISR (void){

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

    您的项目是否基于 TI-RTOS? 在这种情况下、您需要使用 Hwi 模块来寄存中断:

    dev.ti.com/.../index.html
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我使用的是 rfPacketRx 示例、因此如果使用 RTOS、则是。 我仍然不明白为什么无论 RTOS 如何、我都无法按照我显示的方式实现 SysTick 计时器。 您是否有可供我查看的 RTOS 内 SysTick 设置示例?
    Dan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你可以像你一样执行它(但是,我不会把指针的引用传递给 SysTickIntRegister())。 您不必以任何方式修改实际矢量表。 这意味着代码如下所示:

    void TickTimerISR (void){
    //处理中断
    }
    
    void startSysTick (void *arg0)
    {
    SysTickDisable();
    SysTickPeriodSet (48000);// 1ms 中断时序
    SysTickIntRegister (TickTimerISR);
    SysTickIntEnable();
    SysTickEnable();
    } 

    这将正常工作、但是、如果您在 TI-RTOS 上构建、建议使用 Hwi 模块、以便在 RTOS 内处理中断、从而在 ISR 内安全地使用不同的 RTOS API。 如下所示:

    void TickTimerISR (void){
    //处理中断
    }
    
    void startSysTick (void *arg0)
    {
    Hwi_Params HwiParams;
    Hwi_Structhwi;
    
    SysTickDisable();
    SysTickPeriodSet (48000);// 1ms 中断时序
    
    /*为此外设创建 Hwi 对象*/
    Hwi_Params_init (hwiParams);
    hwiParams.priority =~0;//最低
    Hwi_construction (&hwi、INT_SysTick、TickTimerISR、&hwiParams、NULL);
    
    SysTickEnable();
    } 
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢 M-W 我已经尝试了两种编译正常的方法。 唯一的问题是、根据我找到的一些示例、我不得不将中断函数作为地址传递。
    我仍然没有接收中断、因此我仍然缺少一些东西... 在 main 中调用的 startSysTick 函数之后,我只需调用 IntMasterEnable()。 是否还有更多的问题呢?

    int main (空)

    uint32_t txTimer;

    /*呼叫板初始化功能。 *
    Board_initGeneral();
    TickTimerInit();
    IntMasterEnable();

    我不确定要检查哪个寄存器来检查 IntMasterEnable 函数、因为当我单步执行时、调试器会丢失、寻找一个源文件、因此我看不到该调用设置/清除等什么寄存器来验证是否启用了全局中断。

    无法在"C:\Jenkins\Jobs\FWGroup-DriverLib\workspaces\modules\output\cc26xx_cha_2_ext\driverlib\bin\ccs/./../../../driverlib/cpu.c 中找到源文件
    找到文件或编辑源查找路径以包括其位置。

    我猜这是个问题、但不知道工具需要什么、因为这些是内置函数调用。

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

    Daniel、您好!

    我运行了这个精确的代码、它对我很有用:

    #include 
    #include DeviceFamily_constructPath (driverlib/SysTick。h)
    #include DeviceFamily_constructPath (driverlib/interrupt.h)
    
    /*
    === main ====
    */
    void TickTimerISR (void){
    //处理中断
    }
    
    int main (void)
    {
    
    SysTickDisable();
    SysTickPeriodSet (48000);// 1ms 中断时序
    SysTickIntRegister (TickTimerISR);
    SysTickIntEnable();
    SysTickEnable();
    IntMasterEnable();
    
    
    while (1){};
    } 

    您能否将一个示例文件放在一起、显示您从开始->计时器执行所有操作的确切步骤?

    我建议使用 DriverLib 文档来访问 API 调用的源(函数和源代码都有详细的文档记录):

    http://dev.ti.com/tirex/content/simplelink_cc13x0_sdk_2_20_00_38/docs/driverlib_cc13xx_cc26xx/cc26x0r2/driverlib/group__interrupt__api.html#gaa6aaa682af18f11fd33a42b28e11c308

    我仍然建议您在与 TI-RTOS 一起工作时使用 Hwi 模块。 此外,我建议您不要在 BIOS_start()调用之前启用中断,因为这可能会影响 RTOS (此调用实际上会启用全局中断)。  

    您可以在 SDK 文件夹中找到源文件:" /source/ti/device/cc----/driverlib。 您在 CCS 中看到这种奇怪路径的原因是使用了 driverlib 库(包含与实际构建它的主机相关的链接)。 如果您浏览 SDK 版本、它应该会弹出窗口、但没有问题。

    问题的另一个要点是、您是否打算在应用中使用任何低功耗模式? 我提出的原因是、当 TI-RTOS 电源驱动程序将器件置于待机状态时、SysTick 将处于非活动状态(正如我们在几乎所有示例中所做的那样)、这意味着除非 CPU 正在运行、否则计时器将不会计时。  

    您是否考虑过仅使用 TI-RTOS 中的时钟模块来创建系统时钟? 它脱离 RTC 运行、在待机期间处于活动状态。  

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

    这真的很奇怪。  我只需添加 #include 正如我在您的工作示例中注意到的。   

    不是很好

    感谢 RTOS 文档的链接以及对此问题的帮助。

    此致、

    Dan