当前位置: 首页 > news >正文

[APM32F4] 在RT_Thread Studio环境下如何使用APM32F427的SDIO外设驱动

RT-Thread Studio环境,对于开发基于RTT的项目非常友好,有很多组件可视化的配置。下面记录下我使用APM32F427的SDIO外设驱动如何使用。

1. 新建RTT-Studio工程

由于没有找到APM32F427芯片的型号,所以我们先新建APM32F407型号的工程,然后再修改为APM32F427型号的工程代码。

1.1 下载APM32F4软件支持包

打开 SDK 管理器,然后找到 APM32F4 的软件支持包,然后点击安装即可。

1.2 基于芯片新建一个 APM32F407 的工程

控制台串口默认是UART1,如果想要更改控制台串口号,下面会详细介绍,这里先默认UART1。然后点击完成即可创建一个 APM32F407 的工程。

2. 复制APM32F407的BSP修改为APM32F427的BSP

由于官方可能还没有添加APM32F427的BSP目录,但是没关系,由于APM32F407与APM32F427很像。我们基于APM32F407修改为F427即可。
主要就是修改407的时钟配置函数。打开工程中的drv_clk.c文件,修改 clk_init 函数对于时钟的初始化函数。
修改代码如下:
复制
  1. voidSystemInit(void)
  2. {
  3. /* FPU settings */
  4. #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
  5. SCB->CPACR |= ((3UL <<10*2)|(3UL <<11*2));//!< set CP10 and CP11 Full Access
  6. #endif
  7. /* Reset the RCM clock configuration to the default reset state */
  8. /* Set HSIEN bit */
  9. RCM->CTRL_B.HSIEN = BIT_SET;
  10. /* Reset CFG register */
  11. RCM->CFG =0x00000000;
  12. /* Reset HSEEN, CSSEN and PLL1EN bits */
  13. RCM->CTRL &= (uint32_t)0xFEF6FFFF;
  14. /* Reset PLL1CFG register */
  15. RCM->PLL1CFG =0x24003010;
  16. /* Reset HSEBCFG bit */
  17. RCM->CTRL &= (uint32_t)0xFFFBFFFF;
  18. /* Disable all interrupts */
  19. RCM->INT =0x00000000;
  20. #if defined(DATA_IN_ExtSRAM)
  21. SystemInit_ExtSRAM();
  22. #endif/* DATA_IN_ExtSRAM */
  23. SystemClockConfig();
  24. /* Configure the Vector Table location add offset address */
  25. #ifdef VECT_TAB_SRAM
  26. SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET;/* Vector Table Relocation in Internal SRAM */
  27. #else
  28. SCB->VTOR = FMC_BASE | VECT_TAB_OFFSET;/* Vector Table Relocation in Internal FLASH */
  29. #endif
  30. }


3. apm32_msp.c 文件介绍

新建完工程之后,驱动目录结构如下:

可以看到,已经支持了大部分的外设驱动了,如 can/flash/eth/pwm/sdio 等等外设驱动。其中有一个文件是比较重要的, apm32_msp.c 文件,打开这个文件就可以了解到这个文件的作用就是初始化外设时钟和 GPIO 口。比如用到 spi 外设,那么我们就必须要在这个文件里面添加你自己板子所使用到的 spi 外设 GPIO 口的初始化。
我们在项目中使用到的其他外设驱动,关于外设引脚的初始化代码,也都可以编写放进这个文件中。官方也已经给出了这些外设的部分引脚的初始化代码了,如果我们所使用的硬件引脚和给出的代码是一致的,那么就不需要更改给出的示例代码,如果所使用的引脚不一样,就需要自己编写引脚的初始化代码了。

4. APM32F427的SDIO外设驱动

4.1 使能SDIO外设驱动以及FatFs

1、使能SDIO设备驱动程序,有些要填写的参数,默认值就行。

2、使能虚拟文件系统和FatFs。

4.2 在board.h文件中定义SDIO外设相关的宏

4.3 在apm32_msp.c文件中编写SDIO引脚初始化代码

对于SDIO外设,使能的引脚基本都是固定的,所以 apm32_msp.c 给出的代码就可以直接使用,不用修改引脚初始化相关的代码。
复制
  1. voidapm32_msp_sdio_init(void*Instance)
  2. {
  3. #ifdef BSP_USING_SDIO
  4. GPIO_Config_T GPIO_InitStructure;
  5. /* Enable the GPIO Clock */
  6. RCM_EnableAHB1PeriphClock(RCM_AHB1_PERIPH_GPIOC | RCM_AHB1_PERIPH_GPIOD);
  7. /* Enable the SDIO Clock */
  8. RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_SDIO);
  9. /* Enable the SDIO peripheral reset */
  10. RCM_EnableAPB2PeriphReset(RCM_APB2_PERIPH_SDIO);
  11. /* Configure the GPIO pin */
  12. GPIO_InitStructure.pin = GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12;
  13. GPIO_InitStructure.mode = GPIO_MODE_AF;
  14. GPIO_InitStructure.speed = GPIO_SPEED_50MHz;
  15. GPIO_InitStructure.otype = GPIO_OTYPE_PP;
  16. GPIO_InitStructure.pupd = GPIO_PUPD_UP;
  17. GPIO_Config(GPIOC, &GPIO_InitStructure);
  18. GPIO_InitStructure.pin = GPIO_PIN_2;
  19. GPIO_Config(GPIOD, &GPIO_InitStructure);
  20. GPIO_ConfigPinAF(GPIOC,GPIO_PIN_SOURCE_8, GPIO_AF_SDIO);
  21. GPIO_ConfigPinAF(GPIOC,GPIO_PIN_SOURCE_9, GPIO_AF_SDIO);
  22. GPIO_ConfigPinAF(GPIOC,GPIO_PIN_SOURCE_10, GPIO_AF_SDIO);
  23. GPIO_ConfigPinAF(GPIOC,GPIO_PIN_SOURCE_11, GPIO_AF_SDIO);
  24. GPIO_ConfigPinAF(GPIOC,GPIO_PIN_SOURCE_12, GPIO_AF_SDIO);
  25. GPIO_ConfigPinAF(GPIOD,GPIO_PIN_SOURCE_2, GPIO_AF_SDIO);
  26. /* Disable the SDIO peripheral reset */
  27. RCM_DisableAPB2PeriphReset(RCM_APB2_PERIPH_SDIO);
  28. #endif
  29. }


