原子750库开发IAP例程

一、例程分析

在这里插入图片描述

E:\原子资料\【正点原子】北极星stm32h750开发板资料\4,程序源码\新建文件夹\2,标准例程-HAL库版本\实验56 串口IAP实验\IAP Bootloader V1.0_FLASH\USER

boot例程分析:

  1. 例程使用750XB
  2. ram rom
    在这里插入图片描述
  3. User下无需生成bin
  4. c++, level 2
    在这里插入图片描述
  5. 使用了分散加载
    在这里插入图片描述
  6. 750xb烧写算法,注意自己板子qspi烧写算法!
    在这里插入图片描述
  7. 本例程的功能是将iap程序拷贝到0x00000000地址,即ITCM。
    iap程序在bl_itcm.c中,使用const定义,存储在qspi中,由分散加载文件决定。
    在这里插入图片描述
  8. 程序上电后,会初始化Stm32_Clock_Init,里面初始化并启动了qspi的映射模式QSPI_Enable_Memmapmode,注意自己板子qspi的引脚!
  9. 拷贝iap程序到ITCM
  10. 判断中断向量地址 是否是从0开始,猜测:iap程序的rom地址应该为0x0了。
    if((((vu32)(BOOTLOADER_RUN_ADDR+4))&0xFF000000)==0x00000000)
  11. 跳转判断程序的栈顶地址为2000 0000,猜测:iap程序的ram地址应该是0x2000 0000
    if((((vu32)appxaddr)&0x2FF00000)==0x20000000)

IAP程序分析:

  1. target,rom地址是800 0000,跟之前猜测的不一样,这样的话,就无法跳转iap了。
    if((((vu32)(BOOTLOADER_RUN_ADDR+4))&0xFF000000)==0x00000000) 假

    在这里插入图片描述
    ram地址,ram1 ram2都有勾选 ,具体如何分配就看map文件了。下图,ram使用了2400 0000,这样的话,if((((vu32)appxaddr)&0x2FF00000)==0x20000000) 也为假,这还咋跳转??
    在这里插入图片描述

  2. iap竟然还用了分散加载,生成俩bin,这咋放在boot程序 const 数组里呢??

怀疑历程在打包过程出现问题。。。。

二、例程修改

boot程序

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

	u32 tempreg=0; 
	vu32 *data_reg=&QUADSPI->DR;
	GPIO_InitTypeDef qspi_gpio;
	RCC->AHB4ENR|=1<<1;       //使能GPIOB时钟
	RCC->AHB4ENR|=1<<3;       //使能GPIOD时钟
	RCC->AHB4ENR|=1<<4;       //使能GPIOE时钟  
	RCC->AHB3ENR|=1<<14;   		//QSPI时钟使能

	//初始化PB6 片选信号
	qspi_gpio.Pin=GPIO_PIN_6;
	qspi_gpio.Mode=GPIO_MODE_AF_PP;             //复用
	qspi_gpio.Pull=GPIO_PULLUP;              
	qspi_gpio.Speed=GPIO_SPEED_FREQ_VERY_HIGH;  //高速
	qspi_gpio.Alternate=GPIO_AF10_QUADSPI;      //复用为QSPI
	HAL_GPIO_Init(GPIOB,&qspi_gpio);

	//初始化PB2 时钟信号
	qspi_gpio.Pin=GPIO_PIN_2;
	qspi_gpio.Mode=GPIO_MODE_AF_PP;             //复用
	qspi_gpio.Pull=GPIO_NOPULL;              
	qspi_gpio.Speed=GPIO_SPEED_FREQ_VERY_HIGH;  //高速
	qspi_gpio.Alternate=GPIO_AF9_QUADSPI;      //复用为QSPI
	HAL_GPIO_Init(GPIOB,&qspi_gpio);

	//PD11-- QUADSPI_BK1_IO0   PD12-- QUADSPI_BK1_IO1  PD13-- QUADSPI_BK1_IO3
	qspi_gpio.Pin=GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13;
	qspi_gpio.Mode=GPIO_MODE_AF_PP;             //复用
	qspi_gpio.Pull=GPIO_NOPULL;              
	qspi_gpio.Speed=GPIO_SPEED_FREQ_VERY_HIGH;  //高速
	qspi_gpio.Alternate=GPIO_AF9_QUADSPI;      //复用为QSPI
	HAL_GPIO_Init(GPIOD,&qspi_gpio);

	//PE2-- QUADSPI_BK1_IO2
	qspi_gpio.Pin=GPIO_PIN_2;
	qspi_gpio.Mode=GPIO_MODE_AF_PP;             //复用
	qspi_gpio.Pull=GPIO_NOPULL;              
	qspi_gpio.Speed=GPIO_SPEED_FREQ_VERY_HIGH;  //高速
	qspi_gpio.Alternate=GPIO_AF9_QUADSPI;      //复用为QSPI
	HAL_GPIO_Init(GPIOE,&qspi_gpio);

