使用rtthread移植qboot工程的学习笔记

目前还是一个学生,项目不会做,只能写一些学习笔记,没有什么经验(可能一些自己判断的有一定错误,内容仅作为参考),        个人认为一个健全的项目首先就需要一个bootloader,所以就浅浅记录一下自己使用rtthread studio配置qboot和app工程的制作过程. 芯片使用:stm32f407zg
使用工具:rtthread studio
移植qboot工程过程 1.创建工程1.1 创建qboot的项目工程1.2 浅跑一下试试 2.开始配置spi的外部flash –  w25q16 (这里使用spi1,可根据具体调整)2.1 spi硬件连接2.2 在rtthread setting内开启spi2.3 在board.h内开启使用spi12.4 cubemx setting内配置spi2.5 cubemx setting内配置芯片时钟2.6 添加挂载spi的代码//****************************************//注意这里括号显示就没了 自己包含一下头文件//****************************************//这里添加 rtthread.h//加上 大于小于括号#include #include drv_spi.h#include spi_flash_sfud.h//挂载spiint rt_hw_spi_flash_init(void){ __hal_rcc_gpiob_clk_enable(); //片选引脚为pb14 rt_hw_spi_device_attach(spi1, spi10, gpiob, gpio_pin_14); //片选引脚为pb14 if (rt_null == rt_sfud_flash_probe(w25q16, spi10)) { return -rt_error; } return rt_eok;}init_device_export(rt_hw_spi_flash_init); 2.7 成功创建spi和w25q16 3.使用fal设置分区3.1 添加软件包3.2 board.h 里定义 define bsp_using_on_chip_flash3.3 配置fal3.4 添加路径 因为运行提示找不到fal_cfg.h的路径 在此处运行后,会发现如下错误:(在这个地方有较多的解决方法,但是有的方法在到后面在使用后续的ota升级的时候,会擦除到app区域,具体我也不懂…….)3.5 出现错误 解决方法:(将如下代码 全部替换 到 drv_flash_f4.c 文件)/* * copyright (c) 2006-2018, rt-thread development team * * spdx-license-identifier: apache-2.0 * * change logs: * date author notes */#include board.h#ifdef bsp_using_on_chip_flash#include drv_config.h#include drv_flash.h#if defined(pkg_using_fal)#include fal.h#endif//#define drv_debug#define log_tag drv.flash#include /* base address of the flash sectors bank 1 */#define addr_flash_sector_0 ((uint32_t)0x08000000) /* base @ of sector 0, 16 kbytes */#define addr_flash_sector_1 ((uint32_t)0x08004000) /* base @ of sector 1, 16 kbytes */#define addr_flash_sector_2 ((uint32_t)0x08008000) /* base @ of sector 2, 16 kbytes */#define addr_flash_sector_3 ((uint32_t)0x0800c000) /* base @ of sector 3, 16 kbytes */#define addr_flash_sector_4 ((uint32_t)0x08010000) /* base @ of sector 4, 64 kbytes */#define addr_flash_sector_5 ((uint32_t)0x08020000) /* base @ of sector 5, 128 kbytes */#define addr_flash_sector_6 ((uint32_t)0x08040000) /* base @ of sector 6, 128 kbytes */#define addr_flash_sector_7 ((uint32_t)0x08060000) /* base @ of sector 7, 128 kbytes */#define addr_flash_sector_8 ((uint32_t)0x08080000) /* base @ of sector 8, 128 kbytes */#define addr_flash_sector_9 ((uint32_t)0x080a0000) /* base @ of sector 9, 128 kbytes */#define addr_flash_sector_10 ((uint32_t)0x080c0000) /* base @ of sector 10, 128 kbytes */#define addr_flash_sector_11 ((uint32_t)0x080e0000) /* base @ of sector 11, 128 kbytes *//* base address of the flash sectors bank 2 */#define addr_flash_sector_12 ((uint32_t)0x08100000) /* base @ of sector 0, 16 kbytes */#define addr_flash_sector_13 ((uint32_t)0x08104000) /* base @ of sector 1, 16 kbytes */#define addr_flash_sector_14 ((uint32_t)0x08108000) /* base @ of sector 2, 16 kbytes */#define addr_flash_sector_15 ((uint32_t)0x0810c000) /* base @ of sector 3, 16 kbytes */#define addr_flash_sector_16 ((uint32_t)0x08110000) /* base @ of sector 4, 64 kbytes */#define addr_flash_sector_17 ((uint32_t)0x08120000) /* base @ of sector 5, 128 kbytes */#define addr_flash_sector_18 ((uint32_t)0x08140000) /* base @ of sector 6, 128 kbytes */#define addr_flash_sector_19 ((uint32_t)0x08160000) /* base @ of sector 7, 128 kbytes */#define addr_flash_sector_20 ((uint32_t)0x08180000) /* base @ of sector 8, 128 kbytes */#define addr_flash_sector_21 ((uint32_t)0x081a0000) /* base @ of sector 9, 128 kbytes */#define addr_flash_sector_22 ((uint32_t)0x081c0000) /* base @ of sector 10, 128 kbytes */#define addr_flash_sector_23 ((uint32_t)0x081e0000) /* base @ of sector 11, 128 kbytes *//** * @brief gets the sector of a given address * @param none * @retval the sector of a given address */static rt_uint32_t getsector(rt_uint32_t address){ rt_uint32_t sector = 0; if((address = addr_flash_sector_0)) { sector = flash_sector_0; } else if((address = addr_flash_sector_1)) { sector = flash_sector_1; } else if((address = addr_flash_sector_2)) { sector = flash_sector_2; } else if((address = addr_flash_sector_3)) { sector = flash_sector_3; } else if((address = addr_flash_sector_4)) { sector = flash_sector_4; } else if((address = addr_flash_sector_5)) { sector = flash_sector_5; } else if((address = addr_flash_sector_6)) { sector = flash_sector_6; } else if((address = addr_flash_sector_7)) { sector = flash_sector_7; }#if defined(flash_sector_8) else if((address = addr_flash_sector_8)) { sector = flash_sector_8; }#endif#if defined(flash_sector_9) else if((address = addr_flash_sector_9)) { sector = flash_sector_9; }#endif#if defined(flash_sector_10) else if((address = addr_flash_sector_10)) { sector = flash_sector_10; }#endif#if defined(flash_sector_11) else if((address = addr_flash_sector_11)) { sector = flash_sector_11; }#endif#if defined(stm32f427xx) || defined(stm32f437xx) || defined(stm32f429xx)|| defined(stm32f439xx) || defined(stm32f469xx) || defined(stm32f479xx) else if((address = addr_flash_sector_12)) { sector = flash_sector_12; } else if((address = addr_flash_sector_13)) { sector = flash_sector_13; } else if((address = addr_flash_sector_14)) { sector = flash_sector_14; } else if((address = addr_flash_sector_15)) { sector = flash_sector_15; } else if((address = addr_flash_sector_16)) { sector = flash_sector_16; } else if((address = addr_flash_sector_17)) { sector = flash_sector_17; } else if((address = addr_flash_sector_18)) { sector = flash_sector_18; } else if((address = addr_flash_sector_19)) { sector = flash_sector_19; } else if((address = addr_flash_sector_20)) { sector = flash_sector_20; } else if((address = addr_flash_sector_21)) { sector = flash_sector_21; } else if((address = addr_flash_sector_22)) { sector = flash_sector_22; } else /* (address = addr_flash_sector_23) */ { sector = flash_sector_23; }#endif return sector;}/** * read data from flash. * @note this operation's units is word. * * @param addr flash address * @param buf buffer to store read data * @param size read bytes size * * @return result */int stm32_flash_read(rt_uint32_t addr, rt_uint8_t *buf, size_t size){ size_t i; if ((addr + size) > stm32_flash_end_address) { log_e(read outrange flash size! addr is (0x%p), (void*)(addr + size)); return -1; } for (i = 0; i stm32_flash_end_address) { log_e(write outrange flash size! addr is (0x%p), (void*)(addr + size)); return -rt_einval; } if (size vtor = rt_app_part_addr & nvic_vtor_mask; return 0;}init_board_export(ota_app_vtor_reconfig);int f4_clock_information(void){ log_i(system clock information); log_i(sysclk_frequency = %d, hal_rcc_getsysclockfreq()); log_i(hclk_frequency = %d, hal_rcc_gethclkfreq()); log_i(pclk1_frequency = %d, hal_rcc_getpclk1freq()); log_i(pclk2_frequency = %d, hal_rcc_getpclk2freq()); return rt_eok;}init_device_export(f4_clock_information); 2.修改 \linkscripts\stm32f407zg\link.lds 内的起始地址 2.1 将0x08000000改为你的app分区的地址 3.成功运行结果3.1 最基本的app已经成功运行 附带一个工程文件https://github.com/letian-stu/stm32f407-rtos-qboot-app-prj stm32f4-spi-qboot-mini 对qboot的移植; 分区设置; 可以使用ymodem_ota; stm32f4-spi-usb-at 使用esp8266实现连接网络; http_ota; 使能usb-device对w25q16的filesystem读写;
MCU恒流驱动控制芯片LK1668高性价比的方案分析应用
成功横跨美国东西海岸:自动驾驶卡车
2020年中国互联网营销市场总规模突破万亿大关
工业安卓一体机将加速新型智能化港口的推广
冲击钻和电锤的区别
使用rtthread移植qboot工程的学习笔记
2亿C轮融资、整数规划求解器双发布,杉数科技打造决策优化新引擎
日本芯片技术突破!400层堆叠 3D NAND闪存将至!
城市大气质量监测设备tsp颗粒物在线监测站介绍
硕果累累 福禄克亮相世界传感器大会
FPGA设计技巧分享
什么是帧/S-Force Front Surround
震动开关分类及工作原理
如何降低模数转换器的性能
MAX17031 双通道、Quick-PWM、降压控制器,为
河南省5G网络建设发展推进情况介绍
灵动股份推出基于STAR-MC1的MM32G5330
单片机驱动多个LED指示灯IO口不够的解决方法说明
机器视觉行业发展白皮书,海康机器人助推行业标准化发展
你去将你的基因组测序了吗?面临挑战的基因组数据压缩技术