瑞萨e2studio(1)----DTC测试Data Transfer Controller&外部中断&Clock&低功耗模式

目录

概述:

目录

概述:

硬件准备:

新建工程:

 工程模板:

 保存工程路径:

芯片配置:

工程模板选择:

时钟资源配置:

LED指示灯和按钮配置:

 外部中断设置:

 LED设置:

LPM模式设置:

DTC模式配置:

编写测试代码:



概述:

本篇文章主要介绍如何使用e2studio对瑞萨单片机进行DTC功能测试,其中包含有外部中断,时钟树的配置,低功耗模式的简单应用。仅供入门使用,具体研究还需多看硬件设计手册。

A Data Transfer Controller (DTC) module is provided for transferring data when activated by an interrupt request.

当有中断发生时,会执行数据的搬运。

本文会持续更新,请关注。

硬件准备:

首先需要准备一个开发板,这里我准备的是芯片型号R7FA2E1A92DFM的开发板EK-RA2E1。128KB flash,16KB Sram,4KB Data flash。

新建工程:

在这里插入图片描述

 工程模板:

在这里插入图片描述

 保存工程路径:

芯片配置:

本文中使用R7FA2E1A92DFM来进行演示。

工程模板选择:

时钟资源配置:

面对任何一款MCU,它的时钟树非常大关键,初学者应该花点时间把时钟树先理清楚,再去做其他的任务。E2stduio提供了图型化时钟配置界面,非常方便理解。

 时钟默认配置,可以看到ICLK为系统时钟,为48MHz,外设时钟B为24MHz,外设时钟D是48MHz,在本例中不做修改。掌握时钟树对一款MCU的理解至关重要。

LED指示灯和按钮配置:

P913,P914 ,P915驱动3个LED灯,P004接按钮S1。

 外部中断设置:

在Pins标签栏选择INPUT->ICU0,选择中断IRQ03:P004。

在Stack标签栏中,选择new stac->Drive->Input->外部中断驱动 r_icu。

注意选择通道3,修改一下名字,我个人不喜欢,也可以不修改。在本例中我不关注中断回调函数相关的内容,我只是想重点关注的是LPM模式和DTC数据传输部分,所以在这里对回调函数默认为NULL,不做修改。

 LED设置:

P913,P914,P915 三个LED灯配置为输出模式就可以了。然后点击生成,

LPM模式设置:

在stack标签栏中,选择new stac->Drive->Power->低功耗 r_lpm。

注意这里面关键的选项,唤醒源一定要选择IRQ03,也就是上面的中断源。这样系统中低功耗模式下,才能被按钮3触发欢喜。

DTC模式配置:

在stack标签栏中,选择new stac->Drive->Transfer- 数据转移 r_dtc。

注意这里的配置,我理解的DTC就是不用CPU干预,就可以把数据从一个地址搬移到内存的另外一个地址,我现在想让数据从0x20004080转移到0x20004083。

值得注意到是,我在这个IDE中定义变量指定地址时,编译器并不理会我的指令,有知道的同学告诉我一下。

uint8_t P_Dest3 __attribute__((section(".ARM.__at_0x20004080"))) = 0xFF;//does't work

这个语句并不起作用,所以我为了测试,先去定义了4个变量,知道他们的地址,然后再测试的。这样做不合理,需要修改。

特别要注意的是,Interrupt Frequency选项,必须是After each transfer。不然中断无法唤醒,我也不知道为什么。 

编写测试代码:

这下面的程序实现的时,按钮按一下,休眠一次,把Dest的值搬运一次给Dest3。 

uint8_t P_Dest=0x06;
uint8_t P_Dest1=0x01;
uint8_t P_Dest2=0x01;
uint8_t P_Dest3=0xFF;

//uint8_t P_Dest3 __attribute__((section(".ARM.__at_0x20004080"))) = 0xFF;

void BlinkLed()
{
    g_transfer0.p_api->open(g_transfer0.p_ctrl,g_transfer0.p_cfg);
    g_transfer0.p_api->enable(g_transfer0.p_ctrl);
    g_transfer0.p_api->softwareStart(g_transfer0.p_ctrl,TRANSFER_START_MODE_REPEAT);
    P_Dest3=0xFF;
    g_lpm.p_api->open(g_lpm.p_ctrl,g_lpm.p_cfg);
    g_external_irq.p_api->open(g_external_irq.p_ctrl,g_external_irq.p_cfg);
    g_external_irq.p_api->enable(g_external_irq.p_ctrl);
    while(1)
    {
        R_BSP_SoftwareDelay(100,BSP_DELAY_UNITS_MILLISECONDS);
        g_ioport.p_api->pinWrite(&g_ioport_ctrl,BSP_IO_PORT_09_PIN_13,1);
        g_ioport.p_api->pinWrite(&g_ioport_ctrl,BSP_IO_PORT_09_PIN_14,0);
        g_ioport.p_api->pinWrite(&g_ioport_ctrl,BSP_IO_PORT_09_PIN_15,0);
        R_BSP_SoftwareDelay(100,BSP_DELAY_UNITS_MILLISECONDS);
        g_ioport.p_api->pinWrite(&g_ioport_ctrl,BSP_IO_PORT_09_PIN_13,0);
        g_ioport.p_api->pinWrite(&g_ioport_ctrl,BSP_IO_PORT_09_PIN_14,1);
        g_ioport.p_api->pinWrite(&g_ioport_ctrl,BSP_IO_PORT_09_PIN_15,1);
        g_lpm.p_api->lowPowerModeEnter(g_lpm.p_ctrl);
        P_Dest++;
        P_Dest1++;
        P_Dest2++;
    }
}

测试结果如下:可见,初始化时,PDest=6,PDest3=255。

只要按一PDest3就会和Pdest同步。在程序中并没有任何改变Pdest3的代码,Pdest3变量能变更的唯一原因就是DTC转移了数据。

我先记录到这儿,接下来继续完善。 

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值