首页 > 其他分享 >Renesas R7FA8D1BH (Cortex®-M85) 读取芯片内部温度值

Renesas R7FA8D1BH (Cortex®-M85) 读取芯片内部温度值

时间:2024-07-14 10:29:56浏览次数:16  
标签:R7FA8D1BH ERR err ctrl M85 FSP adc ADC Cortex

目录

 概述

1 软硬件

1.1 软硬件环境信息

1.2 开发板信息

1.3 调试器信息

2 FSP和KEIL配置ADC

2.1 ADC硬件接口

2.2 FSP配置ADC

3 软件功能实现

3.1 FSP生成项目

3.2 FSP ADC模块库函数介绍

3.2.1 库函数列表

 3.2.2 函数介绍

4 读Temperature sensor

4.1 初始化ADC

4.2 读取Temperature sensor值函数

4.3 源代码

5 测试

5.1 主函数调用

5.2 下载代码和运行


 概述

本文主要介绍Renesas R7FA8D1BH (Cortex®-M85) ADC模块读取MCU内部Temperature sensor的值,笔者使用FSP配置ADC模块的参数,并生成基于KEIL的工程代码。还编写一个读取Temperature sensor的应用程序,以实现读取温度值的功能,并将读到的数据通过UART发送至控制台,以观察期数据的变化。

1 软硬件

1.1 软硬件环境信息

软硬件信息版本信息
Renesas MCUR7FA8D1BH
KeilMDK ARM 5.38
FSP 版本5.3.0
调试工具:N32G45XVL-STBDAP-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配置ADC

2.1 ADC硬件接口

温度传感器输出一个随温度变化的电压。该电压通过电路转换为数字值12位A/D转换器。要获得模具温度,将此值转换为温度。

2.2 FSP配置ADC

1)创建ADC模块

2)选择ADC单元选择

3)  配置通道号,使能Temperature Sensor

3 软件功能实现

3.1 FSP生成项目

在完成FSP的参数配置之后,就可以使用Generate Project生成项目代码,打开项目后在hal_data.c中已经生成了adc的相关代码。

3.2 FSP ADC模块库函数介绍

3.2.1 库函数列表

概述

ADC模块支持以下特性:

1)12,14或16位最大分辨率取决于MCU
2)配置扫描包括:
      多个模拟通道
       温度传感器通道
       电压传感器通道


3)可配置扫描启动触发器:
       软件扫描触发器
      硬件扫描触发器(例如,计时器过期)
      外部扫描触发器从adtrn端口引脚


4)可配置扫描模式:
     单扫描模式,其中每个触发器启动一次扫描
     连续扫描模式,连续扫描所有通道
     群组扫描模式,将通道分为A组和B组。群组可以配置不同的启动触发器,A组可以优先于B组。当A组优先于B组时,A组触发器暂停正在进行的B组扫描。

5)支持添加和平均转换的样本
6)扫描完成时可选回调
7)取样和保持支撑
8)双层支持
9)具有中断和事件输出的硬件比较器

 3.2.2 函数介绍

1)R_ADC_Open()

fsp_err_t R_ADC_Open	(	adc_ctrl_t * 	p_ctrl,
adc_cfg_t const *const 	p_cfg 
)	

参数介绍

设置整个外设的操作模式、触发源、中断优先级和配置。如果中断被启用,该函数注册一个回调函数指针,以便在扫描完成时通知用户。

Return values

FSP_SUCCESSModule is ready for use.
FSP_ERR_ASSERTIONAn input argument is invalid.
FSP_ERR_ALREADY_OPENThe instance control structure has already been opened.
FSP_ERR_IRQ_BSP_DISABLEDA callback is provided, but the interrupt is not enabled.
FSP_ERR_IP_CHANNEL_NOT_PRESENTThe requested unit does not exist on this MCU.
FSP_ERR_INVALID_HW_CONDITIONThe ADC clock must be at least 1 MHz

2)R_ADC_ScanCfg()


fsp_err_t R_ADC_ScanCfg	(	adc_ctrl_t * 	p_ctrl,
void const *const 	p_channel_cfg 
)	

 参数介绍

配置ADC扫描参数。通道特定设置在此函数中设置。将指向adc_channel_cfg_t的指针传递给p_channel_cfg。

请注意如果adc_channel_cfg_t::priority_group_a设置为ADC_GROUP_A_GROUP_B_CONTINUOUS_SCAN,则启动组B扫描。

