本文介紹了 RA4M2-SENSOR 通過 IIC 協(xié)議實現(xiàn) OLED 顯示,并結(jié)合串口通信讀取 GPS 模塊數(shù)據(jù),實現(xiàn)便攜式 GPS 定位器的項目設(shè)計。
https://bbs.elecfans.com/jishu_2500317_1_1.html
RA4M2-SENSOR 是一款基于 RA4M2 系列微控制器的評估套件,支持 TrustZone 技術(shù)和片內(nèi)安全加密引擎(SCE),提供硬件級安全保護,確保敏感數(shù)據(jù)安全。RA4M2 MCU 采用 40nm 工藝,具有出色的低功耗性能(CoreMark功耗低至 81μA/MHz)。
目錄
一、硬件連接:GPS 模塊和 OLED 分別與開發(fā)板的 UART0 和 SCI2-IIC 對應(yīng)引腳連接;
二、工程創(chuàng)建:使用 e^2^ studio 軟件實現(xiàn)空白工程創(chuàng)建;
三、工程配置:包括 GPIO 引腳、時鐘樹、UART堆棧、IIC 堆棧等配置;
四、工程代碼:包括流程圖、主程序代碼、 GPS 解析代碼和 OLED 驅(qū)動代碼;
五、效果演示:OLED 顯示實時衛(wèi)星定位經(jīng)緯度信息、串口打印讀取到的 GPS 原始數(shù)據(jù)和解析數(shù)據(jù)。
一、硬件連接
1.OLED 與開發(fā)板連接方式如下
| OLED | RA4M2 | Note |
|---|---|---|
| SDA | SDA2 (P302) | Serial data |
| SCL | SCL2 (P301) | Serial clock |
| VCC | 3V3 | Power |
| GND | GND | Ground |
2. GPS 模塊與開發(fā)板連接方式如下
| GPS module | RA4M2 | Note |
|---|---|---|
| RXD | TXD0 (P101) | Receive data |
| TXD | RXD0 (P100) | Transmit data |
| VCC | 3V3 | Power |
| GND | GND | Ground |
3.實物連接圖如下

二、工程創(chuàng)建
打開e2 studio軟件;
依次點擊文件-新建-瑞薩 C/C++ 項目-Renesas RA;
依次進行工程命名,路徑設(shè)置,F(xiàn)SP版本,目標(biāo)開發(fā)板選擇,Device 選擇R7FA4M2AD3CFL,工具鏈選擇GNU ARM Embedded,調(diào)試器選擇J-Link,完成工程創(chuàng)建 ;
三、工程配置
GPIO 引腳
進入 FSP 配置界面,打開 Pins 標(biāo)簽頁,根據(jù)原理圖或開發(fā)板絲印,將 P109 和 P110 引腳分別配置為 TXD9 和 RXD9 串口模式;
同理,將 P101 和 P100 引腳分別配置為 TXD0 和 RXD0 串口模式;
將 SCI2 配置為 Simple I2C 模式,引腳定義為 P302 和 P301 分別對應(yīng) SDA2 和 SCL2 ;

時鐘樹
進入Clock時鐘標(biāo)簽頁,將XTAL外部高速晶振修改為12MHz,FCLK Div設(shè)置為 2 分頻;

UART 堆棧
新建串口通信堆棧New Stack-Connectivity-UART (r_sci_uart);
串口屬性配置,General 標(biāo)簽下的 Channel 改為 9,名稱改為g_uart9,中斷回調(diào)函數(shù)命名為user_uart9_callback;
再次新建串口通信堆棧New Stack-Connectivity-UART (r_sci_uart);
串口屬性配置,General 標(biāo)簽下的 Channel 改為 0,名稱改為g_uart0,中斷回調(diào)函數(shù)命名為user_uart0_callback,注意波特率需要修改為 9600 并與 GPS 模塊匹配;
IIC 堆棧
新建 IIC 通信堆棧
Stacks-New Stack-Connectivity-I2C Master (r_sci_i2c)
選中 iic 堆棧方框,打開屬性標(biāo)簽,配置 IIC 參數(shù);
屬性設(shè)置:屬性-Module g_i2c_master0 I2C Master (r_iic_master);
Slave Address設(shè)置為0x3C;
回調(diào)函數(shù)默認(rèn)為sci_i2c_master_callback;
點擊Generate Project Content按鈕,生成工程代碼。

流程圖

