由于项目需要在sd卡上使用fatfs,在调试中遇到了许多坑,记录一下。
采用安富莱的v7开发板sd fat驱动,在自己做的板子上稍加修改,没有问题。后来把sd驱动部分移植到原来的工程中,发现了很多问题。主要修改如下:
1.修改starup_stm32h743xx.s文件中的stack,heap大小。fatfs需要保存一些东西,必须要加大。
Stack_Size EQU 0x1000
AREA STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem SPACE Stack_Size
__initial_sp
; <h> Heap Configuration
; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>
Heap_Size EQU 0x800
2. 时钟滴答定时,在以前的程序中没有定义,在fatfs需要这个定时服务
void SysTick_Handler(void)
void SysTick_ISR(void)
g_ucEnableSystickISR = 1; //这个变量为1启动定时器服务
3.最大的坑是 时钟初始化函数,由于以前的工程是按照HSE输入24MHz配置的,V7开发板用的是25Mhz时钟,因此PLL1配置参数不一样。PLL1中的PLLQ是配置给SDMMC的时钟分频,很多博文说需要把这个时钟配置到48MHz,但实际上SDMMC初始化时还有一个时钟分频,经过测试这个PLLQ分频后的时钟需要小于100MHz,工程中用的是8,也就是400MHz/8=50Mhz.