【致敬未来的攻城狮计划】— 连续打卡第二十天:RA2E1_UART —— 串口通信例程

news2024/9/29 5:39:01

系列文章目录

1.连续打卡第一天:提前对CPK_RA2E1是瑞萨RA系列开发板的初体验,了解一下

2.开发环境的选择和调试(从零开始,加油)

3.欲速则不达,今天是对RA2E1 基础知识的补充学习。

4.e2 studio 使用教程

5.Keil配置使用(使用 RASC 生成 Keil 工程)

6.Keil配置使用(使用 RASC 生成 Keil 工程)

7.(电脑重装系统)学习RA产品家族选型手册

8.问题解决、学习RA寄存器、用寄存器的方式点亮第一个LED灯。

9.继续学习RA寄存器

10.FSP固件库开发及FSP配置详解。

11.FSP固件库开发点亮第一个灯。

12.FSP固件库开发按键输入检测控制LED灯闪烁

13.FSP固件库开发启动文件详解

14.FSP固件库开发延时函数(时钟详解)

15.FSP固件库外部中断处理编程(外部中断检测按键控制LED闪烁)

16.FSP固件库系统定时器(滴答定时器SysTick)每2秒LED闪烁一次

17.FSP固件库开发GPT — PWM通用定时器 定时2s LED 闪烁

18.FSP固件库开发GPT — PWM输出波形 — LED呼吸灯

19.RA2E1串口通信基础知识


文章目录

前言

一、串口通信是什么?

二、串口通信电平及方式

三、波特率

四、SCI 简介

五、串口通信:实操

1.硬件图:

 2.新建工程

3.FSP配置

4.keil代码编写

总结

不努力谁也不知道结果。


前言

        接上篇文章,串口的基础知识,今天实操串口通信:(8条消息) 【致敬未来的攻城狮计划】— 连续打卡第十九天:RA2E1串口通信基础知识_嵌入式up的博客-CSDN博客

        串口通信例程


一、串口通信是什么?

        串口通信是一种常用的设备间通信方式,它通过串行传输方式将数据一位一位地发送或接收。在计算机科学中,通信协议可以通过分层来简化,通常分为物理层和协议层。物理层规定了通信系统中机械、电子功能部分的特性,确保原始数据在物理媒介上的传输。协议层则规定了通信逻辑,包括数据打包、解包标准,以确保通信的正确性和可靠性。电子工程师在调试设备时也经常使用串口通信方式输出调试信息。常见的串口通信标准包括RS-232、RS-422、RS-485等,它们在数据传输速率、距离、电平等方面有所不同

二、串口通信电平及方式

  • RXD:数据输入引脚,数据接受;
  • TXD:数据发送引脚,数据发送。

 

通信两种方式:

TTL

逻辑1:2.4V-5V

逻辑0:0~0.5V

RS-232

逻辑1:-15V~-3V

逻辑0:+3V~+15V


三、波特率

        波特率,即每个码元的长度,以便对信号进行解码,常见的波特率为4800、9600、115200等。

        详细介绍的话还有波特率发生器,等等好多知识,大家可以参考上篇文章,这篇文章不再赘述基础知识,实操关键。下面这篇文章也讲的很详细。

(8条消息) [攻城狮计划]RT-Thread—详解UART设备(基于RA2E1)_花园宝宝小点点的博客-CSDN博客


四、SCI 简介

        SCI(Serial Communications Interface),意为串行通信接口,是相对与并行通信的概念,是串行通信技术的一种总称。 包括了UART,SPI等串行通信技术。 RA6M5的SCI模块是一个有10个通道的异步/同步串行接口。 包含如下功能:   

  • UART

  • 8位时钟同步接口

  • 简易IIC(只能用作主机)

  • 简易SPI

  • 智能卡接口(符合ISO/IEC 7816-3国际标准)

  • 曼彻斯特接口

  • 增强的串行接口

另外,SCI0、SCI3~SCI9有独立的FIFO缓冲区。

  


五、串口通信:实操

1.硬件图:

    


 2.新建工程

        拷贝一份我们之前的 Keil 工程模板 “RA_LED”, 然后将工程文件夹重命名为 “RA_UART”,并进入该文件夹里面双击 Keil 工程文件,打开该工程。    

  

3.FSP配置

      FSP 配置界面里面点开 “Pins”-> “Peripherals”-> “Connectivity:SCI”-> “SCI0” 来配置SCI模块, 配置为 “Asynchronous UART” 模式,并选择开发板使用串口引脚。

在配置界面底部点击 “Stack”,加入串口UART:

  

        “属性”窗口中配置 名字(name)、通道(Channel)、回调函数(Callback)名字即可, 引脚(Pins)、波特率(Baud Rate)等其他的属性按照默认的配置即可。

  

