芯查查logo
  • 物料选型
  • 数据服务
    1. 新品推荐
    2. 查替代料
    3. 丝印反查
    4. 查品牌
    5. PCN/PDN
    6. 查代理
    7. 数据合作
  • 应用方案
  • SaaS产品
      SaaS产品
    1. 供应链波动监测预警
    2. 半导体产业链地图
    3. 智能BOM管家
    4. 解决方案
    5. 汽车电子
    6. 政府机构
    7. 数据API
  • 商城
  • 行业资讯
    1. 资讯
    2. 直播
  • 论坛社区
    1. 论坛
    2. 学习
    3. 测评中心
    4. 活动中心
    5. 积分商城
  • 查一下
正在使用账号登录iCEasy商城
无垠的广袤
【RA4L1-SENSOR】ADC温度的LCD 显示

【RA4L1-SENSOR】ADC温度的LCD 显示

本文介绍了瑞萨 RA4L1-SENSOR 开发板通过瑞萨 e^2^ Studio 软件和灵活软件包(FSP)快速创建工程,ADC 读取芯片内部温度传感器,实现 LCD 段码屏实时显示芯片温度的项目设计。

项目介绍

介绍了瑞萨 RA4L1 开发套件通过 e^2^ studio 软件实现 ADC 温度 LCD 显示 的项目设计。

项目方案

  1. 创建 LCD 显示工程;
  2. 构建 LCD 显示函数库文件,实现自定义数字显示;
  3. 添加 UART 和 ADC 堆栈,将 A0 模拟通道采集的电压值通过串口打印,并输送至 LCD 显示;
  4. 连接水位传感器,通过 A0 读取模拟信号电压值,转换为水位高度,并输送至 LCD 显示。

原理

LCD 引脚配置

这里使用的 LCD 缩略图

LCD_Segment.jpg

  • SEG(Segment):控制 LCD 具体显示的段,如数码管的 A-G 段。
  • COM(Common):LCD 的 公共信号,决定哪个段被驱动,多 COM 允许减少 I/O 引脚数量。

数字显示的实现

LCD_Screen_num.jpg

举例

令第 6 个数码管(从左往右)显示数字 1 ,对应位号为 6B 和 6C,

第 6 个数码管对应的 段选 为 SEG40 和 SEG41;

根据 LCD 缩略图可知, 6B 和 6C 对应 SEG41,需要 位选 COM1 和 COM2 为 1,COM0 和 COM3 为 0,即二进制从后往前排列 0110,对应的 16 进制为 0x6 ;

且 SEG40 对应的 COM0 - COM3 全为 0,即二进制 0000 ,对应的 16 进制为 0x0 ;

因此,第 6 个数码管显示数字 1 的代码为

R_SLCDC_Modify(&g_slcdc0_ctrl, 40, 0x0, 0xF);
R_SLCDC_Modify(&g_slcdc0_ctrl, 41, 0x6, 0xF);

同理可实现其他各位数码管的 0 至 9 的数字显示。

注意到每位数码管显示相同数字时的位选相同,只有段选差异。

这为定义 LCD 数显函数库提供了方便。

LCD 管脚连接

原理图(引脚对应关系)

SCH_LCD_pinout.jpg

详见:RA4L1_LCD: RA4L1_LCD .

硬件连接

  • 使用 Type-C 数据线连接开发板串口接线端和电脑,用以串口通信;
  • 使用 J-LINK 调试器连接板载 SWD 调试端口;

实物图

adc-temp-connect.jpg

流程图

flowchart_adc_temp_lcd.png

工程创建

打开 e2 studio 软件,依次点击 文件 - 新建 - 瑞萨 C/C++ 项目 - Renesas RA ;

依次进行工程命名,路径设置,FSP版本,目标开发板选择,Device 选择 R7FA4L1BD4CFP ,工具链选择 GNU ARM Embedded ,完成工程创建。

时钟配置

根据 MCU 外部硬件配置,设置晶振及时钟树

LCD_clock_config.jpg

LCD 堆栈

新建数码管 LCD 堆栈 New Stack - Graphics - Segment LCD (r_slcdc) ;

属性设置

