瑞萨e2studio.16--基于DTC的多通道ADC采集
概述
本篇文章主要介绍如何使用e2studio对瑞萨进行DTC配置,并且对多通道ADC进行采集。
需要样片的可以加Q_QUN申请:6_15061293。
视频教学
听不到声音的请点击跳转进行观看。
https://www.bilibili.com/video/BV1cW4y1J783/
瑞萨e2studio(17)----基于DTC的多通道ADC采集
csdn课程
csdn课程更加详细。
https://edu.csdn.net/course/detail/36131
样品申请
https://www.wjx.top/vm/wBbmSFp.aspx#
完整代码下载
https://download.csdn.net/download/qq_24312945/87371587
硬件准备
硬件准备:这里我准备的是芯片型号R7FA4M2AD3CFP的开发板。
开发板
新建工程
工程模板
保存工程路径
芯片配置
本文中使用R7FA4M2AD3CFP来进行演示。
工程模板选择
uart配置
点击Stacks->New Stack->Driver->Connectivity -> UART Driver on r_sci_uart。
uart属性配置
回调函数user_uart_callback ()
发送完毕可以用UART_EVENT_TX_COMPLETE进行判断。
volatile bool uart_send_complete_flag = false;
void user_uart_callback (uart_callback_args_t * p_args)
{
if(p_args->event == UART_EVENT_TX_COMPLETE)
{
uart_send_complete_flag = true;
}
}
设置e2studio堆栈
e2studio的重定向printf设置
e2studio的重定向printf设置
C++ 构建->设置->GNU ARM Cross C Linker->Miscellaneous去掉Other linker flags中的 “–specs=rdimon.specs”
printf输出重定向到串口
打印最常用的方法是printf,所以要解决的问题是将printf的输出重定向到串口,然后通过串口将数据发送出去。
注意一定要加上头文件#include <stdio.h>
#ifdef __GNUC__ //串口重定向
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
PUTCHAR_PROTOTYPE
{
err = R_SCI_UART_Write(&g_uart9_ctrl, (uint8_t *)&ch, 1);
if(FSP_SUCCESS != err) __BKPT();
while(uart_send_complete_flag == false){}
uart_send_complete_flag = false;
return ch;
}
int _write(int fd,char *pBuffer,int size)
{
for(int i=0;i<size;i++)
{
__io_putchar(*pBuffer++);
}
return size;
}
ADC配置
点击Stacks->New Stack->Driver->Analog -> ADC Driver on r_adc。
ADC属性配置
DTC配置
RA mcu上DTC外设的驱动程序。这个模块实现传输接口。
数据传输控制器(DTC)将数据从一个内存位置传输到另一个内存位置,而不使用CPU。
DTC使用基于RAM的向量表。向量表中的每个条目对应于ISR向量表中的一个条目。当DTC被中断触发时,它读取DTC向量表,获取传输信息,然后执行传输。传输执行后,DTC将更新的传输信息写回DTC向量表所指向的位置。
点击Stacks->Transfer->Transfer(r_dtc)。
DTC属性配置
R_DTC_Open()函数原型
故可以用 R_DTC_Open () 函数进行配置,开启DTC和初始化配置。
// Source is first ADC result register
g_transfer0_cfg.p_info->p_src = (void*)&R_ADC0->ADDR[0];
// Destination is results buffer
g_transfer0_cfg.p_info->p_dest = &adc_result_buffer[0];
/* Open the transfer instance with initial configuration. */
err = R_DTC_Open(&g_transfer0_ctrl, &g_transfer0_cfg);
/* Handle any errors. This function should be defined by the user. */
assert(FSP_SUCCESS == err);
R_DTC_Enable()函数原型
在这个激活源上启用DTC传输。
/* Enable the DTC to handle incoming transfer requests. */
err = R_DTC_Enable(&g_transfer0_ctrl);
assert(FSP_SUCCESS == err);
R_DTC_Reset()函数原型
重置传输源、目的地和传输数。
/* Callback function */
void adc_callback(adc_callback_args_t *p_args)
{
/* TODO: add your own code here */
if( p_args->event == ADC_EVENT_SCAN_COMPLETE )
{
err = R_DTC_Reset( &g_transfer0_ctrl,
(void*)&R_ADC0->ADDR[0], // reset source address
&adc_result_buffer[0], // reset destination address
1 ); // reset block size
if( FSP_SUCCESS != err )
{
__BKPT(1);
}
}
}
打印数据
while(1)
{
/* In software trigger mode, start a scan by calling R_ADC_ScanStart(). In other modes, enable external
* triggers by calling R_ADC_ScanStart(). */
err = R_ADC_ScanStart(&g_adc0_ctrl);
assert(FSP_SUCCESS == err);
printf("adc[0]_v=%f\n",(float)adc_result_buffer[0]/4095*3.3);
printf("adc[1]_v=%f\n",(float)adc_result_buffer[1]/4095*3.3);
printf("adc[2]_v=%f\n",(float)adc_result_buffer[3]/4095*3.3);
R_BSP_SoftwareDelay(1000, BSP_DELAY_UNITS_MILLISECONDS); // NOLINT100->160
}
最后
以上的代码会在Q_QUN里分享。Q_QUN:615061293。
或者关注『记帖』,持续更新文章和学习资料!
多通道ADC采集通过DTC传输例程
现在设置3个ADC通道的输入电压如下所示。
ADC通道 | 管脚 | 输入电压 |
---|---|---|
AN0 | P000 | GND(0V) |
AN1 | P001 | VCC(3.3V) |
AN3 | P003 | 1.5V |
结果演示
通过串口打印出的数据如下所示。