Renesas R7FA8D1BH (Cortex®-M85) 上超声波测距模块(HC-SR04)驱动开发

news2024/12/23 12:58:26

目录

概述

1 软硬件

1.1 软硬件环境信息

1.2 开发板信息

1.3 调试器信息

2 硬件架构

2.1 硬件框架结构

2.2 测距模块(HC-SR04)介绍

2.2.1 HC-SR04特性

2.2.2 HC-SR04操作时序

2.2.3 计算距离

3 软件实现

3.1 FSP配置项目

3.1.1 配置IO口的外部中断

 3.1.2 配置定时器

3.2 代码架构

 3.3 驱动实现

4 测试

4.1 编译代码

4.2 验证


源代码下载地址:

https://www.firebbs.cn/forum.php?mod=viewthread&tid=37943

概述

本文主要介绍Renesas R7FA8D1BH (Cortex®-M85) 上超声波测距模块(HC-SR04)驱动开发的过程,笔者介绍了HC-SR04测距模块驱动的实现原理,并使用FSP配置外围驱动接口,并编写驱动代码,实现测距的功能。在Renesas R7FA8D1BH板卡上通过改变距离参数验证驱动程序的功能。

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 硬件架构

2.1 硬件框架结构

IO接口配置功能:

触发信号接口P7_10: 送触发信号(10us)的脉冲

测距数据响应接口P7_09: 该IO配置外部中断响应模式,用于接收HC-SR04发回的脉冲信号

TIMER-0: 配置为10us响应速度,用于计算数据的脉冲宽度

系统工作框架结构如下:

2.2 测距模块(HC-SR04)介绍

2.2.1 HC-SR04特性

2.2.2 HC-SR04操作时序

工作原理:

Step -1: TRIG IO 收到10us 高电平

step - 2:  SR04自动发送8个40hz方波,并检测是否有信号返回

step - 3:SR04检测到返回信号,ECHO IO发送高电平,高电平持续时间为SR04发送波信号到返回波信号的时间。

具体工作波形图如下:

2.2.3 计算距离

以厘米为单位计算公式:

距离 = us/58(单位: cm), us为ECHO IO接收的高电平的持续时间,时间单位为: 微妙

以英寸为单位计算公式:

距离 = us/148(单位: 英寸), us为ECHO IO接收的高电平的持续时间,时间单位为: 微妙

3 软件实现

3.1 FSP配置项目

3.1.1 配置IO口的外部中断

1) 创建外部中断stack

2)配置参数

需要配置的参数如下:

1)选择通道号

2)回调函数

3)IO接口

 3.1.2 配置定时器

1)创建定时器的stack

2)配置参数

需要配置的参数如下:

1)通道号

2)周期

3)  最小周期单元

4)中断回调函数

 

3.2 代码架构

完成以上参数配置后,就可以使用FSP生成工程代码,其代码架构如下:

 3.3 驱动实现

1)初始化函数

函数static void timer5_Init(void):实现定时器的驱动初始化功能

代码32行:打开定时器

代码36行:启动定时器

代码39行:启动计数功能

函数:void HC_SR04_Init ( void ):实现HC_SR04模块初始化功能,该函数可以被外部其他函数调用

代码48行: 代码IO外部中断aima

代码52行:打开外部中断

代码55行:调用定时器初始化函数,启动定时器,以实现计算脉冲宽度功能

2)触发函数和定时器回调函数

 3)外部中断回调函数

代码90行:启动定时器,开始计数

代码94行:停止定时器

代码95行:计算距离数据

 源代码文件如下:

 /*
 FILE NAME  :  sht2x.c
 Description:  user sht20 interface 
 Author     :  tangmingfei2013@126.com
 Date       :  2024/06/03
 */
#include "hal_data.h"
#include "hc_sr04.h"


#define timeDelayUS(us)      R_BSP_SoftwareDelay(us, BSP_DELAY_UNITS_MICROSECONDS);

#define ICU_IRQN_PIN         BSP_IO_PORT_07_PIN_09
#define ICU_IRQN             10

#define TRIG                 BSP_IO_PORT_07_PIN_10

#define TRIG_H  R_IOPORT_PinWrite(&g_ioport_ctrl, TRIG, BSP_IO_LEVEL_HIGH)
#define TRIG_L  R_IOPORT_PinWrite(&g_ioport_ctrl, TRIG, BSP_IO_LEVEL_LOW)


static bool bl_trigger = false;
static uint32_t tick_cnt_1us;
static int state =0;

static float distance;

static void timer5_Init(void)
{
    fsp_err_t err = FSP_SUCCESS;
    /* Initializes the module. */
    err = R_AGT_Open(&g_timer5_ctrl, &g_timer5_cfg);
    /* Handle any errors. This function should be defined by the user. */
    assert(FSP_SUCCESS == err);
    /* Start the timer. */
    err = R_AGT_Start(&g_timer5_ctrl);
    assert(FSP_SUCCESS == err);

    err = R_AGT_Enable(&g_timer5_ctrl);
    assert(FSP_SUCCESS == err);
}



