今天测试下RA2L1_48PIN的串口的收发~我们这了就是最简单的模式,不用FIFO~
接收不开定时器判断,以“rn”作为判断的结束符~
我们在上一节的例程上进行修改~上一节,我们已经配置好了LED及GPT0.下面我们开始添加串口的配置:
我们先双击打开config文件:
在config文件的配置区域:
我们点击Stacks->New Stack->Driver->Connectivity -> UART Driver on r_sci_uart。就只用上面的那个基本的,下面2个不用添加~
选择最上面的基本的模块,开始配置属性:
保存,生成代码。配置结束,下面我们开始写代码。
h文件:
- /*
- * uart0_printf.h
- *
- * Created on: 2021年12月1日
- * Author: Administrator
- */
- #ifndef UART0_PRINTF_H_
- #define UART0_PRINTF_H_
- #include "hal_data.h"
- #include "stdio.h"
- #define USART_REC_LEN 200 //定义最大接收字节数 200
- uint8_t USART_RX_BUF[USART_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节.
- //接收状态
- //bit15, 接收完成标志
- //bit14, 接收到0x0d
- //bit13~0, 接收到的有效字节数目
- uint16_t USART_RX_STA; //接收状态标记
- extern volatile bool uart_send_complete_flag;
- fsp_err_t uart0_Init(void);
- #endif /* UART0_PRINTF_H_ */
复制代码
C文件:
- /*
- * uart0_printf.c
- *
- * Created on: 2021年12月1日
- * Author: Administrator
- */
- #include "uart0_printf.h"
- fsp_err_t err = FSP_SUCCESS;
- volatile bool uart_send_complete_flag = false;
- uint8_t USART_RX_BUF[USART_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节.
- uint16_t USART_RX_STA=0; //接收状态标记
- #if 1
- #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;
- }
- #endif
- fsp_err_t uart0_Init(void)
- {
- /* Initialize UART channel with baud rate 115200 */
- err = R_SCI_UART_Open (&g_uart0_ctrl, &g_uart0_cfg);
- if (FSP_SUCCESS != err)
- {
- return err;
- }
- return err;
- }
- void user_uart_callback (uart_callback_args_t * p_args)
- {
- uint8_t res=0;//缓存接收
- if(p_args->event == UART_EVENT_TX_COMPLETE)
- {
- uart_send_complete_flag = true;
- }
- if(p_args->event == UART_EVENT_RX_CHAR)
- {
- res = p_args->data;
- if((USART_RX_STA&0x8000)==0)//接收未完成
- {
- if(USART_RX_STA&0x4000)//接收到了0x0d
- {
- if(res!=0x0a)USART_RX_STA=0;//接收错误,重新开始
- else USART_RX_STA|=0x8000; //接收完成了
- }
- else //还没收到0X0D
- {
- if(res==0x0d)USART_RX_STA|=0x4000;
- else
- {
- USART_RX_BUF[USART_RX_STA&0X3FFF]=res ;
- USART_RX_STA++;
- if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收
- }
- }
- }
- }
- }
复制代码
我们重定向了Printf,除了添加上述代码,还要加大栈值,及开启printf支持:
我们打开项目设置:
打开下图选择的位置(C++ 构建->设置->GNU ARM Cross C Linker->Miscellaneous)
1、勾选printf float的选项
2、去掉Other linker flags中的 “--specs=rdimon.specs”
主要代码中要添加printf头文件支持:#include 。
我们设置一个发送成功的标志,当发送成功后,就在串口中断函数里面将其置位为
TRUE.
我们发送完字符后,就等待这个标志,一旦置位就发送结束~
至于接收,我们在接收中断中,将每个字符与结束符"rn“比较。
并将其保存至缓存数组。一旦符合结束符,就标志接收完成~
在main的while循环中,我们查询接收完成标志,一旦完成就把接收的字符答应出来。
在hal_entry(void)种的具体代码:
- void hal_entry(void)
- {
- /* TODO: add your own code here */
- uint8_t level=0;
- uint16_t i,t;
- uint16_t len;
- uint16_t times=0;
- fsp_err_t err = FSP_SUCCESS;
- LED_Init();
- uart0_Init();
- //GPT0_Init();
- #if BSP_TZ_SECURE_BUILD
- /* Enter non-secure code */
- R_BSP_NonSecureEnter();
- #endif
- while(1)
- {
- if(USART_RX_STA&0x8000)
- {
- len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度
- printf("length=%drn",len);
- printf("rn您发送的消息为:rnrn");
- //用R_SCI_UART_Write实现
- err = R_SCI_UART_Write(&g_uart0_ctrl, USART_RX_BUF, len);
- if(FSP_SUCCESS != err) __BKPT();
- while(uart_send_complete_flag == false){}
- uart_send_complete_flag = false;
- // for(int i=0;i
- // printf("data:[%c] = 0x%xrn",i,USART_RX_BUF[i]);
- // memset(USART_RX_BUF,0,sizeof(USART_RX_BUF)); //清空缓存数组
- // printf("%s",USART_RX_BUF);
- printf("rnrn");//插入换行
- USART_RX_STA=0;
- }else
- {
- times++;
- if(times%5000==0)
- {
- printf("rnRA2L1_PIN48 串口实验rn");
- printf("qjp1988113@bbs.elecfansrn");
- }
- if(times%200==0){printf("请输入数据,以回车键结束n");}
- if(times%30==0){level=1-level;LED2_CTR(level);}//闪烁LED,提示系统正在运行.
- delay_ms(10);
- }
- }
- }
复制代码
对外设全部建立独立文档,方便移植:
其中调试过程中发送了个小插曲,就是死活接收不到串口发的数据。反复检查代码没有问题。后来发现是TTL串口模块的问题,CP2102就会出现这样的问题,需将接受引脚下拉即可解决问题~
我们下载,查看串口状况:
这了推荐一个串口调试助手,支持UTF8,且支持转译字符(r,n,t)等直接输入即可。
一句话,好使:下载地址:https://singtown.com/singtownserialport/
好了,串口就到这了。
总体而言,上手了E2 STUDIO及熟悉了RA2L1的库函数体系后,编程效率还是可以的~
RA2L1目前就先告一段落了,最近有事了。
好了,谢谢大家观看~有空再会~
SCR文件夹:
|