Renesas R7FA8D1BH (Cortex®-M85)和蓝牙模块通信

news2024/10/7 7:21:49

目录

概述

1 软硬件

1.1 软硬件环境信息

1.2 开发板信息

1.3 调试器信息

2 硬件架构

2.1 系统架构

2.2 蓝牙模块介绍 

3 软件实现

3.1 FSP配置参数

3.2 代码实现

3.2.1 驱动函数

3.2.2 功能函数


概述

本文主要介绍Renesas R7FA8D1BH (Cortex®-M85)和蓝牙模块通信的实现方法,具体内容包括整个系统的架构,蓝牙模块功能介绍,FSP配置参数的方法,蓝牙模块驱动代码,功能代码。

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 系统架构

系统功能介绍:

1)使用4路PWM控制小车的四个轮子转动,并且控制小车的运行方向

2)蓝牙模块通过UART接口和MCU通信

2.2 蓝牙模块介绍 

 HC-08蓝牙串口通信模块是新一代的基于Bluetooth Specification V4.0 BLE 蓝牙协议的数传模块。无线工作频段为 2.4GHz ISM,调制方式是 GFSK。模块最大发射功率为4dBm,接收灵敏度-93dBm,空旷环境下和 手机可以实现 80 米超远距离通信。其和MCU之间通过串口通信,软件设计也简单便捷,且不需要考虑蓝牙协议栈问题,非常适合做速成产品。

蓝牙模块与MCU之间连接图:

3 软件实现

3.1 FSP配置参数

1)蓝牙模块通信接口配置

配置IO参数

配置通信参数

3.2 代码实现

3.2.1 驱动函数

在3.1步骤中完成参数配置之后,就可以生成配置代码,编写功能代码。

1)初始化函数和数据发送函数

2)字符串发送函数

 

3)配置baud函数

 4)接收中断回调函数

源代码文件:

 /*
 FILE NAME  :  bluetooth.c
 Description:  user bluetooth interface 
 Author     :  tangmingfei2013@126.com
 Date       :  2024/09/15
 */
#include "bsp_uart.h"
#include "bluetooth.h" 
#include "hal_data.h"
#include "app_bluetooth.h"

#define TRANSFER_LENGTH       128

static uint8_t  g_out_of_band_received[TRANSFER_LENGTH];
static uint32_t g_transfer_complete = 0;
static uint32_t g_receive_complete  = 0;
static uint32_t g_out_of_band_index = 0;

static void r_sci_b_uart1_set_baud (uint32_t baud_rate);
void r_sci_b_uart1_sendArry ( uint8_t *str, uint32_t len);

void blueTooth_Init( void )
{
    r_sci_b_uart1_set_baud( SCI_B_UART_BAUDRATE_9600 );
}

void blueTooth_send( void )
{
    static int sec;
    rtc_time_t get_time;
    
    user_get_currentRtc(&get_time);
    if( get_time.tm_sec != sec  )
    {
        sec = get_time.tm_sec;
        r_sci_b_uart1_sendArry(g_out_of_band_received,TRANSFER_LENGTH );
    }
}

void r_sci_b_uart1_sendArry ( uint8_t *str, uint32_t len)
{
    fsp_err_t err;

    // send the messsage infor
    err = R_SCI_B_UART_Write(&g_uart1_ctrl,str, len);
    assert(FSP_SUCCESS == err);
    while (!g_transfer_complete)
    {
        R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_MICROSECONDS);
    }
    g_transfer_complete = 0;
}

static void r_sci_b_uart1_set_baud (uint32_t baud_rate)
{
    fsp_err_t err ;
    sci_b_baud_setting_t baud_setting;
    bool                 enable_bitrate_modulation = false;
    uint32_t             error_rate_x_1000         = SCI_B_UART_BAUDRATE_ERROR_PERCENT_5;
    
    err = R_SCI_B_UART_BaudCalculate(baud_rate, 
                                     enable_bitrate_modulation, 
                                     error_rate_x_1000, 
                                     &baud_setting);
    assert(FSP_SUCCESS == err);
    err = R_SCI_B_UART_BaudSet(&g_uart1_ctrl, (void *) &baud_setting);
    assert(FSP_SUCCESS == err);
    
    /* Open the transfer instance with initial configuration. */
    err = R_SCI_B_UART_Open(&g_uart1_ctrl, &g_uart1_cfg);
    assert(FSP_SUCCESS == err);

}

