OpenEdv-开源电子网

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

stm32 api问题

[复制链接]

23

主题

95

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
207
金钱
207
注册时间
2013-2-19
在线时间
0 小时
发表于 2013-8-8 11:43:10 | 显示全部楼层 |阅读模式
我的AIP是这样设计的,AIP程序读取BK9备份寄存器的值,根据这个值进行地址跳转:如下


芯片是stm32f103R8t6,flash大小为64K,0x08000000 - 0x08002000 烧写IAP程序,0x08002000 - 0x08009000 烧写APP1,0x08010000烧写APP2,
ROM1的设置如下:

IAP的flash 设置:


APP1 的ROM1设置:


下载IAP运行后并没有运行APP1,不知道是哪里有问题,请原子大哥和各位指点下!

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

使用道具 举报

23

主题

95

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
207
金钱
207
注册时间
2013-2-19
在线时间
0 小时
 楼主| 发表于 2013-8-8 12:11:36 | 显示全部楼层
单步调试IAP程序的时候执行的是:
iap_load_app(FLASH_APP1_ADDR);

附上两个跳转的地址:
#define FLASH_APP1_ADDR 0x08002000   //第一个应用程序起始地址(存放在FLASH)
#define FLASH_APP2_ADDR 0x08009000
www.wxx3g.com
回复 支持 反对

使用道具 举报

23

主题

95

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
207
金钱
207
注册时间
2013-2-19
在线时间
0 小时
 楼主| 发表于 2013-8-8 14:42:31 | 显示全部楼层
简化了APP程序,只在APP程序中点灯是正常的,原来的主程序默认进入休眠模式,靠外部中断唤醒,现在的情况看应该是中断没作用,但是已经设置了中断向量表偏移量:
如下:
  SCB->VTOR = FLASH_BASE | 0x2000;

请原子大哥出招 。。。
www.wxx3g.com
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-8 14:51:47 | 显示全部楼层
回复【2楼】wuxinxinggg:
---------------------------------
单个的你测试过么?可以么?
你用JTAG直接烧写,这种方式没试过,呵呵.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

23

主题

95

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
207
金钱
207
注册时间
2013-2-19
在线时间
0 小时
 楼主| 发表于 2013-8-8 14:57:53 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
可以的,现在测试的就是单个的,直接用JTAG烧写IAP和APP,直接点灯正常的,但是如果是进入Stop模式后,中断无法唤醒!
www.wxx3g.com
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-8 15:05:23 | 显示全部楼层
回复【5楼】wuxinxinggg:
---------------------------------
停止模式,这就不知道支不支持这种应用了,呵呵.
停止模式寄存器的内容都还在么?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

23

主题

95

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
207
金钱
207
注册时间
2013-2-19
在线时间
0 小时
 楼主| 发表于 2013-8-8 15:13:43 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
在的 。。。 而且我有做了实验,不让他进入停止模式,开机跑马灯,然后触发一个中断,灯不闪了 。。。 很奇怪
www.wxx3g.com
回复 支持 反对

使用道具 举报

23

主题

95

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
207
金钱
207
注册时间
2013-2-19
在线时间
0 小时
 楼主| 发表于 2013-8-8 15:41:33 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
难道是中断向量偏移没设置对?
www.wxx3g.com
回复 支持 反对

使用道具 举报

23

主题

95

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
207
金钱
207
注册时间
2013-2-19
在线时间
0 小时
 楼主| 发表于 2013-8-8 15:56:56 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
把战舰开发板的IAP FLASH测试程序改为外部中断的测试程序,发现一样不能响应中断,应该是中断向量偏移设置方法不对:

原子大哥可以实验下!
www.wxx3g.com
回复 支持 反对

使用道具 举报

23

主题

95

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
207
金钱
207
注册时间
2013-2-19
在线时间
0 小时
 楼主| 发表于 2013-8-8 16:07:54 | 显示全部楼层
回复【9楼】wuxinxinggg:

回复【6楼】正点原子:
---------------------------------
把战舰开发板的IAP FLASH测试程序改为外部中断的测试程序,发现一样不能响应中断,应该是中断向量偏移设置方法不对:
原子大哥可以实验下!

---------------------------------
可以响应中断的,我粗心忘了把向量表偏移加上去!
www.wxx3g.com
回复 支持 反对

使用道具 举报

23

主题

95

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
207
金钱
207
注册时间
2013-2-19
在线时间
0 小时
 楼主| 发表于 2013-8-8 16:43:01 | 显示全部楼层
现在不进入停止模式的话,中断是正常响应的,是中断向量表偏移的问题!但是如果进入停止模式,就无法唤醒了!
www.wxx3g.com
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-8 17:27:07 | 显示全部楼层
回复【11楼】wuxinxinggg:
---------------------------------
停止模式唤醒是从终端处开始运行的,所以这个不确定在IAP APP代码里面,是否可用了.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

