ZigBee 3.0实战教程-Silicon Labs EFR32+EmberZnet-5-02:串口发送数据-hello world

news2024/11/20 4:46:41
源码文档软件硬件技术交流技术支持入口文末
【所有相关 IDESDK例程源码均可从群文件 免费获取免安装解压即用

 

持续更新中,欢迎关注!

 


前面《ZigBee 3.0实战教程-Silicon Labs EFR32+EmberZnet-5-01:片上资源详解》一文中提到了,EFR32MG21总共有3个串口,分别为USART0、USART1和USART2,具体GPIO的映射情况如下图所示:
在这里插入图片描述
(注:如上内容部分截取自EFR32MG21的Datasheet中的“Table 6.4. DBUS Routing Table”。)

由上图可见:

  • USART0:相关引脚可以映射到PAPBPCPD总共4组GPIO的任意一个GPIO上;
  • USART1:相关引脚可以映射到PAPB总共2组GPIO的任意一个GPIO上;
  • USART2:相关引脚可以映射到PCPD总共2组GPIO的任意一个GPIO上。

一、初始化

首先需要在双击pintool文件之后弹出的界面中设置好所需使用的串口引脚,如下图所示:

在这里插入图片描述

上图中框出的部分就是为启用串口所新增的改动。然后在工程中的任意位置增加下面这段初始化代码即可:

void my_usart0_init(uint32_t baudrate)
{
  // Enable clock to GPIO
  CMU_ClockEnable(cmuClock_GPIO, true);

  // Configure the USART TX/RX pin
  GPIO_PinModeSet(MY_USART0_TX_PORT, MY_USART0_TX_PIN, gpioModePushPull, 0);
  GPIO_PinModeSet(MY_USART0_RX_PORT, MY_USART0_RX_PIN, gpioModeInput, 0);

  // Route MY_USART0 TX and RX to the board controller TX and RX pins
  GPIO->USARTROUTE[MY_USART0_NUM].TXROUTE = (MY_USART0_TX_PORT << _GPIO_USART_TXROUTE_PORT_SHIFT) | (MY_USART0_TX_PIN << _GPIO_USART_TXROUTE_PIN_SHIFT);
  GPIO->USARTROUTE[MY_USART0_NUM].RXROUTE = (MY_USART0_RX_PORT << _GPIO_USART_RXROUTE_PORT_SHIFT) | (MY_USART0_RX_PIN << _GPIO_USART_RXROUTE_PIN_SHIFT);
  GPIO->USARTROUTE[MY_USART0_NUM].ROUTEEN = GPIO_USART_ROUTEEN_RXPEN | GPIO_USART_ROUTEEN_TXPEN;

  // Configure and enable MY_USART0
  USART_InitAsync_TypeDef init = USART_INITASYNC_DEFAULT;
  init.baudrate = baudrate;
  init.databits = MY_USART0_DATA_BITS;
  init.parity = MY_USART0_PARITY;
  init.stopbits = MY_USART0_STOP_BITS;
  init.oversampling = MY_USART0_OVER_SAMPLING;
  init.hwFlowControl = MY_USART0_HW_FLOW_CONTROL;
  USART_InitAsync(MY_USART0, &init);

  // Enable NVIC USART sources
  NVIC_ClearPendingIRQ(MY_USART0_RX_IRQ_N);
  NVIC_EnableIRQ(MY_USART0_RX_IRQ_N);

  // Enable receive data valid interrupt
  USART_IntEnable(MY_USART0, USART_IEN_RXDATAV);
}

二、发送

本专题系列博客推荐使用EmberZnet自带的发送函数USART_Tx()进行串口数据发送,该函数的定义在文件em_usart.c内,具体如下图所示:

/***************************************************************************//**
 * @brief
 *   Transmit one 4-9 bit frame.
 *
 * @details
 *   Depending on the frame length configuration, 4-8 (least significant) bits from
 *   @p data are transmitted. If the frame length is 9, 8 bits are transmitted from
 *   @p data and one bit as specified by CTRL register, BIT8DV field.
 *   See USART_TxExt() for transmitting 9 bit frame with full control of
 *   all 9 bits.
 *
 *   Notice that possible parity/stop bits in asynchronous mode are not
 *   considered part of a specified frame bit length.
 *
 * @note
 *   This function will stall if the buffer is full until the buffer becomes available.
 *
 * @param[in] usart
 *   A pointer to the USART/UART peripheral register block.
 *
 * @param[in] data
 *   Data to transmit. See details above for more information.
 ******************************************************************************/
void USART_Tx(USART_TypeDef *usart, uint8_t data)
{
  /* Check that transmit buffer is empty */
  while (!(usart->STATUS & USART_STATUS_TXBL)) {
  }
  usart->TXDATA = (uint32_t)data;
}