void g_uart1_Callback (uart_callback_args_t * p_args)
{
    /* Handle the UART event */
    switch (p_args->event)
    {
        /* Received a character */
        case UART_EVENT_RX_CHAR:
        {
            /* Only put the next character in the receive buffer if there is space for it */
            if (g_out_of_band_index < TRANSFER_LENGTH)
            {
                /* Write either the next one or two bytes depending on the receive data size */
                if (UART_DATA_BITS_8 >= g_uart1_cfg.data_bits)
                {
                    g_out_of_band_received[g_out_of_band_index] = (uint8_t) p_args->data;
                    g_out_of_band_index++;
                    bluetoothCmd_DataRecvByte( (uint8_t) p_args->data );
                }
                else
                {
                    uint16_t * p_dest = (uint16_t *) &g_out_of_band_received[g_out_of_band_index];
                    *p_dest              = (uint16_t) p_args->data;
                    g_out_of_band_index += 2;
                }
            }
            else
            {
                g_out_of_band_index = 0;
            }
            break;
        }
        /* Receive complete */
        case UART_EVENT_RX_COMPLETE:
        {
            g_receive_complete = 1;
            break;
        }
        /* Transmit complete */
        case UART_EVENT_TX_COMPLETE:
        {
            g_transfer_complete = 1;
            break;
        }
        default:
        {
        }
    }
}



/* End of this file */

3.2.2 功能函数

1) 蓝牙模块接收数据函数

2)发送数据接口

 

3)发送log函数

 源代码文件:

 /*
 FILE NAME  :  app_bluetooth.c
 Description:  app UI
 Author     :  tangmingfei2013@126.com
 Date       :  2024/06/03
 */
#include "app_bluetooth.h"
#include "app_main.h" 
#include "bluetooth.h" 

#define PROT_FRAME_LEN       16

Stru_BlueCmd stru_BlueCmd;

static uint8_t recv_buf[PROT_FRAME_LEN];
static uint8_t rev_cnt = 0;


void bluetoothCmd_DataRecvByte(uint8_t data )
{
    recv_buf[rev_cnt++] =  data;
    if( rev_cnt >= PROT_FRAME_LEN)
         rev_cnt = 0;
    
    // bluetooth command
    stru_BlueCmd.recStatus +=1;
    if( stru_BlueCmd.recStatus > PROT_FRAME_LEN )
        stru_BlueCmd.recStatus = 0;
    
    if( rev_cnt >= 2 )
    {
        rev_cnt = 0;
        stru_BlueCmd.mcmd = recv_buf[0];
        stru_BlueCmd.mode = recv_buf[1];
    }
}

static void SendInterface(uint8_t* pu8_buf, uint16_t u16_len )
{
   r_sci_b_uart1_sendArry(pu8_buf, u16_len);
}

static void bluetooth_sendString( uint8_t *ss )
{
    uint8_t buff[2];
    uint8_t index = 0;
    
    while ( ss[index]!='\0' )
    {
        buff[0]= ss[index];
        SendInterface(buff, 1);
        index++;
    }
}

void bluetooth_sengLog( void )
{
    static uint8_t step = 0;
    Struc_SensorPack *pSensorData;
    uint8_t dataBuff[128];
    
    pSensorData = &stru_SensorData;
    switch( step )
    {
        default:
        case 0:
            memset((char*)dataBuff, '\0', sizeof(dataBuff));
            //sprintf((char*)dataBuff, "log:%d,%.2f,", pSensorData->luxValue,pSensorData->sr_value);
            // bluetooth_sendString( dataBuff );
            step = 1;
            break;
        
        case 1:
            //memset((char*)dataBuff, '\0', sizeof(dataBuff));
            sprintf((char*)dataBuff, "log:%.2f,%.2f,%d,%.2f:end", pSensorData->temperature*0.01, pSensorData->humidity*0.01, 
                                                                  pSensorData->luxValue,pSensorData->mcuTemp_value*0.01);
            bluetooth_sendString( dataBuff );
            step = 0;
            break;
    }
}

