上一次评测内容为Analogue和Timers两部分的综合测试,本次进行任务2中的低功耗和USB两部分的综合测试。
低功耗评测效果为:通过按键K1进入睡眠模式,通过K3唤醒。
USB评测效果为:通过pcdc虚拟出串口,然后进行收发实验,收到什么返回什么内容。
低功耗模式切换图如下:

ra4m2支持的低功耗模式有如下4种:
1.睡眠模式(Sleep Mode)
2.软件待机模式(Software Standby Mode)
3.贪睡模式(Snooze Mode)
4.深度软件待机模式(Deep Software Standby Mode)
这里我们测试第二种软件待机模式(Software Standby Mode),在软件待机模式下,CPU以及大部分片上外设功能和所有内部晶振都停止工作。但是会保留CPU内部寄存器和SRAM数据的内容, 片上外设以及IO口的状态。软件待机模式可以显著降低功耗,因为大多数振荡器在这种模式下停止。 与睡眠模式一样,待机模式需要配置一个中断,并使用它来唤醒MCU。退出软件待机模式时,所有内部晶振都会被启动, 待所有晶振稳定后,MCU返回正常模式。
通过上面的介绍可以知道需要中断来唤醒,由于计划通过按键K3唤醒,所以需要设置IRQ中断。

通过原理图可知K3连接在P111引脚,这次在上一次评测的代码基础上进行增加,IRQ部分FSP配置如下:



低功耗部分FSP配置如下:

代码如下:
logDebug("Start Open IRQ4");
err = g_external_irq4.p_api->open(g_external_irq4.p_ctrl,g_external_irq4.p_cfg);
assert(FSP_SUCCESS == err);
err = g_external_irq4.p_api->enable(g_external_irq4.p_ctrl);
assert(FSP_SUCCESS == err);
logDebug("Open IRQ4 end");
logDebug("Start Open lpm");
err = g_lpm0.p_api->open(g_lpm0.p_ctrl,g_lpm0.p_cfg);
assert(FSP_SUCCESS == err);
logDebug("Open lpm end");
在Callback_btn_Handler函数内的SINGLE_CLICK条件下增加如下代码
if (_btn->button_id == 0) {
logWarning("MCU Enter Software Standby Mode!");
g_lpm0.p_api->lowPowerModeEnter(g_lpm0.p_ctrl);
}
IRQ中断代码如下:
void user_irq4_callback(external_irq_callback_args_t * p_args)
{
FSP_PARAMETER_NOT_USED(p_args);
}
按键仅仅用于唤醒MCU,因此不需要在回调函数中放任何代码,只需添加一行FSP_PARAMETER_NOT_USED(p_args);使用一次回调函数的参数, 避免编译器警告即可。
编译后下载进MCU里观察效果,开发板需要重新上电才会起效。
效果如下,按下按键K1进入低功耗模式,板子上的LEDD6停止闪烁,D3熄灭,按下K3后退出低功耗模式,板子上的LEDD6开始重新闪烁,D3点亮。

USB部分的FSP配置如下:



添加了stacks后保持默认即可。
代码如下:
#define NUM_STRING_DESCRIPTOR (7U)
extern uint8_t g_apl_device[];
extern uint8_t g_apl_configuration[];
extern uint8_t g_apl_hs_configuration[];
extern uint8_t g_apl_qualifier_descriptor[];
extern uint8_t *g_apl_string_table[];
extern int g_curr_led_freq;
const usb_descriptor_t g_usb_descriptor =
{
g_apl_device,
g_apl_configuration,
g_apl_hs_configuration,
g_apl_qualifier_descriptor,
g_apl_string_table,
NUM_STRING_DESCRIPTOR
};
usb_status_t usb_event;
static bool b_usb_attach = false;
/*****************************************************************************************************************
* [url=home.php?mod=space&uid=2666770]@Brief[/url] Prints the message to console
* @param[in] p_msg contains address of buffer to be printed
* @retval FSP_SUCCESS Upon success
* @retval any other error code apart from FSP_SUCCESS, Write is unsuccessful
****************************************************************************************************************/
static fsp_err_t print_to_console(char *p_data)
{
fsp_err_t err = FSP_SUCCESS;
uint32_t len = ((uint32_t)strlen(p_data));
err = R_USB_Write (&g_basic0_ctrl, (uint8_t*)p_data, len, USB_CLASS_PCDC);
/* Handle error */
if (FSP_SUCCESS != err)
{
return err;
}
err = check_for_write_complete();
if (FSP_SUCCESS != err)
{
/* Did not get the event hence returning error */
return FSP_ERR_USB_FAILED;
}
return err;
}
/*****************************************************************************************************************
* @brief Check for write completion
* @param[in] None
* @retval FSP_SUCCESS Upon success
* @retval any other error code apart from FSP_SUCCESS
****************************************************************************************************************/
static fsp_err_t check_for_write_complete(void)
{
usb_status_t usb_write_event = USB_STATUS_NONE;
int32_t timeout_count = UINT16_MAX;
fsp_err_t err = FSP_SUCCESS;
usb_event_info_t event_info = {0};
do
{
err = R_USB_EventGet (&event_info, &usb_write_event);
if (FSP_SUCCESS != err)
{
return err;
}
--timeout_count;
if (0 > timeout_count)
{
timeout_count = 0;
err = (fsp_err_t)USB_STATUS_NONE;
break;
}
}while(USB_STATUS_WRITE_COMPLETE != usb_write_event);
return err;
}
#define KIT_INFO ('1')
#define NEXT_STEPS ('2')
#define CARRIAGE_RETURN ('\r')
#define LINE_CODING_LENGTH (0x07U)
#define READ_BUF_SIZE (256U)
usb_event_info_t event_info = {0};
uint8_t g_buf[READ_BUF_SIZE] = {0};
static usb_pcdc_linecoding_t g_line_coding;
static fsp_err_t usb_process(void)
{
fsp_err_t err = FSP_SUCCESS;
/* Obtain USB related events */
err = R_USB_EventGet (&event_info, &usb_event);
/* Handle error */
assert(FSP_SUCCESS == err);
/* USB event received by R_USB_EventGet */
switch (usb_event)
{
case USB_STATUS_CONFIGURED:
{
err = R_USB_Read (&g_basic0_ctrl, g_buf, READ_BUF_SIZE, USB_CLASS_PCDC);
/* Handle error */
assert(FSP_SUCCESS == err);
logDebug("USB configured completed!");
break;
}
case USB_STATUS_READ_COMPLETE:
{
if(b_usb_attach)
{
err = R_USB_Read (&g_basic0_ctrl, g_buf, READ_BUF_SIZE, USB_CLASS_PCDC);
}
/* Handle error */
assert(FSP_SUCCESS == err);
logInfo("USB Read data completed!");
print_to_console((char *)g_buf);
memset (g_buf, 0, sizeof(g_buf));
break;
}
case USB_STATUS_REQUEST : /* Receive Class Request */
{
/* Check for the specific CDC class request IDs */
if (USB_PCDC_SET_LINE_CODING == (event_info.setup.request_type & USB_BREQUEST))
{
err = R_USB_PeriControlDataGet (&g_basic0_ctrl, (uint8_t *) &g_line_coding, LINE_CODING_LENGTH );
/* Handle error */
assert(FSP_SUCCESS == err);
logDebug("USB USB_PCDC_SET_LINE_CODING!");
}
else if (USB_PCDC_GET_LINE_CODING == (event_info.setup.request_type & USB_BREQUEST))
{
err = R_USB_PeriControlDataSet (&g_basic0_ctrl, (uint8_t *) &g_line_coding, LINE_CODING_LENGTH );
/* Handle error */
assert(FSP_SUCCESS == err);
logDebug("USB USB_PCDC_GET_LINE_CODING!");
}
else if (USB_PCDC_SET_CONTROL_LINE_STATE == (event_info.setup.request_type & USB_BREQUEST))
{
err = R_USB_PeriControlStatusSet (&g_basic0_ctrl, USB_SETUP_STATUS_ACK);
/* Handle error */
assert(FSP_SUCCESS == err);
logDebug("USB USB_PCDC_SET_CONTROL_LINE_STATE!");
}
else
{
/* none */
}
break;
}
case USB_STATUS_DETACH:
case USB_STATUS_SUSPEND:
{
b_usb_attach = false;
memset (g_buf, 0, sizeof(g_buf));
logDebug("USB detach or suspend!");
break;
}
case USB_STATUS_RESUME:
{
logDebug("USB resume!");
b_usb_attach = true;
break;
}
default:
{
break;
}
}
return err;
}
USB需要接口和端口描述文件,生成的代码中会有一个参考文件,路径为RA4M2_Sensor\ra\fsp\src\r_usb_pcdc\r_usb_pcdc_descriptor.c.template
描述文件如下:
/***********************************************************************************************************************
* File Name : r_usb_pcdc_descriptor.c
* Description : USB PCDC Descriptor definition.
**********************************************************************************************************************/
/***********************************************************************************************************************
* Copyright (c) 2020 - 2024 Renesas Electronics Corporation and/or its affiliates
*
* SPDX-License-Identifier: BSD-3-Clause
***********************************************************************************************************************/
/******************************************************************************
Includes <System Includes> , "Project Includes"
******************************************************************************/
#include <r_usb_basic.h>
#include <r_usb_basic_api.h>
#include "r_usb_basic_cfg.h"
/******************************************************************************
Macro definitions
******************************************************************************/
/* bcdUSB */
#define USB_BCDNUM (0x0200U)
/* Release Number */
#define USB_RELEASE (0x0200U)
/* DCP max packet size */
#define USB_DCPMAXP (64U)
/* Configuration number */
#define USB_CONFIGNUM (1U)
/* Vendor ID */
#define USB_VENDORID (0x045BU)
/* Product ID */
#define USB_PRODUCTID (0x5310U)
/* Class-Specific Configuration Descriptors */
#define USB_PCDC_CS_INTERFACE (0x24U)
/* bDescriptor SubType in Communications Class Functional Descriptors */
/* Header Functional Descriptor */
#define USB_PCDC_DT_SUBTYPE_HEADER_FUNC (0x00U)
/* Call Management Functional Descriptor. */
#define USB_PCDC_DT_SUBTYPE_CALL_MANAGE_FUNC (0x01U)
/* Abstract Control Management Functional Descriptor. */
#define USB_PCDC_DT_SUBTYPE_ABSTRACT_CTR_MANAGE_FUNC (0x02U)
/* Union Functional Descriptor */
#define USB_PCDC_DT_SUBTYPE_UNION_FUNC (0x06U)
/* Communications Class Subclass Codes */
#define USB_PCDC_CLASS_SUBCLASS_CODE_ABS_CTR_MDL (0x02U)
/* USB Class Definitions for Communications Devices Specification
release number in binary-coded decimal. */
#define USB_PCDC_BCD_CDC (0x0110U)
/* Descriptor length */
#define USB_PCDC_QD_LEN (10U)
#define USB_PCDC_CD1_LEN (67U)
#define STRING_DESCRIPTOR0_LEN (4U)
#define STRING_DESCRIPTOR1_LEN (16U)
#define STRING_DESCRIPTOR2_LEN (44U)
#define STRING_DESCRIPTOR3_LEN (46U)
#define STRING_DESCRIPTOR4_LEN (22U)
#define STRING_DESCRIPTOR5_LEN (18U)
#define STRING_DESCRIPTOR6_LEN (28U)
/* Descriptor data Mask */
#define USB_UCHAR_MAX (0xffU)
#define USB_W_TOTAL_LENGTH_MASK (256U)
#define USB_W_MAX_PACKET_SIZE_MASK (64U)
#define USB_PCDC_BCD_CDC_MASK (256U)
/******************************************************************************
Private global variables and functions
******************************************************************************/
/******************************************************************************
Exported global variables
******************************************************************************/
/******************************************************************************
Exported global functions (to be accessed by other files)
******************************************************************************/
/* Standard Device Descriptor */
uint8_t g_apl_device[USB_DD_BLENGTH + ( USB_DD_BLENGTH % 2)] =
{
USB_DD_BLENGTH, /* 0:bLength */
USB_DT_DEVICE, /* 1:bDescriptorType */
(USB_BCDNUM & (uint8_t) USB_UCHAR_MAX), /* 2:bcdUSB_lo */
((uint8_t) (USB_BCDNUM >> 8) & (uint8_t) USB_UCHAR_MAX), /* 3:bcdUSB_hi */
USB_IFCLS_CDCC, /* 4:bDeviceClass */
0, /* 5:bDeviceSubClass */
0, /* 6:bDeviceProtocol */
(uint8_t) USB_DCPMAXP, /* 7:bMAXPacketSize(for DCP) */
(USB_VENDORID & (uint8_t) USB_UCHAR_MAX), /* 8:idVendor_lo */
((uint8_t) (USB_VENDORID >> 8) & (uint8_t) USB_UCHAR_MAX), /* 9:idVendor_hi */
((uint16_t) USB_PRODUCTID & (uint8_t) USB_UCHAR_MAX), /* 10:idProduct_lo */
((uint8_t) (USB_PRODUCTID >> 8) & (uint8_t) USB_UCHAR_MAX), /* 11:idProduct_hi */
(USB_RELEASE & (uint8_t) USB_UCHAR_MAX), /* 12:bcdDevice_lo */
((uint8_t) (USB_RELEASE >> 8) & (uint8_t) USB_UCHAR_MAX), /* 13:bcdDevice_hi */
1, /* 14:iManufacturer */
2, /* 15:iProduct */
6, /* 16:iSerialNumber */
USB_CONFIGNUM /* 17:bNumConfigurations */
};
/************************************************************
* Device Qualifier Descriptor *
************************************************************/
uint8_t g_apl_qualifier_descriptor[USB_PCDC_QD_LEN + ( USB_PCDC_QD_LEN % 2)] =
{
USB_PCDC_QD_LEN, /* 0:bLength */
USB_DT_DEVICE_QUALIFIER, /* 1:bDescriptorType */
(USB_BCDNUM & (uint8_t) USB_UCHAR_MAX), /* 2:bcdUSB_lo */
((uint8_t) (USB_BCDNUM >> 8) & (uint8_t) USB_UCHAR_MAX), /* 3:bcdUSB_hi */
0, /* 4:bDeviceClass */
0, /* 5:bDeviceSubClass */
0, /* 6:bDeviceProtocol */
(uint8_t) USB_DCPMAXP, /* 7:bMAXPacketSize(for DCP) */
USB_CONFIGNUM, /* 8:bNumConfigurations */
0 /* 9:bReserved */
};
/************************************************************
* Configuration Or Other_Speed_Configuration Descriptor *
************************************************************/
/* For Full-Speed */
uint8_t g_apl_configuration[USB_PCDC_CD1_LEN + ( USB_PCDC_CD1_LEN % 2)] =
{
USB_CD_BLENGTH, /* 0:bLength */
USB_SOFT_CHANGE, /* 1:bDescriptorType */
USB_PCDC_CD1_LEN % USB_W_TOTAL_LENGTH_MASK, /* 2:wTotalLength(L) */
USB_PCDC_CD1_LEN / USB_W_TOTAL_LENGTH_MASK, /* 3:wTotalLength(H) */
2, /* 4:bNumInterfaces */
1, /* 5:bConfigurationValue */
0, /* 6:iConfiguration */
USB_CF_RESERVED | USB_CF_SELFP, /* 7:bmAttributes */
(10 / 2), /* 8:MAXPower (2mA unit) */
/* Interface Descriptor */
USB_ID_BLENGTH, /* 0:bLength */
USB_DT_INTERFACE, /* 1:bDescriptor */
0, /* 2:bInterfaceNumber */
0, /* 3:bAlternateSetting */
1, /* 4:bNumEndpoints */
USB_IFCLS_CDCC, /* 5:bInterfaceClass */
USB_PCDC_CLASS_SUBCLASS_CODE_ABS_CTR_MDL, /* 6:bInterfaceSubClass */
1, /* 7:bInterfaceProtocol */
0, /* 8:iInterface */
/* Communications Class Functional Descriptorss */
5, /* 0:bLength */
USB_PCDC_CS_INTERFACE, /* 1:bDescriptorType */
USB_PCDC_DT_SUBTYPE_HEADER_FUNC, /* 2:bDescriptorSubtype */
USB_PCDC_BCD_CDC % USB_W_TOTAL_LENGTH_MASK, /* 3:bcdCDC_lo */
USB_PCDC_BCD_CDC / USB_W_TOTAL_LENGTH_MASK, /* 4:bcdCDC_hi */
/* Communications Class Functional Descriptorss */
4, /* 0:bLength */
USB_PCDC_CS_INTERFACE, /* 1:bDescriptorType */
USB_PCDC_DT_SUBTYPE_ABSTRACT_CTR_MANAGE_FUNC, /* 2:bDescriptorSubtype */
2, /* 3:bmCapabilities */
/* Communications Class Functional Descriptorss */
5, /* 0:bLength */
USB_PCDC_CS_INTERFACE, /* 1:bDescriptorType */
USB_PCDC_DT_SUBTYPE_UNION_FUNC, /* 2:bDescriptorSubtype */
0, /* 3:bMasterInterface */
1, /* 4:bSlaveInterface0 */
/* Communications Class Functional Descriptorss */
5, /* 0:bLength */
USB_PCDC_CS_INTERFACE, /* 1:bDescriptorType */
USB_PCDC_DT_SUBTYPE_CALL_MANAGE_FUNC, /* 2:bDescriptorSubtype */
/* D1:1-Device can send/receive call management
information over a Data Class interface. */
/* D0:1-Device handles call management itself. */
3, /* 3:bmCapabilities */
1, /* 4:bDataInterface */
/* Endpoint Descriptor 0 */
7, /* 0:bLength */
USB_DT_ENDPOINT, /* 1:bDescriptorType */
USB_EP_IN | USB_EP3, /* 2:bEndpointAddress */
USB_EP_INT, /* 3:bmAttribute */
16, /* 4:wMAXPacketSize_lo */
0, /* 5:wMAXPacketSize_hi */
0x10, /* 6:bInterval */
/* Interface Descriptor */
USB_ID_BLENGTH, /* 0:bLength */
USB_DT_INTERFACE, /* 1:bDescriptor */
1, /* 2:bInterfaceNumber */
0, /* 3:bAlternateSetting */
2, /* 4:bNumEndpoints */
USB_IFCLS_CDCD, /* 5:bInterfaceClass */
0, /* 6:bInterfaceSubClass */
0, /* 7:bInterfaceProtocol */
0, /* 8:iInterface */
/* Endpoint Descriptor 0 */
USB_ED_BLENGTH, /* 0:bLength */
USB_DT_ENDPOINT, /* 1:bDescriptorType */
USB_EP_IN | USB_EP1, /* 2:bEndpointAddress */
USB_EP_BULK, /* 3:bmAttribute */
USB_W_MAX_PACKET_SIZE_MASK, /* 4:wMAXPacketSize_lo */
0, /* 5:wMAXPacketSize_hi */
0, /* 6:bInterval */
/* Endpoint Descriptor 1 */
USB_ED_BLENGTH, /* 0:bLength */
USB_DT_ENDPOINT, /* 1:bDescriptorType */
USB_EP_OUT | USB_EP2, /* 2:bEndpointAddress */
USB_EP_BULK, /* 3:bmAttribute */
USB_W_MAX_PACKET_SIZE_MASK, /* 4:wMAXPacketSize_lo */
0, /* 5:wMAXPacketSize_hi */
0, /* 6:bInterval */
};
/* For High-Speed */
uint8_t g_apl_hs_configuration[USB_PCDC_CD1_LEN + ( USB_PCDC_CD1_LEN % 2)] =
{
9, /* 0:bLength */
USB_SOFT_CHANGE, /* 1:bDescriptorType */
USB_PCDC_CD1_LEN % USB_W_TOTAL_LENGTH_MASK, /* 2:wTotalLength(L) */
USB_PCDC_CD1_LEN / USB_W_TOTAL_LENGTH_MASK, /* 3:wTotalLength(H) */
2, /* 4:bNumInterfaces */
1, /* 5:bConfigurationValue */
0, /* 6:iConfiguration */
USB_CF_RESERVED | USB_CF_SELFP, /* 7:bmAttributes */
(10 / 2), /* 8:MAXPower (2mA unit) */
/* Interface Descriptor */
9, /* 0:bLength */
USB_DT_INTERFACE, /* 1:bDescriptor */
0, /* 2:bInterfaceNumber */
0, /* 3:bAlternateSetting */
1, /* 4:bNumEndpoints */
USB_IFCLS_CDCC, /* 5:bInterfaceClass */
USB_PCDC_CLASS_SUBCLASS_CODE_ABS_CTR_MDL, /* 6:bInterfaceSubClass */
1, /* 7:bInterfaceProtocol */
0, /* 8:iInterface */
/* Communications Class Functional Descriptorss */
5, /* 0:bLength */
USB_PCDC_CS_INTERFACE, /* 1:bDescriptorType */
USB_PCDC_DT_SUBTYPE_HEADER_FUNC, /* 2:bDescriptorSubtype */
USB_PCDC_BCD_CDC % USB_PCDC_BCD_CDC_MASK, /* 3:bcdCDC_lo */
USB_PCDC_BCD_CDC / USB_PCDC_BCD_CDC_MASK, /* 4:bcdCDC_hi */
/* Communications Class Functional Descriptorss */
4, /* 0:bLength */
USB_PCDC_CS_INTERFACE, /* 1:bDescriptorType */
USB_PCDC_DT_SUBTYPE_ABSTRACT_CTR_MANAGE_FUNC, /* 2:bDescriptorSubtype */
2, /* 3:bmCapabilities */
/* Communications Class Functional Descriptorss */
5, /* 0:bLength */
USB_PCDC_CS_INTERFACE, /* 1:bDescriptorType */
USB_PCDC_DT_SUBTYPE_UNION_FUNC, /* 2:bDescriptorSubtype */
0, /* 3:bMasterInterface */
1, /* 4:bSlaveInterface0 */
/* Communications Class Functional Descriptorss */
5, /* 0:bLength */
USB_PCDC_CS_INTERFACE, /* 1:bDescriptorType */
USB_PCDC_DT_SUBTYPE_CALL_MANAGE_FUNC, /* 2:bDescriptorSubtype */
/* D1:1-Device can send/receive call management
information over a Data Class interface. */
/* D0:1-Device handles call management itself. */
3, /* 3:bmCapabilities */
1, /* 4:bDataInterface */
/* Endpoint Descriptor 0 */
7, /* 0:bLength */
USB_DT_ENDPOINT, /* 1:bDescriptorType */
USB_EP_IN | USB_EP3, /* 2:bEndpointAddress */
USB_EP_INT, /* 3:bmAttribute */
16, /* 4:wMAXPacketSize_lo */
0, /* 5:wMAXPacketSize_hi */
0x10, /* 6:bInterval */
/* Interface Descriptor */
9, /* 0:bLength */
USB_DT_INTERFACE, /* 1:bDescriptor */
1, /* 2:bInterfaceNumber */
0, /* 3:bAlternateSetting */
2, /* 4:bNumEndpoints */
USB_IFCLS_CDCD, /* 5:bInterfaceClass */
0, /* 6:bInterfaceSubClass */
0, /* 7:bInterfaceProtocol */
0, /* 8:iInterface */
/* Endpoint Descriptor 0 */
7, /* 0:bLength */
USB_DT_ENDPOINT, /* 1:bDescriptorType */
USB_EP_IN | USB_EP1, /* 2:bEndpointAddress */
USB_EP_BULK, /* 3:bmAttribute */
0, /* 4:wMAXPacketSize_lo */
2, /* 5:wMAXPacketSize_hi */
0, /* 6:bInterval */
/* Endpoint Descriptor 1 */
7, /* 0:bLength */
USB_DT_ENDPOINT, /* 1:bDescriptorType */
USB_EP_OUT | USB_EP2, /* 2:bEndpointAddress */
USB_EP_BULK, /* 3:bmAttribute */
0, /* 4:wMAXPacketSize_lo */
2, /* 5:wMAXPacketSize_hi */
0, /* 6:bInterval */
};
/*************************************
* String Descriptor *
*************************************/
/* UNICODE 0x0409 English (United States) */
uint8_t g_cdc_string_descriptor0[STRING_DESCRIPTOR0_LEN + ( STRING_DESCRIPTOR0_LEN % 2)] =
{
STRING_DESCRIPTOR0_LEN, /* 0:bLength */
USB_DT_STRING, /* 1:bDescriptorType */
0x09, 0x04 /* 2:wLANGID[0] */
};
/* iManufacturer */
uint8_t g_cdc_string_descriptor1[STRING_DESCRIPTOR1_LEN + ( STRING_DESCRIPTOR1_LEN % 2)] =
{
STRING_DESCRIPTOR1_LEN, /* 0:bLength */
USB_DT_STRING, /* 1:bDescriptorType */
'R', 0x00, /* 2:wLANGID[0] */
'E', 0x00,
'N', 0x00,
'E', 0x00,
'S', 0x00,
'A', 0x00,
'S', 0x00,
};
/* iProduct */
uint8_t g_cdc_string_descriptor2[STRING_DESCRIPTOR2_LEN + ( STRING_DESCRIPTOR2_LEN % 2)] =
{
STRING_DESCRIPTOR2_LEN, /* 0:bLength */
USB_DT_STRING, /* 1:bDescriptorType */
'C', 0x00,
'D', 0x00,
'C', 0x00,
' ', 0x00,
'U', 0x00,
'S', 0x00,
'B', 0x00,
' ', 0x00,
'D', 0x00,
'e', 0x00,
'm', 0x00,
'o', 0x00,
'n', 0x00,
's', 0x00,
't', 0x00,
'r', 0x00,
'a', 0x00,
't', 0x00,
'i', 0x00,
'o', 0x00,
'n', 0x00,
};
/* iInterface */
uint8_t g_cdc_string_descriptor3[STRING_DESCRIPTOR3_LEN + ( STRING_DESCRIPTOR3_LEN % 2)] =
{
STRING_DESCRIPTOR3_LEN, /* 0:bLength */
USB_DT_STRING, /* 1:bDescriptorType */
'C', 0x00,
'o', 0x00,
'm', 0x00,
'm', 0x00,
'u', 0x00,
'n', 0x00,
'i', 0x00,
'c', 0x00,
'a', 0x00,
't', 0x00,
'i', 0x00,
'o', 0x00,
'n', 0x00,
's', 0x00,
' ', 0x00,
'D', 0x00,
'e', 0x00,
'v', 0x00,
'i', 0x00,
'c', 0x00,
'e', 0x00,
's', 0x00
};
/* iConfiguration */
uint8_t g_cdc_string_descriptor4[STRING_DESCRIPTOR4_LEN + ( STRING_DESCRIPTOR4_LEN % 2)] =
{
STRING_DESCRIPTOR4_LEN, /* 0:bLength */
USB_DT_STRING, /* 1:bDescriptorType */
'F', 0x00, /* 2:wLANGID[0] */
'u', 0x00,
'l', 0x00,
'l', 0x00,
'-', 0x00,
'S', 0x00,
'p', 0x00,
'e', 0x00,
'e', 0x00,
'd', 0x00
};
/* iConfiguration */
uint8_t g_cdc_string_descriptor5[STRING_DESCRIPTOR5_LEN + ( STRING_DESCRIPTOR5_LEN % 2)] =
{
STRING_DESCRIPTOR5_LEN, /* 0:bLength */
USB_DT_STRING, /* 1:bDescriptorType */
'H', 0x00, /* 2:wLANGID[0] */
'i', 0x00,
'-', 0x00,
'S', 0x00,
'p', 0x00,
'e', 0x00,
'e', 0x00,
'd', 0x00
};
/* iSerialNumber */
uint8_t g_cdc_string_descriptor6[STRING_DESCRIPTOR6_LEN + ( STRING_DESCRIPTOR6_LEN % 2)] =
{
STRING_DESCRIPTOR6_LEN, /* 0:bLength */
USB_DT_STRING, /* 1:bDescriptorType */
'0', 0x00, /* 2:wLANGID[0] */
'0', 0x00,
'0', 0x00,
'0', 0x00,
'0', 0x00,
'0', 0x00,
'0', 0x00,
'0', 0x00,
'0', 0x00,
'0', 0x00,
'0', 0x00,
'0', 0x00,
'1', 0x00,
};
uint8_t *g_apl_string_table[] =
{
g_cdc_string_descriptor0,
g_cdc_string_descriptor1,
g_cdc_string_descriptor2,
g_cdc_string_descriptor3,
g_cdc_string_descriptor4,
g_cdc_string_descriptor5,
g_cdc_string_descriptor6
};
/******************************************************************************
Renesas Abstracted Peripheral Communications Devices Class Driver API functions
******************************************************************************/
/******************************************************************************
End Of File
******************************************************************************/
这里也能看出FSP配置软件的强大和瑞萨生态的完善,初始化代码如下:
logDebug("Start Open usb");
err = g_basic0.p_api->open(g_basic0.p_ctrl,g_basic0.p_cfg);
assert(FSP_SUCCESS == err);
logDebug("Open usb end");
需要在while循环中调用usb_process函数,case USB_STATUS_READ_COMPLETE:事件就是USB接收到数据的事件,接收到什么就输出什么。
编译后下载进MCU,通过TYPE-C线缆连接开发板和电脑,USB枚举过程如下:

同时电脑中会有一个虚拟端口生成。

打开串口调试助手,选择虚拟出来的串口并打开,进行发送数据测试,效果如下:

至此,本次的测评也就结束了
keil完整工程如下:
*附件:RA4M2_Sensor.7z