2025-05-21 11:31:07 +08:00

185 lines
5.2 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*品智科技S32K118开发板*/
/* bootloader实验
* 实验目的:
* 将bootloader 和 app 工程烧录进入开发板在bootloader程序里使用按键KEY1跳转进入APP程序
*
* BOOTLOADRT程序内存分配
* 中断向量表
* 0x00000000 - 0x000000C0
* flash配置信息
* 0x00000400 - 0x00000410
* bootloader程序 占用31.728k空间
* 0x00000410 - 0x00008000
*
* APP程序内存分配
* 中断向量表
* 0x00008000 - 0x00008400
* flash配置信息
* 0x00008400 - 0x00008410
* bootloader程序 占用256k空间
* 0x00008410 - 0x00048410
* 内存配置文件在工程文件夹内的Project Setting/Linker Files/S32K144_64_flash下
*
* 操作方法,将两个应用同时烧录进开发板内即可。
* KEY1 PTC14
* KEY2 PTC15
* KEY3 PTC16
* LED1 PTD16
* LED2 PTD15
* LED3 PTE9
* LED4 PTE8
* 开发板采用无外部晶振设计,时钟走FIRC 48mhz,配置时钟时需要注意
*/
#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开始地址
void JumpToUserApplication( unsigned int userSP, unsigned int userStartup)
{
(void)userSP; //使参数不报警告信息
(void)userStartup;
/* 设置栈指针 */
__asm("msr msp, r0");
__asm("msr psp, r0");
/* 重新定向中断向量表 */
S32_SCB->VTOR = (uint32_t)APP_START_ADDRESS;
/* 跳转至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;
/*把应用程序入口地址赋值给函数指针*/
jump_to_application = (void (*)(void))appEntry;
stack_pointer = appStack;
/* 重新定向中断向量表 */
S32_SCB->VTOR = (uint32_t)APP_START_ADDRESS;
/* 设置栈指针 */
__asm volatile ("MSR msp, %0\n" : : "r" (stack_pointer) : "sp");
__asm volatile ("MSR psp, %0\n" : : "r" (stack_pointer) : "sp");
/*跳转*/
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();//初始化delay函数
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);//初始化I2C外设,用于OLED通讯
LPUART_DRV_Init(INST_LPUART1, &lpuart1_State, &lpuart1_InitConfig0); //初始化串口
oled_init(); //OLED配置参数初始化
OLED_TITLE((uint8_t*)"S32K118",(uint8_t*)"BLOADER");//OLED显示标题
OLED_ShowString(0,2,(uint8_t*)" BOOTLOADER",16,0); //OLED显示字符串
u1_printf("当前进入BOOTLOADER程序,MCU运行频率为 %d Mhz \r\n",MCU_Freq);
while(1)
{
pinstate = KEY_Proc (1);
if(pinstate ==BTN1_PRES )
{
u1_printf("KEY1 按下 2秒后进入app \r\n");
OLED_ShowString(0,4,(uint8_t*)" ENTER APP",16,0); //OLED显示字符串
OLED_ShowString(0,6,(uint8_t*)" in 2 seconds",16,0); //OLED显示字符串
delay_ms(1000);
OLED_ShowString(0,6,(uint8_t*)" in 1 seconds",16,0); //OLED显示字符串
delay_ms(1000);
OLED_ShowString(0,6,(uint8_t*)" in 0 seconds",16,0); //OLED显示字符串
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清行
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.
**
** ###################################################################
*/