Return values

FSP_SUCCESSChannel specific settings applied.
FSP_ERR_ASSERTIONAn input argument is invalid.
FSP_ERR_NOT_OPENUnit is not open.

3)R_ADC_ScanStart()

fsp_err_t R_ADC_ScanStart	(	adc_ctrl_t * 	p_ctrl	)	

 根据R_ADC_Open调用中如何配置触发器,启动软件扫描或启用扫描的硬件触发器。如果单元配置为ELC或外部硬件触发,则此功能允许触发信号到达ADC单元。该函数不能控制触发器本身的生成。如果设备配置为软件触发,则此功能启动软件触发扫描。

Precondition

Call R_ADC_ScanCfg after R_ADC_Open before starting a scan.

On MCUs that support calibration, call R_ADC_Calibrate and wait for calibration to complete before starting a scan.

Return values

FSP_SUCCESSScan started (software trigger) or hardware triggers enabled.
FSP_ERR_ASSERTIONAn input argument is invalid.
FSP_ERR_NOT_OPENUnit is not open.
FSP_ERR_NOT_INITIALIZEDUnit is not initialized.
FSP_ERR_IN_USEAnother scan is still in progress (software trigger).

4)R_ADC_StatusGet()

fsp_err_t R_ADC_StatusGet	(	adc_ctrl_t * 	p_ctrl,
adc_status_t * 	p_status 
)	

 参数介绍

提供已启动的任何扫描进程的状态,包括由ELC或外部触发器启动的扫描以及支持校准的mcu上的校准扫描。

Return values

FSP_SUCCESSModule status stored in the provided pointer p_status
FSP_ERR_ASSERTIONAn input argument is invalid.
FSP_ERR_NOT_OPENUnit is not open.

5)R_ADC_Read()


fsp_err_t R_ADC_Read	(	adc_ctrl_t * 	p_ctrl,
adc_channel_t const 	reg_id,
uint16_t *const 	p_data 
)	

 参数介绍

从单个通道或传感器读取转换结果。

Return values

FSP_SUCCESSData read into provided p_data.
FSP_ERR_ASSERTIONAn input argument is invalid.
FSP_ERR_NOT_OPENUnit is not open.
FSP_ERR_NOT_INITIALIZEDUnit is not initialized.

6) R_ADC_InfoGet()

fsp_err_t R_ADC_InfoGet	(	adc_ctrl_t * 	p_ctrl,
adc_info_t * 	p_adc_info 
)	

返回最低配置通道的地址和为了读取配置通道的结果并返回ELC事件名称而要读取的总字节数。如果没有配置通道,则返回长度为0。还提供了温度传感器的斜率和传感器的校准数据,如果在这个MCU上可用。否则将返回无效的0xFFFFFFFF校准数据。

请注意
在组模式下,只返回组A的信息。目前不支持计算B组的信息。

Return values

FSP_SUCCESSInformation stored in p_adc_info.
FSP_ERR_ASSERTIONAn input argument is invalid.
FSP_ERR_NOT_OPENUnit is not open.

4 读Temperature sensor

4.1 初始化ADC

代码第19行:初始化adc模块

代码第23行:使能adc转换通道

4.2 读取Temperature sensor值函数

代码第54行:启动ADC转换

代码第61行:获取ADC转换的状态

代码第65行:读取ADC的值

代码第72行:标定ADC Temperature sensor的值

代码104行:转换温度值

代码106行:打印温度数据到串口终端

4.3 源代码

 /*
 FILE NAME  :  bsp_adc.c
 Description:  adc interface
 Author     :  [email protected]
 Date       :  2024/06/03
 */
#include "bsp_adc.h" 
#include "hal_data.h"

#define ADC_EXAMPLE_CALIBRATION_DATA_RA6M1               (0x7D5)
#define ADC_EXAMPLE_VCC_MICROVOLT                        (3300000)
#define ADC_EXAMPLE_TEMPERATURE_RESOLUTION               (12U)
#define ADC_EXAMPLE_REFERENCE_CALIBRATION_TEMPERATURE    (127)