点击选中 Segment LCD 堆栈,修改属性配置

LCD_segment_setting.jpg

设置名称、LOCO 时钟源、(LOCO/SOSC)256 分频器、1/3偏压驱动、COM公共端、波形A、内部电压升压、VL1或VCC参考电压、0对比度。

引脚配置

LCD 引脚配置如下

pins_define_1.jpg

pins_define_2.jpg

VL(Voltage Level)引脚用于提供 LCD 偏置电压,控制 LCD 的对比度和驱动电压。

在内部电压提升模式(Internal Voltage Boosting) 下,RA MCU 会自动产生 VL1、VL2、VL3、VL4 并提供给 LCD 作为驱动电压。

pins_define_3.jpg

配置完成后,点击 Generate Project Content ,构建工程,确保没有报错。

代码

使用 e^2^ studio 软件和 FSP 快速创建目标工程,配置 UART、 ADC 和 LCD 堆栈,生成工程的基本架构;

添加 LCD 数字显示库文件和主函数代码;

LCD 驱动程序

包括 LCD_ShowNum.h 头文件和 LCD_ShowNum.c 源文件。

头文件

在项目工程目录 src 文件夹下新建 LCD 驱动头文件 LCD_ShowNum.h ,并添加如下代码

#ifndef LCD_SHOWNUM_H_
#define LCD_SHOWNUM_H_

extern const uint16_t Num;

void LCD_ShowNum(uint16_t Num);

    void calculateTens(uint16_t Num);
    void calculateOnes(uint16_t Num);
    void calculateOnesDot(uint16_t Num);
    void calculateTenths(uint16_t Num);
    void calculatePercentiles(uint16_t Num);

void LCD_Clear();
void LCD_Light();

#endif

保存代码。

源文件

在 src 文件夹下新建 LCD 数显函数文件 LCD_ShowNum.c 并添加如下代码

#include "hal_data.h"
#include "LCD_ShowNum.h"

/**
 @brief LCD 清屏
 @param None
 @return None
*/
void LCD_Clear()
{
    // Clear SEG0-41 段
    uint8_t segment_data_num_off[41+1] ;
    for(int i=0;i<=41;i++)
        segment_data_num_off[i] = 0;
    R_SLCDC_Write(&g_slcdc0_ctrl, 0, segment_data_num_off, sizeof(segment_data_num_off));
}

/**
 @brief LCD 全亮
 @param None
 @return None
*/
void LCD_Light()
{
    uint8_t segment_data_num_on[41+1] ;
    for(int i=0;i<=41;i++)
         segment_data_num_on[i] = 0xf;
    R_SLCDC_Write(&g_slcdc0_ctrl, 0, segment_data_num_on, sizeof(segment_data_num_on));
}

/**
 @brief LCD屏显示频率
 @param frequency -[in] 频率
 @return 无
*/
void LCD_ShowNum(uint16_t Num)
{
    calculateTens(Num);                                           // 十位
    //calculateOnes(Num);                                         // 个位
    calculateOnesDot(Num);                                        // 个位(带小数点)
    calculateTenths(Num);                                         // 小数十分位
    calculatePercentiles(Num);                                    // 小数百分位
}

