一、前言
这次参加的测评活动与之前的有很大的不同点。首先是PCB板的颜色变为白色,更具有辨识度。其次是板卡正面有年份标识,在板卡正面的LED灯角落旁有丙午马的标识,背面有马上有钱的标识,使板卡更具有纪念性。重要的是板卡用的芯片是RA4M2,这与之前的蓝板是同一款芯片,且板子布局和大小都一样。板卡的丝印虽然是印着RA4M2V2.0,但是两者的原理图是一样的,所以程序是可以通用的。
二、资料下载
瑞萨板卡的资料下载是非常方便的。打开瑞萨生态工作室的网站在设计资源栏下的开发板和工具中可以打包下载板卡的例程、原理图和PCB等文件,不需要一个个的下载。也可以下载瑞萨官方发布的相关技术文档。网站资料是可以直接下载的,速度也是非常的快。网站板卡资料下载链接为:瑞萨板卡资料下载链接。
三、添加OLED驱动程序
RA4M2板卡板载了两个用户按键(SW1和SW2),以及两个触摸按键(TS1和TS2)。用户按键的驱动程序可以快速实现,但是触摸按键的程序驱动起来比较麻烦。不过官方例程也有触摸按键实验,如果想用触摸按键的话可以直接在此工程上进行开发。RA4M2V2.0的例程如下
可以看到例程还是比较丰富的。可以将这些例程解压到没有中文路径的文件夹内,然后用e2 studio官方开发软件直接导入就可以了。导入后的程序需要打开configuration.xml组件,然后点击Generate Project Content生成一下底层驱动文件再进行程序的编译,否则会有很多的错误。在生成过程中会有版本不一致问题,可以先忽略,若有问题可以改变一下软件版本重新生成。
在例程中可以看到有OLED的例程,所以添加OLED的驱动程序也是参考例程OLED工程实现的。
1、创建和配置IIC的栈
在使用IIC时,如果不是用GPIO端口模拟IIC时,需要在栈中创建IIC对应的栈。创建方法是:打开configuration.xml组件,进入Stacks,点击New Stack,找到Connectivity下的I2C Master(r_sci_i2c)。
然后在属性配置窗口按如下图的参数配置进行设置
2、引脚配置
在Pins页面中找到Peripherals下的Connectivity:SCI下的SCI3,找到SDA3和SCL3跳转到P408和P409的设置中,按照如下图配置。
3、添加OLED驱动
在src文件夹中添加如下文件oled_fonts.c/h和oled.c/h。其中oled.c文件内容如下
- /*
- * oled.c
- *
- * Created on: 2026年4月25日
- * Author:
- */
- #include "oled.h"
- #include "oled_fonts.h"
- #include "hal_data.h"
- extern fsp_err_t err;
- extern int timeout_ms;
- extern i2c_master_event_t i2c_event ;
- #define I2C_TIMEOUT 1000
- // OLED I2C地址
- #define OLED_ADDR 0x3C
- // 写命令
- static void OLED_WriteCmd(uint8_t cmd)
- {
- uint8_t buf[2] = {0x00, cmd};
- err = R_SCI_I2C_Write(&g_i2c0_ctrl, buf, 0x02, true);
- assert(FSP_SUCCESS == err);
- /* Since there is nothing else to do, block until Callback triggers*/
- while ((I2C_MASTER_EVENT_TX_COMPLETE != i2c_event) && timeout_ms>0)
- {
- R_BSP_SoftwareDelay(1U, BSP_DELAY_UNITS_MICROSECONDS);
- timeout_ms--;
- }
- if (I2C_MASTER_EVENT_ABORTED == i2c_event)
- {
- __BKPT(0);
- }
- /* Read data back from the I2C slave */
- i2c_event = I2C_MASTER_EVENT_ABORTED;
- timeout_ms = 100;
- }
- // 写数据
- static void OLED_WriteData(uint8_t data)
- {
- uint8_t buf[2] = {0x40, data};
- err = R_SCI_I2C_Write(&g_i2c0_ctrl, buf, 0x02, true);
- assert(FSP_SUCCESS == err);
- /* Since there is nothing else to do, block until Callback triggers*/
- while ((I2C_MASTER_EVENT_TX_COMPLETE != i2c_event) && timeout_ms>0)
- {
- R_BSP_SoftwareDelay(1U, BSP_DELAY_UNITS_MICROSECONDS);
- timeout_ms--;
- }
- if (I2C_MASTER_EVENT_ABORTED == i2c_event)
- {
- __BKPT(0);
- }
- /* Read data back from the I2C slave */
- i2c_event = I2C_MASTER_EVENT_ABORTED;
- timeout_ms = 100;
- }
- // OLED初始化(SSD1315专用)
- void OLED_Init(void)
- {
- R_BSP_SoftwareDelay(100, BSP_DELAY_UNITS_MILLISECONDS);
- OLED_WriteCmd(0xAE); // 关显示
- OLED_WriteCmd(0x00);
- OLED_WriteCmd(0x10);
- OLED_WriteCmd(0x40);
- OLED_WriteCmd(0xB0);
- OLED_WriteCmd(0x81);
- OLED_WriteCmd(0xFF);
- OLED_WriteCmd(0xA1);
- OLED_WriteCmd(0xA6);
- OLED_WriteCmd(0xA8); // 开启电荷泵
- OLED_WriteCmd(0x3F);
- OLED_WriteCmd(0xC8); // 页地址模式
- OLED_WriteCmd(0xD3); // 左右反转
- OLED_WriteCmd(0x00); // 上下反转
- OLED_WriteCmd(0xD5);
- OLED_WriteCmd(0x80);
- OLED_WriteCmd(0xD8);
- OLED_WriteCmd(0x05);
- OLED_WriteCmd(0xD9);
- OLED_WriteCmd(0xF1);
- OLED_WriteCmd(0xDA);
- OLED_WriteCmd(0x12);
- OLED_WriteCmd(0xD8);
- OLED_WriteCmd(0x30);
- OLED_WriteCmd(0x8D);
- OLED_WriteCmd(0x14);
- OLED_WriteCmd(0xAF); // 开显示
- OLED_Clear();
- }
- // 清屏
- void OLED_Clear(void)
- {
- uint8_t y, x;
- for(y=0;y<8;y++)
- {
- OLED_WriteCmd(0xB0+y);
- OLED_WriteCmd(0x00);
- OLED_WriteCmd(0x10);
- for(x=0;x<128;x++) OLED_WriteData(0x00);
- }
- }
- // 显示16*16中文字符
- // x:横坐标 y:页号 no:汉字索引
- void OLED_ShowChinese(uint8_t x, uint8_t y, uint8_t no)
- {
- uint8_t i;
- // 上半部分 16列
- OLED_WriteCmd(0xB0 + y);
- OLED_WriteCmd(((x & 0xf0) >> 4) | 0x10);
- OLED_WriteCmd(x & 0x0F);
- for(i=0; i<16; i++)
- {
- OLED_WriteData(g_chinese_16x16[2 * no][i]);
- }
- // 下半部分 16列
- OLED_WriteCmd(0xB0 + y + 1);
- OLED_WriteCmd(((x & 0xf0) >> 4) | 0x10);
- OLED_WriteCmd(x & 0x0F);
- for(i=0; i<16; i++)
- {
- OLED_WriteData(g_chinese_16x16[2 * no][i+16]);
- }
- }
复制代码
oled.h内容如下
- /*
- * oled.h
- *
- * Created on: 2026年4月25日
- * Author:
- */
- #ifndef OLED_H_
- #define OLED_H_
- #include "hal_data.h"
- #include
- #include
- // OLED分辨率
- #define OLED_WIDTH 128
- #define OLED_HEIGHT 64
- // 初始化
- void OLED_Init(void);
- // 清屏
- void OLED_Clear(void);
- // 显示8*16 ASCII字符
- void OLED_ShowChar(uint8_t x, uint8_t y, uint8_t chr);
- // 显示字符串
- void OLED_ShowString(uint8_t x, uint8_t y, char *str);
- // 显示16*16中文字符(2个字节编码)
- void OLED_ShowChinese(uint8_t x, uint8_t y, uint8_t no);
- // 显示数字
- void OLED_ShowNum(uint8_t x,uint8_t y,uint32_t num,uint8_t len);
- #endif /* OLED_H_ */
复制代码
在hal_entry函数中添加如下代码
- // 初始化IIC
- err = R_SCI_I2C_Open(&g_i2c0_ctrl, &g_i2c0_cfg);
- assert(FSP_SUCCESS == err);
- //初始化OLED
- OLED_Init();
- //清屏
- OLED_Clear();
复制代码
这些代码的作用是初始化IIC模块和初始化OLED并清除屏幕显示数据。
四、生成字库
需要在OLED上显示汉字,所以需要生成汉字的编码。使用软件PCtoLCD2002,按照如下配置生成汉字字模(和OLED例程用到的字模配置是一样的)。
生成后的字模数据放到oled_fonts.c文件中的数组g_chinese_16x16内。在oled_fonts.h中添加如下代码
- // 汉字索引
- #define CHI_WEN 0 // 温
- #define CHI_SHI 1 // 湿
- #define CHI_DU 2 // 度
- #define CHI_QI 3 // 气
- #define CHI_YA 4 // 压
- #define CHI_SHE 5 // 设
- #define CHI_ZHI 6 // 置
- #define CHI_ZHI2 7 // 值
- #define CHI_FAN 8 // 返
- #define CHI_HUI 9 // 回
复制代码
五、程序下载验证
1、添加测试代码
为了能够验证OLED显示汉字和四个按键(包括两个用户按键和两个触摸按键)。所以在hal_entry函数初始化完成后添加如下代码
- // 第一行显示:温湿度 气压
- OLED_ShowChinese(0, 0, CHI_WEN); // 温
- OLED_ShowChinese(16,0, CHI_SHI); // 湿
- OLED_ShowChinese(32,0, CHI_DU); // 度
- OLED_ShowChinese(64,0, CHI_QI); // 气
- OLED_ShowChinese(80,0, CHI_YA); // 压
- // 第一行显示:设置值 返回
- OLED_ShowChinese(0, 2, CHI_SHE); // 设
- OLED_ShowChinese(16,2, CHI_ZHI); // 置
- OLED_ShowChinese(32,2, CHI_ZHI2); // 值
- OLED_ShowChinese(64,2, CHI_FAN); // 返
- OLED_ShowChinese(80,2, CHI_HUI); // 回
复制代码
以上代码的作用是显示字模软件生成的全部汉字,维持6秒钟后清屏。
在qe_touch_main函数中的while死循环中添加如下测试代码
- /* for [CONFIG01] configuration */
- err = RM_TOUCH_ScanStart(g_qe_touch_instance_config01.p_ctrl);
- if (FSP_SUCCESS != err)
- {
- while (true) {}
- }
- while (0 == g_qe_touch_flag) {}
- g_qe_touch_flag = 0;
- err = RM_TOUCH_DataGet(g_qe_touch_instance_config01.p_ctrl, &button_status, NULL, NULL);
- if (FSP_SUCCESS == err)
- {
- /* TODO: Add your own code here. */
- if(button_status==1)
- {
- OLED_ShowChinese(0, 0, CHI_WEN); // 温
- err = R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_04, BSP_IO_LEVEL_HIGH);
- }
- else if(button_status==2)
- {
- OLED_ShowChinese(16,0, CHI_SHI); // 湿
- err = R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_05, BSP_IO_LEVEL_HIGH);
- }
- else
- {
- err = R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_04, BSP_IO_LEVEL_LOW);
- err = R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_05, BSP_IO_LEVEL_LOW);
- }
- }
- R_IOPORT_PinRead(&g_ioport_ctrl,BSP_IO_PORT_00_PIN_05,&p_port_value_port_005);
- if (BSP_IO_LEVEL_LOW == p_port_value_port_005)
- {
- OLED_ShowChinese(32,0, CHI_DU); // 度
- }
- R_IOPORT_PinRead(&g_ioport_ctrl,BSP_IO_PORT_00_PIN_06,&p_port_value_port_006);
- if (BSP_IO_LEVEL_LOW == p_port_value_port_006)
- {
- OLED_ShowChinese(64,0, CHI_QI); // 气
- }
- /* FIXME: Since this is a temporary process, so re-create a waiting process yourself. */
- R_BSP_SoftwareDelay(TOUCH_SCAN_INTERVAL_EXAMPLE, BSP_DELAY_UNITS_MILLISECONDS);
复制代码
代码的主要功能是当四个按键按下后依次显示对应的汉字。
2、设置生成hex文件
因为板卡没有板载烧写器,需要通过串口下载程序。而串口下载程序需要用到hex文件,e2 Studio默认配置是不生成hex文件的,需要进行配置才可以。右键项目文件夹,在属性中按照如下图进行配置
配置好之后可以编译代码,如果没有问题的话再输出栏中输出编译成功的结果。在Debug文件夹中会生成与项目名称同名的hex文件。
3、下载程序
下载程序需要用到一根杜邦线和Type-C串口线和Renesas Flash Programmer软件。打开Renesas Flash Programmer软件,点击File菜单栏下的New Project,在下图中设置好路径和名称后,用杜邦线短接MODE1中的两个引脚,用Type-C线连接POWER1端口至电脑。然后点击Connect软件会自动识别芯片的型号。
Program and User Key Files栏中选择对应项目Debug文件夹下的hex文件,点击Start开始下载,直至下载完成后去掉杜邦线的短接,按下复位按键,程序就可以启动了。
4、验证程序
程序启动后会把所有的汉字显示在屏幕上,并维持6S。
之后会清除屏幕数据,按四个按键会显示不同的汉字在屏幕上。
六、附件
完整代码:
原理图:
|