打印
[STM32H7]

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

[复制链接]
楼主: heart蓝色CD
手机看帖
扫描二维码
随时随地手机跟帖
201
本帖最后由 如意不如意 于 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的选项。




4、在bsp\stm32\libraries\STM32H7xx_HAL下文件SConscript中,添加“STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_ltdc.c”。

5、在board文件夹下新建ports文件夹,用来存放接口头文件。在ports下新建lcd_port.h文件,并添加接口头文件路径到board/SConscript中,内容如下:


#ifndef __LCD_PORT_H
#define __LCD_PORT_H
#ifdef __cplusplus
extern "C" {
#endif

#define LCD_BACKLIGHT_USING_GPIO
#define LCD_BL_GPIO_NUM GET_PIN(B, 4)
#define LCD_DISP_GPIO_NUM GET_PIN(B, 14)

#define DRV_DEBUG
#define FINSH_USING_MSH

#define LCD_WIDTH        480
#define LCD_HSYNC 1
#define LCD_HBP 20
#define LCD_HFP        24
#define LCD_HEIGHT 272
#define LCD_VSYNC 2
#define LCD_VBP 8
#define LCD_VFP        6
#define LCD_BUF_SIZE 2*480*272
#define LCD_HSYNC_WIDTH  1
#define LCD_VSYNC_HEIGHT 2
#define LCD_BITS_PER_PIXEL 2
#define LCD_PIXEL_FORMAT RTGRAPHIC_PIXEL_FORMAT_RGB565

#define RED          0xf800
#define GREEN        0x07e0
#define BLUE        0x001f

#ifdef __cplusplus
}

#endif
#endif /*__ LCD_PORT_H */



6、menu "RT-Thread Kernel -> Memory Management"下勾选Using memory heap object选项并在子选项中选择Use all of memheap objects as heap

7、进入stm32h750-gingko-icore4t文件夹下,右击空白处,选择ConEmu Here,使用scons命令,键入scons --target=mdk5,生成MDK5工程。


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


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

至此说明我们的LTDC驱动已经添加成功。

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

使用特权

评论回复
202
如意不如意| | 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。



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



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

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






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



6、在gt9147.c文件末尾添加rt_hw_gt9147_port函数,将gt9147与I2C2总线绑定。

7、手动添加gt9147_sample.c测试文件到工程,并在文件末尾添加代码,将gt_9147_sample命令添加进CMD,在函数gt9147_sample开头对参数进行赋值。





8、将工程编译,烧录,就可以进行触摸测试了打开终端,选择对应COM口,比特率115200,可以看到系统启动信息,I2C2总线注册成功,触摸设备初始化成功。运行gt9147_sample命令,打印出设备ID,xy范围,触摸点数。当点击触摸屏时,打印触点信息。

至此说明我们的电容触摸驱动已经添加成功。

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

使用特权

评论回复
203
wker| | 2020-11-9 09:09 | 只看该作者
好资料啊,感谢分享

使用特权

评论回复
204
zeshoufx| | 2020-11-11 09:17 | 只看该作者
谢谢分享【移植RT-Thread过程的点点滴滴】

使用特权

评论回复
205
xiaorenwuu| | 2020-11-13 09:05 | 只看该作者
过程很详细,值得入手

使用特权

评论回复
206
如意不如意| | 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菜单配置中勾选




2、在文件路径stm32\libraries\HAL_Drivers下,我们修改SConscript文件,将drv_spi_fpga.c源文件添加到编译脚本中去。

3、drv_spi_fpga.c文件内容贴在下面。
/*
* Copyright (c) 2006-2018, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date           Author       Notes
* 2020-02-17     zh.          first version
*/

#include <board.h>
#include <drv_spi.h>
#include <rtdevice.h>
#include <rthw.h>
#include <finsh.h>

#include <ctype.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>

#ifdef BSP_USING_SPI_FPGA

/* fpga command */
#define FPGA_READ_ID_CMD                        0x01
#define FPGA_WRITE_LEN_CMD                        0x02
#define FPGA_WRITE_STATE_CMD                0x03
#define FPGA_WRITE_CMD                                0x04
#define FPGA_READ_LEN_CMD                        0x05
#define FPGA_READ_STATE_CMD                        0x06
#define FPGA_READ_CMD                                0x07

/* spi bus device name*/
#define FPGA_SPI_DEVICE_NAME                                "spi4"