23

主题

95

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
207
金钱
207
注册时间
2013-2-19
在线时间
0 小时
 楼主| 发表于 2013-8-8 19:00:46 | 显示全部楼层
回复【12楼】正点原子:
---------------------------------
不知道能否通过什么实验验证!
我现在实验的结果就是进入停止模式后,中断触发后不生效
还有,请问原子大哥,那睡眠模式是否可用!
www.wxx3g.com
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-8 20:55:42 | 显示全部楼层
回复【13楼】wuxinxinggg:
---------------------------------
你说的这两模式,我都没用过,呵呵.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

23

主题

95

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
207
金钱
207
注册时间
2013-2-19
在线时间
0 小时
 楼主| 发表于 2013-8-12 14:35:53 | 显示全部楼层
回复【14楼】正点原子:
---------------------------------
请问下原子大哥,想让stm32自动重启,知道可以通过看门狗实现,但是不知道应该调用哪个接口!不知道你是否知道!
www.wxx3g.com
回复 支持 反对

使用道具 举报

23

主题

95

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
207
金钱
207
注册时间
2013-2-19
在线时间
0 小时
 楼主| 发表于 2013-8-12 15:40:04 | 显示全部楼层
回复【14楼】正点原子:
---------------------------------
参考了旗舰版的看门狗例子解决了,想再问下原子大哥,
软复位前BKP_WriteBackupRegister(BKP_DR9,0x01);
软复位后BKP_ReadBackupRegister(BKP_DR9);
读取这个备份寄存器,不知道这个值是否会改变?
www.wxx3g.com
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-12 21:25:52 | 显示全部楼层
回复【16楼】wuxinxinggg:
---------------------------------
只要Vbat有电,就不会有问题.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

23

主题

95

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
207
金钱
207
注册时间
2013-2-19
在线时间
0 小时
 楼主| 发表于 2013-8-13 09:50:09 | 显示全部楼层
回复【17楼】正点原子:
---------------------------------
出现一个很奇怪的现象,把IAP和APP分别单独烧写进去,程序没正常工作,先烧写APP(IROM地址指定为0x08000000),程序正常工作后,用keil擦除整块flash,然后再把IAP和APP分别单独烧写进去,程序正常工作,但是如果长时间掉电后,程序又不能正常工作了!请原子大哥指导下可能的原因,IROM的地址设置如上面的截图!IAP代码如下:

int main(void)
{
u8 g_bUpdateFlag; 
u16 pBuffer[2];
u32 ReadAddr;
u32 WriteAddr;

SystemInit(); /* 设置系统时钟 */
  
while(1)
{
/* wxx */
g_bUpdateFlag = BKP_ReadBackupRegister(BKP_DR9);
if( g_bUpdateFlag == 0x00 ){ 
/* go to app1 */
iap_load_app(APP1_ADDR);
}
/* read the upd flag */
else if( g_bUpdateFlag == 0x01 ){


  /* read upd firmware and write to app1 */
__set_PRIMASK(1);//关总中断

ReadAddr = APP2_ADDR;
WriteAddr = APP1_ADDR;
/* 读取一个半字的大小 */
STMFLASH_Read( ReadAddr, pBuffer,1);
ReadAddr += 2;
while( *pBuffer != 0xFFFF ){
STMFLASH_Write(WriteAddr,pBuffer,1);
WriteAddr += 2;

/* clear pBuffer */
pBuffer[0] = 0;
pBuffer[1] = 0;

STMFLASH_Read( ReadAddr, pBuffer,1);
ReadAddr += 2;
}

/* clear upd flag */
BKP_WriteBackupRegister(BKP_DR9,0x00);

__set_PRIMASK(0);//开总中断

iap_load_app(APP1_ADDR);
}
else{
/* go to app1 */
iap_load_app(APP1_ADDR);
}
}       
}

请原子大哥帮忙看下是不是我IAP程序有问题,APP程序单独跑是没有任何问题的,我现在IAP升级的逻辑是APP先把升级的firmware写到flash的0x08009000开始的内存,然后调用iap_load_app(0x08000000); 跳到IAP的地址执行,在IAP中从0x08009000开始的地址读取半字写到0x08002000 在跳到FLASH_APP1_ADDR (即0x08008000)地址运行!
www.wxx3g.com
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-13 10:30:13 | 显示全部楼层
回复【18楼】wuxinxinggg:
---------------------------------
IAP请参考我们的例程.
另外,你这种方式实际上用处不大啊,写IAP的目的就是为了实现方便升级,你用jtag再去刷APP,就显得多此一举了.
直接用IAP,去更新APP,这才是实际需要的.也就是实际应用最常用的烧写方式.
我们的串口IAP例程,实际上已经是一个非常接近实际应用的工程了,只需要在串口协议上做一下文章(加入校验,应答等,组成稳定的串口数据传输),就是一个完整的实际项目工程了.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

