瑞萨单片机论坛
直播中

花开月夜时

3年用户 448经验值
擅长:可编程逻辑
私信 关注
[资料]

【RA4M2设计挑战赛】+驱动温湿度传感器

软件要求:fsp_v4.2.0、keil5

1.生成基本程序
image.png

选择是否使用实时系统,本次不使用
image.png

完后后,见下图
image.png

2.更改时钟源
image.png

3.配置串口
image.png

修改debug参数
image.png

返回配置串口
image.png

4.配置I2C
image.png

image.png

5.生成基础程序
image.png

6.连接模块与开发板
image.png

7.建立 inc 文件夹存放.h文件
keil5中建立hs3003.c、hs3003.h、uart.c、uart.h
.h文件存放在inc中,.c文件存放在src中
image.png

建立.h编译路径
image.png

.c添加进keil
image.png

hs3003.c

#include "hs3003.h"
#include "stdio.h"

/* See Developer Assistance in the project */
void g_comms_i2c_bus0_quick_setup(void);
void g_hs300x_sensor0_quick_setup(void);

void start_demo(void);
static void demo_err(void);

static volatile hs3003_callback_status_t  hs3003_callback_status;

void g_comms_i2c_bus0_quick_setup(void)
{
    fsp_err_t err;
    err = R_SCI_I2C_Open(&hs3003_i2c_ctrl, &hs3003_i2c_cfg);
    assert(FSP_SUCCESS == err);
}

void hs3003_i2c_callback(i2c_master_callback_args_t * p_args)
{
	  if (HS3003_CALLBACK_STATUS_SUCCESS == p_args->event)
    {
        hs3003_callback_status = HS3003_CALLBACK_STATUS_SUCCESS;
    }
    else
    {
        hs3003_callback_status = HS3003_CALLBACK_STATUS_REPEAT;
    }
}

void start_hs3003(void)
{
	fsp_err_t err;
	uint8_t r_buf[4] = {0};
	uint16_t humi, temp;
	float tmp_f = 0.0;
	uint8_t data[2] = {0x00,0x00};
	demo_sequence_t sequence = DEMO_SEQUENCE_1;
	g_comms_i2c_bus0_quick_setup();
	while(1)
	{
		err = R_SCI_I2C_Write(&hs3003_i2c_ctrl,data,1,0);
		R_BSP_SoftwareDelay(40000,BSP_DELAY_UNITS_MICROSECONDS);
		err = R_SCI_I2C_Read(&hs3003_i2c_ctrl,&r_buf,4,1);
		if(err == FSP_SUCCESS)
		{
//        printf("0x%X,0x%X,0x%X,0x%X\n", r_buf[0], r_buf[1], r_buf[2], r_buf[3]);
//        printf("state:%x\n", r_buf[0] & RM_HS300X_MASK_STATUS_0XC0);
        if ((r_buf[0] & RM_HS300X_MASK_STATUS_0XC0) != RM_HS300X_DATA_STATUS_VALID)
        {
            printf("ת»»Ê±¼ä²»¶ß");
        }

        humi = (r_buf[0] & RM_HS300X_MASK_HUMIDITY_UPPER_0X3F) << 8 | r_buf[1];
        temp = (r_buf[2] << 8 | (r_buf[3] & RM_HS300X_MASK_TEMPERATURE_LOWER_0XFC)) >> 2;

        tmp_f = (float)humi;
        tmp_f = (tmp_f * RM_HS300X_CALC_HUMD_VALUE_100) / RM_HS300X_CALC_STATIC_VALUE;
				printf("ʪ¶È: %.2f\n",tmp_f );

        tmp_f = (float)temp;
        tmp_f = ((tmp_f * RM_HS300X_CALC_TEMP_C_VALUE_165) / RM_HS300X_CALC_STATIC_VALUE) - RM_HS300X_CALC_TEMP_C_VALUE_40;
				printf("ζÈ: %.2f\n", tmp_f);
    }
    else {
        printf("¶ÁÈ¡´«¸ÐÆ÷³ö´í!\n");
    }
		
		R_BSP_SoftwareDelay(1000000,BSP_DELAY_UNITS_MICROSECONDS);
	}
}

hs3003.h

#ifndef __HS3003_H
#define __HS3003_H

#include "hal_data.h"
/* Sequence */
typedef enum e_demo_sequence
{
    DEMO_SEQUENCE_1 = (1),
    DEMO_SEQUENCE_2,
    DEMO_SEQUENCE_3,
    DEMO_SEQUENCE_4,
    DEMO_SEQUENCE_5,
    DEMO_SEQUENCE_6,
} demo_sequence_t;

/* Callback status */
typedef enum e_hs3003_callback_status
{
    HS3003_CALLBACK_STATUS_WAIT = (0),
    HS3003_CALLBACK_STATUS_SUCCESS,
    HS3003_CALLBACK_STATUS_REPEAT,
} hs3003_callback_status_t;

#define SENSOR_TEMP_RANGE_MAX (80)
#define SENSOR_TEMP_RANGE_MIN (-10)
#define SENSOR_HUMI_RANGE_MAX (100)
#define SENSOR_HUMI_RANGE_MIN (0)

/* Definitions of Mask Data for A/D data */
#define RM_HS300X_MASK_HUMIDITY_UPPER_0X3F       (0x3F)
#define RM_HS300X_MASK_TEMPERATURE_LOWER_0XFC    (0xFC)
#define RM_HS300X_MASK_STATUS_0XC0               (0xC0)