四、工程代碼
在.../src目錄下新建源文件gps_parser.c和頭文件gps_parser.h用于配置 GPS 相關(guān)解析函數(shù)。
1. hal_entry.c
#include"hal_data.h"#include"oled.h"#include"bmp.h"#include"gps_parser.h"#include#includeFSP_CPP_HEADERvoidR_BSP_WarmStart(bsp_warm_start_event_tevent);FSP_CPP_FOOTERfsp_err_terr = FSP_SUCCESS;volatilebooluart_send_complete_flag =false;voiduser_uart9_callback(uart_callback_args_t* p_args){ if(p_args->event == UART_EVENT_TX_COMPLETE) { uart_send_complete_flag =true; }}/*------------- 串口重定向 -------------*/#ifdef__GNUC__ #definePUTCHAR_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; returnch;}int_write(intfd,char*pBuffer,intsize){ for(inti=0;i { __io_putchar(*pBuffer++); } returnsize;}// 全局變量volatileuint8_tgps_rx_buffer[256];volatileuint16_tgps_rx_index =0;volatileboolgps_line_ready =false;gps_data_tcurrent_gps_data;// SCI0回調(diào)函數(shù)(GPS數(shù)據(jù)接收)voiduser_uart0_callback(uart_callback_args_t* p_args){ if(p_args->event == UART_EVENT_RX_CHAR) { uint8_trx_char = (uint8_t)p_args->data; // 存儲接收到的字符 if(gps_rx_index < (sizeof(gps_rx_buffer) -?1))? ? ? ? {? ? ? ? ? ? gps_rx_buffer[gps_rx_index++] = rx_char;? ? ? ? ? ? // 檢查是否收到換行符(一行結(jié)束)? ? ? ? ? ? if?(rx_char ==?'\n')? ? ? ? ? ? {? ? ? ? ? ? ? ? gps_rx_buffer[gps_rx_index] =?'\0';? ? ? ? ? ? ? ? gps_line_ready =?true;? ? ? ? ? ? ? ? gps_rx_index =?0;? ? ? ? ? ? }? ? ? ? }? ? ? ? else? ? ? ? {? ? ? ? ? ? // 緩沖區(qū)溢出,重置? ? ? ? ? ? gps_rx_index =?0;? ? ? ? }? ? }}// 初始化函數(shù)void?init_system(void){? ? fsp_err_t?err;? ? printf("=== RA4M2 GPS Receiver ===\r\n");? ? printf("Initializing system...\r\n");? ? // 初始化GPS解析器? ? gps_parser_init();? ? // 打開SCI9(printf輸出)? ? err =?R_SCI_UART_Open(&g_uart9_ctrl, &g_uart9_cfg);? ? if?(FSP_SUCCESS != err)? ? {? ? ? ? while(1);?// 初始化失敗? ? }? ? printf("SCI9 (printf) initialized at 115200 baud\r\n");? ? // 打開SCI0(GPS數(shù)據(jù)接收)? ? err =?R_SCI_UART_Open(&g_uart0_ctrl, &g_uart0_cfg);? ? if?(FSP_SUCCESS != err)? ? {? ? ? ? printf("Error: Failed to initialize SCI0 for GPS\r\n");? ? ? ? while(1);? ? }? ? printf("SCI0 (GPS) initialized at 9600 baud\r\n");? ? printf("Waiting for GPS data...\r\n\r\n");}// 處理GPS數(shù)據(jù)void?process_gps_data(void){? ? if?(gps_line_ready)? ? {? ? ? ? // 禁用中斷以防數(shù)據(jù)被修改? ? ? ? __disable_irq();? ? ? ? // 復(fù)制數(shù)據(jù)到本地緩沖區(qū)? ? ? ? char?nmea_line[256];? ? ? ? strncpy(nmea_line, (char?*)gps_rx_buffer,?sizeof(nmea_line));? ? ? ? nmea_line[sizeof(nmea_line) -?1] =?'\0';? ? ? ? gps_line_ready =?false;? ? ? ? // 使能中斷? ? ? ? __enable_irq();? ? ? ? // 打印原始NMEA數(shù)據(jù)? ? ? ? printf("RAW: %s", nmea_line);? ? ? ? // 解析GPGGA語句? ? ? ? if?(strstr(nmea_line,?"$GPGGA"))? ? ? ? {? ? ? ? ? ? if?(parse_gpgga(nmea_line, ¤t_gps_data))? ? ? ? ? ? {? ? ? ? ? ? ? ? print_gps_data(¤t_gps_data);? ? ? ? ? ? }? ? ? ? ? ? else? ? ? ? ? ? {? ? ? ? ? ? ? ? printf("Failed to parse GPGGA data\r\n");? ? ? ? ? ? }? ? ? ? }? ? ? ? // 可以添加其他NMEA語句的解析? ? ? ? else?if?(strstr(nmea_line,?"$GPRMC"))? ? ? ? {? ? ? ? ? ? gps_time_t?rmc_time;? ? ? ? ? ? if?(parse_gprmc(nmea_line, ¤t_gps_data, &rmc_time))? ? ? ? ? ? {? ? ? ? ? ? ? ? // 如果GPGGA沒有提供時間,使用GPRMC的時間? ? ? ? ? ? ? ? if?(current_gps_data.time.hour ==?0?&&? ? ? ? ? ? ? ? ? ? current_gps_data.time.minute ==?0?&&? ? ? ? ? ? ? ? ? ? current_gps_data.time.second ==?0)? ? ? ? ? ? ? ? {? ? ? ? ? ? ? ? ? ? current_gps_data.time = rmc_time;? ? ? ? ? ? ? ? }? ? ? ? ? ? }? ? ? ? ? ? //printf("GPRMC sentence received\r\n");? ? ? ? }? ? ? ? printf("\r\n");? ? }}// 打印解析后的GPS數(shù)據(jù)void?print_parsed_gps_data(void){? ? static?uint32_t?last_print_time =?0;? ? static?uint32_t?current_time =?0;? ? current_time++;? ? // 每2秒打印一次解析結(jié)果? ? if?(current_time - last_print_time >=200) { last_print_time = current_time; printf("\r\n=== PARSED GPS DATA ===\r\n"); if(current_gps_data.is_valid) { // 打印時間信息 print_gps_time(¤t_gps_data.time); printf("\r\n"); // 打印位置信息 printf("Latitude: %.6f°\r\n", current_gps_data.latitude);// 緯度 OLED_ShowDecimal(48,6, current_gps_data.latitude,2,4,16,0); printf("Longitude: %.6f°\r\n", current_gps_data.longitude);//經(jīng)度 OLED_ShowDecimal(48,3, current_gps_data.longitude,3,4,16,0); printf("Altitude: %.1f m\r\n", current_gps_data.altitude); printf("Satellites: %d\r\n", current_gps_data.satellites); printf("Fix Quality: %d\r\n", current_gps_data.fix_quality); // 根據(jù)定位質(zhì)量顯示狀態(tài) switch(current_gps_data.fix_quality) { case0:printf("Status: Invalid fix\r\n");break; case1:printf("Status: GPS fix\r\n");break; case2:printf("Status: DGPS fix\r\n");break; default:printf("Status: Other fix (%d)\r\n", current_gps_data.fix_quality);break; } } else { // 即使沒有有效定位,也顯示時間和衛(wèi)星信息 if(current_gps_data.time.hour !=0|| current_gps_data.time.minute !=0|| current_gps_data.time.second !=0) { print_gps_time(¤t_gps_data.time); printf("\r\n"); } printf("No valid GPS fix\r\n"); OLED_ShowString(60,6,"None",16,0); OLED_ShowString(60,3,"None",16,0); printf("Satellites in view: %d\r\n", current_gps_data.satellites); printf("Waiting for satellite lock...\r\n"); } printf("==========================\r\n"); }}i2c_master_event_ti2c_event = I2C_MASTER_EVENT_ABORTED;voidsci_i2c_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;voidhal_entry(void){ /*TODO:add your own code here */ err =R_SCI_UART_Open(&g_uart9_ctrl, &g_uart9_cfg); assert(FSP_SUCCESS == err); printf("RA4M2 GPS Reader Started\r\n"); // 系統(tǒng)初始化 init_system(); uint32_tstatus_counter =0; /* Initialize IIC OLED */ err =R_SCI_I2C_Open(&g_i2c2_ctrl, &g_i2c2_cfg); assert(FSP_SUCCESS == err); OLED_Init(); OLED_Clear(); OLED_DrawBMP(0,0,128,8,BMP1,0);// initialized page -> Renesas logo R_BSP_SoftwareDelay(200, BSP_DELAY_UNITS_MILLISECONDS); /*----------- Frame ------------*/ OLED_Clear(); OLED_ShowString(0,0," GPS ",16,1); OLED_ShowCHinese(56,0,0,1);//定 OLED_ShowCHinese(72,0,1,1);//位 OLED_ShowCHinese(88,0,2,1);//器 OLED_ShowString(104,0," ",16,1); //OLED_ShowString(4,3,"ADC",16,0); OLED_ShowCHinese(0,3,3,0);//經(jīng) OLED_ShowCHinese(16,3,5,0);//度 OLED_ShowChar(32,3,':',16,0); OLED_ShowCHinese(112,3,6,0);// ° OLED_ShowCHinese(0,6,4,0);//緯 OLED_ShowCHinese(16,6,5,0);//度 OLED_ShowChar(32,6,':',16,0); OLED_ShowCHinese(112,6,6,0);// °
while(1){ process_gps_data();// 原始GPS數(shù)據(jù) print_parsed_gps_data();// 解析GPS數(shù)據(jù) // 每隔一段時間打印狀態(tài) status_counter++; if(status_counter >=1000)// 約每10秒 { printf("[Status] System running...\r\n"); if(current_gps_data.is_valid) { printf("[Status] GPS fix acquired\r\n"); } else { printf("[Status] Waiting for GPS fix\r\n"); } status_counter =0; }
R_BSP_SoftwareDelay(10, BSP_DELAY_UNITS_MILLISECONDS);// 延時 }#ifBSP_TZ_SECURE_BUILD /* Enter non-secure code */ R_BSP_NonSecureEnter();#endif}
GPS 模塊解析代碼gps_parser.c和gps_parser.h詳見:【RA4M2-SENSOR】串口讀取 GPS.
OLED 驅(qū)動代碼oled.c、oled.h、bmp.h和oledfont.h詳見:【RA2E1開發(fā)板】 - IIC 通信的 OLED 顯示.
2. 漢字取模
下載 并運行PC2LCD2018軟件 ;
菜單欄模式設(shè)置為字符模式;
點擊工具欄中的設(shè)置按鈕,配置字模選項:列行式取模、低位在前等,設(shè)置完成后點擊確定保存配置;

在文字輸入選框輸入目標(biāo)漢字,點擊生成字模;
選中復(fù)制或保存字模,代碼添加至oledfont.h文件。
五、效果演示
串口調(diào)試助手接收 GPS 原始數(shù)據(jù)和解析數(shù)據(jù);

使用移動電源供電,實現(xiàn)便攜式 GPS 定位器設(shè)計;
OLED 顯示實時衛(wèi)星定位經(jīng)緯度信息

將上述采集得到的經(jīng)緯坐標(biāo) (121,31) 輸入網(wǎng)址 經(jīng)緯度定位 ,點擊 查詢 按鈕,可獲得對應(yīng)的地理位置
定位結(jié)果與實際位置 (121.45,31.03) 較為接近。

六、總結(jié)
本文介紹了 RA4M2-SENSOR 通過 IIC 協(xié)議實現(xiàn) OLED 顯示,并結(jié)合串口通信讀取 GPS 模塊數(shù)據(jù),實現(xiàn)便攜式衛(wèi)星定位器的項目設(shè)計,為該產(chǎn)品的相關(guān)開發(fā)設(shè)計與快速應(yīng)用提供了參考。
-
gps
+關(guān)注
關(guān)注
22文章
3010瀏覽量
172406 -
定位器
+關(guān)注
關(guān)注
2文章
190瀏覽量
19996 -
開發(fā)板
+關(guān)注
關(guān)注
25文章
6111瀏覽量
112859
發(fā)布評論請先 登錄
【RA4M2-SENSOR】—— 2.串口通訊測試
【RA4M2-SENSOR】1、開箱+新建模板工程
【RA4M2-SENSOR】介紹、環(huán)境搭建、工程測試
【RA4M2-SENSOR】串口讀取 GPS
【RA4M2-SENSOR】便攜 GPS 定位器
【RA4M2-SENSOR】 Keil開發(fā)環(huán)境建立和跑馬燈運行
【RA4M2-SENSOR】數(shù)字識讀及實現(xiàn)
【精品聚合】RA-Eco-RA4M2-100PIN開發(fā)板試用報告作品匯總
【瑞薩RA4系列開發(fā)板體驗】+ 3種瑞薩開發(fā)板的比較
【瑞薩RA4系列開發(fā)板體驗】初步認(rèn)識開發(fā)板
【瑞薩RA4系列開發(fā)板體驗】10. 我的試用總結(jié)
【野火啟明6M5開發(fā)板體驗】野火啟明開發(fā)板和瑞薩RA MCU介紹
【干貨分享】從零學(xué)習(xí)使用瑞薩RA6M4開發(fā)板
【有獎評測 】RA4M2-SENSOR 開發(fā)板免費評測

【干貨分享】基于瑞薩RA4M2-SENSOR開發(fā)板,實現(xiàn)便攜式 GPS 定位器
評論