OpenEdv-开源电子网

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

STM32F030 串口IAP

[复制链接]

34

主题

322

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1838
金钱
1838
注册时间
2014-12-4
在线时间
717 小时
发表于 2016-9-23 19:53:16 | 显示全部楼层 |阅读模式
本帖最后由 loudianxin 于 2016-9-23 19:57 编辑

程序收尾总想着以后更新的方便性,采用在应用编程(In Application Programming),通过Bootload引导单片机自己往程序存储器里写数据或修改程序。下面简介STM32F030的IAP方法。不同于STM32F1系列,F0没有中断向量偏移寄存器。所以在APP程序的开头要添加以下代码。为什么这样做??
可以看到函数用了for循环将矢量表拷贝到0 x20000000 SRAM的基地址,即将矢量表由Flash映射到了SRAM。所以在MDK里面设置Flash偏移地址的时候,同时要设置SRAM偏移地址。如下截图
[mw_shl_code=c,true]//APP程序开头加入IAP_Set(void)函数
//Falsh address
#define  APPLICATION_ADDRESS    ((uint32_t)0x08001400)
//SRAM Address 0x020000C0
void IAP_Set(void)
{
   uint32_t i = 0;
/* Relocate by software the vector table to the internal SRAM at 0x20000000 ***/  
  /* Copy the vector table from the Flash (mapped at the base of the application
     load address 0x08003000) to the base address of the SRAM at 0x20000000. */      
  for(i = 0; i < 48; i++)
  {
    *((uint32_t*)(0x20000000 + (i << 2)))=*(__IO uint32_t*)(APPLICATION_ADDRESS + (i<<2));
}
  /* Enable the SYSCFG peripheral clock*/
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);

/* Remap SRAM at 0x00000000 */
  SYSCFG_MemoryRemapConfig(SYSCFG_MemoryRemap_SRAM);

}[/mw_shl_code]

QQ截图20160923195632.jpg

有Target对话框可以看出APP程序有Flash地址0x8001400开始执行。Sram数据则有0x20000c0出开始存储。

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

使用道具 举报

30

主题

1170

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
金钱
1993
注册时间
2016-2-16
在线时间
527 小时
发表于 2016-9-23 22:04:05 | 显示全部楼层
yklstudent 发表于 2016-9-23 21:55
官网的范例不就是这样的嘛

不要这样打击别人嘛,分享是好处,比如我就不会,受益匪浅
回复 支持 1 反对 0

使用道具 举报

34

主题

322

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1838
金钱
1838
注册时间
2014-12-4
在线时间
717 小时
 楼主| 发表于 2016-9-23 19:53:41 | 显示全部楼层
本帖最后由 loudianxin 于 2016-9-23 19:58 编辑

下面说一下IAP代码编写
[mw_shl_code=c,true]/* Keep the user application running */
/* Test if user code is programmed starting from address "APPLICATION_ADDRESS" */
if (((*(__IO uint32_t*)APPLICATION_ADDRESS) & 0x2FFE0000) == 0x20000000)
{
/* Jump to user application */
JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS + 4);
Jump_To_Application = (pFunction)JumpAddress;


/* Initialize user application's Stack Pointer */
__set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);


/* Jump to application */
Jump_To_Application();
}[/mw_shl_code]
程序更新完以后执行以上跳转函数即可执行更新的APP代码。关于如何通过IAP将代码将APP代码(bin文件)传到单片机Flash,可以通过串口分包传输。因为F0Flash是1K为一页所以这里我用的是1K缓存,即接收串口1K的数据量就执行一次Flash写操作,传输到最后不满1K,填写0XFF按照1K数据写。写Flash代码如下
[mw_shl_code=applescript,true]//存满1K的数据 写入Flash
if (g_nFlashDataLen == FLASH_PAGE_SIZE)
{
#if (DEBUGIAP ==1)

USART1_SendBytesProc(g_nFlashBuf,FLASH_PAGE_SIZE);
g_nSysCommTimerCtrl=0;
while(g_nSysCommTimerCtrl < 200);//5ms        
#else
//擦除待写的Flash
FLASH_If_Erase(g_nFlashAddr);
loop1:
//写入Flash
nFlashData = (u32)g_nFlashBuf;
if (FLASH_If_Write(&g_nFlashAddr, (u32*)nFlashData, (u16)g_nFlashDataLen / 4) != 0)
{
if (nCount++ < 5)
goto loop1;
}
//地址增加
g_nFlashAddr += FLASH_PAGE_SIZE;
#endif
//清除g_nFlashDataLen计数
g_nFlashDataLen = 0;

}[/mw_shl_code]
关于IAP如何接收串口的数据,我用的是正点原子的XCOM V2.0串口调试助手通过协议传输每次传输128字节数据,执行的IAP串口数据接收,存满1K数据执行一次写操作。具体操作可在原子论坛搜索。再此留下参考链接:http://www.openedv.com/thread-40143-1-1.html         http://www.openedv.com/thread-22994-1-1.html
回复 支持 反对