串口属性设置解释:

属性

描述

Name

名字,根据读者需求设置即可。

Channel

通道,根据SCI号设置即可,例如实验使用SCI4,则这里配置为通道4。

Data Bits

每个字(word)的比特(bit)数,默认为8bits

Parity

校验模式,可选择“Odd”奇校验,“Even”偶校验或“None”无校验。

Stop Bits

停止位,可选1或2bit。

Baud Rate

波特率

Baud Rate Modulation

波特率调制,通过调整时钟周期,以减少申请波特率与实际波特率之间的误差。

Max Error(%)

计算波特率时允许的最大百分比误差。

Callback

回调函数的名字,根据读者需求设置即可。

Receive Interrupt Priority

接收中断优先级

Transmit Data Empty Interrupt Priority

发送数据空中断优先级

Transmit End Interrupt Priority

发送完成中断优先级

Error Interrupt Priority

错误中断优先级

由于要使用Printf  函数:

        使用 printf 函数时,需要使用到堆,默认情况下堆的大小为0,因此我们需要修改堆的大小。 可以在 FSP 配置界面中的“BSP”属性栏的“RA Common”中通过修改“Heap size”来设置堆区大小。 这里需要设置为 8 的整数倍,推荐至少为4K(0x1000)

  

点击 “Generate Project Content” 按钮,让软件自动生成配置代码。


4.keil代码编写

#include "hal_data.h"

FSP_CPP_HEADER
void R_BSP_WarmStart(bsp_warm_start_event_t event);
FSP_CPP_FOOTER


/* 调试串口 UART0 初始化 */
void UART0_Init(void)
{
   fsp_err_t err = FSP_SUCCESS;

   err = R_SCI_UART_Open (&g_uart0_ctrl, &g_uart0_cfg);
   assert(FSP_SUCCESS == err);
}

/* 发送完成标志 */
volatile bool uart_send_complete_flag = false;

/* 串口中断回调 */
void uart0_callback (uart_callback_args_t * p_args)
{
   switch (p_args->event)
   {
      case UART_EVENT_RX_CHAR:
      {
            /* 把串口接收到的数据发送回去 */
            R_SCI_UART_Write(&g_uart0_ctrl, (uint8_t *)&(p_args->data), 1);
            break;
      }
      case UART_EVENT_TX_COMPLETE:
      {
            uart_send_complete_flag = true;
            break;
      }
      default:
            break;
   }
}

/*******************************************************************************************************************//**
 * main() is generated by the RA Configuration editor and is used to generate threads if an RTOS is used.  This function
 * is called by main() when no RTOS is used.
 **********************************************************************************************************************/
void hal_entry(void)   //相当于主函数  函数最终执行的地方
{
	UART0_Init();
	while(1){
	     R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_05_PIN_01, BSP_IO_LEVEL_LOW); //LED1亮
         R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_05_PIN_02, BSP_IO_LEVEL_LOW); //LED2亮
         R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_SECONDS); //延时1秒
	     R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_05_PIN_01, BSP_IO_LEVEL_HIGH); //LED1亮
         R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_05_PIN_02, BSP_IO_LEVEL_HIGH); //LED2亮
         R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_SECONDS); //延时1秒
		
		R_SCI_UART_Write(&g_uart0_ctrl,"aaa",3);
	}
	
	
	
	
	
	
	
    /* TODO: add your own code here */

#if BSP_TZ_SECURE_BUILD
    /* Enter non-secure code */
    R_BSP_NonSecureEnter();
#endif
}

烧写代码效果图:

由于习惯,我们更喜欢使用printf函数,所以我需要重定向:

#include "hal_data.h"
#include "stdio.h""

FSP_CPP_HEADER
void R_BSP_WarmStart(bsp_warm_start_event_t event);
FSP_CPP_FOOTER


/* 调试串口 UART0 初始化 */
void UART0_Init(void)
{
   fsp_err_t err = FSP_SUCCESS;

   err = R_SCI_UART_Open (&g_uart0_ctrl, &g_uart0_cfg);
   assert(FSP_SUCCESS == err);
}

/* 发送完成标志 */
volatile bool uart_send_complete_flag = false;

/* 串口中断回调 */
void uart0_callback (uart_callback_args_t * p_args)
{
   switch (p_args->event)
   {
      case UART_EVENT_RX_CHAR:
      {
            /* 把串口接收到的数据发送回去 */
            R_SCI_UART_Write(&g_uart0_ctrl, (uint8_t *)&(p_args->data), 1);
            break;
      }
      case UART_EVENT_TX_COMPLETE:
      {
            uart_send_complete_flag = true;
            break;
      }
      default:
            break;
   }
}

