OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 28416|回复: 65

福利来啦!!!STM32F407通过SD卡进行程序升级(把bin文件烧写到FLASH的方式)

  [复制链接]

16

主题

216

帖子

1

精华

高级会员

Rank: 4

积分
970
金钱
970
注册时间
2016-11-24
在线时间
156 小时
发表于 2016-12-14 16:29:23 | 显示全部楼层 |阅读模式
        发福利啦~~~STM32F407通过SD卡进行升级的程序已经修改好并且上传。该bootloader是直接把bin文件烧写到flash里面去,不是原子哥的跳转哦,理论上可以烧写960k的bin程序。程序流程是把一个需要烧写的bin文件放到SD卡里面,然后在bootloader程序里读出来并把bin文件烧写到指定的FLASH区域,并且让该程序运行。
        说说辛酸史~~~~刚开始的时候走了很多弯路,第一个思路是像原子哥那样,通过把bin文件的内容复制到SRAM然后进行跳转运行,但后来仔细看了资料和他的程序,发现他的程序有限制,要在100k左右,太大了无法放得下,而且这个不是烧写到FLASH去运行,于是放弃这个思路。第二思路是把bin文件的内容复制到外部SRAM里面去,然后在外部SRAM里面运行时候,再把外部SRAM里面的bin内容给烧写到FLASH,相当于一开始从FLASH运行的程序跳转到外部SRAM去运行,然后通过外部SRAM运行的这个程序去把FLASH的内容给修改了,就是烧写新的程序。按照思路,在外部SRAM运行的程序是能够“独立”运行了,已经和FLASH没有关系,那时也能够对FLASH进行烧写,烧写地址是从0x8000000开始的,但烧写到16K以后就死掉了,就是整个程序都崩溃了。以为是在外部SRAM运行的程序不能把它自身的内容给复制出去,外部SRAM的程序存放地址是0x6800000,然后我又把0x6800000这个地址开始的数据复制出来烧写到FLASH去,有点像是一个人在跑步的时候把腿提起来给别人看一样,想想都觉得问题会出现在这里,使劲折腾验证了半天,发现不是这个问题,跑步的时候提起腿来给别人看居然没有“摔倒”~~~后来又去看了资料,发现所有运行的程序中断时都需要跑到FLASH的复位中断向量那里,但我都烧写到16K了,才跑出来折腾,这有点说不过去~~~反正到现在我也不知道是什么鬼在影响,哪位大神了解得可以解释解释。。。后来没办法了,只能换第三个思路,就是老老实实的写一个bootloader引导程序,然后把需要烧写的bin文件烧写到指定的FLASH里去。这个思路是通的,结果也是可以的。而且通过这种方式升级,速度比用FlyMcu.exe串口烧写的快很多很多。具体思路是通过修改原子哥第五十五章串口IAP实验里面的那个bootloader程序,把串口的那些功能全部去掉(串口升级的限制是120K左右,完全不够用啊,分包升级的方式感觉没什么思路也懒得动~~),把原子哥最后那个综合实验里面的 exeplay程序给移植进来,把打开SD卡进行选择文件升级直接给固定死成到SD卡里面的某个文件夹下面去找bin文件,比如在update文件夹下面找,目前只做了把一个bin文件放到这个文件夹下,然后直接升级,直接去掉人工选择的方式(人工选择的方式其实也挺好的,就是觉得固定死文件路径更加方便,避免麻烦)。在bootloader程序里面读到升级的标志位或者检测到按键按下,然后就去SD卡的update文件夹下读bin文件,并且把内容复制到外部SRAM(外部SRAM开辟了960K可以用来存这些数据),然后把从0x08010000到末尾的FLASH区域数据全部删除,再把外部SRAM的bin文件数据从0x08010000开始开始烧写进FLASH,烧写完成了,就把升级标志位清零,然后重启,重启时当然还是先从bootloader的程序开始运行,但判断到到标志位为0后以及0x08010000开始的数据不为FFFF则进行程序跳转。需要注意的是,用来升级的bin文件的起始地址要从0x08010000开始,设置好就可以了。现在还想通过网页传送bin文件的方式进行程序升级,可是网页方面没怎么接触,真希望有思路的大神能指导一二呀。至于这个SD卡升级的程序我就不敢贴出来献丑啦,现在加了网络的程序进去,基本上面目全非~~重要的SD卡升级程序部分还是有的,大神们也可以通过改改原子哥的程序来实现。其实SD卡升级在很多地方还是很有必要的,比如生产的时候,烧写好bootloader程序之后,插个有bin文件的SD卡进去升级就可以了,那速度真心快啊。