/**
 @brief 计算十位,如33.31,则十位3
 @param None
 @return 无
*/
void calculateTens(uint16_t Num)
{
    if(Num / 1000 % 10 == 0)
    {
        R_SLCDC_Modify(&g_slcdc0_ctrl, 22, 0xD, 0xF);
        R_SLCDC_Modify(&g_slcdc0_ctrl, 23, 0x7, 0xF);                  // 0
    }
    else if(Num / 1000 % 10 == 1)
    {
        R_SLCDC_Modify(&g_slcdc0_ctrl, 22, 0x0, 0xF);
        R_SLCDC_Modify(&g_slcdc0_ctrl, 23, 0x6, 0xF);                  // 1
    }
    else if(Num / 1000 % 10 == 2)
    {
        R_SLCDC_Modify(&g_slcdc0_ctrl, 22, 0xE, 0xF);
        R_SLCDC_Modify(&g_slcdc0_ctrl, 23, 0x3, 0xF);                  // 2
    }
    else if(Num / 1000 % 10 == 3)
    {
        R_SLCDC_Modify(&g_slcdc0_ctrl, 22, 0xA, 0xF);
        R_SLCDC_Modify(&g_slcdc0_ctrl, 23, 0x7, 0xF);                  // 3
    }
    else if(Num / 1000 % 10 == 4)
    {
        R_SLCDC_Modify(&g_slcdc0_ctrl, 22, 0x3, 0xF);
        R_SLCDC_Modify(&g_slcdc0_ctrl, 23, 0x6, 0xF);                  // 4
    }
    else if(Num / 1000 % 10 == 5)
    {
        R_SLCDC_Modify(&g_slcdc0_ctrl, 22, 0xB, 0xF);
        R_SLCDC_Modify(&g_slcdc0_ctrl, 23, 0x5, 0xF);                  // 5
    }
    else if(Num / 1000 % 10 == 6)
    {
        R_SLCDC_Modify(&g_slcdc0_ctrl, 22, 0xF, 0xF);
        R_SLCDC_Modify(&g_slcdc0_ctrl, 23, 0x5, 0xF);                  // 6
    }
    else if(Num / 1000 % 10 == 7)
    {
        R_SLCDC_Modify(&g_slcdc0_ctrl, 22, 0x1, 0xF);
        R_SLCDC_Modify(&g_slcdc0_ctrl, 23, 0x7, 0xF);                  // 7
    }
    else if(Num / 1000 % 10 == 8)
    {
        R_SLCDC_Modify(&g_slcdc0_ctrl, 22, 0xF, 0xF);
        R_SLCDC_Modify(&g_slcdc0_ctrl, 23, 0xF, 0xF);                  // 8
    }
    else if(Num / 1000 % 10 == 9)
    {
        R_SLCDC_Modify(&g_slcdc0_ctrl, 22, 0xB, 0xF);
        R_SLCDC_Modify(&g_slcdc0_ctrl, 23, 0xF, 0xF);                  // 9
    }
}

/**
 @brief 计算个位,如3.31,则个位 3
 @param None
 @return 无
*/
void calculateOnes(uint16_t Num)
{
    if(Num / 100 % 10 == 0)
    {
        R_SLCDC_Modify(&g_slcdc0_ctrl, 24, 0xD, 0xF);
        R_SLCDC_Modify(&g_slcdc0_ctrl, 29, 0x7, 0xF);                // 0
    }
    else if(Num / 100 % 10 == 1)
    {
        R_SLCDC_Modify(&g_slcdc0_ctrl, 24, 0x0, 0xF);
        R_SLCDC_Modify(&g_slcdc0_ctrl, 29, 0x6, 0xF);                // 1
    }
    else if(Num / 100 % 10 == 2)
    {
        R_SLCDC_Modify(&g_slcdc0_ctrl, 24, 0xE, 0xF);
        R_SLCDC_Modify(&g_slcdc0_ctrl, 29, 0x3, 0xF);                // 2
    }
    else if(Num / 100 % 10 == 3)
    {
        R_SLCDC_Modify(&g_slcdc0_ctrl, 24, 0xA, 0xF);
        R_SLCDC_Modify(&g_slcdc0_ctrl, 29, 0x7, 0xF);                // 3
    }
    else if(Num / 100 % 10 == 4)
    {
        R_SLCDC_Modify(&g_slcdc0_ctrl, 24, 0x3, 0xF);
        R_SLCDC_Modify(&g_slcdc0_ctrl, 29, 0x6, 0xF);                // 4
    }
    else if(Num / 100 % 10 == 5)
    {
        R_SLCDC_Modify(&g_slcdc0_ctrl, 24, 0xB, 0xF);
        R_SLCDC_Modify(&g_slcdc0_ctrl, 29, 0x5, 0xF);                // 5
    }
    else if(Num / 100 % 10 == 6)
    {
        R_SLCDC_Modify(&g_slcdc0_ctrl, 24, 0xF, 0xF);
        R_SLCDC_Modify(&g_slcdc0_ctrl, 29, 0x5, 0xF);                // 6
    }
    else if(Num / 100 % 10 == 7)
    {
        R_SLCDC_Modify(&g_slcdc0_ctrl, 24, 0x1, 0xF);
        R_SLCDC_Modify(&g_slcdc0_ctrl, 29, 0x7, 0xF);                // 7
    }
    else if(Num / 100 % 10 == 8)
    {
        R_SLCDC_Modify(&g_slcdc0_ctrl, 24, 0xF, 0xF);
        R_SLCDC_Modify(&g_slcdc0_ctrl, 29, 0x7, 0xF);                // 8
    }
    else if(Num / 100 % 10 == 9)
    {
        R_SLCDC_Modify(&g_slcdc0_ctrl, 24, 0xB, 0xF);
        R_SLCDC_Modify(&g_slcdc0_ctrl, 29, 0x7, 0xF);                // 9
    }
}

