硬汉嵌入式论坛

 找回密码
 立即注册
查看: 12682|回复: 26
收起左侧

[MDK] 关于MDK下如何用仿真器烧程序的同时烧写附加数据到SPI FLASH的分享

  [复制链接]

8

主题

42

回帖

71

积分

初级会员

积分
71
发表于 2018-1-9 16:25:47 | 显示全部楼层 |阅读模式
本帖最后由 zwmasdf 于 2018-1-11 17:04 编辑

之前在i.MX rt板块经常看到i.MX RT最新支持XXX Flash的下载算法,于是冒出一个问题,下载算法是啥。故花时间研究了一下
1、首先了解一下下载算法是啥东东
研究过程中参考了这篇文章:https://jingyan.baidu.com/article/414eccf64f03be6b431f0af8.html
经过研究得出结论(可能结论不是很准),下载算法本身是一段读写存储介质的接口函数(生动的说法应该是驱动函数),
这里的存储介质可以是内部/外部RAM,也可以是内部/外部FLASH/EEPROM,FLASH可以是并口也可以是串口等等,这里不一一列举。
仿真器应该通过调试接口将驱动接口程序下载到单片机内部默认的RAM中,这种RAM只能是内置的默认首选RAM,且上电无需初始化就能直接用的
然后通过驱动接口将程序代码烧录至指定的位置。
2.那么怎么实现下载到SPI FLASH呢
  1.首先准备1块开发板,我手头有1块STM32F103RCT6的开发板,并且PA4(CS),PA5(SCK),PA6(MISO),PA7(MOSI)连到W25Q32FV上
  2.打开 MDK安装目录/ARM/Flash  发现有1个STM32F10x_M25P64的文件夹,发现这个文件夹用于生成STM32F10x_M25P64.FLM,
     也就是MDK提供了一份SPI FLASH下载的模板,但是不能直接用于W25Q32,需要稍加修改   
     于是将STM32F10x_M25P64文件夹拷贝一份并改名为STM32F10x_W25Q32,打开工程,由于该工程针对STM32F1系列的外部FLASH,故不需要重新选定单片机型号

     打开option选项设置界面,进入User,将Run#1中的内容改为cmd.exe /C copy Out\STM32F10x_M25P64.axf ..\STM32F10x_W25Q32.FLM,这样编译后会生成对应的W25Q的下载算法文件
     如图
     接着修改文件FlashDev.c,修改FlashDevice的相关属性,这里我将Device Name改为STM32F10X W25Q32 SPI Flash,便于MDK识别
     Device Type保持EXTSPI不变,Device Start Address保持0xC0000000不变, Device Size in Bytes改为0x00400000,因为W25Q32是4MBFlash
     这2个值很重要,凡是程序中位于Device Start Address及其长度范围内的代码及数据(RO段)都会下载到SPI Flash中去
     还有1个关键的数据是倒数第2行数,扇区大小是4KB,扇区起始地址是0,若后面每个扇区大小都一致,则以SECTOR_END结尾即可(其原理参考MDK下的_Template工程)
     参考图 无标题.png      然后是spi_flash.c,修改如下
     #define RDID       0x90  /* Read identification */
     #define SE         0x20  /* Sector Erase instruction */
     #define BE         0xD8  /* Bulk Erase instruction */

     #define Dummy_Byte 0xFF


  1. void SPI_FLASH_Init(void)
  2. {
  3.   SPI_InitTypeDef  SPI_InitStructure;
  4.   GPIO_InitTypeDef GPIO_InitStructure;
  5.    
  6.   /* Enable SPI1, GPIOA and GPIOBclocks */
  7.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1 | RCC_APB2Periph_GPIOA, ENABLE);
  8.   
  9.   /* Configure SPI1 pins: SCK, MISO and MOSI */
  10.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
  11.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  12.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  13.   GPIO_Init(GPIOA, &GPIO_InitStructure);

  14.   /* Configure PA.4 as Output push-pull, used as Flash Chip select */
  15.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
  16.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  17.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  18.   GPIO_Init(GPIOA, &GPIO_InitStructure);

  19.   /* Deselect the FLASH: Chip Select high */
  20.   SPI_FLASH_CS_HIGH();

  21.   /* SPI1 configuration */
  22.   SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
  23.   SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
  24.   SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
  25.   SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
  26.   SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
  27.   SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
  28.   SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;
  29.   SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
  30.   SPI_InitStructure.SPI_CRCPolynomial = 7;
  31.   SPI_Init(SPI1, &SPI_InitStructure);
  32.   
  33.   /* Enable SPI1  */
  34.   SPI_Cmd(SPI1, ENABLE);   
  35. }