4.4 SD卡挂载elm FatFs文件系统

经过上面的步骤之后,SDIO其实已经正常工作起来了的。然后,我们把下面的代码复制到 main.c 文件中。
复制
  1. #include<dfs_elm.h>
  2. #include<dfs_fs.h>
  3. #include<dfs_file.h>
  4. #include<unistd.h>
  5. #include<stdio.h>
  6. #include<sys/stat.h>
  7. #include<sys/statfs.h>
  8. voidsd_mount(void*parameter)
  9. {
  10. while(1)
  11. {
  12. rt_thread_mdelay(500);
  13. if(rt_device_find("sd0") != RT_NULL)
  14. {
  15. if(dfs_mount("sd0","/","elm",0,0) == RT_EOK)
  16. {
  17. LOG_I("sd card mount to '/'");
  18. break;
  19. }
  20. else
  21. {
  22. LOG_W("sd card mount to '/' failed!");
  23. }
  24. }
  25. }
  26. }
  27. intapm32_sdcard_mount(void)
  28. {
  29. rt_thread_ttid;
  30. tid = rt_thread_create("sd_mount", sd_mount, RT_NULL,
  31. 2048, RT_THREAD_PRIORITY_MAX -2,20);
  32. if(tid != RT_NULL)
  33. {
  34. rt_thread_startup(tid);
  35. }
  36. else
  37. {
  38. LOG_E("create sd_mount thread err!");
  39. }
  40. returnRT_EOK;
  41. }
  42. INIT_APP_EXPORT(apm32_sdcard_mount);
最后编译下载程序,可以看到串口终端输出如下信息:

说明SD卡已经挂载到了根目录 "/" 了。这时,我们可以使用 ls/cat/cd 等等基本的文件系统操作命令。
以上就是对APM32F427 SDIO外设驱动在RTT Studio环境下的使用介绍了。










---------------------
作者:luobeihai
链接:https://bbs.21ic.com/icview-3501566-1-1.html
来源:21ic.com
此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。

http://www.jsqmd.com/news/506290/

相关文章:

  • SmolVLA爬虫数据增强:利用Python爬虫获取训练数据与模型微调
  • Lychee Rerank MM高性能部署:BF16精度+模型缓存机制提升吞吐量实测指南
  • docker加速配置
  • Fish-Speech-1.5在虚拟偶像中的应用:个性化语音合成方案
  • GroundingDINO终极指南:如何用文本描述实现零样本目标检测
  • 超星签到自动化:告别手动拍照的全流程攻略
  • 精卫ETL平台实战:如何用B/S架构轻松管理Kettle定时任务(附集群配置技巧)
  • 编译原理入门:从高级语言到可执行程序的旅程
  • 智能视频PPT提取:企业培训资料转化效率提升300%的技术解决方案
  • AI赋能网络安全:使用Qwen1.5-1.8B GPTQ进行日志分析与威胁情报摘要
  • 5分钟部署BAAI/bge-m3:WebUI可视化语义相似度分析服务
  • YOLOv8指令详解:如何通过命令行高效完成目标检测任务
  • MusePublic艺术创作引擎Linux部署指南:从零开始搭建艺术创作环境
  • APK Editor Studio终极指南:如何零基础定制Android应用
  • 手把手教你用Graspnet和MuJoCo实现目标抓取仿真(含B站视频教程链接)
  • API安全通信实战:从P10文件到双向认证的完整配置指南
  • AMD Ryzen系统调试终极指南:SMUDebugTool从入门到实战
  • OSGEARTH3实战:5分钟搞定SHP矢量文件加载与样式自定义(附完整代码)
  • 【教程】2026年OpenClaw腾讯云3分钟安装及使用喂饭级流程
  • 零基础入门前端弹性布局(Flexbox)实战:结合 Class 与 ID 选择器(可用于备赛蓝桥杯Web开发应用)
  • 用Python和OpenCV复现SORT算法:一个视频多目标跟踪的实战项目
  • 外币评估中的冲回与不冲回:财务汇兑损益处理的实战解析
  • 【最全】2026年OpenClaw华为云10分钟部署及使用保姆级方法
  • 动态规划实战:从NOIP装箱问题解析01背包算法精髓
  • HarmonyOS文件操作实战:5分钟搞定ArkTS应用文件读写(附完整代码)
  • 从原理到实践:使用C++与OpenCV实现光度立体视觉
  • 0.5 吨燃气锅炉 低氮环保 工业商用优选
  • Rust学习资源全攻略:从新手到高手的进阶指南
  • Lychee-rerank-mm在数字营销中的应用:广告创意与落地页智能匹配
  • springboot微信小程序社区居民传染病防治信息系统