/* Definitions for Status Bits of A/D Data */
#define RM_HS300X_DATA_STATUS_VALID              (0x00) // Status-bit: Valid data

/* Definitions for Calculation */
#define RM_HS300X_CALC_STATIC_VALUE              (16383.0F)
#define RM_HS300X_CALC_HUMD_VALUE_100            (100.0F)
#define RM_HS300X_CALC_TEMP_C_VALUE_165          (165.0F)
#define RM_HS300X_CALC_TEMP_C_VALUE_40           (40.0F)
#define RM_HS300X_CALC_DECIMAL_VALUE_100         (100.0F)

#define HS300X_ADR  0x44                        // look at datasheet
#define HS300X_TEMP_MULTY           0.010071415 // look at datasheet
#define HS300X_TEMP_MIN             40          // look at datasheet
#define HS300X_HUMD_MULTY           0.006163516 // look at datasheet
#define HS300X_MAX_ITERATION        100
#define HS300X_DELAY_MEASUREMENT    35          // typical on datasheet 16.90 ms, rounded up a little (35ms = 1 try)
#define HS300X_DELAY_ITERATION      1

#define HS300X_STALE_DATA           2
#define HS300X_OK                   1
#define HS300X_ERROR_SENSOR_BUSY    0
#define HS300X_ERROR_COLLISION_I2C  -1

void start_hs3003(void);

#endif

uart.c

#include "uart.h"

/* µ÷ÊÔ´®¿Ú UART4 ³õʼ»¯ */
void uart_init(void)
{
	fsp_err_t err = FSP_SUCCESS;
	err = R_SCI_UART_Open (&g_uart0_ctrl, &g_uart0_cfg);
	assert(FSP_SUCCESS == err);
}

/* ·¢ËÍÍê³É±êÖ¾ */
volatile bool uart_send_complete_flag = false;
/* ´®¿ÚÖжϻص÷ */
void g_uart0_callback (uart_callback_args_t * p_args)
{
	switch (p_args->event)
	{
		case UART_EVENT_RX_CHAR:
		{
		/* °Ñ´®¿Ú½ÓÊÕµ½µÄÊý¾Ý·¢ËÍ»ØÈ¥ */
		R_SCI_UART_Write(&g_uart0_ctrl, (uint8_t *)&(p_args->data), 1);
		break;
		}
		case UART_EVENT_TX_COMPLETE:
		{
		uart_send_complete_flag = true;
		break;
		}
		default:
		break;
	}
}	

/* Öض¨Ïò printf Êä³ö */
#if defined __GNUC__ && !defined __clang__
int _write(int fd, char *pBuffer, int size); //·ÀÖ¹±àÒ뾯¸æ
int _write(int fd, char *pBuffer, int size)
{
	(void)fd;
	R_SCI_UART_Write(&g_uart0_ctrl, (uint8_t *)pBuffer, (uint32_t)size);
	while(uart_send_complete_flag == false);
	uart_send_complete_flag = false;
	return size;
}
#else
int fputc(int ch, FILE *f)
{
	(void)f;
	R_SCI_UART_Write(&g_uart0_ctrl, (uint8_t *)&ch, 1);
	while(uart_send_complete_flag == false);
	uart_send_complete_flag = false;
	return ch;
}
#endif

uart.h

#ifndef __BSP_UART_H__
#define __BSP_UART_H__

#include "hal_data.h"
#include "stdio.h"

void uart_init(void);

#endif

hal_entry.c

#include "hal_data.h"
#include "uart.h"
#include "hs3003.h"

FSP_CPP_HEADER
void R_BSP_WarmStart(bsp_warm_start_event_t event);
FSP_CPP_FOOTER

/*******************************************************************************************************************//**
 * main() is generated by the RA Configuration editor and is used to generate threads if an RTOS is used.  This function
 * is called by main() when no RTOS is used.
 **********************************************************************************************************************/
void hal_entry(void)
{
    /* TODO: add your own code here */
		uart_init();
		start_hs3003();
#if BSP_TZ_SECURE_BUILD
    /* Enter non-secure code */
    R_BSP_NonSecureEnter();
#endif
}

/*******************************************************************************************************************//**
 * This function is called at various points during the startup process.  This implementation uses the event that is
 * called right before main() to set up the pins.
 *
 * @param[in]  event    Where at in the start up process the code is currently at
 **********************************************************************************************************************/
void R_BSP_WarmStart (bsp_warm_start_event_t event)
{
    if (BSP_WARM_START_RESET == event)
    {
#if BSP_FEATURE_FLASH_LP_VERSION != 0

        /* Enable reading from data flash. */
        R_FACI_LP->DFLCTL = 1U;

        /* Would normally have to wait tDSTOP(6us) for data flash recovery. Placing the enable here, before clock and
         * C runtime initialization, should negate the need for a delay since the initialization will typically take more than 6us. */
#endif
    }

    if (BSP_WARM_START_POST_C == event)
    {
        /* C runtime environment and system clocks are setup. */

        /* Configure pins. */
        R_IOPORT_Open(&g_ioport_ctrl, g_ioport.p_cfg);
    }
}

#if BSP_TZ_SECURE_BUILD

BSP_CMSE_NONSECURE_ENTRY void template_nonsecure_callable ();

/* Trustzone Secure Projects require at least one nonsecure callable function in order to build (Remove this if it is not required to build). */
BSP_CMSE_NONSECURE_ENTRY void template_nonsecure_callable ()
{

}
#endif

8.下载程序
设置下载地址
image.png
设置完成后下载程序

9.运行效果
image.png

更多回帖

发帖
×
20
完善资料,
赚取积分