十三、从0开始卷出一个新项目之瑞萨RZN2L串口DMA接收不定长

目录

一、概述

二、rzn2l的elc不支持sci

[三、对策:通过rx引脚下降沿elc gpt](#三、对策:通过rx引脚下降沿elc gpt)

[3.1 用户手册](#3.1 用户手册)

[3.2 框图](#3.2 框图)

[3.3 fsp配置](#3.3 fsp配置)

[3.4 源码](#3.4 源码)

四、测试效果

五、RZN2L限制


一、概述

参考资料:

二、rzn2l的elc不支持sci

  • rzn2l的elc基本不支持通信等类的外设,只支持定时器adc等类的外设

三、对策:通过rx引脚下降沿elc gpt

3.1 用户手册

  • RX p16-6--->ELC single port0--->LLPP GPT event A(GPT_SOURCE_GPT_A)--->GTSSR(Start Source)

  • RX p16-6--->ELC single port0--->LLPP GPT event B(GPT_SOURCE_GPT_B)--->GTCSR(clear Source)

3.2 框图

3.3 fsp配置

3.4 源码

复制代码
void hal_entry(void)
{
    /* TODO: add your own code here */
    fsp_err_t err = g_uart0.p_api->open(g_uart0.p_ctrl, g_uart0.p_cfg);
    FSP_PARAMETER_NOT_USED(err);

    __asm volatile ("cpsie i");

    g_uart0.p_api->write(g_uart0.p_ctrl, (uint8_t *)"hello world!\n", sizeof("hello world!\n"));

    g_timer0.p_api->open(g_timer0.p_ctrl, g_timer0.p_cfg);
    g_timer0.p_api->enable(g_timer0.p_ctrl);

    g_elc.p_api->open(g_elc.p_ctrl, g_elc.p_cfg);
    g_elc.p_api->enable(g_elc.p_ctrl);

    g_timer0_ctrl.p_reg->GTSSR = GPT_SOURCE_GPT_A;//SCI RX p16-6--->ELC single port0--->LLPP GPT event A(GPT_SOURCE_GPT_A)--->GTSSR(Start Source)
    g_timer0_ctrl.p_reg->GTCSR = GPT_SOURCE_GPT_B;//SCI RX p16-6--->ELC single port0--->LLPP GPT event B(GPT_SOURCE_GPT_B)--->GTCSR(clear Source)

    R_SCI_UART_Read(&g_uart0_ctrl, (uint8_t*)g_receive_buffer, TEXT_LENGTH);//start uart0 dma rx

    while(1)
    {
        R_BSP_SoftwareDelay (1000, BSP_DELAY_UNITS_MILLISECONDS);
    }
}

void g_timer0CB(timer_callback_args_t *p_args)
{
    FSP_PARAMETER_NOT_USED(p_args);

    transfer_properties_t p_info;
    R_DMAC_InfoGet (g_transfer1.p_ctrl, &p_info);//rx dma

    uint8_t len = (uint8_t)(TEXT_LENGTH - p_info.transfer_length_remaining);//buf max - remaining = current recv len

    if(len > 0)
    {
        R_SCI_UART_Write(&g_uart0_ctrl, (uint8_t *)g_receive_buffer, TEXT_LENGTH - p_info.transfer_length_remaining);//for test

        R_SCI_UART_Read(&g_uart0_ctrl, (uint8_t*)g_receive_buffer, TEXT_LENGTH);//start uart0 dma rx
    }

    gpt0Cnt++;//for test
}

四、测试效果

五、RZN2L限制

  • rzn2l串口有0-5共6个

  • 支持dma串口0-4躬5个

  • 支持串口dma接收不动长串口0、串口4共2个

以上是指使用gpt elc来计算串口空闲这种方式下的限制
或许有其他方式没有限制

相关推荐
lkbhua莱克瓦242 小时前
用C语言实现——一个中缀表达式的计算器。支持用户输入和动画演示过程。
c语言·开发语言·数据结构·链表·学习方法·交友·计算器
The Mr.Nobody2 小时前
STM32MPU开发之旅:从零开始构建嵌入式Linux镜像
linux·stm32·嵌入式硬件
lwewan3 小时前
26考研——存储系统(3)
c语言·笔记·考研
阿川!3 小时前
嵌入式软件--stm32 DAY 3
stm32·单片机·嵌入式硬件
#金毛4 小时前
STM32的定时器输出PWM时,死区时间(DTR)如何计算
stm32·单片机·嵌入式硬件
无脑学c++4 小时前
STM32串口重定向:MDK与GCC重定向需重写的不同函数
stm32·单片机·物联网
Invinciblenuonuo5 小时前
STM32八股【6】-----CortexM3的双堆栈(MSP、PSP)设计
stm32·单片机·嵌入式硬件
2401_888859715 小时前
STM32 TIM编码器接口
stm32·单片机·嵌入式硬件
祁同伟.6 小时前
【数据结构 · 初阶】- 堆的实现
c语言·数据结构
夜夜敲码6 小时前
C语言教程(十六): C 语言字符串详解
c语言·开发语言