链接:工具 - 瑞萨 RA MCU 生态社区(https://www.ramcu.cn/lists/21.html)
【资料图】
下载开发板资料,如图:
1.2 板卡的固件下载
资料列表:
板卡内容组成(我没有收到线),而且我们的板子和这里的不一样(可能还要自己买个J-link)。
直接可以使用USB线下载代码:
板子不一样,查看一下EK-RA2E1的原理图。
1.3 原理图
链接::https://www.renesas.cn/cn/zh/products/microcontrollers-microprocessors/ra-cortex-m-mcus/ek-ra2e1-evaluation-kit-ra2e1-mcu-group
→注册后下载资料。
1.4 使用串口下载固件
参考:《使用UART串口烧写程序到瑞萨芯片.pptx》;
连接MCU下载固件:
下载成功了,但是LED没有闪烁。MCU选择如下:
修改MCU型号:
测试了P103发现引脚的电平没有变化,根据原理图来看,GPIO控制的是高电平端,如图:
上电,LED直接熄灭了。
修改时钟源:LOCO,
LED依旧常量。
修改代码LED正常闪烁
代码错误,没有加入while(1)循环:
时钟:LOCO 32768Hz(可以闪烁);HOCO 48MHZ(可以闪烁);MCU型号:R7FA2E1A72DNE;
小结:加入在生成的hal_entry()函数加入while()控制后,LED正常闪烁!
异常:确认,选择MCU型号-R7FA2L1AB2DFLLED不能点亮。总结:开发板非常小巧,开发环境也很紧凑,但是即便是点灯,对新手也不太友好。
野火也有RA系列的教程,链接:如何安装e2 studio/Keil开发环境 — [野火]瑞萨RA系列FSP库开发实战指南——基于野火启明开发板文档(https://doc.embedfire.com/mcu/renesas/fsp_ra/zh/latest/doc/chapter2/chapter2.html)
从教程中得知,不能使用DAP仿真器(那基本上ST-LINK就更不要想了):
不过,没有关系,上一节已经实现了串口下载固件,继续往下走。当前计划使用IIC驱动一款显示屏,驱动的显示屏选择:oled12864, 如图:
设置IIC功能:
安装资料包中的PPT,针对IIC外设的使用,基本操作都讲到了。按照教程,增加IIC外设→属性:
当前P400引脚上没有输出信号:
需要注意的是:生成的工程使用rtos的时候,默认是没有之前的 hal_entry()函数调用了;所以这里已经没有调用之前的LED的初始化代码了,如图:
将OLED的初始化放到相关任务后,发现LED就不亮了;注释掉OLED操作的香瓜代码后,LED正常闪烁。最有可能是IIC的操作有错误,导致程序卡死了。现在没有初始化串口,所以暂时使用LED的亮灭状态来调试代码。
接上oled能够在示波器上看到IIC相关波形,如图:
所以,推测IIC初始化肯定成功了,只需要排除接线问题。果然,排除接线问题后,oled12864显示正常,如图:
这里的OLED驱动代码暂时也是使用的资料包里面的例程,后面会上U8G2显示库。2、驱动温度传感器
刚好有一个LM75温度传感器。简单看了一下时序:
简单看了设置寄存器,在这里并不想使用输出报警功能,只要能够读取实时温度就行。
正常的IIC通信时序:
IIC的通信知识点有点陌生了,找了几张图补充了一下知识点:
寄存器地址:
应该连起来看,首先是设置指针寄存器,然后就可以随便读取温度了。
尝试定义多个IIC对象
在这里OLED和LM75都是使用的硬件IIC,所以尝试定义多个IIC对象:
这里定义了2个IIC对象,结果发现固件下载后,直接异常了,OLED不显示,温度不能采集:
所以只能换一种方式,点击相关属性的感叹号,能够找到一主多从的解析:
抓取了部分代码:
显示温度效果:
任务之间传递变量:
发现当硬件I2C的不同的外设放到不同的任务的时候,会引发未知错误,外设不能正常工作,暂时放弃。
移植U8g2-硬件IIC
移植完成:
参考链接:STM32 U8g2 spi软件驱动,spi硬件驱动_u8g2 驱动_weixin_58595117的博客-CSDN博客
主要修改函数:
画图
使用普通软件取模生成的数组,u8g2_DrawGlyph(&u8g2, 112, 56, _air_conditioner_4x_t ); 不能显示,需要使用函数 u8g2_DrawXBM(&u8g2, 13,23, 30, 23, _air_conditioner_4x_t)。
生成bmp文件
使用画图软件调整大小:
生成数组
使用取模软件 -PCtoLCD2022:
代码
显示图片:u8g2_DrawXBM(&u8g2, 13,23, 30, 30, _clock_4x_t);
需要注意的问题:u8g2_NextPage
u8g2_NextPage()的返回值一直为1,所以菜单页面不会更新。
修改 to_right( )函数:
当前显示温度需要关闭显示才能采集,因为温度采集和OLED显示都是使用硬件IIC,会产生冲突,所以这里针对U8G2做了一点改动,采集温度的时候关闭显示。底层代码逻辑:
关键变量:u8x8_d_ssd1306_128x64_noname_powersave0_seq、u8x8_d_ssd1306_128x64_noname_powersave1_seq。
详细显示如下:
实际上调用display off会导致屏幕熄灭,体验不好,所以,将display off 的寄存器进行修改:0x0ae → 0x0af 。骗过U8G2驱动,关闭U8G2不会真的关闭OLED的显示。
按键驱动
按键驱动做的比较粗糙,只有几个状态:短按、短按释放、长按、长按释放。菜单的显示框架参考RTT。
参考:
RTT-thread进行按键驱动的移植:https://packages.rt-thread.org/index.html。
关于按键消抖的时间描述:https://packages.rt-thread.org/detail.html?package=agile_button ;
基于RTT的例子:https://gitee.com/RT-Thread-Mirror/rt-u8g2/
如图:
1、为红外解码启动定时器
当前选择的模块,是费了很大心思的,选择了一个十分好的模块,如图:
因为发射和接收模块,价格很好-9个十分(0.9元/个)。选好了模块,接下来就是使用定时器来驱动发射模块了。
当前配置了GPT定时器后,无法编译通过。单片机Flash不够报错,已经很久没有体验到单片机Flash不够而报错的感觉了。
错误:
修改代码,减少数组定义,解决掉编译错误。
1.1、查阅RTOS的手册中关于定时器的资料
根据这里的意思,可以定位到GPT定时器中断。
RTSO的手中,有章节介绍怎样配置GPT定时器,那就说明RTOS和GPT定时器外设不冲突。
1.2、使用RTOS手册中的代码成功启用定时器
定时器配置:
代码启用定时器(没有采用PPT资料中的方式开启定时器):
2、解码数据2.1、解码数据-1ms
修改GPT定时器的中断,通过在定时器中判断引脚电平的方式来解码红外数据。当前获取到的数据,异常。空调26℃→
重复解码,修改打印的次数:
解码数据异常,查看示波器的采样波形:
当前ms级的中断无法有效解码,优化方向:红外信号的检测任务需要微妙级别的定时器中断。
2.2、解码数据-10us
修改GPT定时器的中断的时间,中断间隔时间10us,抓取的数据如下:
现在对比开头的几行数据(前面4行),解码已经很准确,解码的时间误差在x*10us之内。
2.3、精确分析
1650us的高电平解码:在误差范围内。
650us的高电平解码:在误差范围内。
抓取比较长的数据,第37个长时间高电平脉冲:在误差范围内。
比较典型的9ms低电平解码:在误差范围内。
接下来可以根据红外信号解码的数据,还原红外信号的发送。
解码主要代码(当前的解码和发射都是使用同一个定时器,所以将定时器的周期修改为:26us -38KHZ):
3、MCU还原遥控器信号
红外发送有问题的原因,在红外发送二极管上不能检测到波形,原因:runStatus变量为bool型,没有进入下面的逻辑。
现在改为static int8_t runStatus = 0;,示波器能够检测到波形,如图:
但是程序运行会卡死,在RTOS中加大了相关任务的堆栈。
在红外发射引脚上,示波器能够抓取到,波形的起始位置有一个大概9ms的低电平,如图:
分析:波形反过来。
修改后,抓取要发送的信号进行比对:解码的信号和还原的信号,在波形时间上没有明显差异。
但是还原出来的信号和遥控器的信号还是有差异。
还原的信号和原始信号对比:还原出来的信号和遥控器的信号,在空闲的时候,还是有差异。
还原信号:
初始信号:
修改解码逻辑-将空闲状态取消,还原信号如下:
小结:当前只能确保红外发射管上的波形,接收管上的波形后面再确认。