RA-Eco-RA6E2 开发板使用瑞萨 200MHz ARM Cortex-M33 内核 R7FA6E2 单片机,性能较 STM32F1 强不少,开发板实物图如下:

本篇文章使用 Keil 开发,完成以下两个实验:
- 串口打印 Hello World
- OLED 12864 显示屏显示 Hello World
【串口打印】
使用 FPS Smart Configuration 设置串口,原理图如下:

开发板上串口是 P109、P110,对应 SCI UART 9
引脚配置:

外设配置:

串口时钟设置为 115200 bps
配置完导出代码,代码里打开端口:
void Uart9_Init(u32 bps)
{
UNUSED(bps);
R_SCI_UART_Open(&g_uart9_ctrl, &g_uart9_cfg);
gf_Uart9_Busy = 0;
}
在回调函数里判断状态:
void sci_uart9_callback(uart_callback_args_t * p_args)
{
if(p_args->event == UART_EVENT_TX_COMPLETE)
{
gf_Uart9_Busy = 0;
}
}
串口发送函数如下:
void Uart9_Tx1B(u8 dat)
{
fsp_err_t err;
while (gf_Uart9_Busy);
gf_Uart9_Busy = 1;
err = R_SCI_UART_Write(&g_uart9_ctrl, &dat, 1);
if(FSP_SUCCESS != err) __BKPT();
}
接口代码调通了,就可以进一步进行打印和显示了,串口重映射 printf 函数,官方代码如下:
#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_uart0_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;
}
这段代码在 Keil 里并不能完成串口重定向,原因是 Keil 里使用的 ARM Compiler 6 (armclang) 也定义了宏 GNUC ,在 Keil 里直接重写 int fputc(int ch, FILE *f) 就可以,如下:
int fputc(int ch, FILE *f)
{
UNUSED(f);
Printf_Uart_Tx1B((u8)ch);
return ch;
}
配置完调用以下代码打印 Hello World:
Uart9_Init(115200);
printf("Hello World");
【OLED 显示屏】
使用 FPS Smart Configuration 设置 I2C 接口,原理图如下:

开发板上 I2C 接口是 P100、P101,对应 SCI I2C 0
引脚配置:

外设配置:

I2C 时钟设置为 Fast mode(400K),从机地址在代码中设置即可
配置完导出代码,代码里打开端口:
void I2C0_Init(u32 bps)
{
UNUSED(bps);
R_SCI_I2C_Open(&g_i2c0_ctrl, &g_i2c0_cfg);
}
在回调函数里判断状态:
void sci_i2c_master_callback(i2c_master_callback_args_t *p_args)
{
i2c0_event = I2C_MASTER_EVENT_ABORTED;
if (NULL != p_args)
{
i2c0_event = p_args->event;
}
}
I2C 写寄存器函数如下:
sret I2C0_Wr1B(u8 addr, u8 reg, u8 dat)
{
fsp_err_t err;
u8 buf[2], t;
sci_i2c_instance_ctrl_t *p_ctrl = (sci_i2c_instance_ctrl_t *)(&g_i2c0_ctrl);
p_ctrl->slave = addr;
buf[0] = reg;
buf[1] = dat;
err = R_SCI_I2C_Write(&g_i2c0_ctrl, buf, 0x02, true);
assert(FSP_SUCCESS == err);
I2C_WAIT(I2C_MASTER_EVENT_TX_COMPLETE!=i2c0_event, 100);
if (I2C_MASTER_EVENT_ABORTED == i2c0_event) __BKPT(0);
i2c0_event = I2C_MASTER_EVENT_ABORTED;
return err == FSP_SUCCESS ? SR_OK : SR_ERR;
}
OLED 12864 则进行寄存器初始化后,调用字模显示 Hello World,400Kbps 的速率刷屏还是略显卡顿的,建议 IO 模拟 I2C 可以达到更快速率:
OLED_SSD1306_Init();
OLED_SSD1306_Fill(Black);
OLED_SSD1306_Str("Hello Word", 0, 0);
显示效果见视频