stm32f103sdio通信例程
时间: 2023-09-28 20:04:43 浏览: 145
以下是基于STM32F103的SDIO通信例程:
首先,需要在STM32CubeMX中配置SDIO和GPIO引脚。SDIO引脚需要配置为复用功能,GPIO引脚需要配置为推挽输出,具体配置如下图所示:
![SDIO配置示意图](https://i.loli.net/2021/01/27/Pc7fWqg5rL4GZ6M.png)
然后生成代码并导入到Keil或者其他开发环境中。在代码中需要引入以下头文件:
```c
#include "stm32f1xx_hal.h"
#include "stm32f1xx_hal_gpio.h"
#include "stm32f1xx_hal_sdio.h"
```
在main函数中初始化SDIO:
```c
/* SDIO init function */
MX_SDIO_SD_Init();
```
其中,MX_SDIO_SD_Init()是由STM32CubeMX自动生成的SDIO初始化函数。
接下来,就可以进行SDIO通信了。以下是一个简单的示例程序,实现了在SD卡上创建一个文件,并写入一些数据:
```c
#include "main.h"
#include "stm32f1xx_hal.h"
#include "stm32f1xx_hal_gpio.h"
#include "stm32f1xx_hal_sdio.h"
/* SDIO handle */
SD_HandleTypeDef hsd;
/* Buffer for data */
uint8_t buffer[512];
int main(void)
{
/* MCU initialization */
HAL_Init();
/* System clock initialization */
SystemClock_Config();
/* SDIO init function */
MX_SDIO_SD_Init();
/* SD card initialization */
if (HAL_SD_Init(&hsd) != HAL_OK)
{
/* Initialization error */
Error_Handler();
}
/* Enable wide bus operation */
if (HAL_SD_ConfigWideBusOperation(&hsd, SDIO_BUS_WIDE_4B) != HAL_OK)
{
/* Configuration error */
Error_Handler();
}
/* Create a file on the SD card */
FIL file;
FRESULT res = f_open(&file, "test.txt", FA_CREATE_ALWAYS | FA_WRITE);
if (res != FR_OK)
{
/* File creation error */
Error_Handler();
}
/* Write some data to the file */
for (int i = 0; i < 512; i++)
{
buffer[i] = i;
}
UINT bytes_written;
res = f_write(&file, buffer, sizeof(buffer), &bytes_written);
if (res != FR_OK || bytes_written != sizeof(buffer))
{
/* Write error */
Error_Handler();
}
/* Close the file */
f_close(&file);
while (1)
{
/* Infinite loop */
}
}
/* SDIO init function */
void MX_SDIO_SD_Init(void)
{
/* SDIO GPIO Configuration */
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOD_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
/* Configure SDIO D0~D3, CLK and CMD pins */
GPIO_InitStruct.Pin = GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_2;
HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_15;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
/* SDIO peripheral clock enable */
__HAL_RCC_SDIO_CLK_ENABLE();
/* SDIO interrupt Init */
HAL_NVIC_SetPriority(SDIO_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(SDIO_IRQn);
/* SDIO DMA Init */
/* DMA controller clock enable */
__HAL_RCC_DMA2_CLK_ENABLE();
/* DMA interrupt init */
/* DMA2_Channel4_5_IRQn interrupt configuration */
HAL_NVIC_SetPriority(DMA2_Channel4_5_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(DMA2_Channel4_5_IRQn);
}
```
需要注意的是,SDIO通信需要使用FATFS文件系统库。如果还没有使用过FATFS,需要先进行FATFS的初始化和配置。
阅读全文