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/TMS320F28379D:关于 SYS BIOS Hwi (硬件中断)

Guru**** 2535750 points
Other Parts Discussed in Thread: SYSBIOS

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/796137/rtos-tms320f28379d-regarding-sys-bios-hwi-hardware-interrupt

器件型号:TMS320F28379D
Thread 中讨论的其他器件:SYSBIOS

工具/软件:TI-RTOS

尊敬的先生:

我正在使用 F28379D 处理 SYS/BIOS。 我采用了 SYS/BIOS 的最小项目示例。 我已成功完成任务、Swi 和信标。

现在我想尝试插入一个 Hwi、主 CPU 定时器中断已经成功完成、但我无法为 PWM、ADC 等其他外设生成 Hwi。  

我尝试创建一个 Hwi、采用名为 ADC_ex2_SoC_ePWM 的 driverlib 中的简单示例。 它 不调用我在 app.cfg 接口中创建的中断函数。  

我还共享了 app.cfg 代码和主程序代码。  

请指引我出错的地方。

Amosh Bhshutatt

//================================================ app.cfg ======================================================================== //

var ti_sysbios_hal_hwi = xdc.useModule('ti.sysbios.hal.Hwi');

Hwi.nonDispatchedInterrupts["ti_sysbios_family_c28_Hwi0"].intNum = 0;


var ti_sysbios_hal_hwi0Params =新 ti_sysbios_hal_hwi.Params ();


ti_sysbios_hal_Hwi0Params.instance.name ="ti_sysbios_hal_hwi0";


program.global.ti_sysbios_hal_hwi0 = ti_sysbios_hal_hwi.create (32、"&adcdpwmhwi"、ti_sysbios_hal_hwi0Params);

//============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================ //

//================================================ ISR...Hwi================================================================ //

