185 lines
5.2 KiB
C
Raw Normal View History

2025-05-21 11:31:07 +08:00
/*Ʒ<>ǿƼ<C7BF>S32K118<31><38><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
/* bootloaderʵ<72><CAB5>
* ʵ<EFBFBD><EFBFBD>Ŀ<EFBFBD>ģ<EFBFBD>
* <EFBFBD><EFBFBD>bootloader <EFBFBD><EFBFBD> app <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>bootloader<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ð<EFBFBD><EFBFBD><EFBFBD>KEY1<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD><EFBFBD><EFBFBD>APP<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* BOOTLOADRT<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD>ж<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* 0x00000000 - 0x000000C0
* flash<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
* 0x00000400 - 0x00000410
* bootloader<EFBFBD><EFBFBD><EFBFBD><EFBFBD> ռ<EFBFBD><EFBFBD>31.728k<EFBFBD>ռ<EFBFBD>
* 0x00000410 - 0x00008000
*
* APP<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD>ж<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* 0x00008000 - 0x00008400
* flash<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
* 0x00008400 - 0x00008410
* bootloader<EFBFBD><EFBFBD><EFBFBD><EFBFBD> ռ<EFBFBD><EFBFBD>256k<EFBFBD>ռ<EFBFBD>
* 0x00008410 - 0x00048410
* <EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD>ڹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>Project Setting/Linker Files/S32K144_64_flash<EFBFBD><EFBFBD>
*
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><EFBFBD>ͬʱ<EFBFBD><EFBFBD>¼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڼ<EFBFBD><EFBFBD>ɡ<EFBFBD>
* KEY1 PTC14
* KEY2 PTC15
* KEY3 PTC16
* LED1 PTD16
* LED2 PTD15
* LED3 PTE9
* LED4 PTE8
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ⲿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>FIRC 48mhz,<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>Ҫע<EFBFBD><EFBFBD>
*/
#include "Cpu.h"
#include "delay.h"
#include "uart.h"
#include "oled.h"
#include "key.h"
volatile int exit_code = 0;
/* User includes (#include below this line is not maintained by Processor Expert) */
#define LED1(x) PINS_DRV_WritePin(PTD,16,!x);
#define LED2(x) PINS_DRV_WritePin(PTD,15,!x);
#define LED3(x) PINS_DRV_WritePin(PTE,9,!x);
#define LED4(x) PINS_DRV_WritePin(PTE,8,!x);
#define APP_START_ADDRESS 0x00008000 //app<70><70>ʼ<EFBFBD><CABC>ַ
void JumpToUserApplication( unsigned int userSP, unsigned int userStartup)
{
(void)userSP; //ʹ<><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
(void)userStartup;
/* <20><><EFBFBD><EFBFBD>ջָ<D5BB><D6B8> */
__asm("msr msp, r0");
__asm("msr psp, r0");
/* <20><><EFBFBD><EFBFBD><C2B6><EFBFBD><EFBFBD>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
S32_SCB->VTOR = (uint32_t)APP_START_ADDRESS;
/* <20><>ת<EFBFBD><D7AA>APP */
__asm("mov pc, r1");
}
void Bootup_Application(uint32_t appEntry, uint32_t appStack)
{
static void (*jump_to_application)(void);
static uint32_t stack_pointer;
/*<2A><>Ӧ<EFBFBD>ó<EFBFBD><C3B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>ַ<EFBFBD><D6B7>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>*/
jump_to_application = (void (*)(void))appEntry;
stack_pointer = appStack;
/* <20><><EFBFBD><EFBFBD><C2B6><EFBFBD><EFBFBD>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
S32_SCB->VTOR = (uint32_t)APP_START_ADDRESS;
/* <20><><EFBFBD><EFBFBD>ջָ<D5BB><D6B8> */
__asm volatile ("MSR msp, %0\n" : : "r" (stack_pointer) : "sp");
__asm volatile ("MSR psp, %0\n" : : "r" (stack_pointer) : "sp");
/*<2A><>ת*/
jump_to_application();
}
int main(void)
{
/* Write your local variable definition here */
int MCU_Freq;
uint8_t pinstate;
uint32_t appEntry, appStack;
/*** Processor Expert internal initialization. DON'T REMOVE THIS CODE!!! ***/
#ifdef PEX_RTOS_INIT
PEX_RTOS_INIT(); /* Initialization of the selected RTOS. Macro is defined by the RTOS component. */
#endif
/*** End of Processor Expert internal initialization. ***/
CLOCK_SYS_Init(g_clockManConfigsArr, CLOCK_MANAGER_CONFIG_CNT,
g_clockManCallbacksArr, CLOCK_MANAGER_CALLBACK_CNT);
CLOCK_SYS_UpdateConfiguration(0U, CLOCK_MANAGER_POLICY_AGREEMENT);
MCU_Freq = delay_init();//<2F><>ʼ<EFBFBD><CABC>delay<61><79><EFBFBD><EFBFBD>
PINS_DRV_Init(NUM_OF_CONFIGURED_PINS, g_pin_mux_InitConfigArr);
LED1(0);
LED2(0);
LED3(0);
LED4(0);
I2C_MasterInit(&i2c1_instance, &i2c1_MasterConfig0);//<2F><>ʼ<EFBFBD><CABC>I2C<32><43><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD>OLEDͨѶ
LPUART_DRV_Init(INST_LPUART1, &lpuart1_State, &lpuart1_InitConfig0); //<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
oled_init(); //OLED<45><44><EFBFBD>ò<EFBFBD><C3B2><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>
OLED_TITLE((uint8_t*)"S32K118",(uint8_t*)"BLOADER");//OLED<45><44>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>
OLED_ShowString(0,2,(uint8_t*)" BOOTLOADER",16,0); //OLED<45><44>ʾ<EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>
u1_printf("<EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>BOOTLOADER<EFBFBD><EFBFBD><EFBFBD><EFBFBD>,MCU<43><55><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5>Ϊ %d Mhz \r\n",MCU_Freq);
while(1)
{
pinstate = KEY_Proc (1);
if(pinstate ==BTN1_PRES )
{
u1_printf("KEY1 <20><><EFBFBD><EFBFBD> 2<><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>app \r\n");
OLED_ShowString(0,4,(uint8_t*)" ENTER APP",16,0); //OLED<45><44>ʾ<EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>
OLED_ShowString(0,6,(uint8_t*)" in 2 seconds",16,0); //OLED<45><44>ʾ<EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>
delay_ms(1000);
OLED_ShowString(0,6,(uint8_t*)" in 1 seconds",16,0); //OLED<45><44>ʾ<EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>
delay_ms(1000);
OLED_ShowString(0,6,(uint8_t*)" in 0 seconds",16,0); //OLED<45><44>ʾ<EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>
appStack = *(uint32_t *)(APP_START_ADDRESS);
appEntry = *(uint32_t *)(APP_START_ADDRESS + 4);
Bootup_Application(appEntry, appStack);
//JumpToUserApplication(*((uint32_t*)APP_START_ADDRESS), *((uint32_t*)(APP_START_ADDRESS + 4)));
}
else
{
LCD_clear_L(0,4); //OLED<45><44><EFBFBD><EFBFBD>
LCD_clear_L(0,5);
}
delay_ms(100);
PINS_DRV_TogglePins(PTE, 1 << 8);
PINS_DRV_TogglePins(PTE, 1 << 9);
}
/*** Don't write any code pass this line, or it will be deleted during code generation. ***/
/*** RTOS startup code. Macro PEX_RTOS_START is defined by the RTOS component. DON'T MODIFY THIS CODE!!! ***/
#ifdef PEX_RTOS_START
PEX_RTOS_START(); /* Startup of the selected RTOS. Macro is defined by the RTOS component. */
#endif
/*** End of RTOS startup code. ***/
/*** Processor Expert end of main routine. DON'T MODIFY THIS CODE!!! ***/
for(;;) {
if(exit_code != 0) {
break;
}
}
return exit_code;
/*** Processor Expert end of main routine. DON'T WRITE CODE BELOW!!! ***/
} /*** End of main routine. DO NOT MODIFY THIS TEXT!!! ***/
/* END main */
/*!
** @}
*/
/*
** ###################################################################
**
** This file was created by Processor Expert 10.1 [05.21]
** for the NXP S32K series of microcontrollers.
**
** ###################################################################
*/