嵌入式开发中, 经常会有主控板识别TF卡+读取数据+写入数据的 需求, 下面尽量用简介的描述详细说明一下, 相关驱动的实现细节,
实现TF-card的驱动需要配置的东西比较多, 基本流程就是:
①配置芯片的相关引脚 ②引用FatFS文件系统的三方库 ③根据具体需求配置相关引脚的参数 ④在main函数中调用相关功能的初始化函数初始化对应的硬件⑤实际跑通并测试相关功能(识别+读取+写入)⑥实际应用TF-card驱动功能
①配置相关引脚
这一步相对简单, 如图所示配置 数据线SDIO_D0~SDIO_D3,时钟线SDIO_CLK以及SDIO_CMD
这里我们配置了 四位的数据通讯(除非是引脚不够, 或者数据较少, 才会用一位的)
②引用FatFS文件系统的三方库
这个是必要的文件系统配置, 想要和 TF-card交互数据, 卡必须有文件系统, 通常情况下使用FatFS
配置较多, 扇区大小, 编码方式等, 相关配置如图所示
③+④基本参数配置好之看一下初始化代码, SDIO的相关参数配置需要在使用前初始化, 代码比较清晰, 不多加赘述
void HAL_SD_MspInit(SD_HandleTypeDef* sdHandle)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
if(sdHandle->Instance==SDIO)
{
/* USER CODE BEGIN SDIO_MspInit 0 */
/* USER CODE END SDIO_MspInit 0 */
/* SDIO clock enable */
__HAL_RCC_SDIO_CLK_ENABLE();
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOD_CLK_ENABLE();
/**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;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF12_SDIO;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_2;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF12_SDIO;
HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
/* USER CODE BEGIN SDIO_MspInit 1 */
/* USER CODE END SDIO_MspInit 1 */
}
}
void HAL_SD_MspDeInit(SD_HandleTypeDef* sdHandle)
{
if(sdHandle->Instance==SDIO)
{
/* USER CODE BEGIN SDIO_MspDeInit 0 */
/* USER CODE END SDIO_MspDeInit 0 */
/* Peripheral clock disable */
__HAL_RCC_SDIO_CLK_DISABLE();
/**SDIO GPIO Configuration
PC8 ------> SDIO_D0
PC9 ------> SDIO_D1
PC10 ------> SDIO_D2
PC11 ------> SDIO_D3
PC12 ------> SDIO_CK
PD2 ------> SDIO_CMD
*/
HAL_GPIO_DeInit(GPIOC, GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11
|GPIO_PIN_12);
HAL_GPIO_DeInit(GPIOD, GPIO_PIN_2);
/* USER CODE BEGIN SDIO_MspDeInit 1 */
/* USER CODE END SDIO_MspDeInit 1 */
}
}
⑤这里基本就配置完了, 验证一下功能, (验证功能仅适用一位数据的交互方式)基本逻辑就是通过串口打印一下函数执行的结果
void SD_Test(void)
{
FRESULT res; /* FatFs function common result code */
uint32_t byteswritten, bytesread; /* File write/read counts */
uint8_t wtext[] = "This is STM32 working with FatFs.\n"; /* File write buffer */
uint8_t rtext[100]; /* File read buffer */
/* Register the file system object to the FatFs module */
if (f_mount(&SDFatFS, (TCHAR const*)PATH, 0) != FR_OK)
{
printf("Failed to mount SD card\r\n");
return;
}
/* Create/open a file, name is specified by Path with FileName */
res = f_open(&SDFile, "STM32.TXT", FA_CREATE_ALWAYS | FA_WRITE);
if (res != FR_OK)
{
printf("Failed to open/create file (error code: %d)\r\n", res);
return;
}
/* Write data to the file */
res = f_write(&SDFile, wtext, sizeof(wtext), (void *)&byteswritten);
if ((byteswritten < sizeof(wtext)) || (res != FR_OK))
{
printf("Failed to write file (error code: %d)\r\n", res);
return;
}
/* Close the file */
res = f_close(&SDFile);
if (res != FR_OK)
{
printf("Failed to close file (error code: %d)\r\n", res);
return;
}
printf("File written successfully: %s\r\n", wtext);
/* Open the file, name is specified by Path with FileName */
res = f_open(&SDFile, "STM32.TXT", FA_READ);
if (res != FR_OK)
{
printf("Failed to open file (error code: %d)\r\n", res);
return;
}
/* Read string from the file */
res = f_read(&SDFile, rtext, sizeof(rtext), (void *)&bytesread);
if ((bytesread == 0) || (res != FR_OK))
{
printf("Failed to read file (error code: %d)\r\n", res);
return;
}
/* Close the file */
res = f_close(&SDFile);
if (res != FR_OK)
{
printf("Failed to close file (error code: %d)\r\n", res);
return;
}
printf("Read from file: %s\r\n", rtext);
}
最终执行结果是, 407通过串口打印了相关测试函数的执行结果信息,显示识别并写入成功, 将SD接到电脑上, 可以看到一个 名为STM32.TXT的文件, 说明SD卡驱动已经成功跑通.
当然这里仅作为说明驱动使能, 简化了很多细节没有说明.
比如说 正常情况下, SD卡是有第九个引脚需要通过电位高低来识别SD-card存在, 以此来实现SD卡热插拔的功能,或者软件方式通过定时器定时轮询检测也可以实现,
又比如说,FatFS只是比较常见的文件系统, 如果 设备作为某个体系中的一部分, 需要用和整体一样的系统, 可能就无法通过cubeMX直接引用 FatFS的文件系统 的三方库, 那么相关的文件系统的配置 就需要一系列繁琐的配置.
机器视觉缺陷检测算法开发
一、 明确需求与定义问题 1、检测对象是什么? 明确是哪种产品(PCB板、织物、玻璃、金属件、塑料件 […]
图像采集上位机系统开发
一、核心概念 二、关键组成部分 三、开发流程建议 四、技术选型建议(常见组合) 深圳市由你创科技有限公司是一家 […]
工控采集板卡定制开发
一、 明确需求 信号类型与数量: 性能指标: 环境要求: 机械与电气接口: 软件与驱动: 可靠性与维护: 成本 […]
下位机开发公司哪家好?
在工业自动化、智能设备、物联网终端等领域的核心战场,下位机如同设备的“大脑”,其性能与稳定性直接决定了整个系统 […]
Unity+nodejs简单实现webscoket聊天室
一、前言 在这个互联网时代,几乎每个人都有微信或QQ这类实时通讯工具,现在很多网络游戏也带有实时聊天功能,那这 […]
AI驱动的机器视觉技术
工业视觉算法,AI视觉模型这些都是老生常谈了,本期要讲的是升级版. 自进化检测系统. 目前 […]
机械臂路线规划系统开发
项目介绍: 该项目主要通过机械臂末端搭载双目相机扫描环境,实时构建障碍物点云地图通过红外结构光扫描面部生成密集 […]
无线路由器上位机开发
项目介绍 为满足智能工厂中对生产数据实时远程监测的需求,由你创为客户开发了一套无线路由器上位机软件。该项目采用 […]
血液检测管理系统软件定制开发
项目介绍 该项目是为 某医院开发的血液检测管理系统:以样本唯一码为线索,贯通接收、分拣、前处理、上机、审核、报 […]
分析仪控制采集分析软件开发
项目介绍 该项目是跨厂商、跨接口的通用仪器控制与数据平台,集连接管理、实时/触发/定时/条件采集、元数据绑定、 […]
开源鸿蒙适配器KHP-系列硬件设备产测功能开发
案例背景 开源鸿蒙适配器KHP-系列的硬件设备的产测功能开发。实现了KHP-IC500设备在出厂前测试硬件功能 […]
产品缺陷智能拍照检测分析控制系统管理软件定制开发
案例背景 系统在接受到传感器信号后,根据相机配置信息,调用相应机位的相机进行拍照。系统获取照片后调用,单图判定 […]
联系电话:
电子邮箱:unczzb@unicrom.cn
深圳研发中心(总部): 深圳市龙华区港深国际中心十楼E区
太原研发中心: 山西省太原市万迎泽西大街120号时代天峰1918室
上海办事处: 上海市浦东新区牡丹路60号,东辰大厦7楼702室
扫一扫,关注由你创科技