11044|18

19

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

stm32f051支持IAP功能么 [复制链接]

stm32f051支持IAP功能么  我没有找到中断向量表便宜寄存器 能做在线更新固件功能么
此帖出自stm32/stm8论坛

最新回复

啊,需要啊,大神大神,快发呗 需要啊需要啊。 瞅了瞅 固件库包,并木有啊,stm32f4倒有........  详情 回复 发表于 2017-8-10 23:56

点评

stm32f051是Cortex-M0核的,我没用过这个。不过在同为Cortex-M0的LPC1114上看到了IAP的功能描述,一般的MCU都是有IAP功能的。只知道Cortex-M3上向量表偏移量寄存器( VTOR )的地址是0xE000_ED08  详情 回复 发表于 2013-3-25 14:20
点赞 关注(1)
 

回复
举报

436

帖子

5

TA的资源

五彩晶圆(初级)

沙发
 

回复 楼主 asdbhk 的帖子

stm32f051是Cortex-M0核的,我没用过这个。不过在同为Cortex-M0的LPC1114上看到了IAP的功能描述,一般的MCU都是有IAP功能的。只知道Cortex-M3上向量表偏移量寄存器( VTOR )的地址是0xE000_ED08
此帖出自stm32/stm8论坛
 
 

回复

19

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
是的  在M3和M4的都有中断向量表便宜寄存器 地址也一样 但是在M0里没有找到  
我也认为应该是支持的  但是找不到这个寄存器 纠结
此帖出自stm32/stm8论坛

点评

中断向量表偏移寄存器是属于NVIC中的一个寄存器,NVIC是ARM核内的,所以估计这个地址说不定是一样的,试试看。 因为IAP方面的应用有些偏近底层,很多资料上都不讲,我手上的资料也查过,确实查不到这个寄存器的地  详情 回复 发表于 2013-3-26 11:20
 
 

回复

436

帖子

5

TA的资源

五彩晶圆(初级)

4
 
原帖由 asdbhk 于 2013-3-26 08:44 发表
是的  在M3和M4的都有中断向量表便宜寄存器 地址也一样 但是在M0里没有找到  
我也认为应该是支持的  但是找不到这个寄存器 纠结

中断向量表偏移寄存器是属于NVIC中的一个寄存器,NVIC是ARM核内的,所以估计这个地址说不定是一样的,试试看。
因为IAP方面的应用有些偏近底层,很多资料上都不讲,我手上的资料也查过,确实查不到这个寄存器的地址,连寄存器名都找不到。
此帖出自stm32/stm8论坛
 
 
 

回复

436

帖子

5

TA的资源

五彩晶圆(初级)

5
 
呵呵,查到了,传个ARMv6-M汇编指令体系结构的用户手册给你,这个应该是很权威的,在里面搜索关键字"VTOR",
在263页  :
0xE000ED08 VTOR RW 0x00000000
Vector Table Offset Register, VTOR on page B3-267

地址一样和CM3。

ARMv6-M Architecture Reference Manual.pdf

2.62 MB, 下载次数: 97

此帖出自stm32/stm8论坛
 
 
 

回复

19

帖子

0

TA的资源

一粒金砂(中级)

6
 
谢谢了
我按照那个地址试了 FLASH擦写功能没问题 app程序么有执行
继续努力
此帖出自stm32/stm8论坛

点评

stm32f051的ARM核是Cortex-M0的,Cortex-M0核的ARM汇编指令体系结构版本是ARMv6-M的,所以这个手册应该是可以参考的。当然要是stm32f051直接提到具体是什么样的就是什么样的,毕竟芯片生产商也不一定绝对按照ARM的  详情 回复 发表于 2013-3-27 12:10
 
 
 

回复

436

帖子

5

TA的资源

五彩晶圆(初级)

7
 
原帖由 asdbhk 于 2013-3-27 09:06 发表
谢谢了
我按照那个地址试了 FLASH擦写功能没问题 app程序么有执行
继续努力

stm32f051的ARM核是Cortex-M0的,Cortex-M0核的ARM汇编指令体系结构版本是ARMv6-M的,所以这个手册应该是可以参考的。当然要是stm32f051直接提到具体是什么样的就是什么样的,毕竟芯片生产商也不一定绝对按照ARM的标准来做。

你描述的问题应该是程序跳转过程中的问题,要不行,把代码发给我,我帮你看看。
主要的流程:
1.拷贝中断向量表到RAM中
2.设置中断向量表偏移寄存器
3.设置sp堆栈指针
4.跳转到新程序在中断向量表中的复位向量处指向的地址

一个月前刚好从底层研究过这个问题,也解决了iap的问题。本来还想在论坛发个帖子的,但是感觉搞这东西的人太少,搞上层的人也不愿意看这些东西(看不懂应该算是比较大的因素),又因为出差忙就算了没发。

下次不忙了,整理一下材料再发出来吧。

