目录
概述
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 ADC功能代码
4.1 编写代码
4.2 代码调用
5 测试
概述
本文主要介绍Renesas R7FA8D1BH (Cortex®-M85) ADC模块的应用方法,包括使用FSP配置ADC模块的参数,并生成基于KEIL的工程代码。还编写一个ADC的应用程序,以实现模数转换功能,并将读到的数字量通过UART发送至控制台,以观察期数据的变化。
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配置ADC
2.1 ADC硬件接口
耀阳开发板_瑞萨RA8上提供一个可调电阻,用于验证ADC的功能,该接口对应的PIN引脚为P000,可使用FSP工具来配置参数。
2.2 FSP配置ADC
1) 在Pin面板上配置ADC 输出通道
2)创建ADC模块
3)配置ADC单元
P000 对应的ADC channel为ADC1_AN100
介绍ADC1_AN100:
ADC1: 对应Unit-1
AN100: 表示ADC1 的 channel-0
4) 配置通道号
pin引脚参数
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_SUCCESS Module is ready for use. FSP_ERR_ASSERTION An input argument is invalid. FSP_ERR_ALREADY_OPEN The instance control structure has already been opened. FSP_ERR_IRQ_BSP_DISABLED A callback is provided, but the interrupt is not enabled. FSP_ERR_IP_CHANNEL_NOT_PRESENT The requested unit does not exist on this MCU. FSP_ERR_INVALID_HW_CONDITION The 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_SUCCESS Channel specific settings applied. FSP_ERR_ASSERTION An input argument is invalid. FSP_ERR_NOT_OPEN Unit 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_SUCCESS Scan started (software trigger) or hardware triggers enabled. FSP_ERR_ASSERTION An input argument is invalid. FSP_ERR_NOT_OPEN Unit is not open. FSP_ERR_NOT_INITIALIZED Unit is not initialized. FSP_ERR_IN_USE Another 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_SUCCESS Module status stored in the provided pointer p_status FSP_ERR_ASSERTION An input argument is invalid. FSP_ERR_NOT_OPEN Unit 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_SUCCESS Data read into provided p_data. FSP_ERR_ASSERTION An input argument is invalid. FSP_ERR_NOT_OPEN Unit is not open. FSP_ERR_NOT_INITIALIZED Unit is not initialized.
4 ADC功能代码
4.1 编写代码
编写bsp_adc.c,实现如下代码
/*
FILE NAME : bsp_adc.c
Description: adc interface
Author : tangmingfei2013@126.com
Date : 2024/06/03
*/
#include "bsp_adc.h"
#include "hal_data.h"
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);
}
4.2 代码调用
代码第45行: 初始化adc
代码第51行: 读取adc的值
5 测试
编译代码,下载代码到板卡中,运行代码其结果如下:
通过调节按钮