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/TM4C129CNCPDT:带 TI-RTOS 的 UART (0)上的引导加载程序不起作用

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/723031/rtos-tm4c129cncpdt-bootloader-over-uart-0-with-ti-rtos-does-not-work

器件型号:TM4C129CNCPDT
主题中讨论的其他器件:TM4C129ENCPDT

工具/软件:TI-RTOS

你好!

我尝试了以下操作:

1.在开发板上编译并执行 boot_demo1示例(使用 TM4C129ENCPDT)-正常工作

2.修改了目标 MCU 并在我自己的板上运行 boot_demo1 (使用 TM4C129CNCPDT)-正常工作

3.使用了我自己的使用 TI-RTOS 的项目并添加了对 ROM_UpdateUART()的调用-当我调用 ROM_UpdateUART()时,程序停止响应,显然没有更新。

在调用 ROM_UpdateUART()之前,UART0通过 TI-RTOS 运行良好。

如果我使用 TI-RTOS、是否有任何特殊的方法来执行默认(UART) ROM 引导加载程序?

谢谢!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    调用 ROM_UpdateUART()时,引导加载程序预计 UART 已初始化。 我怀疑 TI-RTOS 已将 UART0配置为使用中断。 在调用 ROM_UpdateUART()之前,请禁用中断并重新配置 UART0。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    问题已解决!

    事实证明、执行停止所有中断的代码和关闭 UART (使用 RTOS 的 UART_CLOSE ()例程)以及重新初始化 UART 是不够的。

    我缺少它的原因是完全退出 BIOS。

    因此、该解决方案包含3个部分:

    1.编写一个函数,该函数将处理所有中断和 UART 内容,然后执行 ROM_UpdateUART()

    2.将此函数添加到"atexit"例程列表中

    3.调用 BIOS_exit(),它将终止所有 RTOS 任务和时钟(然后执行"atexit"例程)。

    我添加的是我现在使用的实际代码、以防其他人出现同样的问题。 当需要更新固件时,我只需要执行“ExecuteUpdateFirmware()”,这就是...

    
    
    空 ExecuteUpdateFirmware(){
    System_atexit( UpdateFirmware );
    BIOS_exit (0);
    }
    
    
    void UpdateFirmware (int val){
    //禁用 SysTick 及其中断
    ROM_SysTickIntDisable();
    ROM_SysTickDisable();
    
    
    //禁用所有中断
    HWREG (NVIC_DIS0)= 0xffffffff;
    HWREG (NVIC_DIS1)= 0xffffffff;
    HWREG (NVIC_DIS2)= 0xffffffff;
    HWREG (NVIC_DIS3)= 0xffffffff;
    
    //准备 UART0
    ROM_SysCtlPeripheralEnable (SYSCTL_Periph_UART0);
    ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);
    
    //
    //将 GPIO PA0和 PA1设置为 UART。
    //
    ROM_GPIOPinConfigure (GPIO_PA0_U0RX);
    ROM_GPIOPinConfigure (GPIO_PA1_U0TX);
    ROM_GPIOPinTypeUART (GPIO_Porta_base、GPIO_PIN_0 | GPIO_PIN_1);
    
    //
    //将 UART0配置为9600、n、8、1
    // gSysClockFreq 是先前返回的值
    //通过调用 SysCtlClockFreqSet()
    //
    ROM_UARTConfigSetExpClk (UART0_BASE、gSysClockFreq、9600、
    (UART_CONFIG_PAR_NONE | UART_CONFIG_STOP_ONE |
    UART_CONFIG_WLEN_8));
    
    //
    //启用 UART 操作。
    //
    ROM_UARTEnable (UART0_BASE);
    
    //调用内置引导加载程序例程
    ROM_UpdateUART();
    }