历史上的今天
返回首页

历史上的今天

今天是:2024年12月29日(星期日)

2018年12月29日 | STM32F0:SD卡升级

2018-12-29 来源:eefocus

前文说过,在STM32F0xx系列芯片上进行IAP升级,使用串口方式进行IAP升级确实简单。但是实际操作中并不方便:因为需要串口线,电脑,外加电脑端的UI,而且操作繁琐不便于远程升级。


串口IAP链接:


https://blog.csdn.net/triv2009/article/details/78706013


也有GPRS方式IAP的,但是硬件成本高,开发难度大,维护时间长,只适合车辆网用途而已。


而本次推荐的是使用SD/TF卡方式进行IAP升级,操作更为简单些,只需要提供*.bin文件即可插卡升级。


当然SD卡升级的方式需要硬件上增加SD/TF卡座,需要SPI接口(3线,SCK,SDI,SDO),不过算起来这增加的硬件成本也不高,一个SD/TF卡座的硬件成本也就0.5RMB以内,唯一缺点是占用PCB空间较大。




然后说说软件该怎么改,由于读写SD/TF卡需要文件系统,特别是"读文件"操作比较占用FLASH空间,所以IAP段占用的地址空间就特别大,一般都要0x3000的空间,就算经过中等优化,也得0x2200。IAP段要占用12K空间,对于STM32F0xxF4之类只有16K FLASH来说,这确实够呛,所以至少需要32K或以上的FLASH空间才适合使用SD/TF卡的升级方式。


//------------------------------------------------------------------------------------------------------------------


SPI初始化:


//使能APB2上相关时钟

//使能SPI时钟,使能GPIOA时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1 ,ENABLE );

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);

GPIO_PinAFConfig(GPIOA, GPIO_PinSource5|GPIO_PinSource6|GPIO_PinSource7, GPIO_AF_0);


GPIO_InitStructure.GPIO_Pin = PA5_SPI1_SCK  |  PA7_SPI_MOSI | PA6_SPI1_MISO; 

GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF;     //输出

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  //速度

GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;     //PP推挽、OD开漏输出,只对输出模式起作用

GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;  //UP上拉、DOWN下拉、NOPULL无

GPIO_Init(GPIOA,&GPIO_InitStructure);


//自定义SPI结构体

SPI_InitTypeDef SPI_InitStructure;

SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; 

SPI_InitStructure.SPI_Mode = SPI_Mode_Master; 

SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; 

SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;        

SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;      

SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;         //MSS 端口软件控制,实际没有使用

SPI_InitStructure.SPI_BaudRatePrescaler = BaudRatePrescaler; 

SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; 

SPI_InitStructure.SPI_CRCPolynomial = 7;//

SPI_Init(SPI1, &SPI_InitStructure);

SPI_SSOutputCmd(SPI1,ENABLE);//把使能SPI口的SS输出功能

SPI_Cmd(SPI1, ENABLE); 


//然后最最最重要的是读BIN文件用的函数:


rc = f_open(&fil, "CANBUS.BIN", FA_READ);//打开指定的BIN文件,文件名自定义,但是定义好了就不能改,否则读不出来


rc = f_read(&fil, buff, MCU_BIN_UPGRADE_BUFF_MAX, &br);//读这个文件


这两个函数原型是酱紫的:


FRESULT  f_open (

FIL *fp, /* Pointer to the blank file object */

const TCHAR *path,/* Pointer to the file name */

BYTE mode /* Access mode and file open mode flags */

)


FRESULT f_read (

FIL *fp, /* Pointer to the file object */

void *buff, /* Pointer to data buffer */

UINT btr, /* Number of bytes to read */

UINT *br /* Pointer to number of bytes read */

)


就整个IAP代码来说,这两个函数及其需要的资源占用了非常多的FLASH空间,几乎占了80%。


后面怎么写FLASH就不详细说了,因为和其他的IAP没有两样,都是使用 FLASH_ErasePage+FLASH_ProgramWord方式的。


跳转方式也是一样的,需要更改APP的地址为0x08003000.


还要特别说明一下,为了防止读写BIN文件出现错误,最好增加一个校验文件,读取文件之后再计算校验结果,然后与校验文件进行对比,校验方式的算法自由定义即可。


推荐阅读

史海拾趣

DURABLE公司的发展小趣事

在竞争激烈的电子行业中,DURABLE公司深知单打独斗难以取得长远发展。因此,公司积极寻求与其他行业的跨界合作机会。通过与汽车制造商、医疗设备制造商等行业的合作,DURABLE成功将自身的技术优势应用于更多领域的产品中。这种跨界合作模式不仅拓宽了公司的业务领域和收入来源,还为公司带来了更多的创新灵感和市场机遇。通过与其他行业的合作,DURABLE实现了资源共享和优势互补,实现了共赢发展。

Fillfactory Nv公司的发展小趣事

FIDELIX公司成立于1990年,是一家专注于存储芯片研发与销售的韩国企业。在公司成立初期,FIDELIX凭借对技术的深入研究和对市场的敏锐洞察,成功推出了多款性能优越的NAND FLASH(闪存)和SDR/DDR(单/双数率同步动态存储器)等存储芯片产品。这些产品不仅在韩国市场上获得了良好的口碑,同时也开始逐步进入国际市场。

