瑞萨单片机论坛
直播中

yhw

未满1年用户 27经验值
擅长:物联网
私信 关注
[经验]

【RA4E2开发板评测】开箱、Hello World(串口+OLED)

OLED

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

DSC00243.jpg

本篇文章使用 Keil 开发,完成以下两个实验:

  • 串口打印 Hello World
  • OLED 12864 显示屏显示 Hello World

【串口打印】

使用 FPS Smart Configuration 设置串口,原理图如下:

11.png

开发板上串口是 P109、P110,对应 SCI UART 9

引脚配置:

15.png

外设配置:

16.png

串口时钟设置为 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 接口,原理图如下:

12.png

开发板上 I2C 接口是 P100、P101,对应 SCI I2C 0

引脚配置:

13.png

外设配置:

14.png

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);

显示效果如下:

DSC00295.jpg

更多回帖

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