void HC_SR04_Init ( void )
{
    /* Configure the external interrupt. */
    fsp_err_t err = R_ICU_ExternalIrqOpen(&g_external_irq10_ctrl, &g_external_irq10_cfg);
    assert(FSP_SUCCESS == err);
    /* Enable the external interrupt. */
    /* Enable not required when used with ELC or DMAC. */
    err = R_ICU_ExternalIrqEnable(&g_external_irq10_ctrl);
    assert(FSP_SUCCESS == err);

    timer5_Init();
}


void HC_SR04_Trigger( void )
{
    bl_trigger = true;
    TRIG_H;
    timeDelayUS(10);
    TRIG_L;
    state = 0;
}


void g_timer5_Callback (timer_callback_args_t * p_args)
{
    if (TIMER_EVENT_CYCLE_END == p_args->event)
    {
        tick_cnt_1us++;
    }
}


/* Called from icu_irq_isr */
void external_irq10_callback (external_irq_callback_args_t * p_args)
{
    fsp_err_t err = FSP_SUCCESS;
    (void) p_args;

    switch( state )
    {
        default:
        case 0:
            tick_cnt_1us = 0;
            state = 1;
            err = R_AGT_Enable(&g_timer5_ctrl);
            assert(FSP_SUCCESS == err);
            break;
        case 1:
            err = R_AGT_Disable(&g_timer5_ctrl);
            distance = (float)(tick_cnt_1us/5.8);
            state = 0;
            tick_cnt_1us = 0;
            assert(FSP_SUCCESS == err);
            break;
    }
}

void debug_SR04_LOG( void )
{
    user_get_rtc();
}

float HC_SR04_getDistance( void )
{
    return distance;
}





/* End of this file */

4 测试

4.1 编译代码

系统硬件平台如下:

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

4.2 验证

改变距离后,在OLED得到当前的距离数据:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2204033.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

springboot 整合spring ai实现 基于知识库的客服问答

rag 需求产生的背景介绍: 在使用大模型时,常遇到的问题之一是模型可能产生幻觉,即生成的内容缺乏准确性。此外,由于大模型不直接访问企业的专有数据,其响应可能会显得泛泛而谈,不够精准或具体,…

Vue包的安装使用

文章目录 vue介绍一、灵活易用1.渐进式框架2.简洁的语法 二、高效的响应式系统1.数据驱动2.响应式原理 三、强大的组件化开发1.组件化思想2.组件通信 四、丰富的生态系统1.插件和库2.社区支持 安装依赖删除新增文件夹components设置(1)home.vue(2)data.vue(3)zero.vue router配…

Visual Studio Code 中通过鼠标滚轮调整字体大小并使用 Ctrl+W 关闭文档窗口【最详细】

1. 使用鼠标滚轮调整字体大小 希望通过鼠标滚轮与 Ctrl 键组合来放大或缩小编辑器的字体大小,按照以下步骤进行设置: 打开 Visual Studio Code。 进入设置页面: 点击左下角的齿轮图标,然后选择“设置”。 或者直接使用快捷键 …

最新Prompt预设词指令教程大全ChatGPT、AI智能体(300+预设词应用)