[ 本帖最后由 lr2131 于 2013-3-27 13:10 编辑 ]
此帖出自stm32/stm8论坛

点评

void jump_app(uint32_t addr) { uint32_t tmp; tmp=*(volatile uint32_t*)addr; if((tmp&0x2FFE0000)==0x20000000) { JumpAddress = *(__IO uint32_t*) (addr + 4); Jump_To_Application =(pFu  详情 回复 发表于 2013-4-1 15:57
我感觉主要是app那边设这中断向量表的问题 我在M3和M4上都实现了iap功能 在M0上没办法设置 按照armv6结构上哪个中断向量偏移寄存器地址设置了一下 程序执行到跳转之后就没反应了 等我整理一下在发上来吧  详情 回复 发表于 2013-3-27 13:37
 
 
 

回复

19

帖子

0

TA的资源

一粒金砂(中级)

8
 

回复 7楼 lr2131 的帖子

我感觉主要是app那边设这中断向量表的问题
我在M3和M4上都实现了iap功能
在M0上没办法设置
按照armv6结构上哪个中断向量偏移寄存器地址设置了一下
程序执行到跳转之后就没反应了
等我整理一下在发上来吧   公司网络不能上传
此帖出自stm32/stm8论坛
 
 
 

回复

19

帖子

0

TA的资源

一粒金砂(中级)

9
 

回复 7楼 lr2131 的帖子

void jump_app(uint32_t addr)
{
        uint32_t tmp;
        tmp=*(volatile uint32_t*)addr;
        if((tmp&0x2FFE0000)==0x20000000)
        {
                JumpAddress = *(__IO uint32_t*) (addr + 4);               
    Jump_To_Application =(pFunction) JumpAddress; //(pFunction) 0x10004;
    /* Initialize user application's Stack Pointer */
    __set_MSP(*(int32u*) addr);
    Jump_To_Application();
        }       
}
这几天去上课了
这个是跳转程序的函数
能帮我分析一下么
此帖出自stm32/stm8论坛

点评

这个我倒是看过了,能懂一些。 void jump_app(uint32_t addr) { uint32_t tmp; tmp=*(volatile uint32_t*)addr;//addr是app的首地址,其实就是中断向量表中的第一项,addr其实就是MSP的初始值  详情 回复 发表于 2013-4-1 21:13
 
 
 

回复

50

帖子

0

TA的资源

一粒金砂(高级)

10
 
不要瞎整了,Cortex-m0并没有中断向量地址偏移寄存器。这个只有M3和M4才有的。请看STM32F0xxx Cortex-M0 programming manual,Page84,
楼主可以尝试这样,BootLoad 程序启始于复位地址,复位首先进入Boot程序,然后跳转到应用程序以及应用程序编写和M3一样,应用程序不需设置向量表偏移,向量表采用下面的方式维护。
Bootload处理所有中断向量。当需进入应用执行时。置g_bAppRun为真
所有的32个中断向量按以下方式实现,APP_START_ADR为应用代码起始地址,ISR_HAND_OFFSET为中断向量在中断向量表中的仿移量(4字节单位,每个中断向量均不同)

typedef void (*pFun)(void);

void ISRHandle(void)
{
    pFun p;
   
    if(g_bAppRun)
    {
        p = (pFun)(APP_START_ADR + ISR_HAND_OFFSET);
    }
    else
    {
        P = BootLoadIsr;
    }
    (*p)();
}
这种方式其实不但适合于M0,其它所有支持在线写代码区的单片机都可以实现,只是细节修改而已(主要是链接器)。

[ 本帖最后由 xg_qing 于 2013-4-1 16:46 编辑 ]
此帖出自stm32/stm8论坛

点评

能给传个小例程么 没弄过这种模式的 第一次弄这种没有偏移寄存器芯片的iap  详情 回复 发表于 2013-4-2 15:49
补充,一个中断需要软件重定向就用一个函数指针,多个就用多个,各自用各自的。 就算是bootlader有选择性的启动不同的app,亦或是appx后启动新的appy,也是一样的,一个中断使用一个函数指针。  详情 回复 发表于 2013-4-1 21:17
上到ST的官网查了相关资料,没找到这个VTOR,应该是没有这个寄存器。你给出的方法其实就是在中断中用软件的方式来重定向ISR。这个方法当然是通用的。 其实呢,对于某个硬件外设对应的中断。这个函数指针可以安排  详情 回复 发表于 2013-4-1 20:55
 
 
 

回复

436

帖子

5

TA的资源

五彩晶圆(初级)

11
 

回复 10楼 xg_qing 的帖子

上到ST的官网查了相关资料,没找到这个VTOR,应该是没有这个寄存器。你给出的方法其实就是在中断中用软件的方式来重定向ISR。这个方法当然是通用的。

其实呢,对于某个硬件外设对应的中断。这个函数指针可以安排在数据区,在bootloder的时候,初始化它为bootloder时需要调用的ISR函数。如果跳转到app的时候呢,就可以重新定向这个函数指针到app自己需要调用的ISR函数。软件重定向的思想。
此帖出自stm32/stm8论坛
 
 
 

回复

436

帖子

5

TA的资源

五彩晶圆(初级)

12
 
原帖由 asdbhk 于 2013-4-1 15:57 发表
void jump_app(uint32_t addr)
{
        uint32_t tmp;
        tmp=*(volatile uint32_t*)addr;
        if((tmp&0x2FFE0000)==0x20000000)
        {
                JumpAddress = *(__IO uint32_t*) (addr + 4);               
    Jump_To_Application =(pFun ...

这个我倒是看过了,能懂一些。
void jump_app(uint32_t addr)
{
        uint32_t tmp;
        tmp=*(volatile uint32_t*)addr;//addr是app的首地址,其实就是中断向量表中的第一项,addr其实就是MSP的初始值的地址,从flash的app的首地址中取出这个MSP的初始值给tmp。
        if((tmp&0x2FFE0000)==0x20000000)// 检查MSP的初始值是否合法,具体怎么才合法,我也早忘光了,你可以查查资料吧,应该是和具体芯片的内存分布或者说内存映射有关。
        {
                JumpAddress = *(__IO uint32_t*) (addr + 4);  //  addr + 4 ,这个就是app中断向量表中复位向量的地址,像上面那样取出它里面的值赋给JumpAddress 。           
    Jump_To_Application =(pFunction) JumpAddress; // 现在再对JumpAddress 做一下类型转化,赋给Jump_To_Application这个函数指针,那么这个函数指针就指向的是APP的复位向量指向的地方,不严格的说法就是复位函数吧。调用整个函数就是APP的开始
    /* Initialize user application's Stack Pointer */
    __set_MSP(*(int32u*) addr);//这里你注意,刚只是检查了MSP的合法性,但是并没有对app的MSP做初始化,目前还是是在bootloader下么。如果不做这一步,直接走下一句跳转的话,那么MSP的值可能会导致溢出,至少会导致浪费,所以要先初始化MSP,然后走下一句再跳转。这里其实是用汇编写的,毕竟SP寄存器是不能通过C来读写的。当时我在这个地方自己试着写了下汇编语句,其实很简单,才2句还是3句忘了,但是不敢确定稳定性,后来反汇编时看到 __set_MSP()的汇编和我的相同才放心。
    Jump_To_Application();// 到这里就完了,开始APP的运行嘛,不细说了。
        }        
}
//这整个函数除开检查MSP初始值的合法性外,主要就做了两件事:
1.重新初始化MSP
2.复位

估计芯片里面的boot固件也是这么干的。

[ 本帖最后由 lr2131 于 2013-4-2 10:29 编辑 ]
此帖出自stm32/stm8论坛

点评

嗯 这个我也懂点 M3和M4都是这么做的 就像十楼说的那样 没有中断向量偏移寄存器 那个地址没写成功 有点小纠结  详情 回复 发表于 2013-4-2 10:09
 
 
 

回复

436

帖子

5

TA的资源

五彩晶圆(初级)

13
 

回复 10楼 xg_qing 的帖子

补充,一个中断需要软件重定向就用一个函数指针,多个就用多个,各自用各自的。
就算是bootlader有选择性的启动不同的app,亦或是appx后启动新的appy,也是一样的,一个中断使用一个函数指针。
此帖出自stm32/stm8论坛
 
 
 

回复

19

帖子

0

TA的资源

一粒金砂(中级)

14
 

回复 12楼 lr2131 的帖子

嗯 这个我也懂点 M3和M4都是这么做的
就像十楼说的那样 没有中断向量偏移寄存器 那个地址没写成功
有点小纠结
此帖出自stm32/stm8论坛
 
 
 

回复

19

帖子

0

TA的资源

一粒金砂(中级)

15
 

回复 10楼 xg_qing 的帖子

能给传个小例程么
没弄过这种模式的
第一次弄这种没有偏移寄存器芯片的iap
此帖出自stm32/stm8论坛
 
 
 

回复

4

帖子

0

TA的资源

一粒金砂(中级)

16
 
同求大神给个小例子,关于软件重定位的例子。我在做的IAP,跳转到APP之后,没有办法响应外部中断,但是可以响应定时器中断。stm32F051的片子
此帖出自stm32/stm8论坛
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

17
 
我现在写的一个能跳转进入APP,但是APP定时器中断没效果
此帖出自stm32/stm8论坛
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

18
 
顶一下
此帖出自stm32/stm8论坛
 
 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

19
 
lr2131 发表于 2013-3-27 12:10
stm32f051的ARM核是Cortex-M0的,Cortex-M0核的ARM汇编指令体系结构版本是ARMv6-M的,所以这个手册应该是 ...

啊,需要啊,大神大神,快发呗
需要啊需要啊。
瞅了瞅 固件库包,并木有啊,stm32f4倒有........
此帖出自stm32/stm8论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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