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

[复制链接]
28915|373
如意不如意 发表于 2020-11-3 09:31 | 显示全部楼层
本帖最后由 如意不如意 于 2020-11-26 10:22 编辑

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

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

iCore4T ARM具有LTCD控制器。今天,我将在前面移植SDRAM驱动项目的基础上,给大家分享RTT的LTDC驱动移植,最后实现LCD液晶屏的刷屏测试。

1、首先按照银杏知识库iCore4T双核心板系列教程(STM32CubeMX教程六十——LCD实验驱动4.3寸液晶屏)来对项目Cube进行配置需要配置时钟、FMC、LTDC、TIM12、GPIO。要与教程配置保持一致,配置完成后重新生成MDK工程。

http://www.gkwiki.cn/doku.php?id=icore4t_60


2、复制刚刚生成的src文件夹main.c文件中的函数SystemClock_Config(void)到board.c。这里内核初始化时要调用该函数进行时钟配置。

3、修改board文件夹下kconfig文件,在menu "Onboard Peripheral Drivers"中添加配置LCD的选项。

11_kconfig.png

11_kconfig2.png
4、在bsp\stm32\libraries\STM32H7xx_HAL下文件SConscript中,添加“STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_ltdc.c”。
11_SConscript.png
5、在board文件夹下新建ports文件夹,用来存放接口头文件。在ports下新建lcd_port.h文件,并添加接口头文件路径到board/SConscript中,内容如下:


  1. #ifndef __LCD_PORT_H
  2. #define __LCD_PORT_H
  3. #ifdef __cplusplus
  4. extern "C" {
  5. #endif

  6. #define LCD_BACKLIGHT_USING_GPIO
  7. #define LCD_BL_GPIO_NUM GET_PIN(B, 4)
  8. #define LCD_DISP_GPIO_NUM GET_PIN(B, 14)

  9. #define DRV_DEBUG
  10. #define FINSH_USING_MSH

  11. #define LCD_WIDTH        480
  12. #define LCD_HSYNC 1
  13. #define LCD_HBP 20
  14. #define LCD_HFP        24
  15. #define LCD_HEIGHT 272
  16. #define LCD_VSYNC 2
  17. #define LCD_VBP 8
  18. #define LCD_VFP        6
  19. #define LCD_BUF_SIZE 2*480*272
  20. #define LCD_HSYNC_WIDTH  1
  21. #define LCD_VSYNC_HEIGHT 2
  22. #define LCD_BITS_PER_PIXEL 2
  23. #define LCD_PIXEL_FORMAT RTGRAPHIC_PIXEL_FORMAT_RGB565

  24. #define RED          0xf800
  25. #define GREEN        0x07e0
  26. #define BLUE        0x001f

  27. #ifdef __cplusplus
  28. }

  29. #endif
  30. #endif /*__ LCD_PORT_H */


11_input.png
6、menu "RT-Thread Kernel -> Memory Management"下勾选Using memory heap object选项并在子选项中选择Use all of memheap objects as heap
11_memory.png
7、进入stm32h750-gingko-icore4t文件夹下,右击空白处,选择ConEmu Here,使用scons命令,键入scons --target=mdk5,生成MDK5工程。


8、打开stm32h750-gingko-icore4t下的project.uvprojx工程,打开drv_lcd.c文件,将液晶屏背光开启函数中的引脚电平进行修改iCore4T中PB4、PB14低电平,液晶屏使能供电。编译,烧录,就可以进行LCD测试了

11_mdk.png
9、打开终端,选择对应COM口,比特率115200,可以看到系统启动信息,ltdc init success,LTDC初始化成功。运行lcd_test程序则液晶屏红绿蓝三色轮流刷屏。注意:drv_lcd.c中lcd_test函数中三色刷屏在while循环中,若要退出lcd_test函数,请自行修改。
11_test.png
至此说明我们的LTDC驱动已经添加成功。

10、源代码
源代码可以稳步这里下载:
链接:https://pan.baidu.com/s/1fcLU4WaRDlgr0mNYwZj1Yg  提取码:zstq

如意不如意 发表于 2020-11-7 10:06 | 显示全部楼层
本帖最后由 如意不如意 于 2020-11-7 10:27 编辑

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

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

4.3寸液晶底板支持电阻屏和电容屏,今天,我将在前面移植LTDC驱动项目的基础上(rt-thread-icore4t-v0.9),给大家分享RTT的电容触摸驱动移植,最后实现电容触摸测试。

1、修改board文件夹下kconfig文件,在menu "On-chip Peripheral Drivers"中添加配置I2C2总线并在菜单配置中勾选这里我们采用的是RT-Thread的模拟I2C,使用普通IO就可以了,不再需要通过CubeMx配置I2C引脚。从原理图可以看到电容触摸的I2C两个引脚SDA、SCL分别为PH6PF6,引脚编号为118、86。
12_kconfig.png
12_menu.png


