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