stm32f407bootloader_2.4.zip

6.74 MB, 下载次数: 29121

bootloader程序

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2016-12-14 17:24:45 | 显示全部楼层
不错,有研究精神。
赞一个.....
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

16

主题

216

帖子

1

精华

高级会员

Rank: 4

积分
970
金钱
970
注册时间
2016-11-24
在线时间
156 小时
 楼主| 发表于 2016-12-15 08:57:00 | 显示全部楼层
正点原子 发表于 2016-12-14 17:24
不错,有研究精神。
赞一个.....

那还是多亏原子哥呀,很多东西都是跟着原子哥学的
回复 支持 反对

使用道具 举报

5

主题

26

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
373
金钱
373
注册时间
2016-8-2
在线时间
106 小时
发表于 2016-12-15 15:08:30 | 显示全部楼层
能否不用扩展外部SRAM,直接从SD卡升级呢
回复 支持 反对

使用道具 举报

16

主题

216

帖子

1

精华

高级会员

Rank: 4

积分
970
金钱
970
注册时间
2016-11-24
在线时间
156 小时
 楼主| 发表于 2016-12-15 16:12:24 | 显示全部楼层
491603829 发表于 2016-12-15 15:08
能否不用扩展外部SRAM,直接从SD卡升级呢

按道理是可以的,但比较麻烦,主要就是你要从SD卡读数据的时候,得有个大的内存来存放这些数据,不然你只能读一段数据就把一段数据烧写进FLASH里面去,实现起来比较繁琐。用外部SRAM直接就把一整个bin的数据全部弄出来,然后再把这些数据烧写进FLASH里面去,过程比较简便。
回复 支持 反对

使用道具 举报

0

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
90
金钱
90
注册时间
2016-12-15
在线时间
20 小时
发表于 2016-12-15 17:18:42 | 显示全部楼层
点个赞,来看看怎么实现的
回复 支持 反对

使用道具 举报

16

主题

216

帖子

1

精华

高级会员

Rank: 4

积分
970
金钱
970
注册时间
2016-11-24
在线时间
156 小时
 楼主| 发表于 2016-12-16 13:39:15 | 显示全部楼层
yklstudent 发表于 2016-12-16 08:54
实际一般都是一边读一边写的,谁会为了升级特意外挂个外部SRAM呢;除非现成的。。。

开发板上有的所以就用现成的,边读边写也是可以的,程序上修改修改就好了,不过外部SRAM用处比较大,一般做点大的项目挂上去跑得比较欢啊
回复 支持 反对

使用道具 举报

3

主题

85

帖子

0

精华

高级会员

Rank: 4

积分
586
金钱
586
注册时间
2016-5-13
在线时间
106 小时
发表于 2016-12-17 11:07:43 | 显示全部楼层
建议你在APP程序里设置版本号,然后Bootloader是根据版本号的新旧来觉得是否升级,我的SD卡升级是这样的
弄2K的读取缓存就可以了,不过没有加CRC校验,只是做了文件大小校验,边读边写,写入完成直接跳转
回复 支持 反对

使用道具 举报

16

主题

216

帖子

1

精华

高级会员

Rank: 4

积分
970
金钱
970
注册时间
2016-11-24
在线时间
156 小时
 楼主| 发表于 2016-12-19 09:17:16 | 显示全部楼层
yklstudent 发表于 2016-12-16 14:19
看来你们做的都是大项目

仅仅是学习用而已啦
回复 支持 反对

使用道具 举报

16

主题

216

帖子

1

精华

高级会员

Rank: 4

积分
970
金钱
970
注册时间
2016-11-24
在线时间
156 小时
 楼主| 发表于 2016-12-19 09:21:48 | 显示全部楼层