2、在菜单路径下RT-Thread online packages -> Peripheral libraries and drivers -> touch drivers -> 勾选GT9147 电容触摸驱动。我使用的电容触摸芯片是GT911,与GT9147同一个系列,我将在官方GT9147驱动的基础上略作修改来适配GT911。
12_menu2.png


3、使用命令Pkgs --force-update 下载官方GT9147驱动包。

4、键入scons --target=mdk5,生成MDK5工程在工程目录packages\gt9147-latest下就是GT9147的驱动文件
12_pkg.png





5、打开stm32h750-gingko-icore4t下的project.uvprojx工程,在gt9147.c文件头部添加board.h头文件和I2C2的INT、RST引脚定义,并替换CFG_TBL数组。


12_gt9147.png
6、在gt9147.c文件末尾添加rt_hw_gt9147_port函数,将gt9147与I2C2总线绑定。
12_gt91472.png
7、手动添加gt9147_sample.c测试文件到工程,并在文件末尾添加代码,将gt_9147_sample命令添加进CMD,在函数gt9147_sample开头对参数进行赋值。
12_gt91473.png
12_gt91474.png



8、将工程编译,烧录,就可以进行触摸测试了打开终端,选择对应COM口,比特率115200,可以看到系统启动信息,I2C2总线注册成功,触摸设备初始化成功。运行gt9147_sample命令,打印出设备ID,xy范围,触摸点数。当点击触摸屏时,打印触点信息。
12_test.png
至此说明我们的电容触摸驱动已经添加成功。

9源代码
源代码可以稳步这里下载:
链接:https://pan.baidu.com/s/1fcLU4WaRDlgr0mNYwZj1Yg  提取码:zstq