/* spi device name*/
#define FPGA_DEVICE_NAME                                        "FPGA"

struct rt_spi_device *spi4_device;


static int spi_write_read_test(void)
{
rt_uint32_t i;
        rt_uint32_t temp;
        rt_size_t t_size = 0;
        rt_uint8_t send_buffer[1028];
        rt_uint8_t recv_buffer[1028];
        rt_uint8_t error = 0;
        float speed;
       
        /* write command */
        send_buffer[0] = FPGA_WRITE_CMD;
        send_buffer[1] = 0x00;
        send_buffer[2] = 0x00;
        /* pseudo command */
        send_buffer[1027] = 0x00;
       
        for(i = 0;i < 1024;i ++)
        {
                send_buffer[i + 3] = i % 256;
        }
       
//        t_size = rt_spi_transfer(spi4_device,send_buffer,recv_buffer,sizeof(send_buffer));
        temp = HAL_GetTick();
        for(i = 0;i < 10240;i ++)
        {
                t_size = rt_spi_transfer(spi4_device,send_buffer,recv_buffer,sizeof(send_buffer));
        }
        temp = HAL_GetTick() - temp;               
       
        if(t_size != sizeof(send_buffer))
        {
                rt_kprintf("fpga write fail!\n");
                return RT_ERROR;
        }
       
        rt_thread_mdelay(100);
       
        //read_command
        send_buffer[0] = FPGA_READ_CMD;
        send_buffer[1] = 0x00;
        send_buffer[2] = 0x00;
        /* pseudo command */               
        send_buffer[3] = 0x00;

       
        memset(recv_buffer,0,sizeof(recv_buffer));
       
        t_size = rt_spi_transfer(spi4_device,send_buffer,recv_buffer,sizeof(send_buffer));

        if(t_size != sizeof(send_buffer))
        {
                rt_kprintf("fpga read fail!\n");
                return RT_ERROR;
        }
        else
        {
                for(i = 0;i < 1024;i ++)
                {
                        if(recv_buffer[i+4] != i%256)
                        {
                                error ++;
                                break;
                        }
                }       
        }
       
        if(error)
        {
                rt_kprintf("fpga test fail!\n");
        }
        else
        {
                speed = 10000./temp;
                temp = speed * 100;
                rt_kprintf("fpga test ok!\n");
//                rt_kprintf("speed : %d.%02dMBytes/s\n",temp/100,temp%100);
        }
       
        return RT_EOK;
}

MSH_CMD_EXPORT(spi_write_read_test,fpga);

static int rt_hw_spi_fpga_probe(void)
{
        struct rt_spi_configuration cfg;
        rt_size_t t_size = 0;
        rt_uint8_t send_buffer[5];
        rt_uint8_t recv_buffer[5];
        rt_uint8_t fpga_id;
       
        /* find spi4 device*/
        spi4_device = (struct rt_spi_device *)rt_device_find(FPGA_DEVICE_NAME);
        if(spi4_device == RT_NULL)
        {
                rt_kprintf("ERROR: SPI device %s not found!\n", FPGA_DEVICE_NAME);
                return RT_ERROR;       
        }
       
        /* config spi4 bus */
        cfg.data_width = 8;
        cfg.max_hz = 130*1000*1000;
        cfg.mode = RT_SPI_MASTER | RT_SPI_MODE_3 | RT_SPI_MSB;
        rt_spi_configure(spi4_device, &cfg);
       
        /* get fpga ID*/
        send_buffer[0] = 0x01;
       
        t_size = rt_spi_transfer(spi4_device,send_buffer,recv_buffer,sizeof(send_buffer));
        if(t_size != sizeof(send_buffer))
        {
                rt_kprintf("[FPGA] probe fail!");
                return RT_ERROR;
        }
        else
        {
                rt_kprintf("[FPGA] probe ok! ID is 0x%02X\n",recv_buffer[4]);
               
                fpga_id = recv_buffer[4];
               
                return fpga_id;
        }
}

static int rt_hw_spi4_fpga_init(void)
{
        __HAL_RCC_GPIOE_CLK_ENABLE();
       
        /* attach fpga to spi bus */
        rt_hw_spi_device_attach(FPGA_SPI_DEVICE_NAME, FPGA_DEVICE_NAME, GPIOE, GPIO_PIN_4);
       
        /* probe fpga */
        rt_hw_spi_fpga_probe();
       
        return RT_EOK;
}

