1.概述
本篇文章主要介绍如何使用e2studio对瑞萨单片机进行usrt通过定时器中断方式接收不定长数据。
2.硬件准备
首先需要准备一个开发板,这里我准备的是芯片型号 r7fa2l1ab2dfl 的开发板。
3.新建工程
4.工程模板
5.保存工程路径
6.芯片配置
本文中使用r7fa2l1ab2dfl来进行演示。
7.工程模板选择
8.uart配置
点击stacks->new stack->driver->connectivity -> uart driver on r_sci_uart。
9.uart属性配置
10.printf重定向
printf重定向已经在上述文章中讲述,故可以查看往期文章进行学习。
打印最常用的方法是printf,所以要解决的问题是将printf的输出重定向到串口,然后通过串口将数据发送出去。
注意一定要加上头文件#include
#ifdef __gnuc__ //串口重定向 #define putchar_prototype int __io_putchar(int ch)#else #define putchar_prototype int fputc(int ch, file *f)#endifputchar_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
11.回调函数user_uart_callback ()
设置接受到0xff则输出已经输入的数据。
若接收到新的数据,使用r_gpt_reset进行充值定时器计数。
volatile bool uart_send_complete_flag = false;uint8_t rxbuff[1]; //进入中断接收数据的数组uint8_t databuff[5000]; //保存接收到的数据的数组int rxline=0; //接收到的数据长度int rx_flag=0; //接受到数据标志int rx_flag_finish=0; //接受完成或者时间溢出void user_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; } rxbuff[0]=0; err = r_gpt_reset(&g_timer0_ctrl); assert(fsp_success == err); }}
12.printf_usart打印函数
打印已经接受的数据以及其长度。
void printf_usart(void){ printf(length=%d\r\n,rxline); for(int i=0;i
13.定时器设置
点击stacks->new stack->driver->timers -> timers driver on r_gpt。
设置500ms无输入则输出已经输入的数据。
频率=时钟源/period,若设置计数时间为500ms一次,频率为1hz,则period=48m/1=48000000
14.定时器回调函数timer0_callback()
/* 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_usart(); rx_flag=0; } }}
15.完整代码
#include hal_data.h#include fsp_cpp_headervoid r_bsp_warmstart(bsp_warm_start_event_t event);fsp_cpp_footervoid printf_usart(void);fsp_err_t err = fsp_success;volatile bool uart_send_complete_flag = false;uint8_t rxbuff[1]; //进入中断接收数据的数组uint8_t databuff[5000]; //保存接收到的数据的数组int rxline=0; //接收到的数据长度int rx_flag=0; //接受到数据标志int rx_flag_finish=0; //接受完成或者时间溢出void user_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; } 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)#endifputchar_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;ievent) { if(rx_flag==1) { printf_usart(); rx_flag=0; } }}void hal_entry(void){ /* todo: add your own code here */ /* open the transfer instance with initial configuration. */ err = r_sci_uart_open(&g_uart0_ctrl, &g_uart0_cfg); assert(fsp_success == err); /* initializes the module. */ err = r_gpt_open(&g_timer0_ctrl, &g_timer0_cfg); /* handle any errors. this function should be defined by the user. */ assert(fsp_success == err); /* start the timer. */ (void) r_gpt_start(&g_timer0_ctrl); while(1) { r_bsp_softwaredelay(1, bsp_delay_units_milliseconds); // nolint100->160 if(rx_flag_finish==1) { printf_usart(); } } #if bsp_tz_secure_build /* enter non-secure code */ r_bsp_nonsecureenter(); #endif }void printf_usart(void){ printf(length=%d\r\n,rxline); for(int i=0;i
16.发送数据,并且以0xff结尾
17.发送数据,延时500ms后打印
18.教学视频
视频教学稍后会在b站官方账号更新,请留意b站视频更新~
原文标题:瑞萨e2studio----usrt通过定时器中断方式接收不定长数据
文章出处:【微信公众号:ra生态工作室】欢迎添加关注!文章转载请注明出处。
镍底板为镀金连接器提供的好处有哪些?
氢能源汽车何时才能面向市场
高温超导机理问题及解决方法
艾迈斯半导体今天宣布推出AS7220智能照明管理器
薄膜电容怎么来的?
瑞萨e2studio----USRT通过定时器中断方式接收不定长数据
消费级台式机最强CPU:18核心36线程酷睿i9正式发布!
基于Zynq的超清4K视频工具箱支持视频格式为4096x2160/60帧的超高清电视(UHDTV)开发
启扬智能基于QY-IMX6主板的智能电子公交站牌解决方案
家用和工业超声波清洗机有什么区别?
pcb表面处理 什么是化学镀镍
易华录与忽米网战略合作 共同发力推动工业互联网发展
CANape/vMeasure exp控制OUTMM输出PWM波的方法
GTX 295双芯显卡 两块PCB合体的疯狂之作!
国产AI芯片雄心勃勃 AI芯片或将迎来发展的新风口
凌阳单片机新品发布会将于宁波、上海、合肥三地举行
360度讲解LED点阵显示屏的系统设计
人工智能会是人类发展的新曙光吗?
智能家居未来的重要一步:开发跟踪占用者并自我适应其偏好的自动化系统
TVS保护原理和参数解读