需要发送一个字节的数据时,直接调用上述函数即可,当需要发送多字节数据时,循环、连续调用该函数即可,如下:

void my_usart0_send_buf(uint8_t *buf, uint16_t len)
{
  uint16_t i;

  for(i=0; i<len; i++)
  {
    USART_Tx(MY_USART0, buf[i]);
  }
}

printf格式化输出:

int my_usart0_printf(const char* format, ...)
{
  char buf[MY_USART0_PRINT_MAX] = {0x00};
  va_list va;
  int ret;

  va_start(va, format);
  ret = vsprintf(buf, format, va);
  va_end(va);

  my_usart0_send_buf((uint8_t *)buf, strlen((const char *)buf));

  return ret;
}

三、实验

在工程中的任意位置增加如下代码:

void emberAfMainInitCallback(void)
{
  my_usart0_printf(hello world!\r\n);
}

即为在回调函数emberAfMainInitCallback()中调用串口打印函数输出 hello world! 字符串并换行。编译烧录后,按一下开发板上的复位按键,即可看到电脑上的串口调试助手可以收到如下图所示的数据:
在这里插入图片描述
上图中框出的部分,就是我们增加的代码产生的效果,感兴趣的朋友可以自行修改相应代码,再编译,再烧录,观察实验现象的变化。

(注:任何相关问题,欢迎在文末技术交流QQ群中交流讨论。)


在这里插入图片描述

 

持续更新中,欢迎关注!

 

【所有相关 IDESDK例程源码均可从群文件 免费获取免安装解压即用
源码文档软件硬件技术交流技术支持入口文末

在这里插入图片描述

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

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

相关文章

90 后学霸博士 8 年进击战:用机器学习为化工研究叠 BUFF

本文首发自微信公众号&#xff1a;HyperAI超神经 内容一览&#xff1a;ScienceAI 作为近两年的技术热点&#xff0c;引起了业界广泛关注和讨论。本文将围绕 ScienceAdvances 的一篇论文&#xff0c;介绍如何利用机器学习&#xff0c;对燃煤电厂的胺排放量进行预测。 关键词&…

初始化一个GCP项目并用gcloud访问操作

1 简介 谷歌云GCP&#xff08;Google Cloud Platform&#xff09;是由Google提供的云平台&#xff0c;还是为用户提供了许多免费的产品&#xff0c;还是可以尝试一下的。对于学习或者小项目&#xff0c;都可以使用。 2 创建一个新项目 要使用GCP&#xff0c;我们需要创建一个…

【日常业务开发】常用JSON库API

【日常业务开发】常用JSON库APIGsonJava 对象转 Json字符串(序列化)Json字符串转Java 对象(反序列化)FastJsonJava 对象转 Json字符串(序列化)Json字符串转Java 对象(反序列化)JacksonJava 对象转 Json字符串(序列化)Json字符串转Java 对象(反序列化)Json 字符串内容反序列化为…

计算机网络各层设备故障及可行的解决方案

计算机网络分层 我们采用某五层模型进行研究 根据有关资料的统计&#xff0c;网络发生故障具体分布为&#xff1a; 应用层占3%&#xff1b; 表示层占7%&#xff1b; 会话层占8%&#xff1b; 传输层占10%&#xff1b; 网络层占12%&#xff1b; 数据链路层占25%&#xff…

大数据开发-Linux操作

目录1.1 touch:创建空文件1.2 mv :move 剪切粘贴--重命名和移动功能1.3 cat命名&#xff1a;查看文件内容1.4 cp &#xff1a;copy 复制粘贴1.5 ps、kill、ifconfig、clear1.6 回顾&#xff1a;1.1 touch:创建空文件 touch a.txt b.txt — 创建空文件a.txt与b.txt touch /root…

数据结构与算法(二)——递归算法

目录 前言 递归算法 1、什么是递归算法 2、核心理念 3、代码演示 4、问题探讨&#xff1a;只递不归会怎样&#xff1f; 5、小结 递归实例&#xff1a;汉诺塔问题 1、故事引入 2、移动盘子的逻辑 3、N个盘子的移动分析 4、代码实现N个盘子的移动 5、汉诺塔移动次数计…

文本到图像模型,如何快速生成高质量图片? #Google Muse AI

AIGC 的存在&#xff0c;大大提高了创作者的生产效率&#xff0c;目前&#xff0c;市面上也出现了许多快速生成图像的 AI 图像模型。近日&#xff0c;谷歌的 Muse AI 系统亮相&#xff0c;使用 AI 生成图片又多了一个选择工具&#xff01;Google Muse AI 图源&#xff1a;Muse …

【参考答案】java基础练习:选择结构(if、switch)

if&#xff1a;if...else...及if嵌套 提示用户输入三个整数&#xff0c;判断并输出最大值、最小值 package com.qzcsbj;import java.util.Scanner;public class Test {public static void main(String[] args) {Scanner input new Scanner(System.in);System.out.print("…