abdfgh 发表于 2016-12-17 11:07
建议你在APP程序里设置版本号,然后Bootloader是根据版本号的新旧来觉得是否升级,我的SD卡升级是这样的
弄2 ...

这也是个好办法,只是bin文件里面怎么识别这个版本号呢
回复 支持 反对

使用道具 举报

3

主题

85

帖子

0

精华

高级会员

Rank: 4

积分
586
金钱
586
注册时间
2016-5-13
在线时间
106 小时
发表于 2016-12-19 09:51:52 | 显示全部楼层
lzq12 发表于 2016-12-19 09:21
这也是个好办法,只是bin文件里面怎么识别这个版本号呢

1.jpg

把APP文件里加上版本号,固定在固定的位置,当然要算好不要影响到程序
我做的最简单的方式,bin文件的文件名就是版本号,fatfs找到bin文件检查文件名,然后和当前APP版本号进行对比,大于就升级,小于等于就略过
当然你也可以选择打开bin文件然后在固定位置查找版本号,不过我没有做那么麻烦
回复 支持 反对

使用道具 举报

16

主题

216

帖子

1

精华

高级会员

Rank: 4

积分
970
金钱
970
注册时间
2016-11-24
在线时间
156 小时
 楼主| 发表于 2016-12-19 11:15:40 | 显示全部楼层
abdfgh 发表于 2016-12-19 09:51
把APP文件里加上版本号,固定在固定的位置,当然要算好不要影响到程序
我做的最简单的方式,bin文件的 ...

这方法不错,就是在做项目的时候要先把整个程序的大小给设定好,然后以后如果有升级,也要把程序的大小控制在这个版本号存放的地址之前,涨知识啦
回复 支持 反对

使用道具 举报

5

主题

179

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
8194
金钱
8194
注册时间
2016-9-7
在线时间
1113 小时
发表于 2016-12-19 21:21:39 | 显示全部楼层
楼主的思路很不错,请教下,对sd卡有无要求,比如容量,速度等
回复 支持 反对

使用道具 举报

16

主题

216

帖子

1

精华

高级会员

Rank: 4

积分
970
金钱
970
注册时间
2016-11-24
在线时间
156 小时
 楼主| 发表于 2016-12-20 10:57:17 | 显示全部楼层
lrzxc 发表于 2016-12-19 21:21
楼主的思路很不错,请教下,对sd卡有无要求,比如容量,速度等

我目前用的是8G的内存卡,其他的没有试过,但这个是原子哥探索者的开发板,理论上秒杀所有类型,有机会倒是可以试试其他的卡是否支持,要是碰到不支持的大家也拿出来讨论讨论
回复 支持 反对

使用道具 举报

11

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2016-11-15
在线时间
55 小时
发表于 2016-12-22 10:10:36 | 显示全部楼层
请教楼主,为什么我的SD卡升级程序可以升级原子哥的代码,自己的代码不能升级成功,就是可以读写进去,但是跳转过去之后无法运行APP程序,这是什么原因?
回复 支持 反对

使用道具 举报

16

主题

216

帖子

1

精华

高级会员

Rank: 4

积分
970
金钱
970
注册时间
2016-11-24
在线时间
156 小时
 楼主| 发表于 2016-12-23 09:09:05 | 显示全部楼层
jiang633 发表于 2016-12-22 10:10
请教楼主,为什么我的SD卡升级程序可以升级原子哥的代码,自己的代码不能升级成功,就是可以读写进去,但是 ...

你的主程序设置好中断向量偏移地址了么,SCB->VTOR = FLASH_BASE | 0x10000;,这个语句要根据你的实际偏移地址来写,放在程序的开头哦,要放在分配中断组什么的前面
回复 支持 反对

使用道具 举报

10

主题

45

帖子

0

精华

初级会员

Rank: 2

积分
118
金钱
118
注册时间
2013-7-2
在线时间
20 小时
发表于 2016-12-23 11:35:44 | 显示全部楼层
帮顶!赞一个!
疾风追电,满月夜郎啸苍天,我辈少年狂!!
回复 支持 反对