/* 重定向 printf 输出 */
#if defined __GNUC__ && !defined __clang__
int _write(int fd, char *pBuffer, int size); //防止编译警告
int _write(int fd, char *pBuffer, int size)
{
   (void)fd;
   R_SCI_UART_Write(&g_uart4_ctrl, (uint8_t *)pBuffer, (uint32_t)size);
   while(uart_send_complete_flag == false);
   uart_send_complete_flag = false;

   return size;
}
#else
int fputc(int ch, FILE *f)
{
   (void)f;
   R_SCI_UART_Write(&g_uart0_ctrl, (uint8_t *)&ch, 1);
   while(uart_send_complete_flag == false);
   uart_send_complete_flag = false;

   return ch;
}
#endif

/*******************************************************************************************************************//**
 * main() is generated by the RA Configuration editor and is used to generate threads if an RTOS is used.  This function
 * is called by main() when no RTOS is used.
 **********************************************************************************************************************/
void hal_entry(void)   //相当于主函数  函数最终执行的地方
{
	UART0_Init();
	while(1){
	     R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_05_PIN_01, BSP_IO_LEVEL_LOW); //LED1亮
         R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_05_PIN_02, BSP_IO_LEVEL_LOW); //LED2亮
         R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_SECONDS); //延时1秒
	     R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_05_PIN_01, BSP_IO_LEVEL_HIGH); //LED1亮
         R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_05_PIN_02, BSP_IO_LEVEL_HIGH); //LED2亮
         R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_SECONDS); //延时1秒
		
		
		printf("你好,程序员!\n");
	}
	
	
	
	
	
	
	
    /* TODO: add your own code here */

#if BSP_TZ_SECURE_BUILD
    /* Enter non-secure code */
    R_BSP_NonSecureEnter();
#endif
}

视频效果:

RA2E1 开发板 串口通信测试


总结

        串口通信一个新的高度,加油!!!


不努力谁也不知道结果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/486230.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Docker consul服务注册与发现

目录 一、服务注册与发现 1、什么是服务注册与发现 2、什么是consul 3、consul提供的一些关键特性 4、容器更新与发现 二、基于nginx与consul构建自动发现即高可用的Docker服务架构 consul服务器部署 1、建立consul 2、查看集群信息 3、通过http获取集群信息 regist…

SpringBoot+vue文件上传下载预览分片上传

学习链接 Blob & File 上传文件 前台 整个过程,就是在使用FormData 添加 上File(这个Blob),并且key要和后台的名字对应上在点击上传按钮开始上传之前,使用了URL.createObjectURL(File)创建blobUrl,…

MySQL数据库之库表管理