/* End of this file */
 

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

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

相关文章

【leetcode】274.H指数

为了方便&#xff0c;将 citations 记为 cs。 所谓的 h 指数是指一个具体的数值&#xff0c;该数值为“最大”的满足「至少发表了 x 篇论文&#xff0c;且每篇论文至少被引用 x 次」定义的合法数&#xff0c;重点是“最大”。 用题面的实例 1 来举个 &#x1f330;&#xff0…

hackmyvm-BaseME靶机

主机发现 sudo arp-scan -l 扫描到本地网络靶机ip:192.168.91.173 nmap扫描 sudo nmap 192.168.91.173 发现靶机开放22端口的ssh服务与80端口的http服务 base64加密 我们访问一下80端口&#xff0c;发现了一串加密信息&#xff0c;判读大概是base64加密 base64加密特征&…

软件无线电4-位同步

在数字通信系统中&#xff0c;同步主要有三种方式&#xff0c;载波同步、位同步和群同步。载波同步指在相干解调时&#xff0c;接收机的解调器需要产生一个与调制载波同频同相的相干载波。载波同步又称为载波恢复。位同步指接收机需要产生一个与调制信号符号速率相同&#xff0…

【stm32】ADC的介绍与使用

ADC的介绍与使用 1、ADC介绍2、逐次逼近型ADC3、ADC电路4、ADC基本结构程序代码编写&#xff1a;ADC 通道和引脚复用的关系 5、转换模式&#xff08;1&#xff09;单次转换&#xff0c;非扫描模式转换流程&#xff1a;程序编写&#xff1a; &#xff08;2&#xff09;连续转换&…

Android一个APP里面最少有几个线程

Android一个APP里面最少有几个线程 参考 https://www.jianshu.com/p/92bff8d6282f https://www.jianshu.com/p/8a820d93c6aa 线程查看 Android一个进程里面最少包含5个线程&#xff0c;分别为&#xff1a; main线程(主线程&#xff09;FinalizerDaemon线程 终结者守护线程…

pg 视图

1.概念 2.创建 3.修改 3.删除 4.递归

【量子计算】开辟全新计算范式

1. &#x1f680; 引言1.1 &#x1f680; 量子计算的现状与发展趋势1.2 &#x1f4dc; 量子位、量子门和量子电路的基本概念1.3 &#x1f3c6; 量子计算在科学研究中的作用 2. &#x1f50d; 量子计算的演变与创新2.1 &#x1f31f; 量子计算的发展历程2.2 &#x1f9e0; 量子算…

Dit架构 diffusion范式分类+应用

1.ping 网址 2.ssh nscc/l20 3.crtl,打开vscode的setting 4.win 10修改ssh配置文件及其密钥权限为600 - 晴云孤魂 - 博客园 整体来看&#xff1a; 使用transformer作为其主干网络&#xff0c;代替了原先的UNet 在latent space进行训练&#xff0c;通过transformer处理潜…

Leetcode——数组:二分搜索法704.二分查找相似题目

知识点&#xff1a; 二分搜索的区间&#xff0c;一般分为左闭右闭或左闭右开 left0 易错点1 while(易错点2) {middle(leftright)/2if(nums[middle]>target){right易错点3}else if(nums[middle]<target){leftmiddle1}else if(nums[middle]target){return target} } retu…

NRF52832

当我下载完NRF的芯片包后出现了一个缺失pack的问题 解决方法&#xff1a; CMSIS缺失警告_error #541: arm::cmsis:core:4.3.0 component is m-CSDN博客 引入新的型号的芯片问题总结&#xff1a; 一般引入新的型号的芯片都会涉及到.pack和芯片包的问题 外设调用&#xff1a; …

论文阅读:LLaVA-OneVision: Easy Visual Task Transfer

论文地址&#xff1a;https://arxiv.org/pdf/2408.03326 公开时间&#xff1a;2024年9月14日 项目地址&#xff1a;https://llava-vl.github.io/blog/llava-onevision LLaVA-OneVision是一个开放的大型多模态模型&#xff08;LMMs&#xff09;&#xff0c;它是通过整合在LLaVA…

