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

本文主要是介绍【致敬未来的攻城狮计划】— 连续打卡第二十天:RA2E1_UART —— 串口通信例程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

系列文章目录

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 开发板 串口通信测试


总结

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


不努力谁也不知道结果。

这篇关于【致敬未来的攻城狮计划】— 连续打卡第二十天:RA2E1_UART —— 串口通信例程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/189468

相关文章

闲置电脑也能活出第二春?鲁大师AiNAS让你动动手指就能轻松部署

对于大多数人而言,在这个“数据爆炸”的时代或多或少都遇到过存储告急的情况,这使得“存储焦虑”不再是个别现象,而将会是随着软件的不断臃肿而越来越普遍的情况。从不少手机厂商都开始将存储上限提升至1TB可以见得,我们似乎正处在互联网信息飞速增长的阶段,对于存储的需求也将会不断扩大。对于苹果用户而言,这一问题愈发严峻,毕竟512GB和1TB版本的iPhone可不是人人都消费得起的,因此成熟的外置存储方案开

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟 开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚 第一站:海量资源,应有尽有 走进“智听

poj2406(连续重复子串)

题意:判断串s是不是str^n,求str的最大长度。 解题思路:kmp可解,后缀数组的倍增算法超时。next[i]表示在第i位匹配失败后,自动跳转到next[i],所以1到next[n]这个串 等于 n-next[n]+1到n这个串。 代码如下; #include<iostream>#include<algorithm>#include<stdio.h>#include<math.

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

XTU 1233 n个硬币连续m个正面个数(dp)

题面: Coins Problem Description: Duoxida buys a bottle of MaiDong from a vending machine and the machine give her n coins back. She places them in a line randomly showing head face or tail face o

【STM32】SPI通信-软件与硬件读写SPI

SPI通信-软件与硬件读写SPI 软件SPI一、SPI通信协议1、SPI通信2、硬件电路3、移位示意图4、SPI时序基本单元(1)开始通信和结束通信(2)模式0---用的最多(3)模式1(4)模式2(5)模式3 5、SPI时序(1)写使能(2)指定地址写(3)指定地址读 二、W25Q64模块介绍1、W25Q64简介2、硬件电路3、W25Q64框图4、Flash操作注意事项软件SPI读写W2

《数据结构(C语言版)第二版》第八章-排序(8.3-交换排序、8.4-选择排序)

8.3 交换排序 8.3.1 冒泡排序 【算法特点】 (1) 稳定排序。 (2) 可用于链式存储结构。 (3) 移动记录次数较多,算法平均时间性能比直接插入排序差。当初始记录无序,n较大时, 此算法不宜采用。 #include <stdio.h>#include <stdlib.h>#define MAXSIZE 26typedef int KeyType;typedef char In

CSP 2023 提高级第一轮 CSP-S 2023初试题 完善程序第二题解析 未完

一、题目阅读 (最大值之和)给定整数序列 a0,⋯,an−1,求该序列所有非空连续子序列的最大值之和。上述参数满足 1≤n≤105 和 1≤ai≤108。 一个序列的非空连续子序列可以用两个下标 ll 和 rr(其中0≤l≤r<n0≤l≤r<n)表示,对应的序列为 al,al+1,⋯,ar​。两个非空连续子序列不同,当且仅当下标不同。 例如,当原序列为 [1,2,1,2] 时,要计算子序列 [

vue2 组件通信

props + emits props:用于接收父组件传递给子组件的数据。可以定义期望从父组件接收的数据结构和类型。‘子组件不可更改该数据’emits:用于定义组件可以向父组件发出的事件。这允许父组件监听子组件的事件并作出响应。(比如数据更新) props检查属性 属性名类型描述默认值typeFunction指定 prop 应该是什么类型,如 String, Number, Boolean,

国产游戏行业的崛起与挑战:技术创新引领未来

国产游戏行业的崛起与挑战:技术创新引领未来 近年来,国产游戏行业蓬勃发展,技术水平不断提升,许多优秀作品在国际市场上崭露头角。从画面渲染到物理引擎,从AI技术到服务器架构,国产游戏已实现质的飞跃。然而,面对全球游戏市场的激烈竞争,国产游戏技术仍然面临诸多挑战。本文将探讨这些挑战,并展望未来的机遇,深入分析IT技术的创新将如何推动行业发展。 国产游戏技术现状 国产游戏在画面渲染、物理引擎、AI