【银杏科技ARM+FPGA】分享iCore4T移植RT-Thread过程的点点滴滴

2020-03-01 11:51发布

本帖最后由 heart蓝 {MOD}CD 于 2020-2-22 12:33 编辑

分享iCore4T移植RT-Thread过程的点点滴滴——DAY 1
高手请略过,如有错误请多多批评指点!

首先放上iCore4T靓照   
    iCore4t.jpg

一、初识RT-Thread
       RT-Thread,全称是 Real Time-Thread,顾名思义,它是一个嵌入式实时多线程操作系统。以下我们就简称RTT,RTT是一款完全由我们国内团队开发的嵌入式实时操作系统,它诞生于2006年,最初源于对当时小型RTOS现状的诸多不满,RTT要打造一个精致而优雅的操作系统。从最初的V0.0.1发布,历经十几个年头的沉淀到今天的V4.0.0的发布,它正演变成一个功能强大、组件丰富的物联网操作系统。
       RTT支持任务抢占,STM32默认支持优先级范围是32,支持多任务(线程)轮转调度,可以通过信号量、互斥量、事件集进行线程间同步,通过邮箱、消息队列、信号进行线程间的通信。RTT也支持动态内存、中断等管理。

二、辅助工具
2.1、Env简介
     Env是RTT推出的开发辅助工具,针对基于RTT操作系统项目工程,提供编译构建环境、图形化系统配置及软件包管理功能,其内置的menuconfig提供了简单易用的配置剪裁工具,可对内核、组件和软件包进行自由剪裁,使用系统以搭积木的方式进行构建。
2.1.1 准备工作
        在电脑上首先安装好git,软件包管理功能需要git的支持。
        git下载地址:https://git-scm.com/downloads。
        下载后一路next安装,安装完成测试是否安装成功。打开cmd,输入git,如果可以显示版本信息说明安装成功。
        如果安装成功说明git已添加到系统环境变量。
        
        下载Env工具
        Env工具下载地址:https://www.rt-thread.org/page/download.html
        下载后解压,打开Env控制台
        双击Env目录下可执行文件env.exe
        在文件夹中通过右键菜单打开 Env 控制台,添加 Env 至右键菜单。

         day1_5.png
         day1_6.png
2.1.2 如何使用
        现在打开我已经制作好的bsp工程,我们通过Env工具对RTT系统进行菜单配置(制作方法我会在以后详细介绍)
        打开工程文件rt-thread/bsp/stm32/stm32h750-gingko-icore4t,右击鼠标点击ConEmu Here
        输入menuconfig,回车
         day1_8.png
         day1_9.png
        至此我们就可以正确的借助Env来方便快速的对内核进行配置,进入RTT的世界。

2.2 Scons构建工具
        SCons 是一套由 Python 语言编写的开源构建系统,类似于 GNU Make。它采用不同于通常 Makefile 文件的方式,而是使用 SConstruct 和 SConscript 文件来替代。这些文件也是 Python 脚本,能够使用标准的 Python 语法来编写。所以在 SConstruct、SConscript文件中可以调用 Python 标准库进行各类复杂的处理,而不局限于 Makefile 设定的规则。
        上面我们介绍了可以通过Env来完成对内核、组件、BSP的配置,我们还可以通过Scons工具来完成对KEIL、IAR等工程的搭建。通过一条命令"scons --target=mdk5",即可完成KEIL新工程的生成。
        
三、烧录进我们的iCore4T双核心板
        打开我们制作的最简单的BSP工程(在这里我们以MDK5为例),编译、下载。
        iCore4T双核心板自带DEBUG_UART,打开终端Putty,程序运行后我们会发现RT-Thread信息打印在了终端。
         day_10.png
        我们在终端输入list_device,可以看一下当前已经挂载上的设备。
         day_11.png

        我将在DAY2里面给大家简单介绍如何制作最简单的BSP工程,也就是RT-Thread的移植过程。








友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
16条回答
heart蓝色CD
2020-03-02 13:14
本帖最后由 heart蓝 {MOD}CD 于 2020-2-27 12:35 编辑

分享iCore4T移植RT-Thread过程的点点滴滴——DAY 5

高手请略过,如有错误请多多批评指点!

iCore4T核心板通过QSPI总线挂有一片 8MB FLASH W25Q64可用于运行程序、存放字库、存放图片、做为文件系统的从设备等,那么我们怎么把它用起来呢,今天给大家分享一下QSPI总线驱动的加载过程及W25Q64的挂载过程。

一、配置QSPI相应的GPIO,选择QSPI的时钟源
        1.1 我们仍然是借助STM32CubeMx工具来完成外设IO的配置,打开../bsp/stm32/stm32h750-gingko-icore4t/board/CubeMX_Config来配置QSPI的IO,从原理图中可以看到我们用的是QSPI的BANK1,它的IO分别是PB2(CLK)、PB6(NCS)、PD11(IO0)、PD12(IO1)、PD13(IO3)、PF7(IO2)。打开QSPI后,默认给出的IO和我们原理图中的并不相符,这里我们手动修改一下,仍然是只配置IO,选择QSPI的时钟源。配置完成点击CREATE CODE。
         day5_1.png
         day5_2.png
        
        1.2 生成工程后,我们只保留红 {MOD}方框内的文件,其他的两个文夹可以删除掉。
         day4_3.png
        
        1.3 复制刚刚生成的src文件夹maic.c文件中的函数SystemClock_Config(void)到board.c。这里内核初始化时要调用该函数进行时钟配置,我们新加入了QSPI的时钟源。
        
