查看: 4092|回复: 0

[原创] 【野火i.MX RT1052学习笔记】4.先定一个小目标:支持SD卡

[复制链接]
  • TA的每日心情
    开心
    2018-6-21 08:39
  • 签到天数: 8 天

    连续签到: 2 天

    [LV.3]偶尔看看II

    发表于 2018-6-10 17:55:26 | 显示全部楼层 |阅读模式
    分享到:
    接着打算移植FatFS了,但文件系统总是要绑定到某种存储设备上吧,目前开发板上可用的存储设备有RAM,Flash,SD卡和通过USB host扩展出mess storage。用RAM做ram disk除了调试外用处不大,USB又比较麻烦,可选的就是Flash和SD卡了。由于SD卡可以通过读卡器,很方便地在电脑验证文件系统是否正常,因此我选择在SD卡上mount FatFS。那就先实现一个小目标:在前面适配好FreeRTOS的基础上,支持SD卡的读写
    野火自带的固件库例程中已经有了‘sdmmc—读写SD卡’的例程了,里面主要是新加了sdmmc目录,这个目录下的内容,其实就是sdk里面'sdk\middleware\sdmmc'目录下的内容,只有些许差别,可能是使用的代码和生成sdk时的版本不太一样吧
    pic1.jpg

    先找块SD卡,恰好手头有一块多年前替换下来的2G的MicroSD卡,在电脑上把它格式化了,插到mini板的SD卡槽,例程下到板子上跑一下看什么效果
    pic2.jpg

    有些乱码,根据代码看也就是对SD卡做了简单的读写测试,那我们的目标就是在前面的FreeRTOS工程上也做到一样的效果,支持SD卡的读写接口
    pic3.jpg

    1. 先参考sd卡的例程,将sdmmc目录和下面的文件拷贝到user目录下,并在工程中加入sdmmc组,以及添加相应的头文件路径
    2. 对sd卡的测试代码在bsp_sd.c中,把这个文件也挪过来,同时加到工程的board组中
    pic4.jpg

    3. sd卡的例程中为了使能SD卡,在BOARD_InitPins中对IOMUX做了针对USDHC管脚的初始化,移植过来
    pic5.jpg

    4. board.h中也增加了对USDHC的pin和clock的一些定义,也挪过来
    pic6.jpg

    5. 最后将例程中调用SDCardTest的地方从main.c文件中挪到app.c中,通过新创建任务来执行
    1. int main(void)
    2. {
    3.     /* Init board hardware. */
    4.     BOARD_ConfigMPU();
    5.     BOARD_InitPins();
    6.     BOARD_BootClockRUN();
    7.     BOARD_InitDebugConsole();
    8.     if (xTaskCreate(hello_task, "Hello_task", configMINIMAL_STACK_SIZE + 10, NULL, hello_task_PRIORITY, NULL) != pdPASS)
    9.     {
    10.         PRINTF("Task creation failed!.\r\n");
    11.         while (1)
    12.             ;
    13.     }
    14.    
    15. #if 0
    16.         /* debug console thread, simply counts seconds */
    17.         xTaskCreate(vDebugConsoleTask, "vDebugConsole",
    18.                                 configMINIMAL_STACK_SIZE, NULL, debugConsole_task_PRIORITY,
    19.                                 (TaskHandle_t *) NULL);
    20. #else
    21.     /* debug console thread, simply counts seconds */
    22.         xTaskCreate(vSdcardTestTask, "vSdcardTest",
    23.                                 configMINIMAL_STACK_SIZE, NULL, sdcardTest_task_PRIORITY,
    24.                                 (TaskHandle_t *) NULL);
    25. #endif

    26.     vTaskStartScheduler();
    27.     for (;;)
    28.         ;
    29. }
    30. extern void SDCardTest(void);
    31. /* sdcard test thread */
    32. static void vSdcardTestTask(void *pvParameters) {
    33.         while (1) {
    34.         SDCardTest();
    35.         vTaskSuspend(NULL);
    36.         }
    37. }
    复制代码

    一编译报错,报SysTick_Handler重复定义,仔细一看,原来例程中SD卡的读写使用的是polling方式,需要用SysTick_Handler中断来更新时戳信息,幸亏报了个错误,要不就糊里糊涂地用了低效的polling方式。。。既然用了RTOS,就应该用中断+event的方式提高效率,所以直接换成freertos目录下的fsl_sdmmc_event.c和fsl_sdmmc_host.c,这些都是sdk里已经写好的驱动了
    pic7.jpg

    这次编译正常,不过一运行挂死了,果然没那么顺利,用Keil调试,发现是调用了多次prvCheckTasksWaitingTermination之后,就mem异常了,好奇怪啊。。。
    pic8.jpg

    想起之前在PIC32上调uC/OS的时候,也是出调用函数多次后就莫名其妙的死机问题,后来跟踪了半天发现是任务栈太小导致的,这个不会也是把。。。我去,竟然忘记改SD卡测试任务的栈大小了,只有90个字节,可不要飞么,改到2048,同时把MemMang管理的内存大小扩大到16K,就都正常了
    1.         xTaskCreate(vSdcardTestTask, "vSdcardTest",
    2.                                 2048, NULL, sdcardTest_task_PRIORITY,
    3.                                 (TaskHandle_t *) NULL);

    4. #define configTOTAL_HEAP_SIZE                   ((size_t)(16 * 1024))
    复制代码

    pic9.jpg

    这下在FreeRTOS下的SD卡驱动可以正常使用了下一步的工作就是把FatFS移植过来,把SD卡的读写接口挂接到FatFS的block read/write接口上

    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-12-4 16:31 , Processed in 0.113945 second(s), 16 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.