wker 发表于 2020-11-9 09:09 | 显示全部楼层
好资料啊,感谢分享
zeshoufx 发表于 2020-11-11 09:17 | 显示全部楼层
谢谢分享【移植RT-Thread过程的点点滴滴】
xiaorenwuu 发表于 2020-11-13 09:05 | 显示全部楼层
过程很详细,值得入手
如意不如意 发表于 2020-11-18 11:06 | 显示全部楼层
分享iCore4T移植RT-Thread过程的点点滴滴——DAY 13
高手请略过,如有错误请多多批评指点!
iCore4T上,RAM通过SPI4总线与FPGA通信,今天,我将给大家分享RTT添加SPI总线和FPGA驱动,最后实现FPGA的读写测试。
1、修改board文件夹下kconfig文件,在menu "Onboard Peripheral Drivers"中添加配置FPGA选项,menu "On-chip Peripheral Drivers"配置SPI总线并在menuconfig菜单配置中勾选
iCore4T_RTT_14_1.png
iCore4T_RTT_14_2.png
iCore4T_RTT_14_3.png
iCore4T_RTT_14_4.png
2、在文件路径stm32\libraries\HAL_Drivers下,我们修改SConscript文件,将drv_spi_fpga.c源文件添加到编译脚本中去。
iCore4T_RTT_14_5.png
3、drv_spi_fpga.c文件内容贴在下面。
  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. * 2020-02-17     zh.          first version
  9. */

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

  15. #include <ctype.h>
  16. #include <string.h>
  17. #include <stdlib.h>
  18. #include <stdio.h>

  19. #ifdef BSP_USING_SPI_FPGA

  20. /* fpga command */
  21. #define FPGA_READ_ID_CMD                        0x01
  22. #define FPGA_WRITE_LEN_CMD                        0x02
  23. #define FPGA_WRITE_STATE_CMD                0x03
  24. #define FPGA_WRITE_CMD                                0x04
  25. #define FPGA_READ_LEN_CMD                        0x05
  26. #define FPGA_READ_STATE_CMD                        0x06
  27. #define FPGA_READ_CMD                                0x07

  28. /* spi bus device name*/
  29. #define FPGA_SPI_DEVICE_NAME                                "spi4"

  30. /* spi device name*/
  31. #define FPGA_DEVICE_NAME                                        "FPGA"

  32. struct rt_spi_device *spi4_device;


  33. static int spi_write_read_test(void)
  34. {
  35. rt_uint32_t i;
  36.         rt_uint32_t temp;
  37.         rt_size_t t_size = 0;
  38.         rt_uint8_t send_buffer[1028];
  39.         rt_uint8_t recv_buffer[1028];
  40.         rt_uint8_t error = 0;
  41.         float speed;
  42.        
  43.         /* write command */
  44.         send_buffer[0] = FPGA_WRITE_CMD;
  45.         send_buffer[1] = 0x00;
  46.         send_buffer[2] = 0x00;
  47.         /* pseudo command */
  48.         send_buffer[1027] = 0x00;
  49.        
  50.         for(i = 0;i < 1024;i ++)
  51.         {
  52.                 send_buffer[i + 3] = i % 256;
  53.         }
  54.        
  55. //        t_size = rt_spi_transfer(spi4_device,send_buffer,recv_buffer,sizeof(send_buffer));
  56.         temp = HAL_GetTick();
  57.         for(i = 0;i < 10240;i ++)
  58.         {
  59.                 t_size = rt_spi_transfer(spi4_device,send_buffer,recv_buffer,sizeof(send_buffer));
  60.         }
  61.         temp = HAL_GetTick() - temp;               
  62.        
  63.         if(t_size != sizeof(send_buffer))
  64.         {
  65.                 rt_kprintf("fpga write fail!\n");
  66.                 return RT_ERROR;
  67.         }
  68.        
  69.         rt_thread_mdelay(100);
  70.        
  71.         //read_command
  72.         send_buffer[0] = FPGA_READ_CMD;
  73.         send_buffer[1] = 0x00;
  74.         send_buffer[2] = 0x00;
  75.         /* pseudo command */               
  76.         send_buffer[3] = 0x00;

  77.        
  78.         memset(recv_buffer,0,sizeof(recv_buffer));
  79.        
  80.         t_size = rt_spi_transfer(spi4_device,send_buffer,recv_buffer,sizeof(send_buffer));

  81.         if(t_size != sizeof(send_buffer))
  82.         {
  83.                 rt_kprintf("fpga read fail!\n");
  84.                 return RT_ERROR;
  85.         }
  86.         else
  87.         {
  88.                 for(i = 0;i < 1024;i ++)
  89.                 {
  90.                         if(recv_buffer[i+4] != i%256)
  91.                         {
  92.                                 error ++;
  93.                                 break;
  94.                         }
  95.                 }       
  96.         }
  97.        
  98.         if(error)
  99.         {
  100.                 rt_kprintf("fpga test fail!\n");
  101.         }
  102.         else
  103.         {
  104.                 speed = 10000./temp;
  105.                 temp = speed * 100;
  106.                 rt_kprintf("fpga test ok!\n");
  107. //                rt_kprintf("speed : %d.%02dMBytes/s\n",temp/100,temp%100);
  108.         }
  109.        
  110.         return RT_EOK;
  111. }

  112. MSH_CMD_EXPORT(spi_write_read_test,fpga);

  113. static int rt_hw_spi_fpga_probe(void)
  114. {
  115.         struct rt_spi_configuration cfg;
  116.         rt_size_t t_size = 0;
  117.         rt_uint8_t send_buffer[5];
  118.         rt_uint8_t recv_buffer[5];
  119.         rt_uint8_t fpga_id;
  120.        
  121.         /* find spi4 device*/
  122.         spi4_device = (struct rt_spi_device *)rt_device_find(FPGA_DEVICE_NAME);
  123.         if(spi4_device == RT_NULL)
  124.         {
  125.                 rt_kprintf("ERROR: SPI device %s not found!\n", FPGA_DEVICE_NAME);
  126.                 return RT_ERROR;       
  127.         }
  128.        
  129.         /* config spi4 bus */
  130.         cfg.data_width = 8;
  131.         cfg.max_hz = 130*1000*1000;
  132.         cfg.mode = RT_SPI_MASTER | RT_SPI_MODE_3 | RT_SPI_MSB;
  133.         rt_spi_configure(spi4_device, &cfg);
  134.        
  135.         /* get fpga ID*/
  136.         send_buffer[0] = 0x01;
  137.        
  138.         t_size = rt_spi_transfer(spi4_device,send_buffer,recv_buffer,sizeof(send_buffer));
  139.         if(t_size != sizeof(send_buffer))
  140.         {
  141.                 rt_kprintf("[FPGA] probe fail!");
  142.                 return RT_ERROR;
  143.         }
  144.         else
  145.         {
  146.                 rt_kprintf("[FPGA] probe ok! ID is 0x%02X\n",recv_buffer[4]);
  147.                
  148.                 fpga_id = recv_buffer[4];
  149.                
  150.                 return fpga_id;
  151.         }
  152. }

  153. static int rt_hw_spi4_fpga_init(void)
  154. {
  155.         __HAL_RCC_GPIOE_CLK_ENABLE();
  156.        
  157.         /* attach fpga to spi bus */
  158.         rt_hw_spi_device_attach(FPGA_SPI_DEVICE_NAME, FPGA_DEVICE_NAME, GPIOE, GPIO_PIN_4);
  159.        
  160.         /* probe fpga */
  161.         rt_hw_spi_fpga_probe();
  162.        
  163.         return RT_EOK;
  164. }

  165. INIT_COMPONENT_EXPORT(rt_hw_spi4_fpga_init);

  166. static int fpga(int argc, char **argv)
  167. {
  168.         int result = RT_EOK;
  169.        
  170.     if (argc > 1)
  171.     {
  172.                 if(!strcmp(argv[0],"fpga"))
  173.                 {
  174.                         if (!strcmp(argv[1], "probe"))
  175.                         {
  176.                                 if (argc == 2)
  177.                                 {
  178.                                         rt_hw_spi_fpga_probe();
  179.                                 }
  180.                                 else
  181.                                 {
  182.                                         rt_kprintf("Bad command. Please enter 'fpga' for help\n");
  183.                                 }
  184.                         }
  185.                         else if (!strcmp(argv[1], "test"))
  186.                         {
  187.                                 if (argc == 2)
  188.                                 {
  189.                                         spi_write_read_test();
  190.                                 }
  191.                                 else
  192.                                 {
  193.                                         rt_kprintf("Bad command. Please enter 'fpga' for help\n");
  194.                                 }
  195.                         }
  196.                         else
  197.                         {
  198.                                 rt_kprintf("Bad command. Please enter 'fpga' for help\n");
  199.                         }               
  200.                 }
  201.                 else
  202.                 {
  203.                         rt_kprintf("Bad command. Please enter 'eeprom' for help\n");
  204.                 }
  205.     }
  206.     else
  207.     {
  208.         rt_kprintf("Usage: \n");
  209.         rt_kprintf("fpga probe                      - read fpga id value\n");
  210.                 rt_kprintf("fpga test                       - write & read test fpga\n");
  211.         result = -RT_ERROR;
  212.     }
  213.        
  214.     return result;
  215. }
  216. MSH_CMD_EXPORT(fpga, fpga function);
  217. #endif /* BSP_USING_SPI_FPGA */