void adcdpwmhwi (void){
GPIO_togglePin (DEVICE_GPIO_PIN_LED1);
ADC_clearInterruptStatus (ADCD_BASE、ADC_INT_NUMBER1);
INTERRUPT_clearACKGROUP (INTERRUPT_ACK_Group1);

//==================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== //

//================================================ main.c ============= //

int main()

 system_printf ("enter main()\n");

DEVICE_initGPIO();
//Interrupt_initModule();
// Interrupt_initVectorTable();
GPIO_setPadConfig (DEVICE_GPIO_PIN_LED1、GPIO_PIN_TYPE_STD);
GPIO_setDirectionMode (DEVICE_GPIO_PIN_LED1、GPIO_DIR_MODE_OUT);
initadC();
initEPwm();
initADCSOC();
// Interrupt_register (INT_ADCD1、&adcdpwmhwi);
ePWM_enableADCtrigger (EPWM1_base、ePWM_SOC_A);
INTERRUPT_ENABLE (INT_ADCA1);
ePWM_enableADCtrigger (EPWM1_base、ePWM_SOC_A);
ePWM_setTimeBaseCounterMode (EPWM1_base、ePWM_COUNTER_MODE_UP);
EINT;
ERTM;
BIOS_start();/*不返回*/
返回(0);

//====================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================

void initadc (void)

//
//将 ADCCLK 分频器设置为/4
//
ADC_setPrescaler (ADCA_BASE、ADC_CLK_DIV_4_0);

//
//设置分辨率和信号模式(请参阅上面的#defines)和负载
//相应的剪裁。
//
#if (EX_ADC_Resolution = 12)
ADC_setMode (ADCA_BASE、ADC_RESolution_12位、ADC_MODE_SINGLE_ENDLE);
#Elif (EX_ADC_Resolution = 16)
ADC_setMode (ADCA_BASE、ADC_RESolution_16BIT、ADC_MODE_differential);
#endif
//
//将脉冲位置设置为晚期
//
ADC_setInterruptPulseMode (ADCA_BASE、ADC_PULSE_END_of _CONV);

//
//为 ADC 加电、然后延迟1ms
//
ADC_enableConverter (ADCA_BASE);
DEVICE_DELAY_US (1000);

//
//函数配置 ePWM1以生成 SOC。
//
空 initEPWM (空)

//
//禁用 SOCA
//
ePWM_DisableADCtrigger (EPWM1_base、ePWM_SOC_A);

//
//将 SOC 配置为在首次递增计数事件发生时发生
//
ePWM_setADCTriggerSource (EPWM1_base、ePWM_SOC_A、ePWM_SOC_TBCTR_U_CMPA);
ePWM_setADCTriggerEventPrescale (EPWM1_base、ePWM_SOC_A、1);

//
//将比较 A 值设置为2048,将周期设置为4096
//
ePWM_setCounterCompareValue (EPWM1_base、ePWM_COUNTER_COMPARE_A、0x0800);
ePWM_setTimeBasePeriod (EPWM1_base、0x1000);

//
//冻结计数器
//
ePWM_setTimeBaseCounterMode (EPWM1_base、ePWM_COUNTER_MODE_STOP_FREEZE);

//
//将 ADCA 的 SOC0配置为由 ePWM1触发的函数。
//
空 initADCSOC (空)

//
//配置 ADCA 的 SOC0以转换引脚 A0。 EPWM1SOCA 信号将是
//触发器。
//
//对于12位分辨率、采样窗口为15 (200MHz 时为75ns
// SYSCLK 速率)。 对于16位分辨率、采样窗口为
//将使用64 (200MHz SYSCLK 速率下为320ns)。
//

ADC_setupSOC (ADCA_BASE、ADC_SOC_NUMBER0、ADC_TRIGGER_EPWM1_SOCA、ADC_CH_ADCIN0、15);

//
//设置 SOC0以设置中断1标志。 启用中断并使其变为
//确保其标志被清除。
//
ADC_setInterruptSource (ADCA_BASE、ADC_INT_NUMBER1、ADC_SOC_NUMBER0);
ADC_enableInterrupt (ADCA_BASE、ADC_INT_NUMBER1);
ADC_clearInterruptStatus (ADCA_BASE、ADC_INT_NUMBER1);

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

    尊敬的 Ashutosh:

    [引用 user="ashutosh bhatt ]Interrupt_enable (INT_ADCA1);
    ePWM_enableADCtrigger (EPWM1_base、ePWM_SOC_A);
    ePWM_setTimeBaseCounterMode (EPWM1_base、ePWM_COUNTER_MODE_UP);
    EINT
    ERTM;
    BIOS_start();/*不返回*/

    不应启用由 Hwi 处理的中断。  Hwi 将在正确的时间启用它。

    更重要的是,不应在 BIOS_start()之前启用全局中断。  EINT 是否启用全局中断?

    此致、

    - Rob

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的先生:
    我按照您的建议进行了尝试。 但它仍然不会进入我在 cfg 文件中使用相关中断编号声明的 ISR 函数。
    任何其他我忘记配置的内容、请为我提供指导。 如果您需要、我将分享该项目。

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

    奥什托什、

    我想不出什么更好的了、所以下一个最好的事情就是让您的项目按您的要求提供。  请查看您是否可以附加它。

    此致、

    - Rob

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

    e2e.ti.com/.../SYSBIOS_5F00_HwiADCSOCPWM.zip

    这里、我向大家介绍 ADCSOCPWM 中断编号32的 Hwi 的最简单项目。 这是一个存档文件。 我使用的是 CCS 版本9.0和 BIOS 6.5、编译器版本为 TI v18.12.1.LTS。  

    请指导我。

    奥什托什

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

    我的问题已解决、还有一些设置保留在那里。

    Amosh Bhshutatt

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    以上内容对我有所帮助、但并未完全解决我的问题。 我还参加过其他一些论坛、在那里我有解决问题的想法。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Ashutosh:

    [引用 user="ashutosh bhatt ]以上内容有助于解决我的问题、但无法完全解决。 我已经浏览过其他一些论坛、在这些论坛中我有办法解决这个问题。[/引述]

    为了 e2e 论坛数据库的利益、我们希望此主题能够全面了解该解决方案。  如果您愿意、能否  总结一下您为解决问题所做的工作?

    此致、

    - Rob

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

    存在外设和时钟初始化的问题。

    Amosh Bhshutatt