使用道具 举报

11

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2016-11-15
在线时间
55 小时
发表于 2016-12-24 10:48:15 | 显示全部楼层
lzq12 发表于 2016-12-23 09:09
你的主程序设置好中断向量偏移地址了么,SCB->VTOR = FLASH_BASE | 0x10000;,这个语句要根据你的实际偏 ...

设置了,现在我的APP是可以跳转过去运行的,可是定时器出现问题了,单独烧APP的话定时器没有问题,通过SD卡升级进去,定时器就没反映了,这是怎么回事?
回复 支持 反对

使用道具 举报

16

主题

216

帖子

1

精华

高级会员

Rank: 4

积分
970
金钱
970
注册时间
2016-11-24
在线时间
156 小时
 楼主| 发表于 2016-12-24 14:43:29 | 显示全部楼层
jiang633 发表于 2016-12-24 10:48
设置了,现在我的APP是可以跳转过去运行的,可是定时器出现问题了,单独烧APP的话定时器没有问题,通过SD ...

你在options for target那里也设置了相应的偏移地址了么
回复 支持 反对

使用道具 举报

11

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2016-11-15
在线时间
55 小时
发表于 2016-12-24 17:07:25 | 显示全部楼层
lzq12 发表于 2016-12-24 14:43
你在options for target那里也设置了相应的偏移地址了么

也一样设置了,我想问一下你的SD卡升级程序支持定时器设置吗?
回复 支持 反对

使用道具 举报

16

主题

216

帖子

1

精华

高级会员

Rank: 4

积分
970
金钱
970
注册时间
2016-11-24
在线时间
156 小时
 楼主| 发表于 2016-12-26 08:54:53 | 显示全部楼层
jiang633 发表于 2016-12-24 17:07
也一样设置了,我想问一下你的SD卡升级程序支持定时器设置吗?

你是说主程序么,这个和bootloader没有关系的吧,我主程序的功能都能用呢,你要不试试直接修改原子哥的定时器程序,就只改那个中断向量的偏移地址,如果这个都可以,那说明你的程序估计是哪里没有设置好,如果都不行,那我也看看我这个bootloader是不是哪里还有bug,目前我的主程序上都用了很多资源,SD卡读写,USB,LWIP,音乐播放,串口,触屏显示,输入法,这些都是没有出现问题的呢
回复 支持 反对

使用道具 举报

11

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2016-11-15
在线时间
55 小时
发表于 2016-12-26 09:40:02 | 显示全部楼层
lzq12 发表于 2016-12-26 08:54
你是说主程序么,这个和bootloader没有关系的吧,我主程序的功能都能用呢,你要不试试直接修改原子哥的定 ...

你在你的BOOT里面初始化一个定时器看看串口是否还能输出数据,我用原子哥的升级代码初始化了一个定时器之后串口就无法输出数据了,不知道是不是我没设置好的原因,你可以试试看
回复 支持 反对

使用道具 举报

16

主题

216

帖子

1

精华

高级会员

Rank: 4

积分
970
金钱
970
注册时间
2016-11-24
在线时间
156 小时
 楼主| 发表于 2016-12-26 10:03:30 | 显示全部楼层
jiang633 发表于 2016-12-26 09:40
你在你的BOOT里面初始化一个定时器看看串口是否还能输出数据,我用原子哥的升级代码初始化了一个定时器之 ...

首先来理顺一下你的程序:1、你是在我这个bootloader里面添加了定时器和串口功能么?如果时这样的话,那你要增加NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);这个中断优先级分组代码,还有就是我的bootloader里面的程序是把原子哥那个bootloader的串口设置那些都改掉了的,原子哥那个bootloader里面的串口设置和平时我们用的串口设置方法有点区别的呢,这个你得注意一下。2、bootloader程序本身就要求简单,不知道增加定时器是要做什么呢,如果没有必要,建议在主程序app里面增加定时器的相关功能,还有就是主程序里面也要有NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);和相关的初始化功能。3、你看一下定时器和串口的中断有没有设置好,尽量对照一下已经成功的代码。
回复 支持 反对

使用道具 举报