复制代码
         然后修改spi_flas.h,修改spi的CS引脚硬件信息          #define SPI_FLASH_CS_LOW()     GPIO_ResetBits(GPIOA, GPIO_Pin_4)
         /* Deselect SPI FLASH: ChipSelect pin high */
         #define SPI_FLASH_CS_HIGH()    GPIO_SetBits(GPIOA, GPIO_Pin_4)
         最后编译,发现Flash文件夹下多了STM32F10x_W25Q32.FLM这个文件
    3. 为了测试是否能正常下载,我写了一个写SPI Flash数据的代码,目的是将SPI FLASH中第1个扇区的数据全部设为0xa5,核心代码如下
        uint8_t wr[4096] = {0}, rd[4096] = {0};
        W25QXX_Erase_Sector(0x00);
        memset(wr, 0xa5, sizeof(wr));
        W25QXX_Write_NoCheck(wr, 0, sizeof(wr));
        W25QXX_Read(rd, 0, sizeof(rd));//这里读出来,通过仿真器得知确实所有数据变成了0Xa5
    4. 写1个针对SPI Flash下载算法的程序,目的是能自动烧录数据至 SPI FLASH
        通过STMCubeMX生成1个STM32F103RCT6的最小程序,修改配置信息,增加1个外部ROM字段,起始地址和之前算法程序中的Device Start Address一致,由于我们就烧录几个字节,        长度这里调小点我们先设为0x100,实际可以设为1个扇区或直接整个FLASH大小(前提扇区信息填完整),如下
         无标题.png

        新建1个dat.c,里面就假如几行代码,如下所示
        #include "stm32f1xx_hal.h"
        const uint8_t dat[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
        右击dat.c,选择options for File 'dat.c',将Code /Const: 区域改为ROM1[0xC0000000-0xC00000FF],
         这样dat.c生成的dat.o将位于0xc0000000区域,即位于SPI Flash区域
        注意为了防止编译器优化dat数组,务必将工程编译等级调为-O0,同时去掉One ELF Section per Function勾选
        添加SPI FLASH的烧录算法,如图
         无标题.png
        编译,下载(注意不是Debug下载,直接点Flash下载,不用调试)
    5.写一个读Flash代码,将之前的写Flash代码注释写部分
        uint8_t wr[4096] = {0}, rd[4096] = {0};
        //W25QXX_Erase_Sector(0x00);
        //memset(wr, 0xa5, sizeof(wr));
        //W25QXX_Write_NoCheck(wr, 0, sizeof(wr));
        W25QXX_Read(rd, 0, sizeof(rd));//这里读出来,通过仿真器得知rd[0]和rd[9]确实变成了dat数组的内容,      至于rd[10]和rd[11]变成0是由于dat数组4字节对齐补了2个0导致的,rd[12]以上则全变为了0XFF
     如图 无标题.png
     至此,实验成功
    这里注意的1点是整片文章共有4个工程,1.写Flash工程,用于初始化SPI Flash数据     2.烧录算法工程,用来第3个工程下载用     
                                                                     3.执行烧录算法的工程   4.读Flash工程,用于验证烧录算法是否将工程3的外部Flash数据烧进外部Flash中去(可以从工程1改)
     烧录顺序从1,3,4,     (2不用烧录)



评分

参与人数 2金币 +30 收起 理由
leiyitan + 10 一般数据只需要烧录一次,烧录算法还可以做.
eric2013 + 20 很给力!

查看全部评分

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106739
QQ
发表于 2018-1-9 16:53:14 | 显示全部楼层
非常感谢楼主分享
回复

使用道具 举报

0

主题

5

回帖

5

积分

新手上路

做人第一,办事第二

积分
5
发表于 2018-1-11 00:29:12 | 显示全部楼层
回复

使用道具 举报

2

主题

42

回帖

48

积分

新手上路

积分
48
发表于 2018-1-26 14:46:08 | 显示全部楼层
不错不错。
回复

使用道具 举报

5

主题

519

回帖

534

积分

金牌会员

积分
534
发表于 2018-1-27 07:30:55 | 显示全部楼层
🐮牛。。。。。。。。。。。
回复

使用道具 举报

4

主题

6

回帖

18

积分

新手上路

积分
18
发表于 2018-4-12 11:38:24 | 显示全部楼层
        
回复

使用道具 举报

3

主题

39

回帖

48

积分

新手上路

积分
48
QQ
发表于 2018-4-13 14:51:08 | 显示全部楼层
我只在我的Keil C51文件夹里面找到文件名为“LPC5460x_MT25QL128”的文件夹,路径为“C:\Keil_v5\ARM\Flash\LPC5460x_MT25QL128”,MDK的版本是V5.23.0.0
回复

使用道具 举报

5

主题

85

回帖

100

积分

初级会员

积分
100
发表于 2018-6-1 10:09:25 | 显示全部楼层
谢谢分享,
mark,mark.
回复

使用道具 举报

9

主题

81

回帖

113

积分

初级会员

积分
113
发表于 2018-11-13 12:11:19 | 显示全部楼层
感谢楼主分享,Mark一下,研究研究。
回复

使用道具 举报

32

主题

262

回帖

363

积分

高级会员

积分
363
发表于 2018-11-15 00:42:46 | 显示全部楼层
感谢楼主的分享
回复

使用道具 举报

0

主题

30

回帖

30

积分

新手上路

积分
30
发表于 2018-11-17 10:09:20 | 显示全部楼层
感谢分享,刚好能够用上
回复

使用道具 举报

56

主题

904

回帖

1072

积分

至尊会员

积分
1072
发表于 2018-12-29 14:41:36 | 显示全部楼层
非常感谢分享。 不知道keil能不能在源代码里面用attribute定义const 数据能烧写到外挂的spi flash。

然后以后更新flash用串口读入再烧写进去。。。。   这种需求应该很多工程都用。校准的数据之类。
回复

使用道具 举报

10

主题

45

回帖

75

积分

初级会员

积分
75
发表于 2019-1-5 16:19:35 | 显示全部楼层
本帖最后由 0520kuang 于 2019-1-7 15:08 编辑

请问一下,这个用ST-link下载不了的吗
回复

使用道具 举报

8

主题

42

回帖

71

积分

初级会员

积分
71
 楼主| 发表于 2019-2-28 12:49:52 | 显示全部楼层
0520kuang 发表于 2019-1-5 16:19
请问一下,这个用ST-link下载不了的吗

不清楚,ST-LINK没研究过
回复

使用道具 举报

12

主题

134

回帖

170

积分

初级会员

积分
170
发表于 2019-3-1 20:23:37 | 显示全部楼层
学习了,不错不错,谢谢分享!
回复

使用道具 举报

0

主题

84

回帖

84

积分

初级会员

积分
84
发表于 2019-12-11 16:52:01 | 显示全部楼层
学习。。。。
回复

使用道具 举报

5

主题

109

回帖

124

积分

初级会员

积分
124
发表于 2020-5-20 00:50:38 | 显示全部楼层
这篇分享当时用的是哪个版本的MDK,我用的5.25版本没有STM32相关的示例,方便发下文章中的工程不
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106739
QQ
发表于 2020-5-20 08:12:04 | 显示全部楼层
打洞者 发表于 2020-5-20 00:50
这篇分享当时用的是哪个版本的MDK,我用的5.25版本没有STM32相关的示例,方便发下文章中的工程不

安装了STM32软件包就看到了,就在软件包里面呢。
回复

使用道具 举报

5

主题

109

回帖

124

积分

初级会员

积分
124
发表于 2020-5-22 12:07:03 | 显示全部楼层
eric2013 发表于 2020-5-20 08:12
安装了STM32软件包就看到了,就在软件包里面呢。

回复

使用道具 举报

5

主题

109

回帖

124

积分

初级会员

积分
124
发表于 2020-5-23 22:46:56 | 显示全部楼层
eric2013 发表于 2020-5-20 08:12
安装了STM32软件包就看到了,就在软件包里面呢。

类似 《STM32F1xx_DFP.2.3.0.pack》 这种软件包么   安装后还是没有
回复

使用道具 举报

73

主题

1193

回帖

1412

积分

至尊会员

积分
1412
发表于 2020-12-7 18:45:02 | 显示全部楼层
请问楼主可以将工程共享下吗?谢谢
回复

使用道具 举报

3

主题

73

回帖

82

积分

初级会员

积分
82
发表于 2021-1-22 15:59:18 | 显示全部楼层
很有用!谢谢!!!
回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2021-10-11 09:41:30 | 显示全部楼层
非常感谢楼主分享~
回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2021-10-11 09:41:57 | 显示全部楼层
非常感谢楼主分享~
回复

使用道具 举报

0

主题

6

回帖

6

积分

新手上路

积分
6
发表于 2021-12-3 22:45:05 | 显示全部楼层
试了好久,好像没成功?不知道是代码的优化问题,还是算法制作问题
回复

使用道具 举报

0

主题

11

回帖

11

积分

新手上路

积分
11
发表于 2021-12-4 12:27:35 | 显示全部楼层
感谢楼主分享,Mark一下,研究研究。
回复

使用道具 举报

0

主题

4

回帖

4

积分

新手上路

积分
4
发表于 2022-7-3 21:28:32 | 显示全部楼层
0520kuang 发表于 2019-1-5 16:19
请问一下,这个用ST-link下载不了的吗

我也是用的stlink,也没有成功,层主当年调试成功了吗?
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-3 10:20 , Processed in 0.264225 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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