【致敬未来的攻城狮计划】— 连续打卡第二十天: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的博客-优快云博客

        串口通信例程


一、串口通信是什么?

        串口通信是一种常用的设备间通信方式,它通过串行传输方式将数据一位一位地发送或接收。在计算机科学中,通信协议可以通过分层来简化,通常分为物理层和协议层。物理层规定了通信系统中机械、电子功能部分的特性,确保原始数据在物理媒介上的传输。协议层则规定了通信逻辑,包括数据打包、解包标准,以确保通信的正确性和可靠性。电子工程师在调试设备时也经常使用串口通信方式输出调试信息。常见的串口通信标准包括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)_花园宝宝小点点的博客-优快云博客


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


总结

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


不努力谁也不知道结果。

06-22
### 得物技术栈及开发者文档分析 得物作为一家专注于潮流商品的电商平台,其技术栈和开发者文档主要围绕电商平台的核心需求展开。以下是对得物技术栈及相关开发资源的详细解析: #### 1. 技术栈概述 得物的技术栈通常会涵盖前端、后端、移动应用开发以及大数据处理等多个领域。以下是可能涉及的主要技术栈[^3]: - **前端开发**: 前端技术栈可能包括现代框架如 React 或 Vue.js,用于构建高效、响应式的用户界面。此外,还会使用 Webpack 等工具进行模块化打包和优化。 - **后端开发**: 后端技术栈可能采用 Java Spring Boot 或 Node.js,以支持高并发和分布式架构。数据库方面,MySQL 和 Redis 是常见的选择,分别用于关系型数据存储和缓存管理。 - **移动应用开发**: 得物的移动应用开发可能基于原生技术(如 Swift/Kotlin)或跨平台框架(如 Flutter)。这有助于确保移动端应用的性能和用户体验一致性。 - **大数据云计算**: 在大数据处理方面,得物可能会使用 Hadoop 或 Spark 进行数据挖掘和分析。同时,依托云服务提供商(如阿里云或腾讯云),实现弹性扩展和资源优化。 #### 2. 开发者文档分析 类似于引用中提到的 Adobe 开发者文档模板[^2],得物也可能提供一套完整的开发者文档体系,以支持内部团队协作和外部开发者接入。以下是开发者文档可能包含的内容: - **API 文档**: 提供 RESTful API 或 GraphQL 的详细说明,帮助开发者快速集成得物的功能模块,例如商品搜索、订单管理等。 - **SDK 集成指南**: 针对不同平台(如 iOS、Android 或 Web)提供 SDK 下载和集成教程,简化第三方应用的开发流程。 - **技术博客**: 分享得物在技术实践中的经验成果,例如如何优化图片加载速度、提升应用性能等。 - **开源项目**: 得物可能将部分技术成果开源,供社区开发者学习和贡献。这不仅有助于提升品牌形象,还能吸引更多优秀人才加入。 #### 3. 示例代码 以下是一个简单的示例代码,展示如何通过 RESTful API 调用得物的商品搜索功能(假设接口已存在): ```python import requests def search_items(keyword, page=1): url = "https://api.dewu.com/v1/items/search" headers = { "Authorization": "Bearer YOUR_ACCESS_TOKEN", "Content-Type": "application/json" } params = { "keyword": keyword, "page": page, "size": 10 } response = requests.get(url, headers=headers, params=params) if response.status_code == 200: return response.json() else: return {"error": "Failed to fetch data"} # 调用示例 result = search_items("Air Jordan", page=1) print(result) ``` 此代码片段展示了如何通过 Python 请求得物的 API,并获取指定关键词的商品列表。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式up

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值