二、修改kconfig文件,增加menuconfig菜单配置中QSPI选项。
         day5_4.png


三、打开menuconfig,使能QSPI。
       day5_5.png

四、使用scons命令生成MDK5工程,编译、烧录。
        启动之后,我们查看设备,可以发现qspi已经做为了个SPI设备添加成功了。
         day5_6.png
        
五、挂载W25Q64
        5.1 修改kconfig文件,在menuconfig中添加配置W25Q64的选项。
         day5_7.png
        
        5.2 添加w25q64的驱动程序drv_qspi_flash.c文件,并将该文件放在../bsp/stm32/libraries/HAL_Drivers,我把源码贴在下面
        
  1. /*
  2. * Copyright (c) 2006-2018, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date           Author       Notes
  8. * 2018-11-27     zylx         first version
  9. */

  10. #include <board.h>
  11. #include <drv_qspi.h>
  12. #include <rtdevice.h>
  13. #include <rthw.h>
  14. #include <finsh.h>

  15. #ifdef BSP_USING_QSPI_FLASH

  16. #include "spi_flash.h"
  17. #include "spi_flash_sfud.h"

  18. char w25qxx_read_status_register2(struct rt_qspi_device *device)
  19. {
  20.     /* 0x35 read status register2 */
  21.     char instruction = 0x35, status;

  22.     rt_qspi_send_then_recv(device, &instruction, 1, &status, 1);

  23.     return status;
  24. }

  25. void w25qxx_write_enable(struct rt_qspi_device *device)
  26. {
  27.     /* 0x06 write enable */
  28.     char instruction = 0x06;

  29.     rt_qspi_send(device, &instruction, 1);
  30. }

  31. void w25qxx_enter_qspi_mode(struct rt_qspi_device *device)
  32. {
  33.     char status = 0;
  34.     /* 0x38 enter qspi mode */
  35.     char instruction = 0x38;
  36.     char write_status2_buf[2] = {0};

  37.     /* 0x31 write status register2 */
  38.     write_status2_buf[0] = 0x31;

  39.     status = w25qxx_read_status_register2(device);
  40.     if (!(status & 0x02))
  41.     {
  42.         status |= 1 << 1;
  43.         w25qxx_write_enable(device);
  44.         write_status2_buf[1] = status;
  45.         rt_qspi_send(device, &write_status2_buf, 2);
  46.         rt_qspi_send(device, &instruction, 1);
  47.         rt_kprintf("flash already enter qspi mode ");
  48.         rt_thread_mdelay(10);
  49.     }
  50. }

  51. static int rt_hw_qspi_flash_with_sfud_init(void)
  52. {
  53.     stm32_qspi_bus_attach_device("qspi1", "qspi10", RT_NULL, 4, w25qxx_enter_qspi_mode, RT_NULL);
  54.    
  55.     /* init w25q64 */
  56.     if (RT_NULL == rt_sfud_flash_probe("W25Q64", "qspi10"))
  57.     {
  58.         return -RT_ERROR;
  59.     }

  60.     return RT_EOK;
  61. }
  62. INIT_COMPONENT_EXPORT(rt_hw_qspi_flash_with_sfud_init);

  63. #if defined(RT_USING_DFS_ELMFAT) && !defined(BSP_USING_SDCARD)
  64. #include <dfs_fs.h>

  65. #define BLK_DEV_NAME  "W25Q64"

  66. int mnt_init(void)
  67. {
  68.     rt_thread_delay(RT_TICK_PER_SECOND);

  69.     if (dfs_mount(BLK_DEV_NAME, "/", "elm", 0, 0) == 0)
  70.     {
  71.         rt_kprintf("file system initialization done! ");
  72.     }
  73.     else
  74.     {
  75.         if(dfs_mkfs("elm", BLK_DEV_NAME) == 0)
  76.         {
  77.             if (dfs_mount(BLK_DEV_NAME, "/", "elm", 0, 0) == 0)
  78.             {
  79.                 rt_kprintf("file system initialization done! ");
  80.             }
  81.             else
  82.             {
  83.                 rt_kprintf("file system initialization failed! ");
  84.             }
  85.         }
  86.     }

  87.     return 0;
  88. }
  89. INIT_ENV_EXPORT(mnt_init);

  90. #endif /* defined(RT_USING_DFS_ELMFAT) && !defined(BSP_USING_SDCARD) */
  91. #endif /* BSP_USING_QSPI_FLASH */
复制代码

        5.3 添加文件路径,这样生成工程的时候可以自动将该文件加入MDK工程。
         day5_8.png
        
        5.4 打开menuconfig,使能QSPI。
         day5_9.png

        5.4 再次使用scons命令生成MDK5工程,编译、烧录,我们发现W25Q64已经做为块设备成功挂载上了。
         day5_10.png
        
六、源代码
        源代码请移步这里下载:链接:https://pan.baidu.com/s/1ftP8TccWYqYt9GX9Lj6PGQ 提取码:pfqr        

        至此,我们成功的添加了QSPI总线驱动,挂载W25Q64。
        
        我将在DAY6里面为大家分享I2C总线驱动的添加,挂载电源管理芯片,通过menuconfig来对各种电源进行管理。

一周热门 更多>