4、在board\CubeMX_Config目录下,打开CubeMX_Config.ioc工程。配置SPI4为Full-Duplex Master模式,将GPIO设置为Very High,点击GENERATE CODE。
iCore4T_RTT_14_7.png
5、使用命令scons --target=mdk5,生成MDK5工程在工程文件stm32h7xx_hal_conf.h中,取消SPI库文件注释
iCore4T_RTT_14_6.png
6、先将iCore4T_FPGA_17:基于SPI总线的ARM与FPGA通信实验中FPGA程序下载到fpga中。
7、将工程编译,烧录,就可以进行FPGA读写测试了打开终端,选择对应COM口,比特率115200,可以看到系统启动信息,设备列表中有SPI4总线,FPGA设备。执行命令fpga probe探测到FPGA的ID为0x01,执行fpga test进行FPGA读写测试。
iCore4T_RTT_14_8.png
至此说明我们的RAM-FPGA通信成功。

8、源代码
源代码可以稳步这里下载:
链接:https://pan.baidu.com/s/1fcLU4WaRDlgr0mNYwZj1Yg  提取码:zstq

wangjiahao88 发表于 2020-11-26 15:22 | 显示全部楼层
Env是RTT推出的开发辅助工具,针对基于RTT操作系统项目工程,提供编译构建环境、图形化系统配置及软件包管理功能,其内置的menuconfig提供了简单易用的配置剪裁工具,可对内核、组件和软件包进行自由剪裁,使用系统以搭积木的方式进行构建。
wangjiahao88 发表于 2020-11-26 15:23 | 显示全部楼层
学习学习!
感觉 国产的 RT 系统 RTT 算是 很有名气的了!
wker 发表于 2020-11-30 08:35 | 显示全部楼层
不错,讲解很详细
t61000 发表于 2020-11-30 16:54 | 显示全部楼层
Scons构建工具
t61000 发表于 2020-11-30 16:55 | 显示全部楼层
原来生成工程的时候可以自动将该文件加入MDK工程。
王派oo 发表于 2020-11-30 16:56 | 显示全部楼层
EEPROM的挂载过程
weicguodong 发表于 2020-12-2 13:59 | 显示全部楼层
路过支持下
pushment 发表于 2020-12-3 09:05 | 显示全部楼层
例子不错,写的很详细
韩小野 发表于 2020-12-4 09:51 | 显示全部楼层
共同学习,共同进步
韩小野 发表于 2020-12-10 16:26 | 显示全部楼层
顶一个
GT01115 发表于 2020-12-11 10:26 | 显示全部楼层
支持,教程非常详细
pushment 发表于 2020-12-11 14:28 | 显示全部楼层
简单易懂,谢谢了
韩小野 发表于 2020-12-17 08:55 | 显示全部楼层
gyh974 发表于 2020-12-17 20:11 | 显示全部楼层
rtthread最强大的教程
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部