STM32F0:SD卡升级

发布者:快乐的天使最新更新时间:2018-12-29 来源: eefocus关键字:STM32F0  SD卡升级 手机看文章 扫描二维码
随时随地手机看文章

前文说过,在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文件出现错误,最好增加一个校验文件,读取文件之后再计算校验结果,然后与校验文件进行对比,校验方式的算法自由定义即可。


关键字:STM32F0  SD卡升级 引用地址:STM32F0:SD卡升级

上一篇:STM32F030和STM32F103的IO结构上的区别
下一篇:STM32 模拟IIC主设备 非IIC静默模式

推荐阅读最新更新时间:2024-03-16 16:21

STM32F0 定时器触发ADC,多通道采样、DMA传输数据的配置
本块代码实现了定时器定时触发ADC,多通道采样,并通过DMA进行数据传输到内存的操作。 #include adc.h #define DMA_BUFFER_SIZE 6 uint8 sample_finish = 0; int16 adc_dma_tab = { 0 }; uint8 sample_index = 0; //采样点数据 int16 sample_1 = { 0 }; int16 sample_2 = { 0 }; int16 sample_3 = { 0 }; int16 sample_4 = { 0 }; int16 sample_5 = { 0 }; int16 sample
[单片机]
STM32的sd卡的IAP升级固件教程
一. 1.功能:通过sd卡升级stm32的固件 2.所需要的设备:STM32的最小系统、sd卡模块、sd卡、keil软件,boot升级程序,APP程序 二. 1.据程序中的接口连接好电气关系,具体的电路图根据附件1连接(根据个人,这个附件就不上传了) 2.首先打开附件2的stm32 boot升级程序 3.根据如图所示设置stm32 boot程序下的keil软件 3.如图上第三步的标示是留给64k的boot引导程序区,这一步是根据你的stm32的flash的大小设定的,一般留有64k空间足够用了 4.这个要注意 5.如上图设置好的后,下载到板子里面 三. 1.打开附件3的
[单片机]
STM32的<font color='red'>sd卡</font>的IAP<font color='red'>升级</font>固件教程
STM32F0 ADC学习
开始时候使用的是stdlib的库,最近发现cube库用的越来越广泛了,遂开始使用cube库来完成ADC的多通道采集实验。 ADC 的driver 在STM32F0XX_HAL_DRIVER当中,有stm32f0xx_hal_adc.c文件中,我们可以在stm32f0xx_hal_conf.h中开启 宏定义 ADC 模块。 ADC有三种工作模式,polling interruptDMA 我这里使用了polling的方式来获取多通道的数据。 首先是要声明两个参数设置的结构体 ADC_HandleTypeDef AdcHandle; ADC_ChannelConfTypeDef sConfig;
[单片机]
用STM32Cube+FreeRTOS+Keil5对STM32F0编程之通过USART发送数据
STM32CubeMX的设置变化 Pinout 中使能 FreeRTOS Configuration 中配置 FreeRTOS 添加任务 生成代码 Keil5 中编辑代码 main 函数 int main(void) { /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /* MCU Configuration----------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and
[单片机]
用STM32Cube+FreeRTOS+Keil5对<font color='red'>STM32F0</font>编程之通过USART发送数据
stm32f0系列在SWD模式下载时复位失败
用stm32f030K6T6做了个小玩意,仿真电路就直接把3.3V,SWDIO,SWCLK,GND引出来连接到j-link的这四个角上,SWDIO和SWCLK引脚既没有上拉也没有下拉。 MCU J-Link 3.3V --- 1脚 SWDIO --- 7脚 SWCLK --- 9脚 GND --- 4脚 ps:4、6、8、10、12、14、16、18、20任意一脚都是GND 可是下载时一直显示复位失败,搜索论坛,有很多种办法,如下: (1)SWDIO和SWCLK引脚上拉到3.3V; (2)SWDIO上拉到3.3V,SWCLK下拉到GND; (3)SWDIO和S
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved