目录
目录
概述:
本篇文章主要介绍如何使用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转移了数据。
我先记录到这儿,接下来继续完善。