问题

  1. cannot load
    在这里插入图片描述
    解决:在这里插入图片描述
    改大一点
    在这里插入图片描述

  2. download failed
    在这里插入图片描述
    在这里插入图片描述
    再去下载的话 会出现
    在这里插入图片描述
    解决:
    问题是因为 Stm32_Clock_Init,QSPI_Enable_Memmapmode 没有修改qspi引脚 导致内存映射死机 连程序都无法下载。此时需要复位+快速点击download按钮,一定要快!!!

  3. download failed 每次下载都会出现 但是程序也下载进去了
    在这里插入图片描述
    在这里插入图片描述

    下载过程,会先擦除片内,再下载片内,然后片外,但最后报错片外内容不匹配:9000B86EH!
    原因是效验错误 ,把烧进去的和生成的hex/bin进行对比,不一样的话就报错了。
    还有一点,如果片外的代码小一点,也不会报错,比如2k外部就报错,1.9k就不报错了。。。我用的flash也是w25q64,跟例程一样,分散加载文件里 m_qspiflash_size 大小就是8M,不用修改。然后看一下这个地址,0x9000 b86e,在看map文件,qspi地址最后在0x90001058 长度 43004字节(0xa7fc) ,加一起就是(qspi的使用情况 b854 = 47188字节)
    在这里插入图片描述
    报错的地址在这个地址后面,应该没有用到啊,为啥还进行效验呢?难道是按块进行效验的?如果按块效验的,这个块的后半部分的可能装过其他程序,特别是上一个程序比当前程序大的情况下,那我把qspi全部擦除在重新下载是不是就不报错了呢?有待测试
    解决:
    不清楚~!可以把效验的勾去掉。。。

iap程序

  1. 修改结果如下,只修改了画线部分
    在这里插入图片描述
    如何计算的呢?根据boot例程iap程序bin文件,它生成的这个bin是符合前面的两个猜测的,if也为真,是可以跳转的。
    在这里插入图片描述
    如果不加修改,iap例程是编译不出下面的bin数据的,由此可见,应该是打包错误。。。
    在这里插入图片描述

  2. 去掉分散加载
    在这里插入图片描述

  3. 生成bin

    fromelf --bin -o "$L@L.bin" "#L"
    
  4. bin转为c,经过对比,跳转应该是没问题了
    在这里插入图片描述

  5. 替换boot程序中的iap代码 烧写测试 发现串口有输出 打印了lcd的型号 然后死掉了 至少说明正常跳转了

  6. 找问题,发现QSPI_Enable_Memmapmode函数中 qspi引脚初始化没改,
    qspi.c 中 HAL_QSPI_MspInit 引脚修改

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Clion是一个非常优秀的跨平台C/C++集成开发环境(IDE),可以用于开发各种嵌入式系统的应用程序,包括STM32。下面是在Clion中开发STM32 IAP例程的步骤: 1. 安装工具链 首先,需要在您的电脑上安装ARM GCC工具链。可以从GNU Arm Embedded Toolchain官网下载。下载完成后,将其添加到系统路径中。 2. 创建STM32工程 在Clion中创建新的CMake项目,并添加STMCube。确保使用正确的芯片型号和IAP实现。 3. 配置CMakeList.txt文件 打开CMakeList.txt文件,并添加以下内容: ``` cmake_minimum_required(VERSION 3.17) project(IAP) set(CMAKE_CXX_STANDARD 14) # 添加头文件路径 include_directories( Inc Drivers/STM32F4xx_HAL_Driver/Inc Middlewares/Third_Party/FatFs/src Middlewares/Third_Party/FreeRTOS/Source/include Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F Middlewares/ST/STM32_USB_Device_Library/Core/Inc Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Inc ) # 添加源文件路径 set(SOURCE_FILES Src/main.c Src/stm32f4xx_it.c Src/system_stm32f4xx.c Src/usbd_cdc_if.c Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c Middlewares/Third_Party/FatFs/src/ff.c Middlewares/Third_Party/FatFs/src/ff_gen_drv.c Middlewares/Third_Party/FatFs/src/option/syscall.c Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.c Middlewares/Third_Party/FreeRTOS/Source/list.c Middlewares/Third_Party/FreeRTOS/Source/queue.c Middlewares/Third_Party/FreeRTOS/Source/tasks.c Middlewares/Third_Party/FreeRTOS/Source/timers.c Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.c Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.c Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/portmacro.h Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/portasm.s Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_core.c Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_ctlreq.c Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_ioreq.c Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Src/usbd_cdc.c ) # 添加链接 set(LINKER_FILES "-T${CMAKE_SOURCE_DIR}/STM32F429ZITx_FLASH.ld" "-Wl,--gc-sections" "-u_printf_float" "-u_printf_long_long" "-lm" ) # 设置芯片型号 add_definitions(-DSTM32F429xx) # 添加可执行文件 add_executable(${PROJECT_NAME} ${SOURCE_FILES}) # 添加链接 target_link_libraries(${PROJECT_NAME} ${LINKER_FILES}) ``` 4. 编写代码 在Src目录下编写IAP代码。根据具体芯片型号和IAP实现,代码会有所不同。 5. 构建项目 在Clion中构建项目,并生成可执行文件。将可执行文件烧录到您的STM32芯片中。 6. 测试 测试IAP是否能够正常运行。如果一切正常,您就可以使用IAP来升级您的STM32应用程序了。 以上就是在Clion中开发STM32 IAP例程的步骤。希望对您有所帮助。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值