INIT_COMPONENT_EXPORT(rt_hw_spi4_fpga_init);

static int fpga(int argc, char **argv)
{
        int result = RT_EOK;
       
    if (argc > 1)
    {
                if(!strcmp(argv[0],"fpga"))
                {
                        if (!strcmp(argv[1], "probe"))
                        {
                                if (argc == 2)
                                {
                                        rt_hw_spi_fpga_probe();
                                }
                                else
                                {
                                        rt_kprintf("Bad command. Please enter 'fpga' for help\n");
                                }
                        }
                        else if (!strcmp(argv[1], "test"))
                        {
                                if (argc == 2)
                                {
                                        spi_write_read_test();
                                }
                                else
                                {
                                        rt_kprintf("Bad command. Please enter 'fpga' for help\n");
                                }
                        }
                        else
                        {
                                rt_kprintf("Bad command. Please enter 'fpga' for help\n");
                        }               
                }
                else
                {
                        rt_kprintf("Bad command. Please enter 'eeprom' for help\n");
                }
    }
    else
    {
        rt_kprintf("Usage: \n");
        rt_kprintf("fpga probe                      - read fpga id value\n");
                rt_kprintf("fpga test                       - write & read test fpga\n");
        result = -RT_ERROR;
    }
       
    return result;
}
MSH_CMD_EXPORT(fpga, fpga function);
#endif /* BSP_USING_SPI_FPGA */


4、在board\CubeMX_Config目录下,打开CubeMX_Config.ioc工程。配置SPI4为Full-Duplex Master模式,将GPIO设置为Very High,点击GENERATE CODE。

5、使用命令scons --target=mdk5,生成MDK5工程在工程文件stm32h7xx_hal_conf.h中,取消SPI库文件注释

6、先将iCore4T_FPGA_17:基于SPI总线的ARM与FPGA通信实验中FPGA程序下载到fpga中。
7、将工程编译,烧录,就可以进行FPGA读写测试了打开终端,选择对应COM口,比特率115200,可以看到系统启动信息,设备列表中有SPI4总线,FPGA设备。执行命令fpga probe探测到FPGA的ID为0x01,执行fpga test进行FPGA读写测试。

至此说明我们的RAM-FPGA通信成功。

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

使用特权

评论回复
207
wangjiahao88| | 2020-11-26 15:22 | 只看该作者
Env是RTT推出的开发辅助工具,针对基于RTT操作系统项目工程,提供编译构建环境、图形化系统配置及软件包管理功能,其内置的menuconfig提供了简单易用的配置剪裁工具,可对内核、组件和软件包进行自由剪裁,使用系统以搭积木的方式进行构建。

使用特权

评论回复
208
wangjiahao88| | 2020-11-26 15:23 | 只看该作者
学习学习!
感觉 国产的 RT 系统 RTT 算是 很有名气的了!

使用特权

评论回复
209
wker| | 2020-11-30 08:35 | 只看该作者
不错,讲解很详细

使用特权

评论回复
210
t61000| | 2020-11-30 16:54 | 只看该作者
Scons构建工具

使用特权

评论回复
211
t61000| | 2020-11-30 16:55 | 只看该作者
原来生成工程的时候可以自动将该文件加入MDK工程。

使用特权

评论回复
212
王派oo| | 2020-11-30 16:56 | 只看该作者
EEPROM的挂载过程

使用特权

评论回复
213
weicguodong| | 2020-12-2 13:59 | 只看该作者
路过支持下

使用特权

评论回复
214
pushment| | 2020-12-3 09:05 | 只看该作者
例子不错,写的很详细

使用特权

评论回复
215
韩小野| | 2020-12-4 09:51 | 只看该作者
共同学习,共同进步

使用特权

评论回复
216
韩小野| | 2020-12-10 16:26 | 只看该作者
顶一个

使用特权

评论回复
217
GT01115| | 2020-12-11 10:26 | 只看该作者
支持,教程非常详细

使用特权

评论回复
218
pushment| | 2020-12-11 14:28 | 只看该作者
简单易懂,谢谢了

使用特权

评论回复
219
韩小野| | 2020-12-17 08:55 | 只看该作者

使用特权

评论回复
220
gyh974| | 2020-12-17 20:11 | 只看该作者
rtthread最强大的教程

使用特权

评论回复
发新帖 本帖赏金 6.66元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则