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.

[参考译文] TMS320F28069:SYS/BIOS 中无延迟

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

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1235935/tms320f28069-zero-latency-in-sys-bios

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

 我不熟悉 SYS/BIOS、过去主要从事裸机工作。 我看到了一个与 XINT1的零/低延迟中断 ISR 调用相关的问题。 在裸机上、我添加了允许中断嵌套的代码、从而获得了非常低的延迟(~24个周期) XINT1 ISR 调用。 我想在 SYS/BIOS 中创建类似的效果、但这里我看到的延迟在2-5 us 范围内、这对我的应用来说太长。 下面是关于咨询和问题的更多详细信息。

提问:

PWM 生成需要与外部异步脉冲同步、具有非常严格的计时要求 、精度低至20-30ns。 具体情况解释如下:

  1. 在 GPIO 输入上接收外部异步脉冲。
  2. 在来自接收 GPIO 的脉冲的上升沿触发外部中断(XINT1)。
  3. 在 XINT1 ISR 中、重新加载 PWM 比较寄存器、并且将 PWM1计数器复位为零。

 

问题:

从概念上讲、这是一个实现的简单逻辑、我已成功在裸机中对其进行了测试、满足了所有时序要求。 然而、在 SYSBIOS OSAL2中、 我所面临的挑战是与 XINT ISR 调用相关的中断延迟抖动。

 

从 µs 到在 XINT ISR 中修改 PWM 寄存器的那一刻、我将看到 ISR 延迟抖动高达5 μ s。

因此、为了应对这种高 ISR 延迟、我尝试了使用 ti_sysBIOS_family_c28_hwi.zeroLatencyIERMask。 (该设置是否允许已标记中断组在 SYS/BIOS 中嵌套中断?)

当我在 app.cfg 中设置 ti_sysbios_family_c28_hwi.zeroLatencyIERMask 时、我看不到调用的 XINT1 ISR 回调函数。  

在 main 中,我添加了 BIOS_start()之前的代码。

主要()

{

 //…… 用户任务

 //在 OSAL2中初始化的 PWM 和其他任务

 ……

 ...

 //插入零延迟中断*/  
 HWI_插头 (35、XINT1_ISR);
 XintInit裸 机 ();
 HWI_enableIER (0x0001);

 BIOS_启动 ();

Bool XintInit裸 机(空)
{
//初始化 GPIO
EALLOW;
GpioCtrlRegs.GPAMUX1.bit.GPIO13 = 0;// GPIO
GpioCtrlRegs.GPADIR.bit.GPIO13 = 0;//输入
GpioCtrlRegs.GPAQSEL1.bit.GPIO13 = 0;//仅 XINT1同步到 SYSCLKOUT
GpioIntRegs.GPIOXINT1SEL.bit.GPIOSEL = 13;// XINT1为 GPIO0
EDIS;
XIntruptRegs.XINT1CR.BIT.POLARITY = 1;//上升沿中断
XIntruptRegs.XINT1CR.bit.enable = 1;//启用 XINT1

PieCtrlRegs.PIEIER1.bit.intx4 = 0u;// 2)禁用 PIE 组中的 XINTx
asm (" RPT #4 || NOP ");// 3)等待5个周期
IFR &=~0x0001u;// 4)清除此 PIE 组的 IFR 位
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;// 5)必须确认 PIE 组


PieCtrlRegs.PIEIER1.bit.INTx4 = 1U;//启用 XINT1中断

返回 true;


#pragma CODE_SECTION (XINT1_ISR、"ramfuncs")
__interrupt void XINT1_ISR (void)
{
EPwm1Regs.TBCTR = 0x0000;
EPwm1Regs.TBCTL.bit.CTRMODE=0;//pwmdrv_cm_count_up;
GpioDataRegs.GPATOGGLE.bit.GPIO21 = 1;

//确认此中断以从组1获取更多内容
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;

随附的是供参考的视频。 请建议如何使 SYSBIOS 中的代码像裸机一样运行。

e2e.ti.com/.../bareMetal.MP4

e2e.ti.com/.../RTOS_5F00_Timing.MOV

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

    您可以看看 Hwi.c 文件以了解如何在 Hwi 发送程序中使用 zeroLatency 和嵌套掩码。 您甚至可以在其中放入一个断点并单步执行它。 了解正在发生的情况可能会有所帮助:

    C:\ti\BIOS_6_83_00_18\packages\ti\sysBIOS\family\c28\Hwi.c

    就我看代码而言、启用零延迟不会自动为该中断启用嵌套、因此、如果您在无延迟中断之前获得 SYS/BIOS 管理的中断、 我认为没有任何东西会阻止 SYS/BIOS 管理的中断在零延迟中断运行之前一直运行。 在给定 Hwi 发送程序的执行时间后、似乎有理由认为这是5us 抖动的原因。

    惠特尼