瑞萨单片机论坛
登录
直播中
jf_01440938
3年用户
29经验值
擅长:电源/新能源 电源/新能源
私信
关注
[经验]
【瑞萨RA2系列开发板体验】瑞萨RA2L1应用笔记二
瑞萨
单片机
RA4M2
开发板
瑞萨电子
前言
经过一段时间对RA2L1
开发板
图形化配置功能的学习,对这款开发板板的应用有了初步了解,参考网友的例程,实现了触摸键、串口
通信
、模数转换的综合应用。
一、主要功能
模数转换是工业控制中常用的功能,用于实现传感器信号的RTC、数字化、串口通信是实现设备间数据交换以及调试信息输出的重要功能,掌握这些常用功能,就能满足一些实用的控制需求。本来是打算做比例阀的驱动控制的,但是因为一直出差,没能完成,只能先提交一个RTC、串口、模数转换功能的综合应用报告,等后续有空再完成比例阀的驱动板项目。
二、软件说明
#include"hal_data.h"
#include
FSP_CPP_HEADER
voidR_BSP_W
ARM
Start(bsp_warm_start_event_t event);
FSP_CPP_FOOTER
unsignedchar send_buff[100];
fsp_err_terr = FSP_SUCCESS;
vola
ti
lebool uart_send_complete_flag = false;
uint8_tRxBuff[1]; //进入中断接收数据的数组
uint8_tDataBuff[5000]; //保存接收到的数据的数组
intRxLine=0; //接收到的数据长度
intRx_flag=0; //接受到数据标志
intRx_flag_finish=0; //接受完成或者时间溢出
uint8_tdir=0;
voiduser_uart_callback (uart_callback_args_t * p_args)
{
if(p_args->event ==UART_EVENT_TX_COMPLETE)
{
uart_send_complete_flag = true;
}
if(p_args->event == UART_EVENT_RX_CHAR)
{
RxBuff[0] = p_args->data;
RxLine++; //每接收到一个数据,进入回调数据长度加1
DataBuff[RxLine-1]=RxBuff[0]; //把每次接收到的数据保存到缓存数组
Rx_flag=1;
if(RxBuff[0]==0xff) //接收结束标志位,这个数据可以自定义,根据实际需求,这里只做示例使用,不一定是0xff
{
Rx_flag_finish=1;
if (dir==0)
{R_IOPORT_PinWrite(&g_ioport_ctrl,BSP_IO_PORT_01_PIN_03, BSP_IO_LEVEL_LOW);
dir=1;}
else
{R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_01_PIN_03,BSP_IO_LEVEL_HIGH);
dir=0;
}
}
RxBuff[0]=0;
err =R_GPT_Reset(&g_timer0_ctrl);
assert(FSP_SUCCESS == err);
}
}
#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_uart0_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
{
__io_putchar(*pBuffer++);
}
return size;
}
/*rtc_time_t is an alias for the C Standard time.h struct 'tm' */
rtc_time_tset_time =
{
.tm_sec = 0, /* 秒,范围从 0 到 59 */
.tm_min = 30, /* 分,范围从 0 到 59 */
.tm_hour = 12, /* 小时,范围从 0 到 23*/
.tm_mday = 20, /* 一月中的第几天,范围从 1 到 31*/
.tm_mon = 11, /* 月份,范围从 0 到 11*/
.tm_year = 121, /* 自 1900 起的年数,2021为121*/
.tm_wday = 5, /* 一周中的第几天,范围从 0 到 6*/
// .tm_yday=0, /* 一年中的第几天,范围从 0 到 365*/
// .tm_isdst=0; /* 夏令时*/
};
rtc_alarm_time_tset_alarm_time=
{
.time.tm_sec = 5,
.time.tm_sec = 5, /* 秒,范围从 0 到 59 */
.time.tm_min = 30, /* 分,范围从 0 到 59 */
.time.tm_hour = 12, /* 小时,范围从 0 到 23*/
.time.tm_mday = 20, /* 一月中的第几天,范围从 1 到 31*/
.time.tm_mon = 11, /* 月份,范围从 0 到 11*/
.time.tm_year = 121, /* 自 1900 起的年数,2021为121*/
.time.tm_wday = 5, /* 一周中的第几天,范围从 0 到 6*/
.sec_match = 1,
.min_match = 0,
.hour_match = 0,
.mday_match = 0,
.mon_match = 0,
.year_match = 0,
.dayofweek_match = 0,
};
volatilebool rtc_flag = 0;//RTC延时1s标志位
volatilebool rtc_alarm_flag = 0;//RTC闹钟
/*Callback function */
voidrtc_callback(rtc_callback_args_t *p_args)
{
/* TODO: add your own code here */
if(p_args->event ==RTC_EVENT_PERIODIC_IRQ)
rtc_flag=1;
else if(p_args->event ==RTC_EVENT_ALARM_IRQ)
rtc_alarm_flag=1;
}
/*******************************************************************************************************************//**
* main() is generated by the RA Configurationeditor and is used to generate threads if an RTOS is used. This function
* is called by main() when no RTOS is used.
**********************************************************************************************************************/
uint16_tadc_result_buffer[3];
/*Callback function */
voidadc_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);
}
}
}
/*Callback function */
void timer0_callback(timer_callback_args_t*p_args)
{
/* TODO: add your own code here */
if (TIMER_EVENT_CYCLE_END ==p_args->event)
{
if(Rx_flag==1)
{
printf("testn");
Rx_flag=0;
}
}
}
voidhal_entry(void)
{
/* TODO: add your own code here */
fsp_err_t err1;
/* Initialize the IOPORT module andconfigure the pins
* Note: The default pin configurationname in the RA Configuraton tool is g_bsp_pin_cfg */
err1 = R_IOPORT_Open(&g_ioport_ctrl,&g_bsp_pin_cfg);
err = R_SCI_UART_Open(&g_uart0_ctrl,&g_uart0_cfg);
assert(FSP_SUCCESS == err);
/* Initialize the RTC module*/
err = R_RTC_Open(&g_rtc0_ctrl,&g_rtc0_cfg);
/* Handle any errors. This function shouldbe defined by the user. */
assert(FSP_SUCCESS == err);
/* R_RTC_CalendarTimeSet must be called atleast once to start the RTC */
R_RTC_CalendarTimeSet(&g_rtc0_ctrl,&set_time);
/* Set the periodic interrupt rate to 1second */
R_RTC_PeriodicIrqRateSet(&g_rtc0_ctrl,RTC_PERIODIC_IRQ_SELECT_1_SECOND);
R_RTC_CalendarAlarmSet(&g_rtc0_ctrl,&set_alarm_time);
uint8_t rtc_second= 0; //秒
uint8_t rtc_minute =0; //分
uint8_t rtc_hour =0; //时
uint8_t rtc_day =0; //日
uint8_t rtc_month =0; //月
uint16_t rtc_year =0; //年
uint8_t rtc_week =0; //周
rtc_time_t get_time;
//-----------------
adc_status_t adc_status;
err = R_ADC_Open(&g_adc0_ctrl,&g_adc0_cfg);
assert(FSP_SUCCESS == err);
err = R_ADC_StatusGet (&g_adc0_ctrl,&adc_status);
assert(FSP_SUCCESS == err);
err = R_ADC_ScanCfg(&g_adc0_ctrl,&g_adc0_channel_cfg);
assert(FSP_SUCCESS == err);
// 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 withinitial configuration. */
err = R_DTC_Open(&g_transfer0_ctrl,&g_transfer0_cfg);
/* Handle any errors. This functionshould be defined by the user. */
assert(FSP_SUCCESS == err);
/* Enable the DTC to handle incomingtransfer requests. */
err =R_DTC_Enable(&g_transfer0_ctrl);
assert(FSP_SUCCESS == err);
//-----------------
printf("rtc_testn");
while(1)
{
if(rtc_flag)
{
R_RTC_CalendarTimeGet(&g_rtc0_ctrl, &get_time);//获取RTC计数时间
rtc_flag=0;
rtc_second=get_time.tm_sec;//秒
rtc_minute=get_time.tm_min;//分
rtc_hour=get_time.tm_hour;//时
rtc_day=get_time.tm_mday;//日
rtc_month=get_time.tm_mon;//月
rtc_year=get_time.tm_year; //年
rtc_week=get_time.tm_wday;//周
printf(" %d y %d m %d d %d h%d m %d s %dwn",rtc_year+1900,rtc_month,rtc_day,rtc_hour,rtc_minute,rtc_second,rtc_week);
err =R_ADC_ScanStart(&g_adc0_ctrl);
assert(FSP_SUCCESS == err);
printf("adc[0]_v=%fn",(float)adc_result_buffer[0]/4095*3.3);
printf("adc[1]_v=%fn",(float)adc_result_buffer[1]/4095*3.3);
printf("adc[2]_v=%fn",(float)adc_result_buffer[2]/4095*3.3);
printf("length=%drn",RxLine);
for(inti=0;i
printf("data:[%d] = 0x%xrn",i,DataBuff
);
memset(DataBuff,0,sizeof(DataBuff)); //清空缓存数组
//memset()作用:可以方便的清空一个结构类型的变量或数组。
//例句:memset(aTxbuffer,0,sizeof(aTxbuffer)) 用memset清空aTxbuffer。
RxLine=0; //清空接收长度
Rx_flag_finish=0;
Rx_flag = 0;
}
if(rtc_alarm_flag)
{
rtc_alarm_flag=0;
printf("/************************AlarmClock********************************/n");
}
}
#ifBSP_TZ_SECURE_BUILD
/* Enter non-secure code */
R_BSP_NonSecureEnter();
#endif
}
三、硬件配置
1.Stacks配置
file:///C:/Users/yyh/AppData/Local/Temp/msohtmlclip1/01/clip_image002.png
2.模数转换引脚配置
file:///C:/Users/yyh/AppData/Local/Temp/msohtmlclip1/01/clip_image004.png
3.BSP属性设置
file:///C:/Users/yyh/AppData/Local/Temp/msohtmlclip1/01/clip_image006.png
四、例程测试结果
file:///C:/Users/yyh/AppData/Local/Temp/msohtmlclip1/01/clip_image008.jpg
总结
采用图形化的配置方式,RTC、串口通信、模数转换等功能使用起来较为简便。
更多回帖
rotate(-90deg);
回复
相关帖子
瑞萨
单片机
RA4M2
开发板
瑞萨电子
【
瑞
萨
RA2
系列
开发板
体验】
瑞
萨
RA2L1
试
用笔记
3394
【
瑞
萨
RA2
系列
开发板
体验】初识
RA2L1
开发板
2016
瑞
萨
RA2
系列
开发板
体验
2539
【
瑞
萨
RA2
系列
开发板
体验】烧录
2011
【
瑞
萨
RA2
系列
开发板
体验】测评
RA2L1
电容式触摸
3074
【
瑞
萨
RA2
系列
开发板
体验】+
RA2
AL
开发板
试
用笔记
2664
【
瑞
萨
RA2
系列
开发板
体验】rz
2l
瑞
萨
开发板
开箱初体验
1062
瑞
萨
RA2L1
系列
CAN通信应用
547
瑞
萨
RA2
开发板
,免费!
7595
瑞
萨
RA2L1
开发板
流水灯
4
发帖
登录/注册
20万+
工程师都在用,
免费
PCB检查工具
无需安装、支持浏览器和手机在线查看、实时共享
查看
点击登录
登录更多精彩功能!
首页
论坛版块
小组
免费开发板试用
ebook
直播
搜索
登录
×
20
完善资料,
赚取积分