6289|6

3416

帖子

0

TA的资源

纯净的硅(高级)

楼主
 

【GD32F350 LogicKids】flash跳转 [复制链接]

本帖最后由 ljj3166 于 2018-9-12 22:24 编辑

在logickids的规划中
需要将F350的FLASH区域进行划分
其中比较重要的是分为boot区和app区
其中boot区用于升级F350的固件
App区用于解析脚本数据
就是FLASH的跳转
今天尝试对F350进行了简单的分区
基本上和STM32F1系列的操作一直
几乎可以直接拷贝使用
先看看workspace的工程

Boot代码工程的Flash划分

起始地址是0x8000000
使用了5000H的空间,20kB
APP代码工程的Flash划分


起始地址是0x8005000
剩余的1B000H空间全部分给了脚本解析
基本片上外设驱动也包括在里面
懒得剥离了
看看boot的代码

  1. #include "bootmain.h"

  2. typedef  void (*pFunction)(void);
  3. #define  AppAddress     0x08005000    //应用程序入口地址
  4. uint32_t JumpAddress = 0;
  5. pFunction Jump_To_Application = 0;  //应用程序地址指针
  6. volatile bool jump_flag = false, flash_flag = false;
  7. void SYSRESET(void)  {__disable_fault_irq(); NVIC_SystemReset();}

  8. void go_app(void)
  9. {
  10.         uint32_t ApplicationAddress=0;
  11.                 ApplicationAddress = AppAddress;  

  12.         if (((*(volatile uint32_t*)ApplicationAddress) & 0x2FFE0000 ) == 0x20000000)//判断Flash数据是否合法
  13.         {
  14.                 debug("go app code...\r\n");
  15.                 OLED_ShowString(5,1,"Go Application...",16);
  16.                 delay_1ms(1000);
  17. //各种deinit和禁用IRQ,准备跳转

  18.                 usart_deinit(USART0);
  19.                 usart_deinit(USART1);
  20.                 i2c_deinit(I2C0);
  21.                 spi_i2s_deinit(SPI1);
  22.                 rcu_deinit();
  23.                 __disable_irq() ;
  24.                 __disable_fault_irq();
  25.                 nvic_vector_table_set(NVIC_VECTTAB_FLASH, 0x5000); //地址映射
  26.                 JumpAddress = *(volatile uint32_t*)(ApplicationAddress + 4);
  27.                 Jump_To_Application = (pFunction)JumpAddress;
  28.                 __set_MSP(*(volatile uint32_t*)ApplicationAddress);    //初始化堆栈指针
  29.                 Jump_To_Application();
  30.         }
  31.         else {
  32.                                 debug("no app in board,please download....\r\n");
  33.                                 OLED_ShowString(15,1,"NO Firmware...",16);
  34.                                 while(1);
  35.                                 }
  36. }
复制代码





比较关键的是AppAddress
这个是app程序的起始地址
然后定义一个程序指针
typedef void (*pFunction)(void);
pFunction Jump_To_Application = 0;
当Jump_To_Application指向这个地址的时候,就发生了Flash的跳转
有个比较重要的动作----软件重启指令
void SYSRESET(void)  {__disable_fault_irq(); NVIC_SystemReset();}
最后是最重要的地址映射
GD库中提供了nvic_vector_table_set函数来处理
很方便,至少不需要把中断向量一个个copy出来了
它执行后会重启F350
跳转基本流程在代码中都有注释了

再来看看app中的处理

  1. void VectorTabs_setup(void)
  2. {

  3.          __disable_irq() ;
  4.          __disable_fault_irq();
  5.          usart_deinit(USART0);
  6.          usart_deinit(USART1);
  7.          i2c_deinit(I2C0);
  8.          i2c_deinit(I2C1);
  9.          spi_i2s_deinit(SPI1);
  10.          spi_i2s_deinit(SPI0);
  11.          rcu_deinit();

  12.          nvic_vector_table_set(NVIC_VECTTAB_FLASH, 0x5000);
  13.          __enable_irq();
  14.          __enable_fault_irq();
  15.          SystemInit();
  16. }