void adc_basic_init( void )
{
    fsp_err_t err = FSP_SUCCESS;
    /* 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);
}


void adc_basic_get_value (uint16_t *result)
{
    fsp_err_t err = FSP_SUCCESS;
    adc_status_t status;
    
    /* In software trigger mode, start a scan by calling R_ADC_ScanStart(). In other modes, enable external
     * triggers by calling R_ADC_ScanStart(). */
    (void) R_ADC_ScanStart(&g_adc0_ctrl);
    /* Wait for conversion to complete. */
    status.state = ADC_STATE_SCAN_IN_PROGRESS;
    while (ADC_STATE_SCAN_IN_PROGRESS == status.state)
    {
        (void) R_ADC_StatusGet(&g_adc0_ctrl, &status);
    }
    
    /* Read converted data. */
    err = R_ADC_Read(&g_adc0_ctrl, ADC_CHANNEL_0, result);
    assert(FSP_SUCCESS == err);
    float voltage = (float)(((*result)*3.3)/4096);
    printf(" ADC_CHANNEL_0:  %d , voltage(v): %.02f\n", *result , voltage);
}

void adc_basic_get_temperature(int32_t *result)
{
    fsp_err_t err = FSP_SUCCESS;

    (void) R_ADC_ScanStart(&g_adc0_ctrl);
    
    /* Wait for conversion to complete. */
    adc_status_t status;
    status.state = ADC_STATE_SCAN_IN_PROGRESS;
    while (ADC_STATE_SCAN_IN_PROGRESS == status.state)
    {
        (void) R_ADC_StatusGet(&g_adc0_ctrl, &status);
    }
    /* Read converted data. */
    uint16_t temperature_conversion_result;
    err = R_ADC_Read(&g_adc0_ctrl, ADC_CHANNEL_TEMPERATURE, &temperature_conversion_result);
    assert(FSP_SUCCESS == err);
    /* If the MCU does not provide calibration data, use the value in the hardware manual or determine it
     * experimentally. */
    /* Get Calibration data from the MCU if available. */
    int32_t    reference_calibration_data;
    adc_info_t adc_info;
    (void) R_ADC_InfoGet(&g_adc0_ctrl, &adc_info);
    reference_calibration_data = (int32_t) adc_info.calibration_data;
    /* NOTE: The slope of the temperature sensor varies from sensor to sensor. Renesas recommends calculating
     * the slope of the temperature sensor experimentally.
     *
     * This example uses the typical slope provided in Table 52.38  "TSN characteristics" in the RA6M1 manual
     * R01UM0011EU0050. */
    int32_t slope_uv_per_c = BSP_FEATURE_ADC_TSN_SLOPE;
    /* Formula for calculating temperature copied from section 44.3.1 "Preparation for Using the Temperature Sensor"
     * of the RA6M1 manual R01UH0884EJ0100:
     *
     * In this MCU, the TSCDR register stores the temperature value (CAL127) of the temperature sensor measured
     * under the condition Ta = Tj = 127 C and AVCC0 = 3.3 V. By using this value as the sample measurement result
     * at the first point, preparation before using the temperature sensor can be omitted.
     *
     * If V1 is calculated from CAL127,
     * V1 = 3.3 * CAL127 / 4096 [V]
     *                                                                                                           
     * Using this, the measured temperature can be calculated according to the following formula.
     *
     * T = (Vs - V1) / Slope + 127 [C]
     * T: Measured temperature (C)
     * Vs: Voltage output by the temperature sensor when the temperature is measured (V)
     * V1: Voltage output by the temperature sensor when Ta = Tj = 127 C and AVCC0 = 3.3 V (V)
     * Slope: Temperature slope given in Table 52.38 / 1000 (V/C)
     */
    int32_t v1_uv = (ADC_EXAMPLE_VCC_MICROVOLT >> ADC_EXAMPLE_TEMPERATURE_RESOLUTION) *
                    reference_calibration_data;
                    
    int32_t vs_uv = (ADC_EXAMPLE_VCC_MICROVOLT >> ADC_EXAMPLE_TEMPERATURE_RESOLUTION) *
                    temperature_conversion_result;
                    
    *result = (vs_uv - v1_uv) / slope_uv_per_c + ADC_EXAMPLE_REFERENCE_CALIBRATION_TEMPERATURE;
    
     printf(" Temperature(C):  %d \n", *result );
}

/* End of this file */

5 测试

5.1 主函数调用

代码第45行: 初始化ADC模块

代码第52行:调用adc端口读取温度值

5.2 下载代码和运行

编译代码,下载到板卡中。运行代码

标签:R7FA8D1BH,ERR,err,ctrl,M85,FSP,adc,ADC,Cortex
From: https://blog.csdn.net/mftang/article/details/140095957

