拿到F69I-DISCO后,发现KEIL V5中的STM32469I-Discovery中的代码都是用HAL库实现的,由于一直在用FWLib来写代码。 看到DISCO板子上面有现成的mini-SD卡座,索性就先用手头的SD卡来做个标准库移植。
从官网下了stm32f4_dsp_stdperiph_libV1.6.1标准库,首先在查看板子SCH中的SD卡接口引脚为SDIO口: 其次,到标准库中找到对应的SD底层和控制文件: stm324x9i_eval_sdio_sd.c/.h文件是对SD卡协议的实现,包括IO口的配置、中断(SDI/DMA)、SD卡协议等的实现,是基于STM324x9I-EVAL系列开发板的。 标准库的SDIO_uSDCard中文件为SD卡的运用函数,包括NVIC中断的配置、SD卡的擦除、读写块等函数的实现。
在将各文件整合到工程中后,需要做一些改动:
在stm324x9i_eval_sdio_sd.c中有包含了stm324x9i_eval_ioe16.h这个头文件,看了下里面都是基于STM324x9I-EVAL的一些必要驱动和宏定义, 包括IC21,外部中断引脚,IO脚的寄存器定义等,一时也不知和需要的SD卡移植有何关系,但编译了下后,发现SD卡检测函数有错: 在.h文件中看到检测脚为IO16_Pin_15, 继续查看到其宏定义: 这个0x8000是什么意思?看到标准库中对GPIO_Pin_x的定义如下: 说明EVAL板的SD检测管脚号为15。
同时查看了stm324x9i_eval_ioe16.c中的这个函数,也只是读取这个IO口的电平功能: 而我们DISCO板的检测脚看原理图为PG2,需要相应的修改IO口的端口和管脚号。
这样,我们可以直接自己写个读取IO电平的函数来代替: /** * @brief Initializes the SD Detect pin MSP. * @param none * @retval None */ #if SD_USE_DETECT_PIN > 0 static void BSP_SD_Detect_MspInit(void) { //F469I-DISCO: PG2 GPIO_InitTypeDef GPIO_InitStructure; RCC_AHB1PeriphClockCmd(SD_DETECT_GPIO_CLK, ENABLE); GPIO_InitStructure.GPIO_Pin = SD_DETECT_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_Init(SD_DETECT_GPIO_PORT, &GPIO_InitStructure); }
uint8_t SD_Detect(void) { __IO uint8_t status = SD_PRESENT;
/*!< Check GPIO to detect SD */ // if (IOE16_MonitorIOPin(SD_DETECT_PIN) != IOE16_BitReset) // { // status = SD_NOT_PRESENT; // } #if SD_USE_DETECT_PIN > 0 if(GPIO_ReadInputDataBit(SD_DETECT_GPIO_PORT, SD_DETECT_PIN) != Bit_RESET) { status = SD_NOT_PRESENT; } #endif return status; } 同时,需要在SD_Init()中添加SD卡插入检测函数: 当然,你也可以直接屏蔽这个函数的功能,直接不检测SD是否插入。
至此,基于标准库的SD卡功能函数移植基本完成,测试我用了F103中移植的野火的测试例程, 对SD的初始、容量、类型、擦除及读写块的结果显示。手头的SD为8G,测试结果为:
需要注意的是,标准库中默认工程的外部时钟为25M,而F469I-DISCO中的外部晶振为8M,需要手动修改,具体修改在工程中的redeme.txt文档有描述。 附上工程,如有不当地方,欢迎各位多多指正:)
|