瑞萨单片机论坛
直播中

jf_01440938

3年用户 29经验值
擅长:电源/新能源 电源/新能源
私信 关注
[经验]

【瑞萨RA2系列开发板体验】瑞萨RA2L1应用笔记二

前言
  经过一段时间对RA2L1 开发板图形化配置功能的学习,对这款开发板板的应用有了初步了解,参考网友的例程,实现了触摸键、串口通信、模数转换的综合应用。
一、主要功能
模数转换是工业控制中常用的功能,用于实现传感器信号的RTC、数字化、串口通信是实现设备间数据交换以及调试信息输出的重要功能,掌握这些常用功能,就能满足一些实用的控制需求。本来是打算做比例阀的驱动控制的,但是因为一直出差,没能完成,只能先提交一个RTC、串口、模数转换功能的综合应用报告,等后续有空再完成比例阀的驱动板项目。
二、软件说明
#include"hal_data.h"
#include
FSP_CPP_HEADER
voidR_BSP_WARMStart(bsp_warm_start_event_t event);
FSP_CPP_FOOTER
unsignedchar send_buff[100];
fsp_err_terr = FSP_SUCCESS;
volatilebool 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、串口通信、模数转换等功能使用起来较为简便。

更多回帖

×
20
完善资料,
赚取积分