【星闪开发连载】SLE_UUID_Server和SLE_UUID_Client程序分析

引言 星闪测试已经搁置了很久了&#xff0c;主要是8-9月份太忙了。今天重新捡回来。想看看官方提供的星闪例子&#xff0c;在application\samples\bt\sle\sle_uuid_client\和sle_uuid_server目录。这两个例子是一对&#xff0c;一个用来广播服务&#xff0c;另一个去连接。对应…

Mybatis-plus的基础用法

文章目录 1. 核心功能1.1 配置与编写规则1.2 条件构造器1.3 自定义SQL1.4 IService接口1.4.1 Lambda方法1.4.2 批量新增 1.5 分页查询 2. 拓展功能2.1 代码生成器2.2 DB静态工具2.3 逻辑删除2.4 枚举处理器 参考 1. 核心功能 1.1 配置与编写规则 Maven依赖&#xff1a; <…

Autosar EcuM配置-初始化及下电执行函数-基于ETAS软件

文章目录 前言EcuMCommonConfigurationEcuMDriverInitListOneEcuMModuleIDEcuMModuleParameterEcuMModuleServiceEcuMRbDriverInitCoreIdEcuMDriverInitListZeroEcuMGeneralEcuMRbOnGoOffOneCalloutEcuMRbCalloutFunctionEcuMRbModuleIDEcuMRbServiceIsNonAutosarEcuMRbOnGoOff…

java控制台输出乱码

第一步&#xff1a;修改 IntelliJ IDEA 全局编码、项目编码、属性文件编码 File->Settings… Editor->File Encodings(不要忘记点击Apply然后OK) 第二步&#xff1a;修改当前 Web 项目 Tomcat Server 的虚拟机输出选项 Run->Edit Configurations… 复制代码->…

DBMS-3.2 SQL(2)——DML的SELECT(含WHERE、聚集函数、GROUP BY、HAVING之间的关系)

本文章的素材与知识来自李国良老师和王珊老师。 数据操纵语言DML&#xff08;Data Manipulation Language&#xff09; SELECT 一.SELECT的语法与构成 1.语法 2.构成 二.投影 投影操作可以选择表中的若干列&#xff0c;主要体现在SELECT子句后的列表达式。 1.列表达式 2.…

【书生浦语实战】茴香豆企业级知识库问答工具-搭建Dify问答助手

快速结论 1、用茴香豆快速搭建Dify问答助手&#xff0c;自带拒答、rerank、切片长度判断、阈值调节功能&#xff0c;回答还能带出图片&#xff0c;顶呱呱&#x1f44d; 2、茴香豆git仓地址&#xff1a;https://github.com/internlm/huixiangdou 遇到问题去翻这里会更多解释&…

如何利用免费音频剪辑软件制作出精彩音频

现在有许多免费的音频剪辑软件可供选择&#xff0c;它们为广大用户提供了丰富的功能和便捷的操作体验&#xff0c;让音频编辑变得更加轻松和有趣。接下来&#xff0c;让我们一起走进这些免费音频剪辑软件的世界&#xff0c;探索它们的独特魅力和强大功能。 1.福昕音频剪辑 链…

李宏毅深度学习-图神经网络GNN

图卷积的开源代码网站DGL 好用的还是 GAT, GIN&#xff08;指出最好的卷积 就是 hi 邻居特征&#xff08;而且只能用 sum&#xff09;&#xff09; Introduction GNN 可以理解为是由 Graph&#xff08;图) Nerual Networks 组合而成的&#xff0c;图结构应该都在数据结构与…

No.12 笔记 | 网络基础:ARP DNS TCP/IP与OSI模型

一、计算机网络&#xff1a;安全的基石 1. 网络的本质&#xff1a;数字世界的神经系统 定义&#xff1a;计算机的互联互通&#xff0c;实现资源共享和信息交换组成要素&#xff1a;发送者、接收者、介质、数据、协议&#xff08;五大要素&#xff09; 2. 网络架构&#xff1…