如何使用wps制作pptCubeMx制作一个基于SD卡的文件系统工程

如何使用CubeMx生成一个DFU工程
时间: 19:09:19
DFU用来做IAP是很方便的,可以直接通过USB来对APP进行升级,因此,掌握DFU的制作还是挺有好处,特别是使用CubeMx工具可以快速制作,本文将基于STM3240G-EVL评估板来一步一步实现一个DFU的IAP工程。
2 制作CubeMx工程
新建一个STM32F407IGHx工程:
Peripherals:
RCC-&High Speed Clock(HSE):Crystal/Ceramic Resonator
SYS-&Debug:Serial Wire
USB_OTG_FS-&Mode:Device_Only
MiddleWares
USB_DEVICE-&Class For FS IP:Download Firmware Update Class(DFU)
再配置PG15脚为GPIO_Input模式。
Clock Configuration:
图1 时钟树设置
如上图,STM3240G-EVAL评估板使用的是25M HSE。
Configuration:
NVIC中将USB中断优先级调为5,PG15的标签设置为USER_BTN,此外还需要设置中间件USB DFU参数,如下图:
图2 USB DFU参数设置
如上图,红色框内为需要修改的代码,0x为需要为用户程序APP烧录的起始地址,字符串“@Internal Flash
/0x*016Ka,01*016Kg,01*064Kg,07*128Kg”实际为USB DFU类的interface字符串描述符,在USB DFU标准文件中有提到可选接口可以使用一个对应的接口字符串来表示此可选接口对应的目标设备的存储块信息,但如何具体规定的,DFU标准(DFU_1.1)并没有要求,是开放的,如下:
图3 DFU标准对接口字符串定义的描述
由此可见,接口字符串定义是可以自由定义的,那么在这里,由于使用到ST工具软件DfuSe Demo(v3.0.5),那么这个工具与USB DFU设备就有一个自定义的接口字符串定义,用来表示当前MCU内部的FLASH组织结构。
接下来我们来看看MCU内部FLASH的组织,由于这里的MCU是STM32F407IGHx,找到其参考文档,并查看其内部FLASH组织结构:
图4 STM32F407内部FLASH的组织结构
如上图,STM32F407内部FLASH包含4个16K扇区+1个64K扇区+7个128K扇区,并且起始地址为0x,所以它对应的接口字符串表示为: “@Internal Flash
/0x*016Ka,01*016Kg,01*064Kg,07*128Kg”, Internal Flash为在工具软件显示的名称,0x为起始地址,03*016Ka表示3个16K大小只读的扇区,01*064Kg表示1个64K大小的可读写扇区,07*128Kg表示7个128K大小的可读写扇区,后缀a表示只读,后缀g表示可读写。这个就是工具软件DfuSe Demo(v3.0.5)与DFU设备之间的约定。如下:
图5 DfuSeDemo软件中所显示的内部FLASH的可读写属性
知道了这些信息后,我们再回过头来看APP的起始地址0x,那么APP的起始地址该如何得来的?有什么要求?与这个接口字符串之间是否有关系?
到目前为止,我们可以确定地是,APP_DEFAULT_ADD的地址必须是位于接口字符串表示的可读写的地址范围内,也就是第4个扇区起(前3个扇区都是只读的),不然是烧录不进去的。其他问题我们先暂且放一放,后续我们回过头来会回答这个问题。
Project Setting :
堆设置为0x500,栈大小设置为0x2000。
图6 堆栈设置
另外,在高级设置中,设置先不调用对USB DFU的初始化:
图7 高级设置
最后生成代码。
3 代码完善
对生成后的代码是可以直接编译通过的,我们这里使用的是IAR,当然你也可以使用MDK,由于不同编译器编译的最终文件大小有所差异,而APP的偏移地址在一定程度上也是有考虑到这个DFU本身代码大小的,接下来我们都将以IAR为例。
打开usbd_duf_if.c文件,这个文件就是USB DFU CLASS与本地对接的接口实现文件,我们需要对这个源文件内没有接口填充其具体实现内容,当然,我们主要的目的是想借助DFU这个IAP来实现对APP的升级和跳转,而这些接口就是实现对FLASH读写的操作。
uint16_t MEM_If_Init_FS(void)
HAL_FLASH_Unlock();
return (USBD_OK);
如上,初始化实现对FALSH的解锁。
uint16_t MEM_If_DeInit_FS(void)
HAL_FLASH_Lock();
return (USBD_OK);
对应地,反初始化时,实现对FALSH的上锁。
uint16_t MEM_If_Erase_FS(uint32_t Add)
uint32_t startsector = 0
uint32_t sectornb = 0
HAL_StatusTypeDef status
FLASH_EraseInitTypeDef eraseinitstruct
startsector = GetSector(Add)
eraseinitstruct.TypeErase = FLASH_TYPEERASE_SECTORS
eraseinitstruct.VoltageRange = FLASH_VOLTAGE_RANGE_3
eraseinitstruct.Sector = startsector
eraseinitstruct.NbSectors = 1
status = HAL_FLASHEx_Erase(&eraseinitstruct, &sectornb)
if (status != HAL_OK)
如上,实现对FLASH擦除操作。对应的GetSector函数实现如下:
static uint32_t GetSector(uint32_t Address)
uint32_t sector = 0;
if((Address & ADDR_FLASH_SECTOR_1) && (Address &= ADDR_FLASH_SECTOR_0))
sector = FLASH_SECTOR_0;
else if((Address & ADDR_FLASH_SECTOR_2) && (Address &= ADDR_FLASH_SECTOR_1))
sector = FLASH_SECTOR_1;
else if((Address & ADDR_FLASH_SECTOR_3) && (Address &= ADDR_FLASH_SECTOR_2))
sector = FLASH_SECTOR_2;
else if((Address & ADDR_FLASH_SECTOR_4) && (Address &= ADDR_FLASH_SECTOR_3))
sector = FLASH_SECTOR_3;
else if((Address & ADDR_FLASH_SECTOR_5) && (Address &= ADDR_FLASH_SECTOR_4))
sector = FLASH_SECTOR_4;
else if((Address & ADDR_FLASH_SECTOR_6) && (Address &= ADDR_FLASH_SECTOR_5))
sector = FLASH_SECTOR_5;
else if((Address & ADDR_FLASH_SECTOR_7) && (Address &= ADDR_FLASH_SECTOR_6))
sector = FLASH_SECTOR_6;
else if((Address & ADDR_FLASH_SECTOR_8) && (Address &= ADDR_FLASH_SECTOR_7))
sector = FLASH_SECTOR_7;
else if((Address & ADDR_FLASH_SECTOR_9) && (Address &= ADDR_FLASH_SECTOR_8))
sector = FLASH_SECTOR_8;
else if((Address & ADDR_FLASH_SECTOR_10) && (Address &= ADDR_FLASH_SECTOR_9))
sector = FLASH_SECTOR_9;
else if((Address & ADDR_FLASH_SECTOR_11) && (Address &= ADDR_FLASH_SECTOR_10))
sector = FLASH_SECTOR_10;
sector = FLASH_SECTOR_11;
uint16_t MEM_If_Write_FS(uint8_t *src, uint8_t *dest, uint32_t Len)
/* USER CODE BEGIN 3 */
uint32_t i = 0;
for(i = 0; i & L i+=4)
/* Device voltage range supposed to be [2.7V to 3.6V], the operation will
be done by byte */
if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, (uint32_t)(dest+i), *(uint32_t*)(src+i)) == HAL_OK)
/* Check the written value */
if(src + i) != *(uint32_t*)(dest+i))
/* Flash content doesn't match SRAM content */
/* Error occurred while writing data in Flash memory */
/* USER CODE END 3 */
如上,实现对FLASH的写操作。
uint8_t *MEM_If_Read_FS (uint8_t *src, uint8_t *dest, uint32_t Len)
/* Return a valid address to avoid HardFault */
/* USER CODE BEGIN 4 */
uint32_t i = 0;
uint8_t *psrc =
for(i = 0; i & L i++)
dest[i] = *psrc++;
/* Return a valid address to avoid HardFault */
return (uint8_t*)(dest);
/* USER CODE END 4 */
读FLASH接口实现。
uint16_t MEM_If_GetStatus_FS (uint32_t Add, uint8_t Cmd, uint8_t *buffer)
switch (Cmd)
case DFU_MEDIA_PROGRAM:
buffer[1] = (uint8_t)FLASH_PROGRAM_TIME;
buffer[2] = (uint8_t)(FLASH_PROGRAM_TIME && 8);
buffer[3] = 0;
case DFU_MEDIA_ERASE:
buffer[1] = (uint8_t)FLASH_ERASE_TIME;
buffer[2] = (uint8_t)(FLASH_ERASE_TIME && 8);
buffer[3] = 0;
(USBD_OK);
获取状态接口实现。
接下来实现从DFU跳转到APP的功能,在main函数中 :
/* USER CODE BEGIN 2 */
if(HAL_GPIO_ReadPin(USER_BTN_GPIO_Port,USER_BTN_Pin) ==GPIO_PIN_SET)
/* Test if user code is programmed starting from address 0x */
if((USBD_DFU_APP_DEFAULT_ADD) & 0x2FFE0000 ) == 0x)
/* Jump to user application */
JumpAddress = *(__IO uint32_t*) (USBD_DFU_APP_DEFAULT_ADD + 4);
JumpToApplication = (pFunction) JumpA
/* Initialize user application's Stack Pointer */
__set_MSP USBD_DFU_APP_DEFAULT_ADD);
JumpToApplication();
MX_USB_DEVICE_Init();
/* USER CODE END 2 */
这样代码就大体修改完了,再次编译下,生成最终可执行文件。我们得到IAR如下编译信息:
18 170 bytes of readonly
code memory
290 bytes of readonly
data memory
12 517 bytes of readwrite data memory
那么DFU这个IAP本身所占ROM大小为(18170+290 )/1024 =18.02K,从图4中我们可以得知,它需要占用两个扇区(扇区0和1都是16K大小),那么APP至少应该是从扇区2开始。
此时,我们回过头去看之前提到的APP偏移地址的问题,此处结合之前说到的APP必须是第4个扇区起,那么最终APP的地址应该设置在第4个扇区的起始位置,也就是扇区3的位置,从图4可知,扇区3的起始位置为0x,这样我们回到CubeMx中将其设置,这也就是为什么APP地址设置为0x的原因。
重新编译并烧录进MCU,接下来连接USB到PC,接可是识别这个DFU设备,并通过DfuSeDemo这个软件升级APP了。
`##4 制作APP工程需要注意事项
不同编译器设置方式略有不同,在IAR中:
1 首先将system_stm32f4xx.c文件中找到VECT_TAB_OFFSET宏定义 :
#define VECT_TAB_OFFSET
即将中断向量表的偏移位置相应偏移0xC000.
接下来修改连接选项 :
图8 IAR链接设置
首先也是修改system_stm32f4xx.c文件中的VECT_TAB_OFFSET宏定义.
图9 Target设置
相应设置好了接可以了。
最后就是通过ST的软件Dfu File Manager这个软件将APP的HEX文件或BIN文件转化成dfu文件,然后通过DfuSeDemo这个软件导入dfu文件,最终烧录APP到0x这个地址了,最终验证是可以运行的。
APP的起始地址应该设置为扇区的起始地址,且即使没有重叠,也不能放在IAP的所在扇区。
APP的起始地址必须在USB DFU CLASS接口字符串所描述的可读写扇区范围内。
另外附上源码示例:http://download.csdn.net/detail/flydream0/9730940
作者:flydream0 发表于 21:09:19 原文链接
阅读:29 评论:0 查看评论21ic官方微信-->
后使用快捷导航没有帐号?
STM32F1入门福利:基于HAL库(CubeMX)的软硬件设计手册(更新完结)
&&已结帖(0)
主题帖子积分
高级技术员, 积分 616, 距离下一级还需 384 积分
高级技术员, 积分 616, 距离下一级还需 384 积分
主题帖子积分
专家等级:结帖率:100%打赏:0.00受赏:8.00
主题帖子积分
高级技术员, 积分 616, 距离下一级还需 384 积分
高级技术员, 积分 616, 距离下一级还需 384 积分
本帖最后由 亼亽 于
09:34 编辑
STM32入门学习选择使用HAL库代替原本的标准固件库已经是板上钉钉的事了,
不然你就out了,当你辛辛苦苦学习完标准固件库之后,发现大家都在用HAL库
了。STM32CubeMX可以提供的方便还是显而易见的。
苦于网上目前还没有体系的、详细的、易理解的基于HAL库教程文档使得新人
学习非常痛苦,现在福利已经到来,基于HAL库的教程文档已经出来了.
实际上在之前到现在就是以后我们一直都在更新基于HAL库的例程(本论坛系
列帖子:【HAL库每天一例】),文档+例程,使得你学习HAL库不再烦恼
经过几个月的奋斗努力,本文档已经编写完结,暂告一段落了,文档总共39章
内容—614页,欢迎各位坛友下载阅读。。。文档中部分内容是硬石团队完全
自主编写,个人觉得还是非常不错的,当然也有部分内容是参考广大网友的智
慧,在这里向他们致敬!最后希望各位坛友在阅读本文档后可以指出文档不足
地方并提出建议,谢谢了。
关于文档更新问题:文档现在更新告一段路,因为个人觉得文档内容已经足够
新手STM32入门了。除非,有很多坛友提出必须增加部分知识点内容,我们会
在后面考虑增加对应的内容。。。
硬石YS-F1Pro开发板技术手册
基于HAL库的STM32入门系列教程
文档及配套例程下载:
资料包括程序、相关说明资料以及软件使用截图
百度云盘: 密码:u6m1360云盘:密码 cfb6
发布记录:
时间& && && && && && && && && & 最新章节
& && && && && & 至第2章
第1章 YS-F1Pro开发板硬件设计
第2章 YS-F1Pro开发板原理图详解
& && && && && & 至第6章
第3章& & 3.5寸液晶模组电路设计
第4章& & HAL库介绍
第5章& & STM32CubeMX安装及使用
第6章& & KEIL v5和IAR软件使用
& && && && && & 至第8章
第7章& & 寄存器
第8章& & Cortex-M3内核
编辑问题:修改例程下载地址
本帖子中包含更多资源
才可以下载或查看,没有帐号?
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
高级技术员, 积分 616, 距离下一级还需 384 积分
高级技术员, 积分 616, 距离下一级还需 384 积分
主题帖子积分
专家等级:结帖率:100%打赏:0.00受赏:8.00
主题帖子积分
高级技术员, 积分 616, 距离下一级还需 384 积分
高级技术员, 积分 616, 距离下一级还需 384 积分
HAL库是ST官方新版本(实际上已经出了几年了)
标准库几年前官方就不再更新
ST新推出的芯片不再有标准库了,只有HAL库
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
高级技术员, 积分 616, 距离下一级还需 384 积分
高级技术员, 积分 616, 距离下一级还需 384 积分
主题帖子积分
专家等级:结帖率:100%打赏:0.00受赏:8.00
主题帖子积分
高级技术员, 积分 616, 距离下一级还需 384 积分
高级技术员, 积分 616, 距离下一级还需 384 积分
& && && && && & 至第9章
第9章& & GPIO—流水灯
& && && && && & 至第11章
第10章& & 工程文件结构和复位启动
第11章&&GPIO—按键输入扫描
& && && && && & 至第17章
第12章& &EXTI—按键中断输入
第13章& &USART—RS-232串口通信
第14章& &USART-指令控制
第15章& &DMA—直接内存访问
第16章& &DMA- USART1接发
第17章& &SysTick—系统滴答定时器
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
高级技术员, 积分 616, 距离下一级还需 384 积分
高级技术员, 积分 616, 距离下一级还需 384 积分
主题帖子积分
专家等级:结帖率:100%打赏:0.00受赏:8.00
主题帖子积分
高级技术员, 积分 616, 距离下一级还需 384 积分
高级技术员, 积分 616, 距离下一级还需 384 积分
& && && && && & 至第19章
第18章& &TIM—基本定时器
第19章& &TIM-高级控制定时器
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
高级技术员, 积分 616, 距离下一级还需 384 积分
高级技术员, 积分 616, 距离下一级还需 384 积分
主题帖子积分
专家等级:结帖率:100%打赏:0.00受赏:8.00
主题帖子积分
高级技术员, 积分 616, 距离下一级还需 384 积分
高级技术员, 积分 616, 距离下一级还需 384 积分
& && && && && & 至第21章
第20章& &TIM—通用定时器(电容按键)
第21章& &TIM—通用定时器( 呼吸灯)
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
高级技术员, 积分 616, 距离下一级还需 384 积分
高级技术员, 积分 616, 距离下一级还需 384 积分
主题帖子积分
专家等级:结帖率:100%打赏:0.00受赏:8.00
主题帖子积分
高级技术员, 积分 616, 距离下一级还需 384 积分
高级技术员, 积分 616, 距离下一级还需 384 积分
& && && && && & 至第23章
第22章& &ADC—电压采集
第23章& &DAC—电压输出
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
高级技术员, 积分 616, 距离下一级还需 384 积分
高级技术员, 积分 616, 距离下一级还需 384 积分
主题帖子积分
专家等级:结帖率:100%打赏:0.00受赏:8.00
主题帖子积分
高级技术员, 积分 616, 距离下一级还需 384 积分
高级技术员, 积分 616, 距离下一级还需 384 积分
& && && && && & 至第26章
第24章& &LCD-液晶显示
第25章& &LCD显示中英文(字模在内部FLASH)
第26章& &FSMC-外部SRAM实验
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
高级技术员, 积分 616, 距离下一级还需 384 积分
高级技术员, 积分 616, 距离下一级还需 384 积分
主题帖子积分
专家等级:结帖率:100%打赏:0.00受赏:8.00
主题帖子积分
高级技术员, 积分 616, 距离下一级还需 384 积分
高级技术员, 积分 616, 距离下一级还需 384 积分
& && && && && & 至第28章
第27章& &SDIO-SD卡
第28章& &SDIO-基于SD卡的FATFS文件系统
文档及配套例程下载:
资料包括程序、相关说明资料以及软件使用截图
百度云链接:/s/1i574oPv
密码:r3s3
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
高级技术员, 积分 616, 距离下一级还需 384 积分
高级技术员, 积分 616, 距离下一级还需 384 积分
主题帖子积分
专家等级:结帖率:100%打赏:0.00受赏:8.00
主题帖子积分
高级技术员, 积分 616, 距离下一级还需 384 积分
高级技术员, 积分 616, 距离下一级还需 384 积分
& && && && && & 至第31章
第29章& &SPI-串行Flash
第30章& &SPI-基于串行Flash的FatFS文件系统
第31章& &I2C-EEPROM
百度云盘:/s/1slN8rIt 密码:u6m1
360云盘:/OcPiRp3wEcA92u密码 cfb6
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
高级技术员, 积分 616, 距离下一级还需 384 积分
高级技术员, 积分 616, 距离下一级还需 384 积分
主题帖子积分
专家等级:结帖率:100%打赏:0.00受赏:8.00
主题帖子积分
高级技术员, 积分 616, 距离下一级还需 384 积分
高级技术员, 积分 616, 距离下一级还需 384 积分
终于找到下载地址了,你们的网站没有工信部的许可证啊,小心被抓。。
谢谢提醒,最近已经在做备案问题了
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
高级技术员, 积分 616, 距离下一级还需 384 积分
高级技术员, 积分 616, 距离下一级还需 384 积分
主题帖子积分
专家等级:结帖率:100%打赏:0.00受赏:8.00
主题帖子积分
高级技术员, 积分 616, 距离下一级还需 384 积分
高级技术员, 积分 616, 距离下一级还需 384 积分
& && && && && & 至第35章
第32章& &LCD-显示汉字(字库在SD卡)
第33章& &LCD-显示汉字(字库在串行Flash)
第34章& &LCD-显示图片(图片在SD卡)
第35章& &LCD-触摸画笔
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
高级技术员, 积分 616, 距离下一级还需 384 积分
高级技术员, 积分 616, 距离下一级还需 384 积分
主题帖子积分
专家等级:结帖率:100%打赏:0.00受赏:8.00
主题帖子积分
高级技术员, 积分 616, 距离下一级还需 384 积分
高级技术员, 积分 616, 距离下一级还需 384 积分
& && && && && & 至第37章
第36章& &CAN-双机通信测试
第37章& &RS-485通信
百度云盘:& &密码:u6m1
360云盘:&&密码 cfb6
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
高级技术员, 积分 616, 距离下一级还需 384 积分
高级技术员, 积分 616, 距离下一级还需 384 积分
主题帖子积分
专家等级:结帖率:100%打赏:0.00受赏:8.00
主题帖子积分
高级技术员, 积分 616, 距离下一级还需 384 积分
高级技术员, 积分 616, 距离下一级还需 384 积分
STM32CubeMX下载很慢很费时,不知道现在有没有改进?
百度云盘:& &密码:u6m1
360云盘:&&密码 cfb6
我们网盘里边有资源的,可以下载
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
高级技术员, 积分 616, 距离下一级还需 384 积分
高级技术员, 积分 616, 距离下一级还需 384 积分
主题帖子积分
专家等级:结帖率:100%打赏:0.00受赏:8.00
主题帖子积分
高级技术员, 积分 616, 距离下一级还需 384 积分
高级技术员, 积分 616, 距离下一级还需 384 积分
& && && && && & 至第39章
第38章& &以太网-W5500
第39章& &WIFI-ESP8266
文档及配套例程下载:
资料包括程序、相关说明资料以及软件使用截图
百度云盘: 密码:u6m1
360云盘:密码 cfb6
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
高级技术员, 积分 616, 距离下一级还需 384 积分
高级技术员, 积分 616, 距离下一级还需 384 积分
主题帖子积分
专家等级:结帖率:100%打赏:0.00受赏:8.00
主题帖子积分
高级技术员, 积分 616, 距离下一级还需 384 积分
高级技术员, 积分 616, 距离下一级还需 384 积分
没有USB么,就卡在USB这边了,STM32F303RET6的板子,用STM32F3-Discovery_FW_V1.1.0里面Peripheral_Example ...
USB 的目前只有模拟U盘的例程,USB做起来内容很多,需要花多时间呢
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
高级技术员, 积分 616, 距离下一级还需 384 积分
高级技术员, 积分 616, 距离下一级还需 384 积分
主题帖子积分
专家等级:结帖率:100%打赏:0.00受赏:8.00
主题帖子积分
高级技术员, 积分 616, 距离下一级还需 384 积分
高级技术员, 积分 616, 距离下一级还需 384 积分
模拟U盘的例程也没有看到啊
有HAL库例程的,你仔细找找,,文档说明就没有
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:使用STM32CubeMX 创建第一个点亮LED工程 - STM32/STM8技术论坛 -
中国电子技术论坛 -
最好最受欢迎电子论坛!
后使用快捷导航没有帐号?
Hot [直播]
使用STM32CubeMX 创建第一个点亮LED工程
17:19:29  
最近空着没事打算研究freertos,突然发现STM32CubeMX工具,用来配置软件开发。突然感觉很兴奋的发现终于有一个和labview图形化的开发程序的软件了,其实从大二开始就开始接触单片机,到现在已经工作两年,这么算起来已经有四年的相关知识了,尤其对于在OS上的开发,对于很多的开发者来说,绝对是个很麻烦的事情。其中还要包括系统移植等操作。接下来我想和大家分享如何利用STM32CubeMX工具来开发STM32本文虽然简单,但是对于后期开发有很大的帮助。
本打算把移植FREERTOS的也弄在上面,后来想想算了,没有必要重复劳动。
按照LED的工程设置,直接选中FREERTOS功能项,注意:如果使用, xTaskCreate(vTaskLED,&TASK&,512,NULL,2,NULL);需要将下面两句注释掉,我查了一下,下面两句好似就是用来创建任务使用,不过对于这个还是不太擅长使用。即可编写自己的应用程序了。
//&&osThreadDef(defaultTask, StartDefaultTask, osPriorityNormal, 0, 128);
//&&defaultTaskHandle = osThreadCreate(osThread(defaultTask), NULL);
17:14 上传
点击文件名下载附件
下载积分: 积分 -1 分
601.92 KB, 下载次数: 28, 下载积分: 积分 -1 分
17:52:34  
PCB在线计价下单
板子大小:
板子数量:
PCB 在线计价
CubeMX工具还是挺好用的
12个问题&&&&&&&&8353个浏览
21个问题&&&&&&&&21285个浏览
33个问题&&&&&&&&7912个浏览
Powered byCube+SDIO+FATFS使用时SD卡读块卡死问题!! - STM32 - 意法半导体STM32/STM8技术社区
后使用快捷导航没有帐号?
查看: 4066|回复: 17
Cube+SDIO+FATFS使用时SD卡读块卡死问题!!
在线时间252 小时
主题帖子好友
金牌会员, 积分 1174, 距离下一级还需 3826 积分
金牌会员, 积分 1174, 距离下一级还需 3826 积分
本帖最后由 adlu 于
15:09 编辑
MCU型号:STM32F407ZET6开发软件:STM32CubeMX V4.11,MDK V5
使用STM32CubeMX配置生成程序框架,使用SDIO 4bit模式操作SD卡,并配置了使用FATFS。截图如下
QQ图片21.png (50.36 KB, 下载次数: 1)
14:59 上传
QQ图片34.png (63.15 KB, 下载次数: 1)
14:59 上传
SDIO时钟分频系数为2,即SDIO_CK=48MHz/(2+2)=12MHz.SDIO其他配置默认。
QQ图片05.png (38.33 KB, 下载次数: 0)
15:00 上传
FATFS配置,仅改变CODE_PAGE为简体中文,其他默认。
a.png (108.31 KB, 下载次数: 0)
15:01 上传
问题描述:SD卡读写操作时,经常出现卡死的情况。通过J-Link调试,发现卡死时程序在HAL_SD_ReadBlocks()函数的两个语句之间来回运行,如下图。
b.png (69.08 KB, 下载次数: 3)
15:02 上传
&&/* Read block(s) in polling mode */
&&if(NumberOfBlocks & 1)
&&{
}
&&else
&&{
& & /* Check for error conditions */
& & errorstate = SD_CmdResp1Error(hsd, SD_CMD_READ_SINGLE_BLOCK);
& & if (errorstate != SD_OK)
& & {
& && &
& & }& &
& & /* In case of single block transfer, no need of stop transfer at all */
#ifdef SDIO_STA_STBITERR
& & while(!__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DBCKEND | SDIO_FLAG_STBITERR)) /*卡在此句1*/
#else /* SDIO_STA_STBITERR not defined */
& & while(!__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DBCKEND))& && &
#endif /* SDIO_STA_STBITERR */
& & {
& && &if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXFIFOHF)) /*卡在此句2*/
& && &{
& && &&&/* Read data from SDIO Rx FIFO */
& && &&&for (count = 0; count & 8; count++)
& && &&&{
& && && & *(tempbuff + count) = SDIO_ReadFIFO(hsd-&Instance);
& && &&&}
& && &&&
& && &&&tempbuff += 8;
& && &}
& & }
&&}复制代码
降低SDIO的时钟或配置为1bit模式,也无法避免该现象的发生。
请高人指点迷津!!
欢迎加入STM32/STM8社区技术交流群:& & &STM32Lxx开发群:
在线时间92 小时
ST金币1543
主题帖子好友
金牌会员, 积分 1440, 距离下一级还需 3560 积分
金牌会员, 积分 1440, 距离下一级还需 3560 积分
,看能不能帮助你...
在线时间252 小时
主题帖子好友
金牌会员, 积分 1174, 距离下一级还需 3826 积分
金牌会员, 积分 1174, 距离下一级还需 3826 积分
参考 http://www.stmcu.org/module/forum/thread--1.html
,看能不能帮助你...
这个贴我看过,只是讲SD卡读写的基本操作。这部分操作我已经实现,包括FATFS对文件的读和写操作。
而且已经实现文件的读取,创建,写入,保存,删除等操作。
我遇到的问题是:很容易卡死在上面贴出的那两行代码中。
欢迎加入STM32/STM8社区技术交流群:& & &STM32Lxx开发群:
在线时间92 小时
ST金币1543
主题帖子好友
金牌会员, 积分 1440, 距离下一级还需 3560 积分
金牌会员, 积分 1440, 距离下一级还需 3560 积分
明白,好像是什么状态不满足时卡死了,有没有可能是硬件原因,如信号不稳定等...
在线时间252 小时
主题帖子好友
金牌会员, 积分 1174, 距离下一级还需 3826 积分
金牌会员, 积分 1174, 距离下一级还需 3826 积分
本帖最后由 adlu 于
18:22 编辑
问题已解决。
欢迎加入STM32/STM8社区技术交流群:& & &STM32Lxx开发群:
在线时间252 小时
主题帖子好友
金牌会员, 积分 1174, 距离下一级还需 3826 积分
金牌会员, 积分 1174, 距离下一级还需 3826 积分
本帖最后由 adlu 于
18:23 编辑
已经解决。
CubeMX生成的代码SDIO polling模式可能真的有问题。
配置SDIO使用DMA模式,SDIO_RX和SDIO_TX配置相同。
a.jpg (89.72 KB, 下载次数: 2)
18:21 上传
生成代码,然后需要手动修改部分代码。
1.如果是用CubeMX 4.11及更早版本的,要修改stm32f4xx_hal_msp.c中HAL_SD_MspInit( )函数的两个DMA配置参数,将DMA_NORMAL改为DMA_PFCTRL。
2.修改sd_diskio.c中SD_read( )和SD_write( )函数,
分别将BSP_SD_ReadBlocks( )改为BSP_SD_ReadBlocks_DMA( );
将BSP_SD_WriteBlocks( )改为BSP_SD_WriteBlocks_DMA( ).
3.全局搜索SdTransferCplt变量,找到while(hsd-&SdTransferCplt == 0)这个语句并屏蔽,否则会卡死在词句,我也不知道为什么。
经过上述步骤,就可以顺利的使用SDIO DMA功能进行SD卡读写了。
配合CubeMX生成的FATFS架构,就可以进行SD卡的文件操作了。目前未发现其他问题。
谢谢分享!&
在线时间6 小时
主题帖子好友
初级会员, 积分 59, 距离下一级还需 141 积分
初级会员, 积分 59, 距离下一级还需 141 积分
估计F103可以用来参考。先谢谢经验分享!
欢迎加入STM32/STM8社区技术交流群:& & &STM32Lxx开发群:
在线时间47 小时
主题帖子好友
中级会员, 积分 230, 距离下一级还需 270 积分
中级会员, 积分 230, 距离下一级还需 270 积分
按照您的方法没有解决呢
在线时间127 小时
ST金币1257
主题帖子好友
金牌会员, 积分 2475, 距离下一级还需 2525 积分
金牌会员, 积分 2475, 距离下一级还需 2525 积分
谢谢分享!!!
欢迎加入STM32/STM8社区技术交流群:& & &STM32Lxx开发群:
在线时间87 小时
主题帖子好友
高级会员, 积分 538, 距离下一级还需 462 积分
高级会员, 积分 538, 距离下一级还需 462 积分
已经解决。
CubeMX生成的代码SDIO polling模式可能真的有问题。
配置SDIO使用DMA模式,SDIO_RX和SDIO_TX配 ...
找到while(hsd-&SdTransferCplt == 0)这个语句并屏蔽....
你的SDIO global interrupt的优先级是多少? SDIO的Tx,Rx的DMA的中断优先级又是多少?
我也碰到你的问题,但我将SDIO global interrupt的优先级设置为小于或等于SDIO的Tx,Rx的DMA的中断优先级后,问题好像解决了。
站长推荐 /3
为让大家更好的使用STM32单片机,特别是学生群体有进一步的提升,特推出本次助学计划。愿开发板可以物尽其用,发挥最大价值。
Tel: 3-8064
备案号: 苏ICP备号-2
|||意法半导体STM32/STM8技术社区
Powered by

我要回帖

更多关于 印章制作大师如何使用 的文章

 

随机推荐