【正点原子FPGA连载】第十二章U-Boot移植 摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Linux开发指南

1&#xff09;实验平台&#xff1a;正点原子MPSoC开发板 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id692450874670 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html 第十二章U-Boot移…

CVR预估模型ESMM

1. 概述 一般在对CVR建模的过程中&#xff0c;正样本选择的是在点击后有转化的样本作为正样本&#xff0c;负样本则是在点击后没有转化的样本作为负样本。然而&#xff0c;这样的建模方式存在一定的问题&#xff1a; Sample Selection Bias&#xff08;SSB&#xff09;问题&a…

ArcGIS基础实验操作100例--实验90创建点、线、面要素混合的Voronoi

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台&#xff1a;ArcGIS 10.6 实验数据&#xff1a;请访问实验1&#xff08;传送门&#xff09; 空间分析篇--实验90 创建点、线、面要素混合的Voronoi 目录 一、实验背景 二、实验数据 三、实验步骤 …

回收租赁商城系统功能拆解08讲-售后退款

回收租赁系统适用于物品回收、物品租赁、二手买卖交易等三大场景。 可以快速帮助企业搭建类似闲鱼回收/爱回收/爱租机/人人租等回收租赁商城。 回收租赁系统支持智能评估回收价格&#xff0c;后台调整最终回收价&#xff0c;用户同意回收后系统即刻放款&#xff0c;用户微信零…

使用nginx和ffmpeg搭建HLS流媒体服务器

使用nginx和ffmpeg搭建HLS流媒体服务器 文章目录使用nginx和ffmpeg搭建HLS流媒体服务器1 安装ffmpeg2 安装nginx3 nginx有关HLS参数配置ffmpeg进行HLS切片VLC播放验证最近研究HLS流媒体协议&#xff0c;需要临时搭建HLS服务器&#xff0c;这里记录下搭建的过程(操作系统&#x…

计算机制图设计教程-以全国降水处理为例

前言本博客主要是通过一幅完整数字地图的制作过程&#xff0c;巩固计算机制图内容&#xff0c;报告中涉及到了地图数字化、空间数据的存储与管理、空间数据库的建立、符号化、制图综合技术和空间分析等内容。从而锻炼自身的动手实践能力&#xff0c;了解一幅地图制作设计的完整…

2022年江西省首届职业院校教师数字经济职业技能比赛“信息安全”赛项竞赛任务书

2022年江西省首届职业院校教师数字经济职业技能比赛“信息安全”赛项竞赛任务书 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 A模块 A-1 登录安全加固 90分钟 200分 A-2 数据库加固 A-3 服务加固 A-4 防火墙策略 B模块 B-1 Windows操作系统渗透测试 400分 B…

云间玉兔,自出机抒,从零开始制作Web插件网页特效小兔子组件(小挂件widget),基于原生CSS/NPM

著意登楼瞻玉兔&#xff0c;何人张幕遮银阙&#xff1f;又到了一年一度的网页小挂件环节&#xff0c;以往我们都是集成别人开源的组件&#xff0c;但所谓熟读唐诗三百首&#xff0c;不会做诗也会吟&#xff0c;熟读了别人的东西&#xff0c;做几首打油诗也是可以的&#xff0c;…

数据降维-MDS 算法

数据降维-MDS 算法 文章目录数据降维-MDS 算法算法概述算法步骤算法证明代码参考算法概述 MDS的初衷是将图结构中的距离在空间的一种表示。 例如&#xff0c;已知几个城市的距离&#xff0c;但是不知道城市的坐标&#xff0c;那么MDS就能通过距离矩阵转换成空间坐标向量来近似…

mock的基本使用

mock的基本使用官网文档mockjs是用来模拟产生一些虚拟的数据&#xff0c;可以让前端在后端接口还没有开发出来时独立开发&#xff0c;mockjs可以拦截ajax请求&#xff0c;返回设定好的数据。注意&#xff1a;mock&#xff08;模拟数据&#xff09;数据需要使用到mockjs模块&…

如何用更好的创意引发卖家和消费者的共鸣?

我们知道&#xff0c;近年来国家的政策越来越向创新型的企业发展倾斜&#xff0c;因此各行各业都响应政策&#xff0c;做创新型高质量发展&#xff0c;跨境电商作为疫情下应运而生的产物&#xff0c;其本身就带有创新型发展的概念&#xff0c;同时&#xff0c;面对着2022年许多…

Java程序的运行过程(执行流程)分析

万事知其然&#xff0c;要知其所以然&#xff0c;所以本节带大家来详细了解一下 Java 程序的执行过程。从《使用记事本编写运行Java程序》一节的案例可以看出&#xff0c;Java 程序的运行必须经过编写、编译和运行 3 个步骤。编写&#xff1a;是指在 Java 开发环境中进行程序代…