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

目录

概述

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 */
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值