一、常用的数据类型: 类型含义tinyint(n)1个字节,范围(-128~127)smallint(n)2个字节,范围(-32768~32767)mediumint(n)3个字节,范围(-8388608~8388607)int(n)4个字节(32个比特位),整数型,范围(-2147483648~…

JavaEE - 网络编程

一、网络编程基础 为什么需要网络编程? 用户在浏览器中,打开在线视频网站,如优酷看视频,实质是通过网络,获取到网络上的一个视频资源。 与本地打开视频文件类似,只是视频文件这个资源的来源是网络。 相比本…

KALI入门到高级【第五章】

预计更新第一章 入门 1.1 什么是Kali Linux? 1.2 安装Kali Linux 1.3 Kali Linux桌面环境介绍 1.4 基本命令和工具 第二章 信息收集 1.1 网络扫描 1.2 端口扫描 1.3 漏洞扫描 1.4 社交工程学 第三章 攻击和渗透测试 1.1 密码破解 1.2 暴力破解 1.3 漏洞利用 1.4 特…

模糊PID(模糊规则表)

模糊PID的模糊化相关内容,请参看下面的博客文章: PLC模糊控制模糊PID(梯形图实现+算法分析)_RXXW_Dor的博客-CSDN博客博途PLC的模糊PID控制详细内容请查看下面的博客文章:Matlab仿真+博途PLC模糊PID控制完整SCL源代码参考(带模糊和普通PID切换功能)_博途怎么实现模糊pid_…

后端程序员的前端必备【Vue】 - 05 class与style绑定、表单输入绑定、Vue生命周期

class与style绑定、表单输入绑定、Vue生命周期 1 class与style绑定1.1 绑定class1.2 绑定style1.3 练习 2 表单输入绑定3 Vue生命周期3.1 vue生命周期3.2 组件的生命周期钩子 1 class与style绑定 操作元素的 class 列表和内联样式是数据绑定的一个常见需求。因为它们都是 attri…

【操作系统】操作系统内核

图灵机 当系统中有一个CPU的时候 ,MR就是它的状态 当系统中有n个CPU的时候,MR1,MR2…MRn 是它的状态 IRQ和NMI是低电平有效信号 NMI不可屏蔽中断 6502的CPU一共40个引脚 eflags寄存器里的 IF 表示 interrupt enable 1表示可以响应中断,0表示…

破解马赛克有多「容易」?

刷短视频时,估计大家都看过下面这类视频,各家营销号争相曝光「一分钟解码苹果笔刷背后内容」的秘密。换汤不换药,自媒体们戏称其为「破解马赛克」,殊不知让多少不明真相的用户建立起了错误的认知,也让苹果笔刷第 10086…

【网络编程】demo版UDP网络服务器实现

文章目录 一、引入二、服务端实现2.1 创建套接字socket2.2 绑定bind2.3 启动服务器2.4 IP的绑定2.5 读取数据recvfrom 三、用户端实现3.1 绑定问题3.2 发送数据sendto 四、源码 一、引入 在上一章【网络编程】socket套接字中我们讲述了TCP/UDP协议,这一篇就是简单实…

保护移动设备免受恶意软件侵害优秀方法

几天前,移动恶意软件攻击增加了500%显然,我们大多数人都不知道不能很好地保护我们的手机下面小编揭秘有效保护移动设备免受恶意软件侵害的最佳方法。 1、使用移动反恶意软件 恶意软件很容易感染智能手机和平板电脑,因此在设备上安装可靠的…

douyin 之xgorgon0404参数

如果我们想要看抖音的数据,在抓包的时候,会发现有一个xgorgon参数,在请求接口的时候,只需要在请求头携带xgorgon参数,就能获得响应后的数据。 目前抖音的xgorgon0404算法已经还原了, 下面是一个请求的demo。代码如下:…

计算机网络可靠传输的三种基本实现机制

可靠传输的means 在数据链路层会给上层网络层提供可靠传输或者不可靠传输,不可靠传输是指检测到传输差错的时候只是丢弃该分组而不进行任何处理,而可靠传输会给发送者一个信号进行重发该分组。 以下给出的三种基本实现机制是提出一些问题,慢…

截图的背景色如何去除?这里介绍一个小工具

屏幕截图,是方便常用的功能。例如从网页或者视频中截图。但是有时候想去除截图中的背景颜色,怎么办?下面这个案例介绍如何去掉截图中的蓝色背景色。 这个小工具就能帮你方便实现。Web端的便捷小工具链接: http://www.artvily.com/renderCase…

深度学习框架发展趋势

深度学习方法的发展是推动深度学习框架进步的最大动力,因此深度学习框架的功能和设计应顺应 算法和模型的发展趋势: 第一,易用性。深度学习领域仍处于快速发展期,参与者和学习者不断增加,新模型大量提出。因 此&#…

深入篇【C++】类与对象:拷贝构造函数详解

深入篇【C】类与对象:拷贝构造函数详解 ①.拷贝构造函数Ⅰ.概念Ⅱ.特征1.重载形式之一2.参数唯一3.形参必须传引用4.编译器的拷贝函数5.典型调用场景 ②.总结: ①.拷贝构造函数 Ⅰ.概念 在创建对象时,能否创建一个与已存在对象一模一样的新…

[架构之路-186]-《软考-系统分析师》-5-数据库系统 - 关系型数据库、操作型数据库、数据集市、数据仓库的区别?

目录 总体架构: 一、数据库 二、关系型数据库 三、SQL与数据库 四、 分布式数据库 五、数据仓库 1. 概述 2. 架构 3、数据仓库的主要特征 3、1 面向主题性 3、2 集成性 3、3 非易失性 3、4 时变性 总体架构: 一、数据库 数据库是“按照数据…

【链表OJ题 1】反转链表

目录 题目来源: 代码实现 1、方法一 1.1分析 2、方法二 2.1 分析 题目来源: 力扣 题目描述: 代码实现 1、方法一 struct ListNode* reverseList(struct ListNode* head) {struct ListNode* prev NULL, * cur head;while (cur){st…

基础IO+文件

基础IO 回顾文件回顾文件操作库函数调用接口写文件-w读文件-r 系统调用打开文件-open写文件-write 文件操作本质文件描述符fd文件描述符的分配规则重定向 FILE缓冲区模拟实现缓冲区总结 理解文件系统磁盘物理结构存储结构逻辑结构 文件系统软硬链接 动静态库动态库和静态库生成…

Kafka上的优化经验

1. 平滑扩容 Motivation kafka扩容⼀台新机器的流程 假如集群有 3 个 broker ,⼀共有 4 个 TP ,每个 3 副本,均匀分布。现在要扩容⼀台机器, 新 broker 加⼊集群后需要通过⼯具进⾏ TP 的迁移。⼀共迁移 3 个 TP 的副…