使用指南 直接复制在AI工具助手中使用(提问前) 可以前往已经添加好Prompt预设的AI系统测试使用(可自定义添加使用) SparkAi系统现已支持自定义添加官方GPTs(对专业领域更加专业,支持多模态文档&#xff0…

科研绘图系列:R语言绘制中国地理地图

文章目录 介绍加载R包导入数据图a图b图c图d系统信息介绍 文章提供了绘制图a,图b和图d的数据和代码。该图展示了不同省份的物种分布情况。 加载R包 library(geojsonsf) library(sf) library(ggplot2) library(RColorBrewer) library(ggspatial) library(</

C++AVL树详解

什么是AVL树 AVL树是最先发明的⾃平衡⼆叉查找树&#xff0c;AVL是⼀颗空树&#xff0c;或者具备下列性质的⼆叉搜索树&#xff1a;它的 左右⼦树都是AV树&#xff0c;且左右⼦树的⾼度差的绝对值不超过1。AVL树是⼀颗⾼度平衡搜索⼆叉树&#xff0c; 通过控制⾼度差去控制平衡…

python的介绍以及基本操作

python的介绍 &#xff08;1&#xff09;python是一门编程语言&#xff08;比如&#xff1a;java、c、c、.net、go等都是编程语言&#xff09; python 也是胶水语言 &#xff08;2&#xff09;python是一门面向对象&#xff0c;解释型的动态类型的编程语言&#xff0c; a、什…

select、epoll相关

select函数&#xff1a; int select(int nfds, // 监控的文件描述符集里最大文件描述符加1fd_set *readfds, // 监控有读数据到达文件描述符集合&#xff0c;引用类型的参数fd_set *writefds, // 监控写数据到达文件描述符集合&…

【零散技术】一分钟完成Odoo悬挂网站备案号

序言:时间是我们最宝贵的财富,珍惜手上的每个时分 目录 1.激活开发者模式 2.修改视图 Odoo套上域名是常见的需求&#xff0c;当我们兴致勃勃的做好 域名申请&#xff0c;网站备案&#xff0c;域名解析&#xff0c;SSL证书申请&#xff0c;Nginx转发后&#xff0c;就可以通过域…

横向移动与痕迹清理

目录 横向移动漏洞利⽤服务利⽤IPC横向计划任务横向计划任务横向WMI横向SMB横向DCOM横向WinRM横向PSEXEC横向其他⽅式横向 软件部署利⽤GPO组策略横向 密码喷洒密码策略检查喷洒主机喷洒⽤户名喷洒密码喷洒hash喷洒服务 痕迹清除OPSEC清除webshell清除隧道⼯具清除落地样本清除…

由于找不到krpt.dll,无法继续执行代码该怎么办?总结三种简单有效修复方法

1. krpt.dll 简介 1.1 定义 krpt.dll 是一个 Windows 动态链接库文件&#xff08;Dynamic Link Library&#xff09;&#xff0c;这种类型的文件包含可由多个应用程序共享的函数和资源。它是Windows操作系统中的一个重要组件&#xff0c;对于系统的正常运行起着至关重要的作用…

模块化沙箱的功能特点

模块化沙箱是一种高灵活性和高扩展性的数据安全产品&#xff0c;通过选择不同的沙箱模块&#xff0c;满足不同的安全需求。 同时&#xff0c;深信达模块化沙箱&#xff0c;根据企事业单位各类国密标准需求&#xff0c;合理转换沙箱模式&#xff0c;满足不同场景、不同类型的数…

TK东南亚、美区、英区产品投放内容该如何选择?

TikTok是抖音在海外市场的版本&#xff0c;已经成为全球最受欢迎的短视频应用之一&#xff0c;并被视为品牌国际化的重要平台。卖家若能有效利用 TikTok&#xff0c;有望在全球范围内提升企业知名度和产品销量&#xff0c;吸引大量的粉丝和订单。那么&#xff0c;在不同国家&am…

每日论文13-18TCAS2数控调谐电感的V波段CMOS压控振荡器

《A V-Band CMOS VCO With Digitally-Controlled Inductor for Frequency Tuning》 18TCAS2 广东省毫米波与太赫兹重点实验室 有个手头上的东西感觉粗调电感可能会比粗调电容好一些&#xff0c;所以拜读一下老板18年的这篇TCAS2&#xff0c;这感觉是个偏理论一点的工作。 首…

哇塞!FLUX 杠上 Midjourney,你选谁?

大家和大家聊聊最近超火的 AI 绘图工具 ——Black Forest Labs 的 FLUX 和一直备受青睐的 Midjourney。 来源&#xff1a;blackforestlabs.ai FLUX 这套开源的文本转图像模型一经推出&#xff0c;就掀起了不小的波澜。好多设计同行都对它充满了好奇与期待&#xff0c;这无疑给…

封装、继承、抽象类

面向对象共有三个特征&#xff1a;封装&#xff0c;继承&#xff0c;多态。 封装 封装表现&#xff1a; &#xff08;1&#xff09;方法就是一个最基本封装体。 &#xff08;2&#xff09;类其实也是一个封装体。 封装的好处&#xff1a; &#xff08;1&#xff09;提高…

Jquery serialize()、serializeArray()、$.param()

param()方法 1.定义&#xff1a;param() 方法创建**数组或对象**的序列化表示。》》该序列化值可在进行 AJAX 请求时在 URL 查询字符串中使用。2.语法&#xff1a;$.param(object,trad)object&#xff1a;必需&#xff0c;规定要序列化的数组或对象。trad&#xff1a;可选。布尔…

如何提高LabVIEW编程效率

提高LabVIEW编程效率对开发者来说非常重要&#xff0c;尤其是在处理复杂项目或紧迫的开发周期时。以下是一些可以显著提升LabVIEW编程效率的技巧&#xff0c;从代码结构、工具使用到团队协作的多个角度进行详细分析&#xff1a; 1. 模块化设计 模块化设计 是提高代码可维护性和…

Linux——grep-wc-管道符

grep命令 利用关键字过滤文件行&#xff0c;找到关键字所在那一行 wc命令 统计文件行数&#xff0c;单词数量 wc命令 不带选项全选 wc -c test.txt 字节bytes数量 wc -m test.txt 字符数量 wc -l test-txt 行数 wc -w test-txt 单词数量 管道符 | 将左边命令的…

【LLM论文日更】| BGE-M3E embedding模型

论文&#xff1a;https://arxiv.org/pdf/2402.03216代码&#xff1a;GitHub - FlagOpen/FlagEmbedding: Retrieval and Retrieval-augmented LLMs机构&#xff1a;BAAI领域&#xff1a;embedding model发表&#xff1a; ​ 研究背景 研究问题&#xff1a;这篇文章要解决的问…