个人社区网站备案郑州做网站哪家公司好
- 作者: 五速梦信息网
- 时间: 2026年03月21日 11:13
当前位置: 首页 > news >正文
个人社区网站备案,郑州做网站哪家公司好,个人中心登录注册,什么样建网站0 前置知识#xff1a; FLASH相关内容#xff1a;前往STM32补充——FLASH STM32三种烧录方式#xff08;看看就行#xff09;#xff1a; 1.ISP#xff1a;In System Programming#xff08;在系统编程#xff09; 执行芯片厂商的 Bootloader 程序进入 ISP 模式 FLASH相关内容前往STM32补充——FLASH STM32三种烧录方式看看就行 1.ISPIn System Programming在系统编程 执行芯片厂商的 Bootloader 程序进入 ISP 模式进入ISP 模式后用户可选择官方提供的烧录通信接口如串口并配合ISP 编程工具如FlyMcu对闪存进行烧录。 2.ICPIn Circuit Programing在线编程 使用IDE并通过JTAG/SWD接口对闪存进行烧录。 3.IAPIn Application Programming在应用编程 使用用户的应用程序也称为Bootloader程序对闪存进行烧录。该应用程序需要通过一种通信接口如IO口\USB\CAN\UART\I2C\SPI等对闪存进行烧录即把APP程序烧录到闪存。IAP 通常被开发者用作远程升级的手段。 1.IAP原理介绍 1.1 程序正常运行过程 ①跳转到复位中断服务函数 ②跳转到main函数 ③发生中断时会强制跳转到中断向量表 ④根据中断源跳转到对应的中断服务函数 ⑤执行中断服务程序后回到main函数原来的位置执行 1.2 加入IAP后程序运行过程 ①执行复位中断服务函数后跳转到IAP程序main函数 ②执行IAP过程跳转到APP中断向量表 ③跳转到APP的main函数 ④发生中断时会强制跳转到地址为0x08000000的中断向量表 ⑤根据设置的中断向量表偏移量跳转到APP对应的中断服务函数 ⑥执行中断服务程序后回到main函数原来的位置执行 2.APP的生成步骤 设置APP程序的起始地址和存储空间大小设置中断向量表偏移量设置SCB-VTOR的值即可设置MDK编译后运行fromelf.exe生成.bin文件在User选项卡设置编译后调用fromelf.exe根据.axf文件生成.bin文件用于IAP更新 注意APP程序的起始地址可在Keil上直接设置但中断向量表偏移量需要另外手动设置 2.1 设置APP程序的起始地址和存储空间大小 设置APP起始地址要注意的点 1APP要在BootLoader后面 2内存不能出现重叠 3偏移量是0x200的倍数 FLASH_APP SRAM_APP: ①Bootloader程序运行预留4KB SRAM ②存放APP程序预留48KB SRAM ③APP程序运行预留12KB SRAM 2.2 设置中断向量表偏移量 APP存放在FLASH中的设置方法 SCB-VTOR FLASH_BASE | 0x10000; APP存放在SRAM中的设置方法 SCB-VTOR SRAM_BASE | 0x1000;2.3 设置MDK编译后运行fromelf.exe生成.bin文件 D:\MDK5.36\ARM\ARMCC\bin\fromelf –bin -o ....\Output\L.bin ....\Output\%L 3. 代码 iap模块 iapfun jump2app; uint16_t g_iapbuf[1024]; /* 2K字节缓存 //** brief IAP写入APP BIN* param appxaddr : 应用程序的起始地址* param appbuf : 应用程序CODE* param appsize : 应用程序大小(字节)* retval 无*/ void iap_write_appbin(uint32_t appxaddr, uint8_t appbuf, uint32_t appsize) {uint16_t t;uint16_t i 0;uint16_t temp;uint32_t fwaddr appxaddr; / 当前写入的地址 */uint8_t dfu appbuf;for (t 0; t appsize; t 2){temp (uint16_t)dfu[1] 8;temp | (uint16_t)dfu[0];dfu 2; / 偏移2个字节FLASH每次写入两个字节 /g_iapbuf[i] temp;if (i 1024){i 0;stmflash_write(fwaddr, g_iapbuf, 1024);fwaddr 2048; / 偏移2048 16 2 * 8 所以要乘以2 /}}if (i){stmflash_write(fwaddr, g_iapbuf, i); / 将最后的一些内容字节写进去 /} }/** brief 跳转到应用程序段(执行APP)* param appxaddr : 应用程序的起始地址* retval 无/ void iap_load_app(uint32_t appxaddr) {if ((((volatile uint32_t )appxaddr) 0x2FFE0000) 0x20000000) / 检查栈顶地址是否合法.可以放在内部SRAM共64KB(0x20000000) /{/ 用户代码区第二个字为程序开始地址(复位地址) */jump2app (iapfun) * (volatile uint32_t )(appxaddr 4);/ 初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址) /sys_msr_msp((volatile uint32_t )appxaddr);/ 跳转到APP /jump2app();} } main函数 int main(void) {uint8_t t;uint8_t key;uint32_t oldcount 0; / 老的串口接收数据值 /uint32_t applenth 0; / 接收到的app代码长度 /uint8_t clearflag 0;HAL_Init(); / 初始化HAL库 /sys_stm32_clock_init(RCC_PLL_MUL9); / 设置时钟, 72Mhz /delay_init(72); / 延时初始化 /usart_init(115200); / 串口初始化为115200 /led_init(); / 初始化LED /lcd_init(); / 初始化LCD /key_init(); / 初始化按键 /lcd_show_string(30, 50, 200, 16, 16, STM32, RED);lcd_show_string(30, 70, 200, 16, 16, IAP TEST, RED);lcd_show_string(30, 90, 200, 16, 16, ATOMALIENTEK, RED);lcd_show_string(30, 110, 200, 16, 16, KEY_UP: Copy APP2FLASH!, RED);lcd_show_string(30, 130, 200, 16, 16, KEY1: Run FLASH APP, RED);lcd_show_string(30, 150, 200, 16, 16, KEY0: Run SRAM APP, RED);while (1){if (g_usart_rx_cnt){if (oldcount g_usart_rx_cnt) / 新周期内,没有收到任何数据,认为本次数据接收完成 /{applenth g_usart_rx_cnt;oldcount 0;g_usart_rx_cnt 0;printf(用户程序接收完成!\r\n);printf(代码长度:%dBytes\r\n, applenth);}else oldcount g_usart_rx_cnt;}t;delay_ms(100);if (t 3){LED0_TOGGLE();t 0;if (clearflag){clearflag–;if (clearflag 0){lcd_fill(30, 190, 240, 210 16, WHITE); / 清除显示 /}}}key key_scan(0);if (key WKUP_PRES) / WKUP按下,更新固件到FLASH /{if (applenth){printf(开始更新固件…\r\n);lcd_show_string(30, 190, 200, 16, 16, Copying APP2FLASH…, BLUE);if ((((volatile uint32_t )(0X20001000 4)) 0xFF000000) 0x08000000) / 判断是否为0X08XXXXXX /{iap_write_appbin(FLASH_APP1_ADDR, g_usart_rx_buf, applenth); / 更新FLASH代码 /lcd_show_string(30, 190, 200, 16, 16, Copy APP Successed!!, BLUE);printf(固件更新完成!\r\n);}else{lcd_show_string(30, 190, 200, 16, 16, Illegal FLASH APP! , BLUE);printf(非FLASH应用程序!\r\n);}}else{printf(没有可以更新的固件!\r\n);lcd_show_string(30, 190, 200, 16, 16, No APP!, BLUE);}clearflag 7; / 标志更新了显示,并且设置7*300ms后清除显示 /}if (key KEY1_PRES) / KEY1按键按下, 运行FLASH APP代码 /{if ((((volatile uint32_t )(FLASH_APP1_ADDR 4)) 0xFF000000) 0x08000000) / 判断FLASH里面是否有APP,有的话执行 /{printf(开始执行FLASH用户代码!!\r\n\r\n);delay_ms(10);iap_load_app(FLASH_APP1_ADDR);/ 执行FLASH APP代码 /}else{printf(没有可以运行的固件!\r\n);lcd_show_string(30, 190, 200, 16, 16, No APP!, BLUE);}clearflag 7; / 标志更新了显示,并且设置7*300ms后清除显示 /}if (key KEY0_PRES) / KEY0按下 /{printf(开始执行SRAM用户代码!!\r\n\r\n);delay_ms(10);if ((((volatile uint32_t )(0x20001000 4)) 0xFF000000) 0x20000000) / 判断是否为0X20XXXXXX /{iap_load_app(0x20001000); / SRAM地址 /}else{printf(非SRAM应用程序,无法执行!\r\n);lcd_show_string(30, 190, 200, 16, 16, Illegal SRAM APP!, BLUE);}clearflag 7; / 标志更新了显示,并且设置7*300ms后清除显示 */}} }
- 上一篇: 个人商城网站建设中企动力网站好么
- 下一篇: 个人使用网站xampp wordpress 绑定域名
相关文章
-
个人商城网站建设中企动力网站好么
个人商城网站建设中企动力网站好么
- 技术栈
- 2026年03月21日
-
个人如何做短视频网站北京海淀区建设局网站
个人如何做短视频网站北京海淀区建设局网站
- 技术栈
- 2026年03月21日
-
个人如何在企业网站做实名认证上海人才网官网入口查询
个人如何在企业网站做实名认证上海人才网官网入口查询
- 技术栈
- 2026年03月21日
-
个人使用网站xampp wordpress 绑定域名
个人使用网站xampp wordpress 绑定域名
- 技术栈
- 2026年03月21日
-
个人手机网站大全seo整站网站推广优化排名
个人手机网站大全seo整站网站推广优化排名
- 技术栈
- 2026年03月21日
-
个人手机网站建设国外做免费网站的
个人手机网站建设国外做免费网站的
- 技术栈
- 2026年03月21日






