原创 【瑞萨 RA6E2】+按键LED+串口中断收发+内部虚拟EEPROM

2023-7-24 13:37 676 3 3 分类: MCU/ 嵌入式 文集: 瑞萨
硬件:瑞萨RA6E2
软件:FSP 4.0.5 / e2studio (需要使用4.0.5才可以选择RA6E2的芯片R7FA6E2BB3CFM
资料参考:
新建工程流程:
文件->新建->瑞萨C/C++项目->Renesas RA



选择保存工程的路径

选择芯片型号

一· 按键LED
LED灯和按键原理图

LED灯引脚配置

按键引脚配置



stack配置


#define USER_SW_IRQ_NUMBER ( 10 )
  • volatile bool g_sw_press = false;
  • void hal_entry(void)
  • {
  • /* TODO: add your own code here */
  • bsp_io_level_t led_current_state = (bsp_io_level_t) 0x01;
  •        /* 打开外部中断*/
  • R_ICU_ExternalIrqOpen(&g_external_irq0_ctrl, &g_external_irq0_cfg);</p><p>/*使能外部中断*/
  • R_ICU_ExternalIrqEnable(&g_external_irq0_ctrl);
  • while (true)
  • {
  • /* Toggle user LED when user pushbutton is pressed*/
  • if(true == g_sw_press)
  • {
  • /* Clear user pushbutton flag */
  • g_sw_press = false;
  • /* Read user LED pin */
  • R_IOPORT_PinRead(&g_ioport_ctrl, LED1, &led_current_state);
  • /* Reverse LED pin state*/
  • led_current_state ^= BSP_IO_LEVEL_HIGH;
  • /* Toggle user LED */
  • R_IOPORT_PinWrite(&g_ioport_ctrl, LED1, led_current_state);
  • R_IOPORT_PinRead(&g_ioport_ctrl, LED2, &led_current_state);
  • led_current_state ^= BSP_IO_LEVEL_HIGH;
  • R_IOPORT_PinWrite(&g_ioport_ctrl, LED2, led_current_state);
  • }
  • }
  • #if BSP_TZ_SECURE_BUILD
  • /* Enter non-secure code */
  • R_BSP_NonSecureEnter();
  • #endif
  • }
  • void irq_ep_callback(external_irq_callback_args_t *p_args)
  • {
  • if (USER_SW_IRQ_NUMBER == p_args->channel)
  • {
  • g_sw_press = true;
  • }
  • }
  • 复制代码


    二· 串口收发

    串口原理图

    注意:需要用跳帽连接如下位置


    串口配置

    引脚配置



    代码参考的是野火

    SCI UART——串口通信
    三· 内部虚拟EEPROM使用
    RA6E2有4KB 虚拟EEPROM,也就是4096字节,但是由于使用rm_vee_flash组件实际只有2028字节可以使用



    void rm_vee_example();
  • /* 用于写数据完成*/
  • volatile bool callback_called = false;
  • /* 内部大小是4kb, 每个字节占用2byte大小,理论存储2048字节,
  • * 每一条记录需要8字节的数据的开头和结尾,占用16字节,所以只有2032字节可以使用,还要预留Padding 3字节
  • */
  • /* 写入数据的长度*/
  • #define DATA_SIZE ( 2028 )
  • /* Record ID 用来记录存取的数据 0-15*/
  • #define ID_TESTDATA ( 1U )
  • /* Example data Structure*/
  • uint8_t data[DATA_SIZE] = {0};
  • uint8_t data_recv[DATA_SIZE] = { 0 };
  • uint8_t data_recv1[DATA_SIZE] = { 0 };
  • uint32_t length = DATA_SIZE;
  • /*******************************************************************************************************************//**
  • * @brief 这个函数擦除VEEPROM使用的整个数据闪存。
  • * @param[IN] None
  • * @retval FSP_SUCCESS 格式化成功除
  • * @retval FSP_SUCCESSFSP_SUCCESS之外的任何其他错误码
  • **********************************************************************************************************************/
  • fsp_err_t vee_format_operation(void)
  • {
  • fsp_err_t err = FSP_SUCCESS;
  • uint8_t ref_data = 0;
  • rm_vee_status_t p_status;
  • /* Start a manual format operation.*/
  • err = RM_VEE_FLASH_Format(&g_vee0_ctrl, &ref_data);
  • if(FSP_SUCCESS != err)
  • {
  • return err;
  • }
  • /* Get the current status of the driver.*/
  • err = RM_VEE_FLASH_StatusGet(&g_vee0_ctrl, &p_status);
  • if(FSP_SUCCESS != err)
  • {
  • return err;
  • }
  • /* Compare Last ID written with Default ID.*/
  • if (ID_TESTDATA == p_status.last_id)
  • {
  • }
  • else
  • {
  • err = FSP_ERR_NOT_ERASED;
  • }
  • return err;
  • }
  • void rm_vee_example()
  • {
  • int i = 0;
  • uint8_t *data_ptr1 = 0;
  • uint8_t *data_ptr2 = 0;
  • /* 打开 Virtual EEPROM Module. */
  • fsp_err_t err = RM_VEE_FLASH_Open(&g_vee0_ctrl, &g_vee0_cfg);
  • assert(FSP_SUCCESS == err);
  • /* 格式化EEPROM*/
  • // vee_format_operation();
  • /* 先读一次,表示断电后读取数据,验证数据的正确性*/
  • err = RM_VEE_FLASH_RecordPtrGet(&g_vee0_ctrl, ID_TESTDATA,
  • (uint8_t **) &data_ptr1, &length);
  • for(i = 0; i < DATA_SIZE; ++i)
  • data_recv1[i] = *data_ptr1++;
  • length = DATA_SIZE;
  • /* 填充数据*/
  • for (i = 0; i < DATA_SIZE; ++i)
  • {
  • data[i] = (uint8_t)i;
  • }
  • /* Write the pressure data to a Virtual EEPROM Record. */
  • err = RM_VEE_FLASH_RecordWrite(&g_vee0_ctrl, ID_TESTDATA,
  • (uint8_t *)data, length);
  • assert(FSP_SUCCESS == err);
  • /* Wait for the Virtual EEPROM callback to indicate it finished writing data. */
  • while (false == callback_called);
  • /* Get a pointer to the record that is stored in data flash. */
  • err = RM_VEE_FLASH_RecordPtrGet(&g_vee0_ctrl, ID_TESTDATA,
  • (uint8_t **) &data_ptr2, &length);
  • assert(FSP_SUCCESS == err);
  • for(i = 0; i < DATA_SIZE; ++i)
  • data_recv[i] = *data_ptr2++;
  • //读取数据与写入数据一致则点亮蓝色LED灯
  • R_IOPORT_PinWrite(&g_ioport_ctrl, LED1, BSP_IO_LEVEL_LOW);
  • for (i = 0; i < DATA_SIZE; ++i)
  • {
  • if (data[i] != data_recv[i])
  • break;
  • }
  • if (i == DATA_SIZE)
  • R_IOPORT_PinWrite(&g_ioport_ctrl, LED1, BSP_IO_LEVEL_HIGH);
  • /* Close the Virtual EEPROM Module. */
  • err = RM_VEE_FLASH_Close(&g_vee0_ctrl);
  • assert(FSP_SUCCESS == err);
  • }
  • void vee_callback(rm_vee_callback_args_t *p_args)
  • {
  • FSP_PARAMETER_NOT_USED(p_args);
  • callback_called = true;
  • }
  • 复制代码



    void hal_entry(void)
  • {
  • /* TODO: add your own code here */
  • rm_vee_example();
  • #if BSP_TZ_SECURE_BUILD
  • /* Enter non-secure code */
  • R_BSP_NonSecureEnter();
  • #endif
  • }
  • 复制代码

    作者: 莫羨, 来源:面包板社区

    链接: https://mbb.eet-china.com/blog/uid-me-4040671.html

    版权声明:本文为博主原创,未经本人允许,禁止转载!

    PARTNER CONTENT

    文章评论0条评论)

    登录后参与讨论
    我要评论
    0
    3
    关闭 站长推荐上一条 /3 下一条