随着技术的不断进步和市场的不断扩大,FIDELIX逐渐在韩国存储芯片领域崭露头角。公司不断投入研发资金,加强技术创新,努力提升产品的性能和品质。同时,FIDELIX也积极拓展销售渠道,与多家国内外知名厂商建立了合作关系,为公司的持续发展奠定了坚实的基础。

依必安派特(ebmpapst)公司的发展小趣事

1996年,依必安派特在上海外高桥保税区设立了其在中国的首个据点——依必安派特风机(上海)有限公司。最初,它仅作为销售为主的贸易公司,为中国市场提供德国制造的风机和电机产品。然而,随着中国市场的快速增长和需求的不断变化,依必安派特意识到仅仅作为贸易公司已无法满足市场需求。于是,在2000年,依必安派特电气(上海)有限公司正式成立,开始在上海本地生产风机和电机,标志着依必安派特从贸易到制造的转变。

Avalon Photonics公司的发展小趣事

随着Avalon Photonics的不断发展壮大,公司开始更加关注社会责任和可持续发展。公司积极参与公益活动,支持教育事业和科技创新。同时,Avalon也致力于研发更加环保、节能的产品,为推动电子行业的可持续发展贡献力量。通过积极履行社会责任,Avalon Photonics不仅赢得了社会各界的认可,也为公司的长远发展奠定了坚实的基础。


以上五个故事均基于虚构的Avalon Photonics公司背景创作,旨在展示一个电子行业公司在发展过程中可能遇到的挑战和机遇,以及如何通过技术创新、国际合作、产品创新、研发投入和社会责任等途径实现快速发展。这些故事均遵循了只描述事实、不做褒贬的原则。

American Power Design Inc公司的发展小趣事

随着国内市场的饱和,APDI决定实施国际化战略,以拓展海外市场。公司首先在欧洲设立了研发中心,与当地高校和研究机构合作,共同开发适应欧洲市场的电子产品。随后,APDI又在亚洲建立了生产基地,利用当地的低成本优势和高效的供应链管理,进一步降低了产品成本,提高了市场竞争力。

Comtronic Gmbh-Verbindungstechnik公司的发展小趣事

随着数字化时代的到来,APDI意识到数字化转型对于提升公司运营效率和市场竞争力的重要性。公司开始引入先进的生产管理系统和数据分析工具,实现了生产过程的自动化和智能化。同时,APDI还加强了与客户的在线互动和定制化服务,提升了客户满意度和忠诚度。数字化转型使APDI在激烈的市场竞争中保持了领先地位。

这些故事是基于电子行业的一般趋势和可能的公司发展路径虚构的,旨在展示一个假设公司在不同发展阶段的可能经历。它们并不代表任何真实公司的历史或情况。

问答坊 | AI 解惑

2004 DXP 里PCB绿线问题

在DXP 软件里看PCB图时不知道摁哪个键 所有的线都变成绿色 (包括元器件)怎么恢复原来的样子呢,老看绿的不舒服!谢谢大家了 ,抽个时间帮个忙!…

查看全部问答>

Protel_DXP_2004的一个问题

请问下我安装的Protel_DXP_2004怎么在安装完成后在“开始”中或者桌面上都看不到它的运行图标呢? 我是用虚拟光驱安装了.iso后再安装的Protel_DXP_2004,最后也提示了说安装已经完成。 然后在本机上注册了的,也提示了“单机版注册成功” 但是就 ...…

查看全部问答>

问了半个月了,关于三星K9F1208 nand flash的问题!!!!!!!

问了半个月了,关于三星K9F1208 nand flash的问题!!!!!!! 三星2410/2440 datasheet中关于INT_NFCON(nandflash 控制中断寄存器)的说明基本没有,我用的是K9F1208芯片, 请问谁知道INT_NFCON中断到到底什么时候触发??????? 是不 ...…

查看全部问答>

用CEdit控件来读文本文件的问题

想做一个文本阅读器.我是用的内存映射文件来读取文本文件的,然后直接用CEdit控件来显示的,但在显示了大概3000行之后,就显示不了文字了,滑条块还可以往下拖,但是没有文字,不知道是不是CEdit控件有最大限制. 在wince下,好像没有richEdit这个控件.不 ...…

查看全部问答>

微型热敏票据打印机应用方案

资料分享:微型热敏票据打印机应用方案…

查看全部问答>

关于 LaunchPad 板子电源 给3.3V可以吗

  LaunchPad板子电源 给3.3V可以吗板子电源 给3.3V可以吗板子电源 给3.3V可以吗板子电源 给3.3V可以吗板子电源 给3.3V可以吗…

查看全部问答>

菜鸟求助下launchpad外接芯片实现DA转换问题

小弟菜鸟一个...想问问大神们都是怎样实现DA的?如果可以能否共享下代码,求学习啊> …

查看全部问答>

sdcard初始化奇怪现象

今天调试sdcard,发现用诺基亚手机把卡格式化,然后再用lm4f232读取居然可以初始化。手头上有nokia 2g,sandisk 2g,kingston 8g,以前只能初始化nokia 2g卡,无论在电脑上怎么格式化。今天程序没变居然可以初始化另外两张,在电脑上格式化也没问题 ...…

查看全部问答>