/**
 @brief 计算个位,如3.31,则个位 3. (带小数点)
 @param None
 @return 无
*/
void calculateOnesDot(uint16_t Num)
{
    if(Num / 100 % 10 == 0)
    {
        R_SLCDC_Modify(&g_slcdc0_ctrl, 24, 0xD, 0xF);
        R_SLCDC_Modify(&g_slcdc0_ctrl, 29, 0xF, 0xF);                // 0.
    }
    else if(Num / 100 % 10 == 1)
    {
        R_SLCDC_Modify(&g_slcdc0_ctrl, 24, 0x0, 0xF);
        R_SLCDC_Modify(&g_slcdc0_ctrl, 29, 0xE, 0xF);                // 1.
    }
    else if(Num / 100 % 10 == 2)
    {
        R_SLCDC_Modify(&g_slcdc0_ctrl, 24, 0xE, 0xF);
        R_SLCDC_Modify(&g_slcdc0_ctrl, 29, 0xB, 0xF);                // 2.
    }
    else if(Num / 100 % 10 == 3)
    {
        R_SLCDC_Modify(&g_slcdc0_ctrl, 24, 0xA, 0xF);
        R_SLCDC_Modify(&g_slcdc0_ctrl, 29, 0xF, 0xF);                // 3.
    }
    else if(Num / 100 % 10 == 4)
    {
        R_SLCDC_Modify(&g_slcdc0_ctrl, 24, 0x3, 0xF);
        R_SLCDC_Modify(&g_slcdc0_ctrl, 29, 0xE, 0xF);                // 4.
    }
    else if(Num / 100 % 10 == 5)
    {
        R_SLCDC_Modify(&g_slcdc0_ctrl, 24, 0xB, 0xF);
        R_SLCDC_Modify(&g_slcdc0_ctrl, 29, 0xD, 0xF);                // 5.
    }
    else if(Num / 100 % 10 == 6)
    {
        R_SLCDC_Modify(&g_slcdc0_ctrl, 24, 0xF, 0xF);
        R_SLCDC_Modify(&g_slcdc0_ctrl, 29, 0xD, 0xF);                // 6.
    }
    else if(Num / 100 % 10 == 7)
    {
        R_SLCDC_Modify(&g_slcdc0_ctrl, 24, 0x1, 0xF);
        R_SLCDC_Modify(&g_slcdc0_ctrl, 29, 0xF, 0xF);                // 7.
    }
    else if(Num / 100 % 10 == 8)
    {
        R_SLCDC_Modify(&g_slcdc0_ctrl, 24, 0xF, 0xF);
        R_SLCDC_Modify(&g_slcdc0_ctrl, 29, 0xF, 0xF);                // 8.
    }
    else if(Num / 100 % 10 == 9)
    {
        R_SLCDC_Modify(&g_slcdc0_ctrl, 24, 0xB, 0xF);
        R_SLCDC_Modify(&g_slcdc0_ctrl, 29, 0xF, 0xF);                // 9.
    }
}

