项目通过
STM32cubeide创建,boot looder部分目前为了测试,进入main函数后直接跳转到app(此时未初始化任何中断、外设):
- /* USER CODE BEGIN 1 */
- uint16_t boot_flag;
- //boot_flag = readBootFlag();
- //for debug
- boot_flag = BOOT_FLAG_RUNAPP;
- if (boot_flag == BOOT_FLAG_RUNAPP)
- {
- JumpToApp();
- }
- /* USER CODE END 1 */
bootloader的JumpToApp函数实现:
- void JumpToApp(void)
- {
- if (((*(__IO uint32_t *)APP_BASE_ADDR) 0x2ffe0000) == 0x20000000)
- {
- JumpToApplication = (pFunction)(*(__IO uint32_t *)(APP_BASE_ADDR+4));
- __disable_irq();
- __set_MSP(*(__IO uint32_t *)APP_BASE_ADDR);
- JumpToApplication();
- }
- }
app部分修改system_stm32l0xx.c里面VECT_TAB_OFFSET宏为app部分在flash中的位置,主函数主要如下:
- /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
- HAL_Init();
- /* USER CODE BEGIN Init */
- /* USER CODE END Init */
- /* Configure the system clock */
- SystemClock_Config();
- /* USER CODE BEGIN SysInit */
- __enable_irq();
- /* USER CODE END SysInit */
- /* Initialize all configured peripherals */
- MX_GPIO_Init();
- MX_DMA_Init();
- MX_IWDG_Init(); //注释掉就没问题,加上后程序跑到main loop后循环几次后就会reset
- MX_LPUART1_UART_Init();
- MX_USART2_UART_Init();
- /* USER CODE BEGIN 2 */
- /* USER CODE END 2 */
- /* Infinite loop */
- /* USER CODE BEGIN WHILE */
- printf("app enter main loop...n");
- while (1)
- {
- delay_us(100000);
- /* USER CODE END WHILE */
- /* USER CODE BEGIN 3 */
- printf("%lun", HAL_GetTick());
- HAL_IWDG_Refresh( hiwdg);
- }
- /* USER CODE END 3 */
boot启动后跳转到app没问题,发现app部分,只要初始化了IWDG,主循环里面的打印打印了几次后,程序就会reset,主循环里面有喂狗的代码但是感觉不起作用;要是app里面不初始化IWDG,就运行正常。