【RA-Eco-RA2L1-48PIN】ADC 電壓表與OLED顯示
本文介紹了 RA-Eco-RA2L1-48PIN 開發板通過瑞薩 e2 Studio 靈活軟件包(FSP)編程實現 ADC 串口采集電壓和OLED顯示電壓數值的項目設計,包括串口電壓值串口打印、硬件 IIC 通信協議配置、 OLED顯示、效果展示等流程。
項目介紹
- 使用 FSP 靈活軟件包和 e2 studio 軟件創建工程;
- 配置串口和 ADC,實現串口printf重定向,打印 ADC 電壓值;
- 配置硬件 IIC 并實現 OLED 驅動和框架顯示;
- OLED 顯示 ADC 采集電壓值,實現電壓表項目設計。
驅動 OLED
介紹了通過配置硬件 IIC 實現與 SSD1306 通信進而驅動 OLED 顯示屏的主要流程。
工程創建
-
打開 e2 studio 軟件,依次點擊
文件
-新建
-瑞薩 C/C++ 項目
-Renesas RA
-
依次進行工程命名,路徑設置,FSP版本,目標開發板選擇,Device 選擇
R7FA2L1AB2DFL
,工具鏈選擇GNU ARM Embedded
,調試器選擇 J-Link -
完成工程創建
IIC 配置
-
設置目標串口對應的 GPIO 引腳
- 依次選擇
Pins
-Peripherals
-Connectivity:IIC
-IIC0
- 使能該模式 - 可見 P401 和 P400 引腳分別對應 SDA 和 SCL ;
- 依次選擇
-
新建 IIC 通信堆棧
Stacks
-New Stack
-Connectivity
-I2C Master (r_iic_master)
-
選中 iic 堆棧方框,打開屬性標簽,配置 IIC 參數
-
屬性設置:
屬性
-Module g_i2c_master0 I2C Master (r_iic_master)
; -
Slave Address
設置為0x3C
; -
回調函數設置為
IIC_master_callback
; -
點擊
Generate Code
按鈕,生成工程代碼。
漢字取模
-
下載 并運行 PC2LCD2018 軟件 ;
-
菜單欄模式設置為
字符模式
; -
點擊工具欄中的
設置
按鈕,配置字模選項:列行式取模、低位在前等,設置完成后點擊確定
保存配置;
- 在文字輸入選框輸入目標漢字,點擊
生成字模
; - 選中復制或保存字模,代碼添加至
oledfont.h
文件。
工程代碼
驅動基于 SSD1306 的 OLED 屏幕顯示框架。
oled.c
文件、oled.h
文件、oledfont.h
文件下載鏈接:
【免費】Renesas單片機OLED驅動文件資源-CSDN文庫
hal_entry.c
關鍵代碼如下
#include "hal_data.h"
#include "oled.h"FSP_CPP_HEADER
void R_BSP_WarmStart(bsp_warm_start_event_t event);
FSP_CPP_FOOTERFSP_CPP_HEADER
void R_BSP_WarmStart(bsp_warm_start_event_t event);
FSP_CPP_FOOTERi2c_master_event_t i2c_event = I2C_MASTER_EVENT_ABORTED;
void IIC_master_callback(i2c_master_callback_args_t *p_args)
{i2c_event = I2C_MASTER_EVENT_ABORTED;if (NULL != p_args){/* capture callback event for validating the i2c transfer event*/i2c_event = p_args->event;}
}
fsp_err_t err = FSP_SUCCESS;
int timeout_ms = 100;void hal_entry(void)
{/* TODO: add your own code here *//* Initialize IIC OLED */err = R_IIC_MASTER_Open(&g_i2c_master0_ctrl, &g_i2c_master0_cfg);assert(FSP_SUCCESS == err);OLED_Init();OLED_Clear();OLED_ShowString(0,0,"A D C ",16,1);OLED_ShowCHinese(48,0,0,1);//電OLED_ShowCHinese(64,0,1,1);//壓OLED_ShowCHinese(80,0,2,1);//表OLED_ShowString(4,3,"ADC",16,0);OLED_ShowCHinese(32,3,3,0);//值OLED_ShowChar(48,3,':',16,0);OLED_ShowCHinese(0,6,0,0);//電OLED_ShowCHinese(16,6,1,0);//壓OLED_ShowCHinese(32,6,3,0);//值OLED_ShowChar(48,6,':',16,0);OLED_ShowChar(100,6,'V',16,0);
#if BSP_TZ_SECURE_BUILD/* Enter non-secure code */R_BSP_NonSecureEnter();
#endif
}
保存代碼,重新構建工程。
硬件連接
SWDIO
-> J-Link (DIO)SWCLK
-> J-Link (CLK)P400
-> OLED (SCL)P401
-> OLED (SDA)
工程調試
- 點擊上方工具欄
小錘子
按鈕(或右鍵工程選擇調試方式
-調試配置
); - 選擇
Renesas GDB Hardware Debugging
,選擇構建的相應的 Flat ; - 確保調試器已正確連接,點擊調試按鈕,進入調試模式;
- 點擊左上角綠色三角形啟動按鈕,再次點擊啟動調試;
- 打開串口調試助手,配置串口信息,打開串口,可獲得相應的字符串輸出。
效果
首行顯示 A D C 電壓表
,后面兩行分別顯示 ADC 值和電壓值及單位。
ADC 顯示
在前面工作的基礎上,介紹了結合 ADC 模擬輸入信號的電壓轉換和串口打印與 OLED 顯示,實現了實時讀取 ADC 值和電壓值的電壓表項目。
工程創建
在前面驅動 OLED 顯示框架的基礎上,加入 UART 和 ADC 堆棧配置,并將數值同時輸出至 OLED 顯示和串口,即可實現電壓值的實時顯示。
這里簡述相應的流程。
串口配置
-
設置目標串口對應的 GPIO 引腳
- 依次選擇
Pins
-Peripherals
-Connectivity:SCI
-SCI9
對應 P109 (TXD9) 和 P110 (RXD9) 引腳;
- 依次選擇
-
新建串口通信堆棧
New Stack
-Connectivity
-UART (r_sci_uart)
-
選中 uart 堆棧方框,打開屬性標簽,配置串口參數
-
屬性設置:
屬性
-Module g_uart9 UART (r_sci_uart)
-General
、Baud
、Interrupts
設置回調函數
ADC 配置
-
設置 ADC 通道對應的 GPIO 配置
- 依次選擇
Pins
-Peripherals
-Analog:ADC
-ADC0
- 右側通道選項AN000
打開對應值P000
引腳;
- 依次選擇
-
新建 ADC 堆棧
New Stack
-Analog
-ADC (r_adc)
-
屬性配置
-
General 選項下設置 ADC 單次掃描
-
Input
選項下勾選Channel0
,配置中斷與回調函數;
-
-
ADC 及串口配置完成后,構建工程,確保無誤。
工程代碼
hal_entry.c
關鍵代碼如下
#include "hal_data.h"
#include "oled.h"FSP_CPP_HEADER
void R_BSP_WarmStart(bsp_warm_start_event_t event);
FSP_CPP_FOOTERfsp_err_t err = FSP_SUCCESS;
volatile bool uart_send_complete_flag = false;
void user_uart_callback (uart_callback_args_t * p_args)
{if(p_args->event == UART_EVENT_TX_COMPLETE){uart_send_complete_flag = true;}
}/*------------- 串口重定向 -------------*/
#ifdef __GNUC__#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else#endifPUTCHAR_PROTOTYPE
{err = R_SCI_UART_Write(&g_uart9_ctrl, (uint8_t *)&ch, 1);if(FSP_SUCCESS != err) __BKPT();while(uart_send_complete_flag == false){}uart_send_complete_flag = false;return ch;
}int _write(int fd,char *pBuffer,int size)
{for(int i=0;i<size;i++){__io_putchar(*pBuffer++);}return size;
}volatile bool scan_complete_flag = false;
void adc_callback (adc_callback_args_t * p_args)
{FSP_PARAMETER_NOT_USED(p_args);scan_complete_flag = true;
}/*------------- IIC 初始化 -------------*/
i2c_master_event_t i2c_event = I2C_MASTER_EVENT_ABORTED;
void IIC_master_callback(i2c_master_callback_args_t *p_args)
{i2c_event = I2C_MASTER_EVENT_ABORTED;if (NULL != p_args){/* capture callback event for validating the i2c transfer event*/i2c_event = p_args->event;}
}int timeout_ms = 100;/*------------- main -------------*/
void hal_entry(void)
{/* TODO: add your own code here *//* Open the transfer instance with initial configuration. */err = R_SCI_UART_Open(&g_uart9_ctrl, &g_uart9_cfg);assert(FSP_SUCCESS == err);/* Initializes the module. */err = R_ADC_Open(&g_adc0_ctrl, &g_adc0_cfg);/* Handle any errors. This function should be defined by the user. */assert(FSP_SUCCESS == err);/* Enable channels. */err = R_ADC_ScanCfg(&g_adc0_ctrl, &g_adc0_channel_cfg);assert(FSP_SUCCESS == err);/* Initialize OLED screen */err = R_IIC_MASTER_Open(&g_i2c_master0_ctrl, &g_i2c_master0_cfg);assert(FSP_SUCCESS == err);OLED_Init();OLED_Clear();OLED_ShowString(0,0,"A D C ",16,1);OLED_ShowCHinese(48,0,0,1);//電OLED_ShowCHinese(64,0,1,1);//壓OLED_ShowCHinese(80,0,2,1);//表OLED_ShowString(4,3,"ADC",16,0);OLED_ShowCHinese(32,3,3,0);//值OLED_ShowChar(48,3,':',16,0);OLED_ShowCHinese(0,6,0,0);//電OLED_ShowCHinese(16,6,1,0);//壓OLED_ShowCHinese(32,6,3,0);//值OLED_ShowChar(48,6,':',16,0);OLED_ShowChar(100,6,'V',16,0);while(1){uint16_t adc_data0 = 0;double a0;/* Enable scan triggering from ELC events. */(void) R_ADC_ScanStart(&g_adc0_ctrl);scan_complete_flag = false;while (!scan_complete_flag){/* Wait for callback to set flag. */}err = R_ADC_Read(&g_adc0_ctrl, ADC_CHANNEL_0, &adc_data0);assert(FSP_SUCCESS == err);a0=(double)(adc_data0/4095.0)*3.3;printf("P510(AN0)=%d,voltage=%f\n",adc_data0,a0);OLED_ShowNum(60, 3, adc_data0, 4, 16, 0);OLED_ShowDecimal(60, 6, a0, 1, 2, 16, 0);R_BSP_SoftwareDelay (500, BSP_DELAY_UNITS_MILLISECONDS);}
#if BSP_TZ_SECURE_BUILD/* Enter non-secure code */R_BSP_NonSecureEnter();
#endif
}
保存代碼,重新構建工程。
硬件連接
SWDIO
-> J-Link (DIO)SWCLK
-> J-Link (CLK)P109
-> J-Link (RXD)P110
-> J-Link (TXD)P400
-> OLED (SCL)P401
-> OLED (SDA)
效果展示
OLED 實時顯示 ADC 引腳采集的電壓值,刷新間隔為 500 毫秒。
動態刷新
同時串口打印電壓值
總結
本文介紹了 RA-Eco-RA2L1-48PIN 開發板通過瑞薩 e2 Studio 靈活軟件包(FSP)編程實現 ADC 串口采集電壓和OLED顯示電壓數值的ADC電壓表的項目設計。
項目包括串口電壓值串口打印、硬件 IIC 通信協議配置、 OLED顯示、效果展示等流程,為瑞薩單片機串口通信、IIC 通信、OLED 顯示和 ADC 相關產品的開發設計和快速應用提供了參考。