/**
 @brief 计算小数十分位,如3.31,则十分位 3
 @param voltage -[in] 电压
 @return 无
*/
void calculateTenths(uint16_t Num)
{
    if(Num / 10 % 10 == 0)
    {
        R_SLCDC_Modify(&g_slcdc0_ctrl, 30, 0xD, 0xF);
        R_SLCDC_Modify(&g_slcdc0_ctrl, 39, 0x7, 0xF);                  // 0
    }
    else if(Num / 10 % 10 == 1)
    {
        R_SLCDC_Modify(&g_slcdc0_ctrl, 30, 0x0, 0xF);
        R_SLCDC_Modify(&g_slcdc0_ctrl, 39, 0x6, 0xF);                  // 1
    }
    else if(Num / 10 % 10 == 2)
    {
        R_SLCDC_Modify(&g_slcdc0_ctrl, 30, 0xE, 0xF);
        R_SLCDC_Modify(&g_slcdc0_ctrl, 39, 0x3, 0xF);                  // 2
    }
    else if(Num / 10 % 10 == 3)
    {
        R_SLCDC_Modify(&g_slcdc0_ctrl, 30, 0xA, 0xF);
        R_SLCDC_Modify(&g_slcdc0_ctrl, 39, 0x7, 0xF);                  // 3
    }
    else if(Num / 10 % 10 == 4)
    {
        R_SLCDC_Modify(&g_slcdc0_ctrl, 30, 0x3, 0xF);
        R_SLCDC_Modify(&g_slcdc0_ctrl, 39, 0x6, 0xF);                  // 4
    }
    else if(Num / 10 % 10 == 5)
    {
        R_SLCDC_Modify(&g_slcdc0_ctrl, 30, 0xB, 0xF);
        R_SLCDC_Modify(&g_slcdc0_ctrl, 39, 0x5, 0xF);                  // 5
    }
    else if(Num / 10 % 10 == 6)
    {
        R_SLCDC_Modify(&g_slcdc0_ctrl, 30, 0xF, 0xF);
        R_SLCDC_Modify(&g_slcdc0_ctrl, 39, 0x5, 0xF);                  // 6
    }
    else if(Num / 10 % 10 == 7)
    {
        R_SLCDC_Modify(&g_slcdc0_ctrl, 30, 0x1, 0xF);
        R_SLCDC_Modify(&g_slcdc0_ctrl, 39, 0x7, 0xF);                  // 7
    }
    else if(Num / 10 % 10 == 8)
    {
        R_SLCDC_Modify(&g_slcdc0_ctrl, 30, 0xF, 0xF);
        R_SLCDC_Modify(&g_slcdc0_ctrl, 39, 0xF, 0xF);                  // 8
    }
    else if(Num / 10 % 10 == 9)
    {
        R_SLCDC_Modify(&g_slcdc0_ctrl, 30, 0xB, 0xF);
        R_SLCDC_Modify(&g_slcdc0_ctrl, 39, 0xF, 0xF);                  // 9
    }
}

