Renesas R7FA8D1BH (Cortex®-M85) 控制DS18B20和ADC,实现两个页面的跳转功能
目录
概述
本文主要介绍Renesas R7FA8D1BH (Cortex®-M85)设计一个综合的应用案例:使用板卡上的两个按键实现UI页面跳转功能。page-1: 实现显示ADC的count和实际电压值;page-2:显示DS18B20的实时数据。通过按键实现跳转到下一个页面或者返回到当前页面的功能。
1 软硬件
1.1 软硬件环境信息
软硬件信息 | 版本信息 |
---|---|
Renesas MCU | R7FA8D1BH |
Keil | MDK ARM 5.38 |
FSP 版本 | 5.3.0 |
调试工具:N32G45XVL-STB | DAP-LINK |
1.2 开发板信息
笔者选择使用野火耀阳开发板_瑞萨RA8,该板块的主控MCU为R7FA8D1BHECBD,7FA8D1BHECBD的内核为ARM Contex-M85。
1.3 调试器信息
对于R7FA8D1BHECBD芯片,其使用的内核为Cortex®-M85 Core, ST-LINK-V2或者J-LINK-V9不支持下载和调试功能。笔者经过多次尝试,发现N32G45XVL-STB板卡上自带的DAP-LINK可以下载和调试R7FA8D1BHECBD。
下图为N32G45XVL-STB开发板实物图:
2 FSP和KEIL配置
2.1 硬件接口电路
SW3: 连接PA13引脚,其对应FSP上的配置引脚为BSP_IO_PORT_10_PIN_13
SW4: 连接P404引脚,其对应FSP上的配置引脚为BSP_IO_PORT_04_PIN_04
2.2 FSB配置KEY的IO
1) 配置SW3,其对应IO: PA13
2) 配置SW4,其对应IO: P404
3 功能实现
3.1 FSP生成项目
点击Generate Project,FSP生成项目文件,在pin_data.c文件中生成了pin的相关配置参数。
3.2 KEY功能实现
1)创建key.h文件,编写如下代码:
#ifndef _KEY_H
#define _KEY_H
#include "hal_data.h"
#define KEY1_SW2_PIN BSP_IO_PORT_10_PIN_13
#define KEY2_SW3_PIN BSP_IO_PORT_04_PIN_04
#define KEY_ON 1
#define KEY_OFF 0
#endif /* _KEY_H */
2)创建key.c文件,编写如下代码:
/*
FILE NAME : key.c
Description: board's key interface
Author : tangmingfei2013@126.com
Date : 2024/06/03
*/
#include "key.h"
#include "hal_data.h"
#define KEY_DELAY_MS(ms) R_BSP_SoftwareDelay(ms, BSP_DELAY_UNITS_MILLISECONDS);
uint32_t Key_Scan(bsp_io_port_pin_t key)
{
bsp_io_level_t state;
R_IOPORT_PinRead(&g_ioport_ctrl, key, &state);
if (BSP_IO_LEVEL_HIGH == state)
{
return KEY_OFF;
}
else
{
do
{
R_IOPORT_PinRead(&g_ioport_ctrl, key, &state);
KEY_DELAY_MS(10);
} while (BSP_IO_LEVEL_LOW == state);
}
return KEY_ON;
}
/* End of this file */
4 KEY控制UI跳转
4.1 功能描述
1) UI功能定义
系统实现两个UI页面:
UI-Page-1:
第一行:显示通道0的count值,同时显示实际电压值
第二行: 显示采集MCU内部的温度值
UI-Page-2:
第一行:显示字符串DS18B20
第二行: 显示DS18B20的温度值
2) KEY控制页面流程
SW2: 跳转到页面UI-Page-1
SW3: 跳转到页面UI-Page-2
4.2 state功能实现
代码第12行: 定义跳转指针函数
代码第13行:定义跳转函数变量
代码37行:读取SW2的值,如果该键被按下,跳转到NEXT
代码40行:读取SW3的值,如果该键被按下,跳转到BACK
4.3 源代码
/*
FILE NAME : app_ui.c
Description: app UI
Author : tangmingfei2013@126.com
Date : 2024/06/03
*/
#include "bsp_i2c.h"
#include "hal_data.h"
#include "oled_drv.h"
#include "bsp_led.h"
#include "bsp_timer.h"
#include "bsp_uart.h"
#include "bsp_adc.h"
#include "ds18b20.h"
#include "app_ui.h"
#include "key.h"
#include "app_state.h"
typedef enum{
INIT_DQ = 0,
NEXT,
BACK,
}APP_STATE;
static void dispADC_state( void *ptr );
static void dispDS18B20_state( void *ptr );
STATE_FUNC pSt_State = dispADC_state;
uint8_t key_getState( void )
{
uint8_t run_state = INIT_DQ;
if( Key_Scan(KEY1_SW2_PIN) == KEY_ON){
run_state = NEXT;
}
else if( Key_Scan(KEY2_SW3_PIN) == KEY_ON){
run_state = BACK;
}
return run_state;
}
void state_machine(void)
{
pSt_State((void *)pSt_State);
}
static void dispADC_state( void *ptr )
{
uint8_t run_state;
(void)ptr;
oled_Clear();
oled_SetCharSize( FONT_16 );
oled_PrintfString(13,0,(uint8_t*)"Renesas MCU ");
while(1)
{
run_state = key_getState();
if( run_state == NEXT ){
pSt_State = dispDS18B20_state;
return;
}
ui_active();
}
}
static void dispDS18B20_state( void *ptr )
{
uint8_t run_state;
(void)ptr;
oled_Clear();
oled_SetCharSize( FONT_16 );
oled_PrintfString(13,0,(uint8_t*)"Renesas MCU ");
while(1)
{
run_state = key_getState();
if( run_state == BACK ){
pSt_State = dispADC_state;
return;
}
ui_dispDS18b20();
}
}
5 测试
编译代码,下载到板卡中运行,其结果如下:
1)page-1: 显示ADC的值
2)page-2: 显示DS18B20值