11

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2016-11-15
在线时间
55 小时
发表于 2016-12-26 14:21:28 | 显示全部楼层
lzq12 发表于 2016-12-26 10:03
首先来理顺一下你的程序:1、你是在我这个bootloader里面添加了定时器和串口功能么?如果时这样的话,那 ...

我用的不是你的bootloader,是用别人改原子哥通过串口升级的代码,增加NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);是在bootloader还是在APP增加,bootloader已经增加有了NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);,bootloader和APP都有串口初始化,是否要区分设置他们的中断优先级?我发现用自己的定时器没法应,原子哥的定时器没有什么影响,可以使用,
回复 支持 反对

使用道具 举报

16

主题

216

帖子

1

精华

高级会员

Rank: 4

积分
970
金钱
970
注册时间
2016-11-24
在线时间
156 小时
 楼主| 发表于 2016-12-27 08:52:51 | 显示全部楼层
jiang633 发表于 2016-12-26 14:21
我用的不是你的bootloader,是用别人改原子哥通过串口升级的代码,增加NVIC_PriorityGroupConfig(NVIC_Pr ...

只要用到了中断,就增加NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);,按道理是不用区分中断优先级的,不过为了排除问题,区分一下也可以,如果怕bootloader设置的定时器中断会影响到APP的,那就在APP那里先关闭在bootloader的开启的中断,原理上,跳转到APP之后,bootloader的代码是不会再执行的,还有就是看一下bootloader的bin文件大小,看看有没有超出,原子哥的串口升级代码对APP的大小也有限制的,这个也得看一下
回复 支持 反对

使用道具 举报

11

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2016-11-15
在线时间
55 小时
发表于 2016-12-27 18:22:48 | 显示全部楼层
lzq12 发表于 2016-12-27 08:52
只要用到了中断,就增加NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);,按道理是不用区分中断优先级 ...

我想问一下你的APP有没有用到定时器呀?没有用的话试用带有定时器的APP试一下看看咧,顺便给我个答案是不是定时器出现问题了
回复 支持 反对

使用道具 举报

16

主题

216

帖子

1

精华

高级会员

Rank: 4

积分
970
金钱
970
注册时间
2016-11-24
在线时间
156 小时
 楼主| 发表于 2016-12-29 09:17:37 | 显示全部楼层
jiang633 发表于 2016-12-27 18:22
我想问一下你的APP有没有用到定时器呀?没有用的话试用带有定时器的APP试一下看看咧,顺便给我个答案是不 ...

可以啊,我开定时器3,中断里面就LED1闪烁,没有任何问题,主函数里面放TIM3_Int_Init(5000-1,8400-1);        ,中断里:void TIM3_IRQHandler(void)
{
        if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET)
        {
                LED1=!LED1;//D
        }
        TIM_ClearITPendingBit(TIM3,TIM_IT_Update);  
},定时器初始化函数就用原子哥的,
void TIM3_Int_Init(u16 arr,u16 psc)
{
        TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
       
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);  ///ê1ÄüTIM3ê±Öó
       
  TIM_TimeBaseInitStructure.TIM_Period = arr;         //×Ô¶ˉÖØ×°ÔØÖμ
        TIM_TimeBaseInitStructure.TIM_Prescaler=psc;  //¶¨ê±Æ÷·ÖÆμ
        TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //ÏòéϼÆêyÄ£ê½
        TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
       
        TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);
       
        TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE); //ÔêDí¶¨ê±Æ÷3¸üDÂÖD¶Ï
        TIM_Cmd(TIM3,ENABLE); //ê1Äü¶¨ê±Æ÷3
       
        NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn; //¶¨ê±Æ÷3ÖD¶Ï
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x02; //ÇàÕ¼óÅÏ輶2
        NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x00; //×óóÅÏ輶0
        NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
        NVIC_Init(&NVIC_InitStructure);                                                         
}
回复 支持 反对

使用道具 举报

11

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2016-11-15
在线时间
55 小时
发表于 2016-12-29 10:27:14 | 显示全部楼层
lzq12 发表于 2016-12-29 09:17
可以啊,我开定时器3,中断里面就LED1闪烁,没有任何问题,主函数里面放TIM3_Int_Init(5000-1,8400-1);         ...