使用道具 举报

34

主题

322

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1838
金钱
1838
注册时间
2014-12-4
在线时间
717 小时
 楼主| 发表于 2016-9-24 11:11:41 | 显示全部楼层
yklstudent 发表于 2016-9-23 21:55
官网的范例不就是这样的嘛

看过范例,用的Ymodem写的,在WIN xp 或win7 32下用超级终端可以,但是win7 64位用不了,有局限性。用串口助手就方便多了。只是提供个方法。。。
回复 支持 反对

使用道具 举报

56

主题

289

帖子

0

精华

高级会员

Rank: 4

积分
865
金钱
865
注册时间
2012-11-16
在线时间
65 小时
发表于 2017-1-1 22:39:12 | 显示全部楼层
不错
回复 支持 反对

使用道具 举报

0

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2016-9-1
在线时间
6 小时
发表于 2017-1-1 23:08:23 | 显示全部楼层
LZ 辛苦 ,STM32F030 系列比较特殊 ,还有就是96BIT的DEVICE ID 都没有
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2018-11-23
在线时间
4 小时
发表于 2018-11-23 15:33:05 | 显示全部楼层
楼主,能不能参考一下你写flash,然后做地址偏移那一块啊,万分感谢!
回复 支持 反对

使用道具 举报

13

主题

633

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1331
金钱
1331
注册时间
2016-8-1
在线时间
229 小时
发表于 2018-11-23 16:31:46 | 显示全部楼层
楼主很有想法
Loto虚拟示波器 官方qq群: 706769836 https://shop296209296.taobao.com/shop/view_shop.htm?tracelog=t
回复 支持 反对

使用道具 举报

25

主题

138

帖子

0

精华

高级会员

Rank: 4

积分
612
金钱
612
注册时间
2016-6-7
在线时间
59 小时
发表于 2018-12-28 10:41:00 | 显示全部楼层
  /* Enable the SYSCFG peripheral clock*/
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);

/* Remap SRAM at 0x00000000 */
  SYSCFG_MemoryRemapConfig(SYSCFG_MemoryRemap_SRAM);

我想问问,上面这两句,在HAL库里要怎么处理????
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2020-1-30
在线时间
5 小时
发表于 2020-2-20 22:03:30 | 显示全部楼层
学习了,谢谢楼主分享!!!
回复 支持 反对

使用道具 举报

1

主题

3

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2017-4-15
在线时间
7 小时
发表于 2020-3-12 13:32:25 | 显示全部楼层
有stm32f030用ymodem 的iap吗
回复 支持 反对

使用道具 举报

17

主题

170

帖子

0

精华

高级会员

Rank: 4

积分
562
金钱
562
注册时间
2018-7-8
在线时间
118 小时
发表于 2020-10-29 18:14:25 | 显示全部楼层
憨厚诚实大叔 发表于 2016-9-23 22:04
不要这样打击别人嘛,分享是好处,比如我就不会,受益匪浅

官网的例程没有这个细致,我都看不到拷贝的语句,简直是扯淡
回复 支持 反对

使用道具 举报

0

主题

7

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2020-7-2
在线时间
5 小时
发表于 2020-11-29 22:26:58 | 显示全部楼层
楼主可以给个例程参考一下吗?最近搞这个搞不明白了
回复 支持 反对

使用道具 举报

9

主题

33

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3464
金钱
3464
注册时间
2019-5-15
在线时间
258 小时
发表于 2021-6-16 14:33:34 | 显示全部楼层
最近一个项目  就用这个 谢谢了
梦想!是个神奇的东西!
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-22 21:42

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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