STM32F401 SDIO HAL driver初始化SD卡
2016-07-18 22:04
1241 查看
STM32F4xx的HAL部分已经提供了SD的driver,初始化时的IO PIN等放在HAL_SD_MspInit。
定义两个变量
main函数中初始化SD卡的相关代码:
HAL_SD_Init()函数中会先调用HAL_SD_MspInit()初始化PIN和clk等。
需要注意的是初始化时bus width只能设置成1bit,然后通过
HAL_SD_WideBusOperation_Config(&hsd, SDIO_BUS_WIDE_4B)来切换成4位模式,在初始化时直接设置成4位是无效的。
完成以上工作后就可以通过HAL_SD_ReadBlocks()和HAL_SD_WriteBlocks()来完成block形式的读写操作了,需要FATFS的话可以参考其它例子。
void HAL_SD_MspInit(SD_HandleTypeDef *hsd) { GPIO_InitTypeDef GPIO_InitStruct; __HAL_RCC_GPIOC_CLK_ENABLE(); __HAL_RCC_GPIOD_CLK_ENABLE(); GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FAST; GPIO_InitStruct.Alternate = GPIO_AF12_SDIO; /*SDIO GPIO Configuration PC8 ------> SDIO_D0 PC9 ------> SDIO_D1 PC10 ------> SDIO_D2 PC11 ------> SDIO_D3 PC12 ------> SDIO_CK PD2 ------> SDIO_CMD */ GPIO_InitStruct.Pin = GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_2; HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); __HAL_RCC_SDIO_CLK_ENABLE(); __SDIO_CLK_ENABLE(); hsd->Instance = SDIO; hsd->Init.ClockEdge = SDIO_CLOCK_EDGE_RISING; hsd->Init.ClockBypass = SDIO_CLOCK_BYPASS_DISABLE; hsd->Init.ClockPowerSave = SDIO_CLOCK_POWER_SAVE_DISABLE; hsd->Init.BusWide = SDIO_BUS_WIDE_1B; hsd->Init.HardwareFlowControl = SDIO_HARDWARE_FLOW_CONTROL_DISABLE; hsd->Init.ClockDiv = SDIO_TRANSFER_CLK_DIV; }
定义两个变量
SD_HandleTypeDef hsd; HAL_SD_CardInfoTypedef SDCardInfo;
main函数中初始化SD卡的相关代码:
__IO HAL_SD_ErrorTypedef errorstate = SD_OK; errorstate = HAL_SD_Init(&hsd, &SDCardInfo); if(SD_OK == errorstate) { errorstate = HAL_SD_WideBusOperation_Config(&hsd, SDIO_BUS_WIDE_4B); if(SD_OK != errorstate) { while(1); } .... }
HAL_SD_Init()函数中会先调用HAL_SD_MspInit()初始化PIN和clk等。
需要注意的是初始化时bus width只能设置成1bit,然后通过
HAL_SD_WideBusOperation_Config(&hsd, SDIO_BUS_WIDE_4B)来切换成4位模式,在初始化时直接设置成4位是无效的。
完成以上工作后就可以通过HAL_SD_ReadBlocks()和HAL_SD_WriteBlocks()来完成block形式的读写操作了,需要FATFS的话可以参考其它例子。
相关文章推荐
- #新闻拍一拍# IBM 招聘广告要求应聘者具备至少 12 年 K8S 使用经验
- vivi下重新调整分区
- ARM Linux系统启动
- Linux及ARM Linux程序开发笔记(零基础入门篇)
- 零基础入门篇之Linux及Arm-Linux程序开发笔记
- STM32 IO口双向问题
- 使用CMake来构建STM32工程
- 我的 ARM+Linux 学习路线
- 64位Ubuntu 14.04上使用musleabi最小化交叉编译Android版PHP7
- 关于ARM启动的一篇文章
- ARM 的堆栈初始化详解
- ARM条件码与CPSR标志位的关系
- 加载/存储指令
- 关于ARM 汇编的一些疑问
- ARM汇编伪指令介绍
- linux的防火墙及arm与虚拟机共享
- 编译单个驱动的Makefile文件。
- ARM Linux系统调用的原理
- Android LKM Rootkit,查找sys_call_table
- LKM Tricks to Android Devices,查找sys_call_table