Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
RT-Thread活动
SPI
【开发板评测】Renesas RA2L 点亮LCD (SPI)
发布于 2022-10-24 22:35:33 浏览:1464
订阅该版
[tocm] # 【开发板评测】Renesas RA2L1 开发板 点亮ST7735 SPI LCD ## 开发板简介 CPK-RA2L1是瑞萨电子针对中国本地做的一款评估版,MCU为R7FA2L1AB2DFM,Arm Cortex®-M23@48MHz,256k Flash, 32k SRAM,板载Jlink调试器 (SWD)。 ## 功能模块的硬件介绍 R7FA2L1拥有两组硬件SPI - 传输位长度可选 8, 9, 10, 11, 12, 13, 14, 15, 16, 20, 24, or 32 - 32发送和接收缓冲区 - 模式故障错误检测 - 奇偶校验错误检测 - 可设置模块停止降低功耗 - 5个中断源 - 接收缓冲区满 - 发送缓冲区满 - SPI错误中断 - SPI空闲中断 - SPI发送完成中断 - 最大速率为PCLKB二分频(可选2-4096分频) 因为此外设已经对接RTT设备框架层,故不需要特别在意寄存器的配置。 ## 外设性能指标测试 在16M下全屏刷新160*128 16bit的lcd需要727ms ![Untitled.png](https://oss-club.rt-thread.org/uploads/20221024/029671da8ebbf9be480e27b94e14c510.png.webp "Untitled.png") ## 测试流程 - 选用weact studio的st7735 1.8寸TFT-LCD模块,相关手册资料在附录,3线spi(CLK MOSI CS)。 - 下载FSP3.5.0(3.6.0应该也行,我看RTT的readme里面写的是3.5.0就优先使用3.5.0了),安装好Rasc3.5.0,RA Pack 3.5.0(MDK包管理器里可以直接下载),看到站内的贴子都有讲到,此处不在赘述。 - 下载[RT-Thread最新的Releases版本(4.1.1)](https://github.com/RT-Thread/rt-thread/releases),打开 ...\rt-thread\bsp\renesas\ra2l1-cpk目录下的MDK文件(bsp内的其他板卡可以删错),此时直接编译会报22个错误,回到ra2l1-cpk文件夹,右键打开ENV工具 ![Untitled 1.png](https://oss-club.rt-thread.org/uploads/20221024/43fcabbd95b4a713e538140838c2a061.png.webp "Untitled 1.png") 先打开UART_V2 ![Untitled 2.png](https://oss-club.rt-thread.org/uploads/20221024/90a35c7a39e86586208cc9095ebf25cd.png "Untitled 2.png") 再把RTT默认输出串口设备改为uart9 esc退出menucongfig,scons --target=mdk5生成工程文件,此时再编译不报错了,啪的一下很快啊,烧录,插上usb-ttl,一看串口不输出,尬住了。 debug查看得知mcu卡死在此处,不过由于串口还未初始化,因此没有输出 ![Untitled 3.png](https://oss-club.rt-thread.org/uploads/20221024/6ef67d4d5aa23c7e8cf023ee3676282a.png.webp "Untitled 3.png") 通过栈回溯可得知其是由此处断言错误引起 ![Untitled 4.png](https://oss-club.rt-thread.org/uploads/20221024/19f791f167303f437b46f9c9102bd01b.png.webp "Untitled 4.png") 当时纳闷了,后面看到群里rb大佬发的工程找到这里发现这一行被他注释掉了,试了一下注释掉确实能够正常工作,~~估计是没有开启ops而导致的?~~ 此时,我们已经得到了一个可以正常运行的工程。 - 参考[https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/tutorial/make-bsp/renesas-ra/RA系列BSP外设驱动使用教程](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/tutorial/make-bsp/renesas-ra/RA%E7%B3%BB%E5%88%97BSP%E5%A4%96%E8%AE%BE%E9%A9%B1%E5%8A%A8%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B)打开SPI外设,编译报错缺少board_cfg.h,去别的工程查看该文件 ```c /* generated configuration header file - do not edit */ #ifndef BOARD_CFG_H_ #define BOARD_CFG_H_ #include "../../../ra/board/ra2l1_cpk/board.h" #endif /* BOARD_CFG_H_ */ ``` 应该只是包含了bsp里的board配置,直接复制一份到工程里面,编译通过,把spi0总线挂载上 烧录,用msh查看list_device,可以看到spi0 bus已经被识别到 编写一个挂载函数,可以把spi总线抽象成一个spi设备 ```c void rt_spi_device_attach(const char *bus_name, const char *device_name, rt_uint32_t *cs_pin) { RT_ASSERT(bus_name != RT_NULL); RT_ASSERT(device_name != RT_NULL); struct rt_spi_device *spi_device; struct rt_spi_configuration cfg; /* attach the device to spi bus*/ spi_device = (struct rt_spi_device *)rt_malloc(sizeof(struct rt_spi_device)); RT_ASSERT(spi_device != RT_NULL); rt_hw_spi_device_attach(spi_device, device_name, bus_name, (void *)cs_pin); cfg.data_width = 8; cfg.mode = RT_SPI_MASTER | RT_SPI_MODE_0 | RT_SPI_MSB; cfg.max_hz = 16 * 1000 * 1000; /* 16M */ rt_spi_configure(spi_device, &cfg); } //在初始化设备阶段调用 int spi10_device_init(void) { rt_uint32_t lcd_cs_pin = rt_pin_get(LCD_CS); rt_pin_mode(lcd_cs_pin, PIN_MODE_OUTPUT); //设备挂载到SPI总线,抽象为 spi10 设备 rt_spi_device_attach("spi0", "spi10", (rt_uint32_t *)lcd_cs_pin); return RT_EOK; } INIT_DEVICE_EXPORT(spi10_device_init); ``` ![Untitled 5.png](https://oss-club.rt-thread.org/uploads/20221024/bc9d3437529cdbbe121c590ee933f569.png.webp "Untitled 5.png") 此时我们已经成功启用了SPI外设 - 编写drv_lcd文件(详见工程代码),在user app里面初始化并创建一个lcd thread ```c static void lcd_app(void *parameter); int lcd_thread(void) { rt_thread_t tid; rt_uint32_t lcd_dc_pin = rt_pin_get(LCD_DC); rt_uint32_t lcd_rst_pin = rt_pin_get(LCD_RST); rt_uint32_t lcd_blk_pin = rt_pin_get(LCD_BLK); rt_pin_mode(lcd_dc_pin, PIN_MODE_OUTPUT); rt_pin_mode(lcd_rst_pin, PIN_MODE_OUTPUT); rt_pin_mode(lcd_blk_pin, PIN_MODE_OUTPUT); rt_pin_write(lcd_blk_pin, PIN_LOW);//开启lcd背光,手里有的模组是低电平点亮,实际情况要参考模组原理图 if(lcd_init("spi10", lcd_dc_pin, lcd_rst_pin) == RT_EOK) { lcd_clear(WHITE); rt_kprintf("lcd init ok\r\n"); } else { rt_kprintf("lcd init fail\r\n"); return RT_ERROR; } tid = rt_thread_create("lcd task", lcd_app, RT_NULL, 4096, 12, 10); if (RT_NULL != tid) rt_thread_startup(tid); return RT_EOK; } INIT_APP_EXPORT(lcd_thread); ``` ![Untitled 6.png](https://oss-club.rt-thread.org/uploads/20221024/d7a996eca6eb38e96236caec603f881d.png.webp "Untitled 6.png") 此时可以看到我们的lcd设备已经初始化完成并且注册成功,编写两个简单的test测试一下lcd功能 ```c void lcd_test1(void) { lcd_draw_rect(40 - Rect_W, 32 - Rect_H, 40 + Rect_W, 32 + Rect_H, BLUE); lcd_draw_rect(120 - Rect_W, 32 - Rect_H, 120 + Rect_W, 32 + Rect_H, YELLOW); lcd_draw_rect(40 - Rect_W, 96 - Rect_H, 40 + Rect_W, 96 + Rect_H, GRAY); lcd_draw_rect(120 - Rect_W, 96 - Rect_H, 120 + Rect_W, 96 + Rect_H, GREEN); lcd_draw_rect(80 - Rect_W, 64 - Rect_H, 80 + Rect_W, 64 + Rect_H, PINK); rt_thread_mdelay(1000); lcd_clear(WHITE); lcd_draw_circ(80, 64, 5 * 2, RED); lcd_draw_circ(80, 64, 10 * 2, GREEN); lcd_draw_circ(80, 64, 15 * 2, BLUE); lcd_draw_circ(80, 64, 20 * 2, GRAY); lcd_draw_circ(80, 64, 25 * 2, BROWN); lcd_draw_circ(80, 64, 30 * 2, PINK); rt_thread_mdelay(1000); lcd_clear(WHITE); lcd_showpicture(0, 0, 160, 80, RT_Thread_logo_map); lcd_showstr(20, 5, (uint8_t *)"Powered by"); lcd_showstr(40, 6, (uint8_t *)"Renesas RA2L1"); return ; } MSH_CMD_EXPORT(lcd_test1, "lcd basic test"); void lcd_test2(void) { // rt_tick_t tick_start, tick_end; // tick_start = rt_tick_get(); for(uint8_t i = 0; i < 2; ++i) { lcd_clear(RED); lcd_clear(GREEN); lcd_clear(BLUE); } // tick_end = rt_tick_get(); // rt_kprintf("clear screen use %d ms\n", (tick_end - tick_start) / 9); lcd_clear(WHITE); return ; } MSH_CMD_EXPORT(lcd_test2, "lcd test fill RGB"); ``` 用MSH输入命令观察到可以正常运行 ![Untitled 7.png](https://oss-club.rt-thread.org/uploads/20221024/f7b2cf5d4683733630eb630bc1192037.png.webp "Untitled 7.png") ## 完成模块功能的演示 [https://www.bilibili.com/video/BV1q14y157N2/?vd_source=765b34fccdb194af21d8784dccd2435e](https://www.bilibili.com/video/BV1q14y157N2/?vd_source=765b34fccdb194af21d8784dccd2435e) ## 可编译下载的代码 [https://github.com/ninagon666/RTT_RA2L1_SPI](https://github.com/ninagon666/RTT_RA2L1_SPI) ## 遇到的问题 - Rasc每次生成会删除board_cfg.h文件,ENV每次生成会把我手动添加的文件排除构建(应该是设置没搞对,第一次用ENV)。 - RTT studio不支持该BSP,包管理器里面没有,直接选择从BSP文件导入也会报错,希望后续能够加入相关支持。 - Rasc配置文件里有两个cfg(雷坑),因为CPK这个默认选中了很多引脚,我以为他是给RTT当模板文件的,就使用了第二个,配置一切正常,msh也能查看的设备注册成功,debug单步查看瑞萨相关库函数返回都是正常的,我在while(1)里循环rt_spi_send R_SPI_Write用逻辑分析仪查看CLK和MOSI都没有输出,搞了好久都没想明白,想查看外设寄存器但是debug里面看到的全是0,直到前两天看见有大佬发帖已经成功使用了SPI外设,下载下来对比查看才知道这里出了问题,这个文件默认配置的那些引脚不知道有什么作用,而且直接配置外设还会冲突,要先关掉那几个引脚的配置才能正常打开,不知道默认配置有什么特殊意义。 ![Untitled 8.png](https://oss-club.rt-thread.org/uploads/20221024/ae22e32e9ac6cd6f29a7196c0ee8ac22.png.webp "Untitled 8.png") ## 收获与感想 - 熟悉了一下ENV工具,同时通过debug单步调试加深了对RTT的spi框架调用结构的理解。 - 这次是本人第一次使用瑞萨的mcu,得益于RTT适配好的框架层,能够快速在一个完全没有使用过的平台上快速布署实现我想要的功能。 ## 附录(参考资料) [瑞萨官方资料(也可以在瑞萨电子官网下载) 百度云盘 提取码eui5](https://pan.baidu.com/s/1Gpqx327tZdBfHWiat25OMw?pwd=eui5) [Weact 1.8寸TFT-LCD](https://github.com/WeActTC/WeAct-ST7735.git) *在这最后感谢一下群里各位大佬无私的解答以及RT-Thread官方和瑞萨电子。*
0
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
NinaGon
这家伙很懒,什么也没写!
文章
1
回答
1
被采纳
0
关注TA
发私信
相关文章
1
BBB的SPI驱动
2
求个SPI上挂两个或多个设备的使用例子
3
SPI设备有个bug
4
spi flash 的fatfs使用一段时间后读写文件出现故障
5
SPI驱动
6
请教rt_spi_configure函数理解
7
SPI FLASH挂载的问题
8
SPI-FLASH 文件系统 SPIFFS
9
求助一个完整的 spi flash 驱动
10
关于同时使用文件系统与SPI FLASH的问题
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
UART
WIZnet_W5500
ota在线升级
PWM
flash
cubemx
freemodbus
BSP
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
编译报错
Debug
rt_mq_消息队列_msg_queue
SFUD
keil_MDK
msh
ulog
MicroPython
C++_cpp
本月问答贡献
出出啊
1517
个答案
342
次被采纳
小小李sunny
1444
个答案
290
次被采纳
张世争
812
个答案
177
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
148
次被采纳
本月文章贡献
出出啊
1
篇文章
2
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
2
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
2
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部