复制代码


禁用IRQ
把所有在boot中初始化过的外设全部deinit一次,包括时钟
然后使能IRQ
接着调用SystemInit
其实SystemInit在boot代码的main函数之前就已经调用过
这里调用是因为
Logickids有2种重启方式
一种是单板重启,相当于重新上电
从boot进入app
另一种是app重启,仅重启APP区域的代码
目前采用的方式是将app使用的相关变量置零后
直接调用main完成app的重启
所以这里将SystemInit又重新调用了一次
上个动图


上电进入boot,显示logickids的logo
显示booting,显示进入app
在boot代码中,mcu_led是快速闪烁的
接下来进入app,硬件检测,显示hardware check
然后读取外置Flash的脚本数据,没有的话显示NO APP DATA
在app代码中,mcu_led是慢速闪烁的

As top

此帖出自GD32 MCU论坛

最新回复

感觉这个做下来项目一个人很有挑战啊! 我以为mBlock那样,把Arduino嵌入到MIT的scratch中,不知道这个怎么嵌进去的,如果可以把energia也嵌到scratch就好了   详情 回复 发表于 2018-9-13 10:39
点赞 关注(1)
个人签名

So TM what......?

 

回复
举报

5310

帖子

453

TA的资源

五彩晶圆(高级)

沙发
 
注意下RAM只有16k哦
我最近做gui就遇到莫名奇妙的问题
此帖出自GD32 MCU论坛

点评

是有点少 不过一般不会刷图,基本上也够了 我的沙发啊......  详情 回复 发表于 2018-9-12 22:27
 
 
 

回复

3416

帖子

0

TA的资源

纯净的硅(高级)

板凳
 
蓝雨夜 发表于 2018-9-12 22:19
注意下RAM只有16k哦
我最近做gui就遇到莫名奇妙的问题

是有点少
不过一般不会刷图,基本上也够了
我的沙发啊......
此帖出自GD32 MCU论坛
 
个人签名

So TM what......?

 

 

回复

5310

帖子

453

TA的资源

五彩晶圆(高级)

4
 
你上位机怎么做?
此帖出自GD32 MCU论坛

点评

手机端用的爪哇+as,pc端用的c艹+扣替  详情 回复 发表于 2018-9-13 10:12
 
 
 

回复

3416

帖子

0

TA的资源

纯净的硅(高级)

5
 
蓝雨夜 发表于 2018-9-13 08:23
你上位机怎么做?

手机端用的爪哇+as,pc端用的c艹+扣替
此帖出自GD32 MCU论坛

点评

感觉这个做下来项目一个人很有挑战啊! 我以为mBlock那样,把Arduino嵌入到MIT的scratch中,不知道这个怎么嵌进去的,如果可以把energia也嵌到scratch就好了  详情 回复 发表于 2018-9-13 10:39
 
 
 

回复

5310

帖子

453

TA的资源

五彩晶圆(高级)

6
 
ljj3166 发表于 2018-9-13 10:12
手机端用的爪哇+as,pc端用的c艹+扣替

感觉这个做下来项目一个人很有挑战啊!

我以为mBlock那样,把Arduino嵌入到MIT的scratch中,不知道这个怎么嵌进去的,如果可以把energia也嵌到scratch就好了
此帖出自GD32 MCU论坛

点评

是有点大 其实完全脱离了对单片鸡的编程 而是用单片鸡去解析一些自己制定的命令和数据  详情 回复 发表于 2018-9-14 09:38
 
 
 

回复

3416

帖子

0

TA的资源

纯净的硅(高级)

7
 
蓝雨夜 发表于 2018-9-13 10:39
感觉这个做下来项目一个人很有挑战啊!

我以为mBlock那样,把Arduino嵌入到MIT的scratch中,不知道这 ...

是有点大
其实完全脱离了对单片鸡的编程
而是用单片鸡去解析一些自己制定的命令和数据
此帖出自GD32 MCU论坛
 
个人签名

So TM what......?

 

 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表