Renesas R7FA8D1BH (Cortex®-M85) 输入接口的应用

Renesas R7FA8D1BH (Cortex®-M85) 控制DS18B20和ADC,实现两个页面的跳转功能

目录

概述

[1 软硬件](#1 软硬件)

[1.1 软硬件环境信息](#1.1 软硬件环境信息)

[1.2 开发板信息](#1.2 开发板信息)

[1.3 调试器信息](#1.3 调试器信息)

[2 FSP和KEIL配置](#2 FSP和KEIL配置)

[2.1 硬件接口电路](#2.1 硬件接口电路)

[2.2 FSB配置KEY的IO](#2.2 FSB配置KEY的IO)

[3 功能实现](#3 功能实现)

[3.1 FSP生成项目](#3.1 FSP生成项目)

[3.2 KEY功能实现](#3.2 KEY功能实现)

[4 KEY控制UI跳转](#4 KEY控制UI跳转)

[4.1 功能描述](#4.1 功能描述)

[4.2 state功能实现](#4.2 state功能实现)

[4.3 源代码](#4.3 源代码)

[5 测试](#5 测试)


概述

本文主要介绍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
  1. 配置SW4,其对应IO: P404

3 功能实现

3.1 FSP生成项目

点击Generate Project,FSP生成项目文件,在pin_data.c文件中生成了pin的相关配置参数。

3.2 KEY功能实现

1)创建key.h文件,编写如下代码:

cpp 复制代码
#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文件,编写如下代码:

cpp 复制代码
 /*
 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 源代码

cpp 复制代码
 /*
 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值

相关推荐
redcocal6 小时前
地平线秋招
python·嵌入式硬件·算法·fpga开发·求职招聘
辰哥单片机设计10 小时前
门磁模块详解(防盗感应开关 STM32)
stm32·单片机·嵌入式硬件·传感器
夜间去看海10 小时前
基于51单片机的自动清洗系统(自动洗衣机)
嵌入式硬件·51单片机·proteus·洗衣机
yrx02030710 小时前
stm32 IIC总线busy解决方法
stm32·单片机·嵌入式硬件
YHPsophie12 小时前
ATGM331C-5T杭州中科微BDS/GNSS全星座定位授时模块应用领域
经验分享·笔记·单片机·信息与通信·交通物流
Archie_IT13 小时前
【STM32系统】基于STM32设计的SD卡数据读取与上位机显示系统(SDIO接口驱动、雷龙SD卡)——文末资料下载
arm开发·stm32·单片机·嵌入式硬件
辰哥单片机设计13 小时前
1×4矩阵键盘详解(STM32)
stm32·单片机·嵌入式硬件·矩阵·传感器
wmkswd13 小时前
CAN总线-STM32上CAN外设
stm32·单片机·嵌入式硬件
Ruohongxu13 小时前
LAN8720A-CP-TR-ABC QFN-24 以太网收发器芯片
单片机