相关文章

  • keil5编译错误之Download failed - “Cortex-M3”
    可能出现的问题1.你设置的debug有点问题,没有把之前的文件清除解决办法:点开setting-》flashdownload 按下面配置注意这个programming algorothm非常重要根据不同的芯片内置flash大小要选择不同的programming,这个的作用是限制你的代码容量使其不超过总flash大小,并且......
  • ARM Cortex-A 与 STM32 F107
    ARMCortex-A和STM32F107是两种不同的微控制器架构,它们在性能、应用场景和硬件支持方面有很大的差异。以下是它们的详细比较和分析:1.基本特性比较ARMCortex-A系列ARMCortex-A是ARM架构中的高级应用处理器系列,专为复杂的计算任务和高级应用设计。它广泛用于智能手机、......
  • 搭建Renesas R7FA8D1BHECBD-BTB的开发调试环境(DAP-LINK: N32G45XVL-STB)
    目录概述1软硬件1.1软硬件环境信息1.2开发板信息1.3调试器信息2FSP和KEIL产生测试项目2.1FSP生成项目2.2Keil中配置 3 硬件连接框图4一个测试案例4.1功能介绍4.2 定时器函数5测试搭建RenesasR7FA8D1BHECBD-BTB的开发调试环境(DAP-LINK:N32G45......
  • Cortex系列详解
    Cortex系列属于ARMv7架构(ARM公司在经典处理器ARM11以后的产品改用Cortex命名)一、Cortex-A系列“A”系列面向尖端的基于虚拟内存的操作系统和用户应用。A系列处理器适用于具有高计算要求、运行丰富操作系统以及提供交互媒体和图形体验的应用领域。具体案例如:智能手机、......
  • GD32 使用ST-Link进行调试出现Error:Flash Download Failed-“Cortex-M3“ 解决方案
    项目场景:原来一直使用STM32,最近有个项目发项工程师打板采用的是GD32,外部引脚是一一对应的,STM32的各种下载工具和方法也是基本相同的。问题描述`前期就是库函数和芯片包要改成GD32的。前期工作都完成了,剩下最后一公里,就是下载程序。在MDK5中,采用STLINK,选好芯片型号,准备下载,但出现了Error:FlashDow......
  • DP32RF002 是深基于 ARM Cortex-M0+内核的超低功耗、高性能的、单片集成 (G)FSK/OOK
    产品简介DP32RF002是深基于ARMCortex-M0+内核的超低功耗、高性能的、单片集成(G)FSK/OOK无线收发机的32位SoC芯片。工作于200~960MHz范围内,支持灵活可设的数据包格式,支持自动应答和自动重发功能,支持跳频操作,支持FEC功能,同时内部集成了完整的射频接收机、射频发射机......
  • 基于ARM Cortex-M0软核处理器 在FPGA 搭建soc遇到的问题(灯不亮)
    1.Modelsim仿真发现所有的指令都不执行,可能是指令读取问题和总线信号的控制问题。 我遇到的:HRESP信号未使用,也没有赋值。查阅后发现HRESP标志传输状态,设置为常0即代表传输不会出错,就不会压制主机了。2.Modelsim仿真能通过,但是下载到FPGA上后,进行KEIL调试发现没有输出,我遇到的......
  • ARM Coresight DS-5 系列 2 - ARM Cortex-M DS-5 Trace 使用
    1.1ARMDS-5Trace接着上文完成ARMDS5的环境配置之后,这篇文章介绍如何使用ARMDS5(DS-5)进行DATATrace和指令Trace1.1.1ETM数据Trace和指令Trace1)新建一个"Debugger"core连接,创建步骤如下图所示,下图创建的是一个名为“Trace_Demo”的debugercore连接,需要注......
  • Cortex-M7 内存模型
    1前言        如图1所示, Cortex-M7最大支持4GB的内存寻址,并对内存映射(memorymap)做了初步的规定,将整个内存空间划分为了多个内存区域(region)。每个内存区域有着既定的内存类型(memorytype)和内存属性(memoryattribute),这两者决定了访存的具体行为。图1  Co......
  • Cortex-M7中断向量表的重定向
    1前言    系统上电后,PC会指向复位向量,即向量表中的Reset_Handler,而系统就是通过VectorTableOffsetRegister(VTOR)的值加上4字节来找到复位向量的入口的。        因为地址0处应该存储引导代码,所以它通常映射到Flash或者是ROM器件,并且它们的值不......