RA\\-Eco\\-RA4E2\\-64PIN\\-V1\\.0是一款基于100MHz Arm® Cortex®\\-M33内核架构的核心板,主控芯片为R7FA4E2B93CFM。RA4E2组是RA4系列中最新的入门级微控制器,基于带有TrustZone的100MHz Arm® Cortex®\\-M33内核。RA4E2 MCU提供了高性能和优化的外设功能以及最小的封装选项,包括节省空间的36引脚BGA和32引脚QFN封装。这些都满足了对成本敏感和空间受限的应用的需要。由于RA4E2具有均衡的性能、先进的外设功能和可扩展性,它为更广泛的RA系列提供了一个入门点
2.特性:
3.相关链接
RA生态社区论坛:https://ramcu.cn
资料链接: https://www.ramcu.cn/index.php/lists/21.html
gitee链接:https://gitee.com/ramcu
其他学习资料
选择P402、P401为OLED显示屏I2C接口的SCL与SDA引脚,选择P110、P109作为UART串口引脚,新建工程选择R7FA4E2B93CFM作为平台芯片,再进行IO和UART设置,设置UART工作方式和中断函数名,uart引脚;设置OLED使用的I2C引脚功能:
接下来移植代码并调试UART数据传输,然后修改 hal_entry.c文件中关键代码:
#include "hal_data.h"
#include<stdio.h>
#include "oled.h"
FSP_CPP_HEADER
void R_BSP_WarmStart(bsp_warm_start_event_t event);
FSP_CPP_FOOTER
fsp_err_t err = FSP_SUCCESS;
volatile bool uart_send_complete_flag = false;
uint8_t RxBuff[1]; //进入中断接收数据的数组
uint8_t DataBuff[5000]; //保存接收到的数据的数组
char hollow[10]="hollow";
int RxLine=0; //接收到的数据长度
int Rx_flag=0; //接受到数据标志
int Rx_flag_finish=0; //接受完成或者时间溢出
void user_uart_callback (uart_callback_args_t * p_args) //串口中断回调函数
{if(p_args->event == UART_EVENT_TX_COMPLETE)
{
uart_send_complete_flag = true;
}
}
#ifdef GNUC //串口重定向
\\#define PUTCHAR\\_PROTOTYPE int \\_\\_io\\_putchar\\(int ch\\)
#else
\\#define PUTCHAR\\_PROTOTYPE int fputc\\(int ch, FILE \\*f\\)
#endif
PUTCHAR_PROTOTYPE
{
err = R\\_SCI\\_UART\\_Write\\(&g\\_uart9\\_ctrl, \\(uint8\\_t \\*\\)&ch, 1\\);
if\\(FSP\\_SUCCESS \\!= err\\) \\_\\_BKPT\\(\\);
while\\(uart\\_send\\_complete\\_flag == false\\)\\{\\}
uart\\_send\\_complete\\_flag = false;
return ch;
}
int _write(int fd,char *pBuffer,int size)
{
for\\(int i=0;i<size;i\\+\\+\\)
\\{
\\_\\_io\\_putchar\\(\\*pBuffer\\+\\+\\);
\\}
return size;
}
要使用printf函数还要进行设置,要在编译设置中完成如下配置,右键项目进入属性界面,选择 C/C++ 构建 - 设置 - GNU Arm Cross C Linker - Miscellaneous,勾选 printf 、scanf 以及syscalls 选项:
再将OLED对应代码加入到项目工程中,再修改oled.h中的代码:
#define OLED_SCL_Set() R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_02, BSP_IO_LEVEL_HIGH)
#define OLED_SCL_Clr() R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_02, BSP_IO_LEVEL_LOW)
#define OLED_SDA_Clr() R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_01, BSP_IO_LEVEL_LOW)
#define OLED_SDA_Set() R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_01, BSP_IO_LEVEL_HIGH)
在主函数中调用OLED显示函数:
void hal_entry(void)
{
/\\* TODO: add your own code here \\*/
err = R\\_SCI\\_UART\\_Open\\(&g\\_uart9\\_ctrl, &g\\_uart9\\_cfg\\);
assert\\(FSP\\_SUCCESS == err\\);
OLED\\_Init\\(\\);
OLED\\_ColorTurn\\(0\\);//0正常显示,1 反色显示
OLED\\_DisplayTurn\\(0\\);//0正常显示 1 屏幕翻转显示
while(1)
{ OLED_Refresh();
R_BSP_SoftwareDelay (500, BSP_DELAY_UNITS_MILLISECONDS);
OLED_Clear();
OLED_ShowChinese(0,0,0,16,1);//中
OLED_ShowChinese(18,0,1,16,1);//景
OLED_ShowChinese(36,0,2,16,1);//园
OLED_ShowChinese(54,0,3,16,1);//电
OLED_ShowChinese(72,0,4,16,1);//子
OLED_ShowChinese(90,0,5,16,1);//技
OLED_ShowChinese(108,0,6,16,1);//术
OLED_ShowString(8,16,"ZHONGJINGYUAN",16,1);
OLED_ShowString(20,32,"2014/05/01",16,1);
printf\\("hollow world \\\\n"\\);
printf\\("length=%d\\\\r\\\\n",RxLine\\);
R\\_SCI\\_UART\\_Write\\(&g\\_uart9\\_ctrl, hollow, 6\\);
R\\_BSP\\_SoftwareDelay\\(500, BSP\\_DELAY\\_UNITS\\_MILLISECONDS\\); // NOLINT
R\\_IOPORT\\_PinWrite\\(&g\\_ioport\\_ctrl, BSP\\_IO\\_PORT\\_02\\_PIN\\_07, BSP\\_IO\\_LEVEL\\_LOW\\);
R\\_BSP\\_SoftwareDelay\\(500, BSP\\_DELAY\\_UNITS\\_MILLISECONDS\\); // NOLINT
R\\_IOPORT\\_PinWrite\\(&g\\_ioport\\_ctrl, BSP\\_IO\\_PORT\\_02\\_PIN\\_07, BSP\\_IO\\_LEVEL\\_HIGH\\);
\\}
#if BSP_TZ_SECURE_BUILD
/\\* Enter non\\-secure code \\*/
R\\_BSP\\_NonSecureEnter\\(\\);
#endif
}
当然还要根据出现error进行逐个修改;
要测量温度传感器DHT11必须按照协议进行读取数据,接数据线到P0104引脚;