/**
 @brief 计算小数百分位,如3.31,则百分位 1
 @param None
 @return 无
*/
void calculatePercentiles(uint16_t Num)
{
    if(Num % 10 == 0)
    {
        R_SLCDC_Modify(&g_slcdc0_ctrl, 40, 0xD, 0xF);                  // 0
        R_SLCDC_Modify(&g_slcdc0_ctrl, 41, 0x7, 0xF);
    }
    else if(Num % 10 == 1)
    {
        R_SLCDC_Modify(&g_slcdc0_ctrl, 40, 0x0, 0xF);
        R_SLCDC_Modify(&g_slcdc0_ctrl, 41, 0x6, 0xF);                  // 1
    }
    else if(Num % 10 == 2)
    {
        R_SLCDC_Modify(&g_slcdc0_ctrl, 40, 0xE, 0xF);
        R_SLCDC_Modify(&g_slcdc0_ctrl, 41, 0x3, 0xF);                  // 2
    }
    else if(Num % 10 == 3)
    {
        R_SLCDC_Modify(&g_slcdc0_ctrl, 40, 0xA, 0xF);
        R_SLCDC_Modify(&g_slcdc0_ctrl, 41, 0x7, 0xF);                  // 3
    }
    else if(Num % 10 == 4)
    {
        R_SLCDC_Modify(&g_slcdc0_ctrl, 40, 0x3, 0xF);
        R_SLCDC_Modify(&g_slcdc0_ctrl, 41, 0x6, 0xF);                  // 4
    }
    else if(Num % 10 == 5)
    {
        R_SLCDC_Modify(&g_slcdc0_ctrl, 40, 0xB, 0xF);
        R_SLCDC_Modify(&g_slcdc0_ctrl, 41, 0x5, 0xF);                  // 5
    }
    else if(Num % 10 == 6)
    {
        R_SLCDC_Modify(&g_slcdc0_ctrl, 40, 0xF, 0xF);
        R_SLCDC_Modify(&g_slcdc0_ctrl, 41, 0x5, 0xF);                  // 6
    }
    else if(Num % 10 == 7)
    {
        R_SLCDC_Modify(&g_slcdc0_ctrl, 40, 0x1, 0xF);
        R_SLCDC_Modify(&g_slcdc0_ctrl, 41, 0x7, 0xF);                  // 7
    }
    else if(Num % 10 == 8)
    {
        R_SLCDC_Modify(&g_slcdc0_ctrl, 40, 0xF, 0xF);
        R_SLCDC_Modify(&g_slcdc0_ctrl, 41, 0xF, 0xF);                  // 8
    }
    else if(Num % 10 == 9)
    {
        R_SLCDC_Modify(&g_slcdc0_ctrl, 40, 0xB, 0xF);
        R_SLCDC_Modify(&g_slcdc0_ctrl, 41, 0xF, 0xF);                  // 9
    }
}

完成文件创建和工程编译,上传固件至开发板,即可实现

主程序

在 .../src/hal_entry.c 主程序中添加 ADC 温度获取与 LCD 显示的相关代码

#include "hal_data.h"
#include <stdio.h>
#include "LCD_ShowNum.h"

FSP_CPP_HEADER
void R_BSP_WarmStart(bsp_warm_start_event_t event);
FSP_CPP_FOOTER

fsp_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

#endif


PUTCHAR_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)
{
    //宏将告知编译器回调函数不使用参数 p_args,从而避免编译器发出警告,
    FSP_PARAMETER_NOT_USED(p_args);
    scan_complete_flag = true;
}

/******************
 * ADC Temperature
 * (详见 https://renesas.github.io/fsp/group___a_d_c.html )
 *******************/
/* 官方例程常数 */
#define VCC_UV           (3300000UL)   /* 3.3 V → μV */
#define RES_SHIFT        (12U)         /* 12-bit ADC */
#define REF_TEMP         (127)         /* 校准点 127 ℃ */
#define SLOPE_UV_PER_C   (4000L)       /* 4 mV/℃ → 4000 μV/℃ */

/* 获取ADC通道温度 */
static int32_t get_temperature_c(void)
{
    /* 1. 启动 ADC 并等待完成 */
    R_ADC_ScanStart(&g_adc0_ctrl);
    adc_status_t status = { .state = ADC_STATE_SCAN_IN_PROGRESS };
    while (status.state == ADC_STATE_SCAN_IN_PROGRESS)
    {
        R_ADC_StatusGet(&g_adc0_ctrl, &status);
    }

    /* 2. 读温度通道原始码值 */
    uint16_t raw;
    R_ADC_Read(&g_adc0_ctrl, ADC_CHANNEL_TEMPERATURE, &raw);

    /* 3. 取 127 ℃ 校准码值(TSCDR) */
    adc_info_t info;
    R_ADC_InfoGet(&g_adc0_ctrl, &info);
    int32_t cal127 = (int32_t)info.calibration_data;

    /* 4. 官方公式(单位 μV) */
    int32_t v1_uv   = (VCC_UV >> RES_SHIFT) * cal127;   /* 127 ℃ 对应电压 */
    int32_t vs_uv   = (VCC_UV >> RES_SHIFT) * raw;      /* 当前电压 */
    int32_t temp_c  = (vs_uv - v1_uv) / SLOPE_UV_PER_C + REF_TEMP;
    //printf("raw=%u cal127=%ld v1=%ld vs=%ld temp=%ld\r\n",raw, cal127, v1_uv, vs_uv, temp_c);
    return temp_c;
}

