概述
RA4L1 评估套件可以使用户能够无缝评估 RA4L1 系列LQFP100 封装的微控制器功能,RA4L1 MCU 具有低功耗功能,例如段码 LCD 显示驱动器和高级安全引擎,以及 RTC、ADC 和定时器。 这些 MCU 集成了 CAN FD、USB 2.0 FS、I2C/I3C 和低功耗 UART 等通信接口,因此非常适合用于工业自动化、家电、智能家居、消费品、楼宇/家居自动化和医疗/保健应用。
这里通过配置LED和UART输出进行简单测试。
最近在瑞萨RA的课程,需要样片的可以加qun申请:925643491。
视频教学
https://www.bilibili.com/video/BV1iGRpYvEfJ/
样品申请
https://www.wjx.top/vm/rCrkUrz.aspx
产品特性
瑞萨电子 RA4L1 MCU 产品组,低功耗 32 位微控制器 (MCU),基于支持 TrustZone® 的 Arm® Cortex®-M33 (CM33) 内核,实现了低工作电压、低功耗与高性能的理想平衡。 RA4L1 的工作电压低至 1.6V,待机电流低至 1.65µA,并具有多种低功耗功能,用户能够根据应用要求来动态优化功耗/性能。
参考程序
https://github.com/CoreMaker-lab/RA4L1
https://gitee.com/CoreMaker/RA4L1
源码下载
硬件准备
首先需要准备一个开发板,这里我准备的是自己绘制的开发板,需要的可以进行申请。
主控为R7FA4L1BD4CFP
新建工程
工程模板
保存工程路径
芯片配置
本文中使用R7FA4L1BD4CFP来进行演示。
工程模板选择
时钟设置
开发板上的外部高速晶振为8M.
需要修改XTAL为8M。
GPIO口配置
由下图我们可以得知,板子上有3个LED灯,同时需要给高电平才可以点亮,故以P601、P610、P609管脚为例,配置方式如下所示。
在e2studio中可以直接设置P601、P610、P609为输出口。
UART配置
点击Stacks->New Stack->Connectivity -> UART(r_sci_uart)。
UART属性配置
e2studio_134">设置e2studio堆栈
printf函数通常需要设置堆栈大小。这是因为printf函数在运行时需要使用栈空间来存储临时变量和函数调用信息。如果堆栈大小不足,可能会导致程序崩溃或不可预期的行为。
printf函数使用了可变参数列表,它会在调用时使用栈来存储参数,在函数调用结束时再清除参数,这需要足够的栈空间。另外printf也会使用一些临时变量,如果栈空间不足,会导致程序崩溃。
因此,为了避免这类问题,应该根据程序的需求来合理设置堆栈大小。
e2studioprintf_147">e2studio的重定向printf设置
主程序
#include "hal_data.h"
#include <stdio.h>FSP_CPP_HEADER
void R_BSP_WarmStart(bsp_warm_start_event_t event);
FSP_CPP_FOOTERfsp_err_t err = FSP_SUCCESS;
volatile bool uart_send_complete_flag = false;
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)
#endifPUTCHAR_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;
}/*******************************************************************************************************************//*** 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 *//* Open the transfer instance with initial configuration. */err = R_SCI_UART_Open(&g_uart9_ctrl, &g_uart9_cfg);assert(FSP_SUCCESS == err);printf("hello world!\n");while(1){printf("Hello e2studio!\n");R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_06_PIN_01, BSP_IO_LEVEL_HIGH);R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_06_PIN_10, BSP_IO_LEVEL_HIGH);R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_06_PIN_09, BSP_IO_LEVEL_HIGH);R_BSP_SoftwareDelay (500, BSP_DELAY_UNITS_MILLISECONDS);R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_06_PIN_01, BSP_IO_LEVEL_LOW);R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_06_PIN_10, BSP_IO_LEVEL_LOW);R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_06_PIN_09, BSP_IO_LEVEL_LOW);R_BSP_SoftwareDelay (500, BSP_DELAY_UNITS_MILLISECONDS);}#if BSP_TZ_SECURE_BUILD/* Enter non-secure code */R_BSP_NonSecureEnter();
#endif
}