现在发现不是定时器的问题,应该是中断向量没有找到,所以一直没有进入中断处理函数,现在还是没有解决问题, void NVIC_Configuration()
{
  NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x10000);
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
}

int main(void)
{
//          RCC_DeInit();
//          NVIC_DeInit();
   RCC_Configuration();
// NVIC_SetVectorTable(0x08000000,0x0010000);
   SCB->VTOR = FLASH_BASE | 0x10000;
//         NVIC_Configuration();
       
//                __disable_irq();
          __enable_irq();



void NVIC_SetVectorTable(uint32_t NVIC_VectTab, uint32_t Offset)
{
  /* Check the parameters */
  assert_param(IS_NVIC_VECTTAB(NVIC_VectTab));
  assert_param(IS_NVIC_OFFSET(Offset));  
       
  SCB->VTOR = NVIC_VectTab | 0x10000;
//  SCB->VTOR = NVIC_VectTab | (Offset & (uint32_t)0x1FFFFF80);
}
这些都试过了,还是没能解决问题,请问大神现在要怎么弄了?
回复 支持 反对

使用道具 举报

16

主题

216

帖子

1

精华

高级会员

Rank: 4

积分
970
金钱
970
注册时间
2016-11-24
在线时间
156 小时
 楼主| 发表于 2016-12-29 13:31:03 | 显示全部楼层
jiang633 发表于 2016-12-29 10:27
现在发现不是定时器的问题,应该是中断向量没有找到,所以一直没有进入中断处理函数,现在还是没有解决问 ...

你把SCB->VTOR = FLASH_BASE | 0x10000;弄成main的第一条语句,放在RCC_Configuration();前面试了也不行么?首先要确保已经能够正确跳转到该APP程序,然后APP里面就做个最简单的LED灯闪烁提示,如果只是定时器中断等无法进入中断,但其他程序能正常运行,那可能是APP中断向量的设置有问题,实在不行就直接用人家成功的APP直接修改,有时候新建一个工程反而就成功了的情况也是有的
回复 支持 反对

使用道具 举报

11

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2016-11-15
在线时间
55 小时
发表于 2016-12-29 15:51:28 | 显示全部楼层
lzq12 发表于 2016-12-29 13:31
你把SCB->VTOR = FLASH_BASE | 0x10000;弄成main的第一条语句,放在RCC_Configuration();前面试了也不行 ...

现在发现并不是定时器和中断向量的问题,定时器中断可以正常运行,现在可能是串口问题,BOOT初始化了串口和一个中断函数,APP里面又初始化了两个串口和一个串口中断处理函数,现在通过BOOT运行APP除了串口不输出数据,其他都是正常的,单独APP烧录是可以输出数据的,这问题怎么解决?
回复 支持 反对

使用道具 举报

16

主题

216

帖子

1

精华

高级会员

Rank: 4

积分
970
金钱
970
注册时间
2016-11-24
在线时间
156 小时
 楼主| 发表于 2016-12-30 15:37:34 | 显示全部楼层
jiang633 发表于 2016-12-29 15:51
现在发现并不是定时器和中断向量的问题,定时器中断可以正常运行,现在可能是串口问题,BOOT初始化了串口 ...

那你得好好看看bootloader和APP的串口设置了,尽量设置不一样的,中断优先级那些也不一样试试,还有波特率的问题
回复 支持 反对

使用道具 举报

11

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2016-11-15
在线时间
55 小时
发表于 2016-12-30 17:41:59 | 显示全部楼层
lzq12 发表于 2016-12-30 15:37
那你得好好看看bootloader和APP的串口设置了,尽量设置不一样的,中断优先级那些也不一样试试,还有波特 ...

我找到问题出现在那里了,只要把usmart_dev.init(72);这句屏蔽了之后就可以了
回复 支持 反对

使用道具 举报

16

主题

216

帖子

1

精华

高级会员

Rank: 4

积分
970
金钱
970
注册时间
2016-11-24
在线时间
156 小时
 楼主| 发表于 2016-12-31 09:21:43 | 显示全部楼层
jiang633 发表于 2016-12-30 17:41
我找到问题出现在那里了,只要把usmart_dev.init(72);这句屏蔽了之后就可以了

这个是对USMART的初始化,怪不得你的串口会有问题,估计是你自己设置的和这个USMART设置的有冲突了,可以参考一下原子哥的综合实验,他里面对串口和USMART的设置都是可以用的
回复 支持 反对

使用道具 举报

11

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2016-11-15
在线时间
55 小时
发表于 2017-1-15 11:32:27 | 显示全部楼层
lzq12 发表于 2016-12-31 09:21
这个是对USMART的初始化,怪不得你的串口会有问题,估计是你自己设置的和这个USMART设置的有冲突了,可以 ...

楼主你好,我现在想问一下怎么把升级的APP存放在外部flash里面?还有怎么设置存放地址呀?
回复 支持 反对

使用道具 举报

16

主题

216

帖子

1

精华

高级会员

Rank: 4

积分
970
金钱
970
注册时间
2016-11-24
在线时间
156 小时
 楼主| 发表于 2017-1-16 08:52:27 | 显示全部楼层
jiang633 发表于 2017-1-15 11:32
楼主你好,我现在想问一下怎么把升级的APP存放在外部flash里面?还有怎么设置存放地址呀?

你是说让APP在外部FLASH运行还是让APP不存储在SD卡而是放在外部FLASH中呢?如果是在外部FLASH运行那个我没有试过呢,也要看能不能在外部运行得了。如果是存储在外部FLASH,那可以通过插入USB的方式(原子哥的综合实验 U盘模式),直接把外部FLASH弄成一个U盘来存储,在里面建立一个文件夹存放bin文件,然后在bootloader程序里面设置文件夹的路径就好了。
回复 支持 反对

使用道具 举报

11

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2016-11-15
在线时间
55 小时
发表于 2017-1-16 11:22:10 | 显示全部楼层
lzq12 发表于 2017-1-16 08:52
你是说让APP在外部FLASH运行还是让APP不存储在SD卡而是放在外部FLASH中呢?如果是在外部FLASH运行那个我 ...

原本APP是放在SD卡,然后通过u-boot升级到内部flash运行,现在想把u-boot升级进来的APP存储在外部flash里面,然后通过u-boot引导运行,不知道这样子行不行?地址和外部flash的ID号怎么搞?
回复 支持 反对

使用道具 举报

16

主题

216

帖子

1

精华

高级会员

Rank: 4

积分
970
金钱
970
注册时间
2016-11-24
在线时间
156 小时
 楼主| 发表于 2017-1-16 11:46:31 | 显示全部楼层
jiang633 发表于 2017-1-16 11:22
原本APP是放在SD卡,然后通过u-boot升级到内部flash运行,现在想把u-boot升级进来的APP存储在外部flash里 ...

那你的意思就是用外部FLASH代替SD卡存放bin文件,是吧?如果是我的那个bootloader直接在iap.c里面的SETTING_UPDATE_DIR修改成"1:/UPDATE",然后在外部FLASH中建立UPDATE文件夹,再把bin文件放进去就好了。我这个bootloader是加了FATFS文件系统的,但如果要通过usb对外部FLASH操作,那前提是得先给板子烧写好一个带有USB的那个程序。这个方式太麻烦了,建议把bin放到SD卡,升级或者生产都方便些
回复 支持 反对

使用道具 举报

11

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2016-11-15
在线时间
55 小时
发表于 2017-1-16 14:39:58 | 显示全部楼层
lzq12 发表于 2017-1-16 11:46
那你的意思就是用外部FLASH代替SD卡存放bin文件,是吧?如果是我的那个bootloader直接在iap.c里面的SETTI ...

一开始Bin文件放在SD卡,插卡,然后通过u-boot升级之后把程序存储在外部的flash,这时可以把SD卡拔掉的,上电的时候通过u-boot引导外部flash运行,也是需要用在操作系统上面的,APP能不能直接在外部flash运行?
回复 支持 反对

使用道具 举报

16

主题

216

帖子

1

精华

高级会员

Rank: 4

积分
970
金钱
970
注册时间
2016-11-24
在线时间
156 小时
 楼主| 发表于 2017-1-17 08:44:43 | 显示全部楼层
jiang633 发表于 2017-1-16 14:39
一开始Bin文件放在SD卡,插卡,然后通过u-boot升级之后把程序存储在外部的flash,这时可以把SD卡拔掉的, ...

网上有说是可以在外部FLASH运行的,方法应该是和在内部FLASH运行的差不多,就是跳转地址有区别,外部FLASH要固定个存放bin的地址,然后在APP的Options fot target那里设置好地址,有些是说设置成片外地址什么的,具体的得你这边试一下呢,到时也和我们分享一下经验啊
回复 支持 反对

使用道具 举报

18

主题

112

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
363
金钱
363
注册时间
2015-10-29
在线时间
49 小时
发表于 2017-1-17 09:10:14 | 显示全部楼层
我之前也做过一个这个,已经用在产品上了,论坛有人发过的,不过还是赞下楼主分享精神。
回复 支持 反对

使用道具 举报

1

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
140
金钱
140
注册时间
2016-1-25
在线时间
33 小时
发表于 2017-1-17 09:35:37 | 显示全部楼层
学习学习~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
回复 支持 反对

使用道具 举报

16

主题

216

帖子

1

精华

高级会员

Rank: 4

积分
970
金钱
970
注册时间
2016-11-24
在线时间
156 小时
 楼主| 发表于 2017-1-17 11:48:52 | 显示全部楼层
tony129 发表于 2017-1-17 09:10
我之前也做过一个这个,已经用在产品上了,论坛有人发过的,不过还是赞下楼主分享精神。

谢谢支持产品上用SD卡升级应该都稳定吧,目前打算把网络升级的也加进去,就是没这方面的思路呢
回复 支持 反对

使用道具 举报

16

主题

216

帖子

1

精华

高级会员

Rank: 4

积分
970
金钱
970
注册时间
2016-11-24
在线时间
156 小时
 楼主| 发表于 2017-1-17 11:49:29 | 显示全部楼层
muecn 发表于 2017-1-17 09:35
学习学习~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

大家互相学习
回复 支持 反对

使用道具 举报

1

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2016-11-15
在线时间
14 小时
发表于 2017-4-13 17:01:43 | 显示全部楼层
可以,好好研究研究。
回复 支持 反对

使用道具 举报

0

主题

24

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
483
金钱
483
注册时间
2014-2-9
在线时间
91 小时
发表于 2017-4-13 17:55:45 | 显示全部楼层
谢谢分享!mark一下,用到时再来好好学习
回复 支持 反对

使用道具 举报

16

主题

216

帖子

1

精华

高级会员

Rank: 4

积分
970
金钱
970
注册时间
2016-11-24
在线时间
156 小时
 楼主| 发表于 2017-4-14 09:41:23 | 显示全部楼层
tony129 发表于 2017-1-17 09:10
我之前也做过一个这个,已经用在产品上了,论坛有人发过的,不过还是赞下楼主分享精神。

目前这个SD卡升级也用得挺稳定的,不过还想增加网络升级,难度比较大
回复 支持 反对

使用道具 举报

4

主题

20

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2038
金钱
2038
注册时间
2017-3-23
在线时间
135 小时
发表于 2017-4-14 12:11:51 | 显示全部楼层
这个不错,,谢谢分享!
回复 支持 反对

使用道具 举报

2

主题

41

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
477
金钱
477
注册时间
2016-10-21
在线时间
88 小时
发表于 2017-5-18 16:58:57 | 显示全部楼层
好福利。。。mark一发 。谢谢楼主
回复 支持 反对

使用道具 举报

15

主题

118

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3059
金钱
3059
注册时间
2015-12-20
在线时间
299 小时
发表于 2017-11-16 16:33:43 | 显示全部楼层
这种精神值得点赞!
回复 支持 反对

使用道具 举报

15

主题

118

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3059
金钱
3059
注册时间
2015-12-20
在线时间
299 小时
发表于 2017-12-19 16:35:43 | 显示全部楼层
给楼主点个赞,这个想法我也想学习一下
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 09:35

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表