目录
[三、对策:通过rx引脚下降沿elc gpt](#三、对策:通过rx引脚下降沿elc gpt)
[3.1 用户手册](#3.1 用户手册)
[3.2 框图](#3.2 框图)
[3.3 fsp配置](#3.3 fsp配置)
[3.4 源码](#3.4 源码)
一、概述
-
关键原理:串口空闲中断,stm32利用空闲中断来处理串口dma接收不定长度,可用hal库api
-
瑞萨RA使用gpt定时器和elc来硬件检测串口空闲。但是:1、fsp没有sci+dma的api,需要自己封装;2:dma接收不定长的实现
-
瑞萨RZN2l可以按照RA的思路来实现,但是rzn2l的elc源不支持串口接收满,如何实现?
参考资料:
- STM32之串口DMA接收不定长数据:https://shequ.stmicroelectronics.cn/thread-617564-1-1.html
二、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来计算串口空闲这种方式下的限制
或许有其他方式没有限制