/*******************************************************************************************************************//**
 * main() is generated by the RA Configuration editor and is used to generate threads if an RTOS is used.  This function
 * is called by main() when no RTOS is used.
 **********************************************************************************************************************/
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);

    //fsp_err_t err;
    /* Open SLCDC driver */
    err = R_SLCDC_Open(&g_slcdc0_ctrl, &g_slcdc0_cfg);
    /* Handle any errors. This function should be defined by the user. */
    assert(FSP_SUCCESS == err);
    /* When using internal boost mode this delay is required to allow the boost circuit to charge. See RA4M1 User's
    * Manual (R01UH0887EJ0100) 8.2.18 "Segment LCD Source Clock Control Register (SLCDSCKCR)" for details. */
    R_BSP_SoftwareDelay(5, BSP_DELAY_UNITS_MILLISECONDS);
    /* Start SLCDC output */
    err = R_SLCDC_Start(&g_slcdc0_ctrl);
    assert(FSP_SUCCESS == err);

    /* Set Display Area of SLCDC driver.*/
    //    err = R_SLCDC_SetDisplayArea(&g_slcdc0_ctrl, SLCDC_DISP_A);
    //    assert(FSP_SUCCESS == err);

    while(1)
    {
        int32_t temp_c = get_temperature_c();

        printf("{\"temp\": %ld}\r\n",temp_c);
        uint16_t Num = temp_c * 100 ; // temperature display on LCD

        LCD_ShowNum(Num);
        R_BSP_SoftwareDelay (500, BSP_DELAY_UNITS_MILLISECONDS);
        LCD_Clear();
    }

#if BSP_TZ_SECURE_BUILD
    /* Enter non-secure code */
    R_BSP_NonSecureEnter();
#endif
}
  • 构建工程;
  • 调试、上传固件。

效果

  • 使用 Type-C 数据线连接开发板的UART接口,
  • 运行串口调试助手软件,
  • 打开对应的端口即可获得输出本文

ADC 温度显示

连接 LCD 并显示芯片的实时温度值(单位:摄氏度)

lcd_adc_temp.jpg

触摸芯片可改变 LCD 显示的 ADC 温度值,同时串口打印温度值

adc_temp_print.jpg

总结

本文介绍了瑞萨 RA4L1-SENSOR 开发板通过瑞萨 e^2^ Studio 软件和灵活软件包(FSP)快速创建工程,ADC 读取芯片内部温度传感器,实现 LCD 段码屏实时显示芯片温度的项目设计,为瑞萨 RA4L1 系列单片机的快速开发和应用提供了参考。

开发板测评
版块: 瑞萨电子
2025/11/05 18:00
  • 举报
😁😂😃😄😅😆😉😊😋😌😍😏😒😓😔😖😘😚😜😝😞😠😡😢😣😤😥😨😩😪😫😭😰😱😲😳😵😷😸😹😺😻😼😽😾😿🙀🙅🙆🙇🙈🙉🙊🙋🙌🙍🙎🙏✂✅✈✉✊✋✌✏✒✔✖✨✳✴❄❇❌❎❓❔❕❗❤➕➖➗➡➰🚀🚃🚄🚅🚇🚉🚌🚏🚑🚒🚓🚕🚗🚙🚚🚢🚤🚥🚧🚨🚩🚪🚫🚬🚭🚲🚶🚹🚺🚻🚼🚽🚾🛀Ⓜ🅰🅱🅾🅿🆎🆑🆒🆓🆔🆕
@好友

全部评论

加载中
游客登录通知
已选择 0 人
自定义圈子
移动
发布帖子
发布动态
发布问答
最新帖子
学而思可多编程掌机改装2PCB设计翻车实录:我踩过的5个大坑,每个都值一万块从0到1学PCB:硬件工程师Layout实战避坑指南从0到1做硬件:智能硬件产品经理全流程实战指南《图解功率半导体》书评
热门版块
查看更多
萤火工场
电子元器件
单片机/MCU论坛
问型号
飞腾
开源硬件项目
每日打卡
电子DIY
维修技术交流
抄图联盟

39

收藏

分享

微信扫码
分享给好友

评论