按照以下协议进行数据读取:
要注意引脚输入输出切换函数为:
R_IOPORT_PinCfg(&g_ioport_ctrl, BSP_IO_PORT_01_PIN_04, IOPORT_CFG_PORT_DIRECTION_OUTPUT);
R_IOPORT_PinCfg(&g_ioport_ctrl, BSP_IO_PORT_01_PIN_04 , BSP_IO_DIRECTION_INPUT );
编写DHT11读取程序如下:
typedef struct
{
uint8_t humi_high8bit;
uint8_t humi_low8bit;
uint8_t temp_high8bit;
uint8_t temp_low8bit;
uint8_t check_sum;
float humidity;
float temperature;
} DHT11_Data_TypeDef;
DHT11_Data_TypeDef DHT11_Data;
uint8_t showdata[8];
unsigned char U8FLAG,U8comdata,U8temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
unsigned char U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H,U8RH_data_L;
unsigned char str[5],U8T_data_H,U8T_data_L,U8checkdata;
static uint8_t DHT11_ReadByte (void )
{
uint8_t i, temp=0;
//R_IOPORT_PinCfg(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_07, BSP_IO_DIRECTION_INPUT);
//R_IOPORT_PinCfg(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_07, BSP_IO_DIRECTION_OUTPUT);
R_IOPORT_PinCfg(&g_ioport_ctrl, BSP_IO_PORT_01_PIN_04 , BSP_IO_DIRECTION_INPUT );
for (i=0;i<8;i++)
{
while (R_BSP_PinRead( BSP_IO_PORT_01_PIN_04 )==0);
R_BSP_SoftwareDelay (40, BSP_DELAY_UNITS_MICROSECONDS );
if (R_BSP_PinRead( BSP_IO_PORT_01_PIN_04 )==1)
{
while (R_BSP_PinRead( BSP_IO_PORT_01_PIN_04 )==1);
temp|=(uint8_t)(0x01<<(7-i));
}
else
{
temp&=(uint8_t)~(0x01<<(7-i));
}
}
return temp;
}
uint8_t DHT11_Read_TempAndHumidity (DHT11_Data_TypeDef *DHT11_Data)
{
uint8_t temp;
uint16_t humi_temp;
R_IOPORT_PinCfg(&g_ioport_ctrl, BSP_IO_PORT_01_PIN_04 , IOPORT_CFG_PORT_DIRECTION_OUTPUT );
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_01_PIN_04 , BSP_IO_LEVEL_LOW );
R_BSP_SoftwareDelay (20, BSP_DELAY_UNITS_MILLISECONDS );
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_01_PIN_04 , BSP_IO_LEVEL_HIGH );
R_BSP_SoftwareDelay (30, BSP_DELAY_UNITS_MICROSECONDS );
R_IOPORT_PinCfg(&g_ioport_ctrl, BSP_IO_PORT_01_PIN_04 , BSP_IO_DIRECTION_INPUT );
R_BSP_SoftwareDelay (30, BSP_DELAY_UNITS_MICROSECONDS );
if (R_BSP_PinRead( BSP_IO_PORT_01_PIN_04 )==0)
{
while (R_BSP_PinRead( BSP_IO_PORT_01_PIN_04 )==0);
while (R_BSP_PinRead( BSP_IO_PORT_01_PIN_04 )==1);
DHT11_Data->humi_high8bit= DHT11_ReadByte();
DHT11_Data->humi_low8bit = DHT11_ReadByte();
DHT11_Data->temp_high8bit= DHT11_ReadByte();
DHT11_Data->temp_low8bit = DHT11_ReadByte();
DHT11_Data->check_sum = DHT11_ReadByte();
// DHT11_Mode_Out_PP();
R_IOPORT_PinCfg(&g_ioport_ctrl, BSP_IO_PORT_01_PIN_04 , IOPORT_CFG_PORT_DIRECTION_OUTPUT );
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_01_PIN_04 , BSP_IO_LEVEL_HIGH );
humi_temp=DHT11_Data->humi_high8bit*100+DHT11_Data->humi_low8bit;
DHT11_Data->humidity =( float )humi_temp/100;
humi_temp=DHT11_Data->temp_high8bit*100+DHT11_Data->temp_low8bit;
DHT11_Data->temperature=( float )humi_temp/100;
temp = DHT11_Data->humi_high8bit + DHT11_Data->humi_low8bit +
DHT11_Data->temp_high8bit+ DHT11_Data->temp_low8bit;
if (DHT11_Data->check_sum==temp)
{return 1;}
else return 0;}
else return 0;
}
OLED显示和接线如图:
更多回帖