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.

[参考译文] UCD3138:timerinit 问题 UCD3138

Guru**** 2386480 points
Other Parts Discussed in Thread: UCD3138A64, UCD3138128A, UCD3138128
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/1035477/ucd3138-timerinit-problem-ucd3138

器件型号:UCD3138

您好!
在执行 SWI ASM 命令期间、在警报模式下、我没有预期的程序结束。
此命令在 init_timer_interrupt ()-> disable_fast_interrupt ()-> swi_single_entry (0、0、0、5)中执行。
有人能解释原因是什么吗?请
我的代码是:

~~~μ A

#define main 1.

#include "include.h"
// software_interrupt_wraper.c
void disable_fast_interrupt (void)

Swi_single_entry (0、0、0、5);//代码为5;

// init_miscellaneous.c
void init_timer_interrupt (void)

TimerRegs.T16PWM0CMP0DAT.ALL = 1587;//大约10kHz。 按规格
TimerRegs.T16PWM0CMP1DAT.ALL = 0xFFFF;
TimerRegs.T16PWM0CMPCTRL.ALL = 2;
TimerRegs.T16PWM0CNTCTRL.ALL = 0x00c;

disable_fast_interrupt ();//确保禁用快速中断
disable_interrupt ();
WRITE_FIRQpr (0x0A000000);//将其设置为除 FAULT_INT、DPWM2以外的所有 IRQ
WRITE_REQMASK (0x0A020000);//启用 FAULT_INT 和 PWM0_INT、DPWM2
enable_interrupt ();
ENABLE_FAST_INTERRUPT ();//确保快速中断被启用,并在空闲状态中启用


void main()

杂项 AnalogRegs.IOMUX.ALL = 0;//启用 JTAG
start_state =5;

杂项 AnalogRegs.GLBION.ALL = MASK_PGOOD | MASK_PSON | MASK_FAIL_IN | MASK_AC_FAIL_IN | MASK_AC_FAIL_OUT | MASK_OR_CTRL;

if (((杂波模拟 Regs.GLBIOREAD.ALL & MASK_PGOOD)&&(杂波模拟 Regs.GLBIOREAD.ALL & MASK_FAILURE))

//PMBus_read_write_rom_mode (PMBus_write);


//检查最后一次 DFLASH 擦除是否中断
Look for Interrupted_dflash_erase ();

RESTORE_DEFAULT_ALL ();

周期=(switch_FREQ_numero/PMBus_DCDC_CONFIG[0].switching_frequency);//以4ns 为单位

CONFIG_CPCC ();

init_uart1();

init_gpio();

INIT_PMBus (0x58);

init_DPWM ();

#IF 已定义(UCD3138A64)||已定义(UCD3138128)||已定义(UCD3138A64A)||已定义(UCD3138128A)
enable_oversing();
#endif

init_ADC12();

init_protection();

init_volte_loop();

init_current_loop();

init_light_load_configuration ();

init_Miscellaneous ();

init_timer_interrupt ();

for (;;)


如果(ERASE_SEGM_COUNTER > 0)

ERASE_TASK ();//处理 DFlash 段擦除


decimal_out_5_digits (supply_state);
char_out ('\r');
char_out ('\n');

void c_int00 (void)

main();

~~~μ A

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

    伊凡,这是一个艰难的。  我以前从未见过禁用计时器中断问题。  用户堆栈很可能未初始化为正确的值?   

    SWI 使用在 load.asm 中初始化的监控器堆栈、通常如下所示:


    LDR R13,c_sup_stack_top;初始化监控器堆栈指针

    在此处获取良好的值时、这些语句还必须位于 load.asm 中:

    SUP_STACK_TOP .equ 0x19ffc;监控器模式(SWI 堆栈)从存储器顶部开始

    c_sup_stack_top .long SUP_stack_top

    您还需要将其保留在 main.c 中:

    void c_int00 (void)

    main();

    如果没有、编译器将放入其自己的初始化代码、并且可能不使用 load.asm。   

    您从什么开始?  您是否从我们的 EVM 代码之一开始?  是否在网站上工作?  您使用的是哪个版本的 CCS?  我强烈建议6.2、尤其是当你遇到这些问题时。  初始化序列是可以从版本更改为版本的操作之一。   

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

    感谢您的回复!

    我已经获得了 CCS 6.2、我从 main 开始

    很抱歉、我不明白如何增加堆栈值

    提前感谢

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

    伊凡,我不明白这个问题。  您是否解决了问题?   

    要增加堆栈值、请更改 load.asm 文件中的各种堆栈常量。  它们未连接到 cyclone.cmd 文件、因此您可能应该根据您的代码和 load.asm 中的堆栈值、使总堆栈段大小与预期的堆栈使用情况相匹配。

    首先、EVM 代码中的堆栈是正确的。  我建议您使用标准程序、并确保您能够正常工作。   

    有些人会看到与您类似的问题、因为他们在 main.c 的开头忽略了硬件后门  您没有告诉我您使用的是什么代码、因此我无法准确地告诉您要上拉或下拉的引脚、但如果您看的话、应该很容易看到。  它被设计成清除闪存校验和并复位 UCD、而代码全部通过引起一个异常来实现。   

    我认为这就是您在报警模式下意外结束程序的含义。 尽管更多详细信息会有所帮助。  您遇到异常吗?   

    我在  以下位置提供了有关最近 E2E 帖子的一些信息:https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/1031362/ucd3138a-abort_prefetch_exception-interrupt-as-soon-as-miscanalogueregs-iomux-all-0-is-executed

    这也许会有帮助。