网上查到的直接进入TIVA系列MCU存在ROM中的bootloader的三种方法,记录一下。
使用 TM4C ROM bootloader 的三種方式:
Flash Empty
當 MCU Flash Address 0x00000004 內容值是 0xFFFFFFFF
會直接進入 HW ROM Boootloader (Power ON or RESET)
也就是說MCU 內是沒燒入程式或是 Flash Erease 的狀態
BOOTCFG Setting GPIO
修改 BOOTCFG register 可指定 GPIO 強制進入 ROM Bootloader
這邊說明使用 GPIO PF4 Keep LOW 進入 HW ROM Bootloader (Power ON or RESET)
當程式設定過後就不會再執行此設定
若要清除改變設定,就要回復到預設狀態
利用 Tool 清除
LM Flash Programmer → Other Utilities → Debug Port Unlonk → Select Fury, DustDevil, TM4C123 and TM4C129 Classes
→ click Unlock
1 2 3 4 5 6 7 8 9 10 11 12 | void CheckBootloaderCFG(void) { unsigned long bootcfg; bootcfg = HWREG(FLASH_BOOTCFG); if(bootcfg & FLASH_BOOTCFG_NW) { HWREG(FLASH_FMA) = 0x75100000; HWREG(FLASH_FMD) = FLASH_BOOTCFG_PORT_F | FLASH_BOOTCFG_PIN4 | FLASH_BOOTCFG_KEY | FLASH_BOOTCFG_DBG1; HWREG(FLASH_FMC) = DLASH_FMC_WRKEY | FLASH_FMC_COMT; while((HWREG(FLASH_FMC) & FLASH_FMC_COMT) == FLASH_FMC_COMT); } } |
Call ROM Bootloader API
也可在應用程序中調用 ROM Library 來使用 ROM Bootloader
以下範例使用 UART0 來說明
當使用 LM Flash Programmer 的 Serial(UART) 需勾選 Disbale Auto Buad Support
此 UART是固定傳輸速率
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | void JumpToBootloader(void) { // Set UART0 use ROM bootloader ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); ROM_GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1); ROM_UARTConfigSetExpClk( UART0_BASE, SysCtlClockGet(), 115200, (UART_CONFIG_PAR_NONE | UART_CONFIG_STOP_ONE | UART_CONFIG_WLEN_8)); ROM_UARTEnable(UART0_BASE); // Disable all processor interrupts. HWREG(NVIC_DIS0) = 0xffffffff; HWREG(NVIC_DIS1) = 0xffffffff; // Call the ROM UART bootloader ROM_UpdateUART(); } |