23

主题

95

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
207
金钱
207
注册时间
2013-2-19
在线时间
0 小时
 楼主| 发表于 2013-8-13 10:37:20 | 显示全部楼层
回复【19楼】正点原子:
---------------------------------
程序的读写flash的接口都是参考战舰的例程的,我这种是项目的需求,空板用Jlink进行烧写是可以接收的,但是后续APP进行更新就必须得通过上位机,因此,IAP程序越简单越好。因为上位机和stm32还有其他的逻辑控制,所以才这么做的,希望能帮忙看下,是否是哪里有问题啊!且不考虑其他的!
www.wxx3g.com
回复 支持 反对

使用道具 举报

23

主题

95

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
207
金钱
207
注册时间
2013-2-19
在线时间
0 小时
 楼主| 发表于 2013-8-13 10:43:59 | 显示全部楼层
回复【19楼】正点原子:
---------------------------------
之前根据您给的指导,stm32和arm上位机之间已经是通过modbus来进行通信了的,现在也想通过modbus来对stm32的固件进行升级,所以才这么做的!希望原子大哥帮忙看下,您的经验应该很快看出问题所在了!
www.wxx3g.com
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-13 12:51:39 | 显示全部楼层
回复【21楼】wuxinxinggg:
---------------------------------
看不出问题。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

23

主题

95

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
207
金钱
207
注册时间
2013-2-19
在线时间
0 小时
 楼主| 发表于 2013-8-13 14:58:16 | 显示全部楼层
回复【22楼】正点原子:
---------------------------------
while( *pBuffer != 0xFFFF ) 这个while循环的条件判断没问题吗?
www.wxx3g.com
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-13 16:37:48 | 显示全部楼层
你只要能整个写完,没出现break的情况,也没问题。
我们的STMFLASH_Write有自己检查是不是有擦除的,你这样读一下判断是不是0XFFFF,完全是多此一举。
另外,你2个字节就调用一次STMFLASH_Write,真是不怕折寿啊。。。如果这段flash没使用过(全是0XFFFF)那倒是无所谓,但是如果全部不是0XFFFF,那你有的玩了,以2K的最小单位(扇区)计算,那么你写完一个扇区,要擦除1024次,FLASH寿命才1W次啊,兄弟你这代码跑10遍,STM32就要驾鹤西归了....
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

23

主题

95

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
207
金钱
207
注册时间
2013-2-19
在线时间
0 小时
 楼主| 发表于 2013-8-13 17:15:05 | 显示全部楼层
回复【24楼】正点原子:
---------------------------------
嗯,谢谢原子大哥,这个判断是因为我不知道在APP2的估计的大小,所以才这么弄的,你说的很在理,马上做相应修改!

另外,发现我发现对BKP_DR9的写根本没作用,不知道是什么原因:

                BKP_WriteBackupRegister(BKP_DR9,0x01); 

g_bkr = BKP_ReadBackupRegister(BKP_DR9);

if( g_bkr == 0x01 ){
for(i = 0; i < 5; i++ ){
LED_1(1);
delay_ms(500);
LED_1(0);
delay_ms(500);
}
}

if判断中LED_1 一直没亮,把判断改为g_bkr == 0x00 LED_1亮了 。。。
www.wxx3g.com
回复 支持 反对

使用道具 举报

23

主题

95

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
207
金钱
207
注册时间
2013-2-19
在线时间
0 小时
 楼主| 发表于 2013-8-13 18:30:34 | 显示全部楼层
回复【24楼】正点原子:
---------------------------------
备份寄存器的使用需要使能相应时钟,谢谢原子大哥的耐心回复 。。。
www.wxx3g.com
回复 支持 反对

使用道具 举报

23

主题

95

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
207
金钱
207
注册时间
2013-2-19
在线时间
0 小时
 楼主| 发表于 2013-8-15 18:22:24 | 显示全部楼层
回复【24楼】正点原子:
---------------------------------
原子大哥,请问下keil能不能把stm32的flash中的数据读出来,我用战舰的 STMFLASH_Read 接口读出我写的数据,只有起始地址(0x08009000)的第一个扇区(1024)有数据,后面的都是FF,现在因为我写进去后没法启动,所以想把数据读出来看看,数据写入的时候用的是keil 生成的bin文件,麻烦原子大哥指明出路啊。。。 调试了两天了。。。
www.wxx3g.com
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-15 19:18:52 | 显示全部楼层
回复【27楼】wuxinxinggg:
---------------------------------
keil没这个功能吧,JTAG貌似有。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-15 00:53

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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