PSoc62™开发板之串口通信

实验目的

1.使用串口和PC机通信:接收和发送信息

2.接收GNSS模块定位信息

实验准备

  • PSoc62™开发板
  • CH340 USB转TTL模块
  • ATGM332D GNSS模块
  • 公母头杜邦线x4

板载资源

板载有多少uart

创建工程例程,在libraries/HAL_Drivers/uart_config.h中查看BSP支持的uart数量及对应的GPIO,可以看到一共有7组uart

/** Copyright (c) 2006-2023, RT-Thread Development Team** SPDX-License-Identifier: Apache-2.0** Change Logs:* Date           Author       Notes* 2022-07-08     Rbb666       first version*/#ifndef __UART_CONFIG_H__
#define __UART_CONFIG_H__#include <rtthread.h>
#include "board.h"#ifdef __cplusplus
extern "C"
{
#endif#ifdef BSP_USING_UART0/* UART0 device driver structure */cy_stc_sysint_t UART0_SCB_IRQ_cfg ={.intrSrc = (IRQn_Type)scb_0_interrupt_IRQn,.intrPriority = (7u),};
#endif
#ifdef BSP_USING_UART1/* UART1 device driver structure */cy_stc_sysint_t UART1_SCB_IRQ_cfg ={.intrSrc = (IRQn_Type)scb_1_interrupt_IRQn,.intrPriority = (7u),};
#endif
#ifdef BSP_USING_UART2/* UART2 device driver structure */cy_stc_sysint_t UART2_SCB_IRQ_cfg ={.intrSrc = (IRQn_Type)scb_2_interrupt_IRQn,.intrPriority = (7u),};
#endif
#ifdef BSP_USING_UART3/* UART3 device driver structure */cy_stc_sysint_t UART3_SCB_IRQ_cfg ={.intrSrc = (IRQn_Type)scb_3_interrupt_IRQn,.intrPriority = (7u),};
#endif
#ifdef BSP_USING_UART4/* UART4 device driver structure */cy_stc_sysint_t UART4_SCB_IRQ_cfg ={.intrSrc = (IRQn_Type)scb_4_interrupt_IRQn,.intrPriority = (7u),};
#endif
#ifdef BSP_USING_UART5/* UART5 device driver structure */cy_stc_sysint_t UART5_SCB_IRQ_cfg ={.intrSrc = (IRQn_Type)scb_5_interrupt_IRQn,.intrPriority = (7u),};
#endif#ifdef BSP_USING_UART6/* UART6 device driver structure */cy_stc_sysint_t UART6_SCB_IRQ_cfg ={.intrSrc = (IRQn_Type)scb_6_interrupt_IRQn,.intrPriority = (7u),};
#endif
#if defined(BSP_USING_UART0)
#ifndef UART0_CONFIG
#define UART0_CONFIG                            \{                                           \.name = "uart0",                        \.tx_pin = P0_3,                         \.rx_pin = P0_2,                         \.usart_x = SCB0,                        \.intrSrc = scb_0_interrupt_IRQn,        \.userIsr = uart_isr_callback(uart0),    \.UART_SCB_IRQ_cfg = &UART0_SCB_IRQ_cfg, \}void uart0_isr_callback(void);
#endif /* UART0_CONFIG */
#endif /* BSP_USING_UART0 */#if defined(BSP_USING_UART1)
#ifndef UART1_CONFIG
#define UART1_CONFIG                            \{                                           \.name = "uart1",                        \.tx_pin = P10_1,                        \.rx_pin = P10_0,                        \.usart_x = SCB1,                        \.intrSrc = scb_1_interrupt_IRQn,        \.userIsr = uart_isr_callback(uart1),    \.UART_SCB_IRQ_cfg = &UART1_SCB_IRQ_cfg, \}void uart1_isr_callback(void);
#endif /* UART1_CONFIG */
#endif /* BSP_USING_UART1 */#if defined(BSP_USING_UART2)
#ifndef UART2_CONFIG
#if defined(SOC_CY8C6244LQI_S4D92)
#define UART2_CONFIG                            \{                                           \.name = "uart2",                        \.tx_pin = P3_1,                         \.rx_pin = P3_0,                         \.usart_x = SCB2,                        \.intrSrc = scb_2_interrupt_IRQn,        \.userIsr = uart_isr_callback(uart2),    \.UART_SCB_IRQ_cfg = &UART2_SCB_IRQ_cfg, \}
#else
#define UART2_CONFIG                            \{                                           \.name = "uart2",                        \.tx_pin = P9_1,                         \.rx_pin = P9_0,                         \.usart_x = SCB2,                        \.intrSrc = scb_2_interrupt_IRQn,        \.userIsr = uart_isr_callback(uart2),    \.UART_SCB_IRQ_cfg = &UART2_SCB_IRQ_cfg, \}
#endif /* SOC_CY8C6244LQI_S4D92 */void uart2_isr_callback(void);
#endif /* UART2_CONFIG */
#endif /* BSP_USING_UART2 */#if defined(BSP_USING_UART3)
#ifndef UART3_CONFIG
#define UART3_CONFIG                            \{                                           \.name = "uart3",                        \.tx_pin = P6_1,                         \.rx_pin = P6_0,                         \.usart_x = SCB3,                        \.intrSrc = scb_3_interrupt_IRQn,        \.userIsr = uart_isr_callback(uart3),    \.UART_SCB_IRQ_cfg = &UART3_SCB_IRQ_cfg, \}void uart3_isr_callback(void);
#endif /* UART3_CONFIG */
#endif /* BSP_USING_UART3 */#if defined(BSP_USING_UART4)
#ifndef UART4_CONFIG
#define UART4_CONFIG                            \{                                           \.name = "uart4",                        \.tx_pin = P7_1,                         \.rx_pin = P7_0,                         \.usart_x = SCB4,                        \.intrSrc = scb_4_interrupt_IRQn,        \.userIsr = uart_isr_callback(uart4),    \.UART_SCB_IRQ_cfg = &UART4_SCB_IRQ_cfg, \}void uart4_isr_callback(void);
#endif /* UART4_CONFIG */
#endif /* BSP_USING_UART4 */#if defined(BSP_USING_UART5)
#ifndef UART5_CONFIG
#define UART5_CONFIG                            \{                                           \.name = "uart5",                        \.tx_pin = P5_1,                         \.rx_pin = P5_0,                         \.usart_x = SCB5,                        \.intrSrc = scb_5_interrupt_IRQn,        \.userIsr = uart_isr_callback(uart5),    \.UART_SCB_IRQ_cfg = &UART5_SCB_IRQ_cfg, \}void uart5_isr_callback(void);
#endif /* UART5_CONFIG */
#endif /* BSP_USING_UART5 */#if defined(BSP_USING_UART6)
#ifndef UART6_CONFIG
#define UART6_CONFIG                            \{                                           \.name = "uart6",                        \.tx_pin = P6_5,                         \.rx_pin = P6_4,                         \.usart_x = SCB6,                        \.intrSrc = scb_6_interrupt_IRQn,        \.userIsr = uart_isr_callback(uart6),    \.UART_SCB_IRQ_cfg = &UART6_SCB_IRQ_cfg, \}void uart6_isr_callback(void);
#endif /* UART6_CONFIG */
#endif /* BSP_USING_UART6 */
#ifdef __cplusplus
}
#endif#endif

uart0-uart6和GPIO对应关系表

uart2是比较特殊的,两组不同的GPIO都可以使用它

分组RXDTXD
uart0P0.2P0.3
uart1P10.0P10.1
uart2P3.0 / P9.0P3.1 / P9.1
uart3P6.0P6.1
uart4P7.0P7.1
uart5P5.0P5.1
uart6P6.4P6.5

电路图

串口IO

这里以uart0为例,P0.2对应MCU_ARD_PWM11P0.3对应MCU_ARD_PWM12

在这里插入图片描述

模块连接图

右侧排母从上往下第6、7引脚分别对应uart0 TXD、RXD

在这里插入图片描述

状态指示灯

板子有两个自主控制的绿色LED,通过上拉方式接入GPIO,MCU_USER_LED1对应P0.0,本次实验使用它来指示uart0的数据接收状态

程序设计

和PC机通信

通过CH340 USB转TTL模块连接PC和uart0,实物连接图如下

在这里插入图片描述

编码实现

#include <rtthread.h>
#include <rtdevice.h>
#include "drv_gpio.h"#define LED_PIN     GET_PIN(0, 1)
#define UART_DEVICE_NAME       "uart0"
#define BSP_UART4_RX_BUFSIZE 1024static rt_device_t serial;struct rx_msg
{rt_device_t dev;rt_size_t size;
};static struct rt_messagequeue rx_mq;static rt_err_t uart_input(rt_device_t dev, rt_size_t size)
{rt_pin_write(LED_PIN, PIN_LOW);struct rx_msg msg;rt_err_t result;msg.dev = dev;msg.size = size;result = rt_mq_send(&rx_mq, &msg, sizeof(msg));if (result == -RT_EFULL){rt_kprintf("message queue full!\n");}return result;
}static void serial_thread_entry(void *parameter)
{struct rx_msg msg;rt_err_t result;rt_uint32_t rx_length;static char rx_buffer[BSP_UART4_RX_BUFSIZE + 1];while (1){rt_memset(&msg, 0, sizeof(msg));result = rt_mq_recv(&rx_mq, &msg, sizeof(msg), RT_WAITING_FOREVER);
//        if (result == RT_EOK){rx_length = rt_device_read(msg.dev, 0, rx_buffer, msg.size);rx_buffer[rx_length] = '\0';rt_device_write(serial, 0, rx_buffer, rx_length);rt_pin_write(LED_PIN, PIN_HIGH);
//            rt_kprintf("%s\n",rx_buffer);}}
}static int uart0_setup(int argc, char *argv[])
{rt_err_t ret = RT_EOK;char uart_name[RT_NAME_MAX];static char msg_pool[256];char str[] = "uart0 setup successfully!\r\n";if (argc == 2){rt_strncpy(uart_name, argv[1], RT_NAME_MAX);}else{rt_strncpy(uart_name, UART_DEVICE_NAME, RT_NAME_MAX);}serial = rt_device_find(uart_name);if (!serial){rt_kprintf("find %s failed!\n", uart_name);return RT_ERROR;}struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT;config.baud_rate = BAUD_RATE_9600;config.data_bits = DATA_BITS_8;config.stop_bits = STOP_BITS_1;config.bufsz     = 1024;config.parity    = PARITY_NONE;rt_device_control(serial, RT_DEVICE_CTRL_CONFIG, &config);rt_mq_init(&rx_mq, "rx_mq", msg_pool, sizeof(struct rx_msg), sizeof(msg_pool), RT_IPC_FLAG_FIFO);rt_device_open(serial, RT_DEVICE_FLAG_INT_RX);rt_device_set_rx_indicate(serial, uart_input);rt_device_write(serial, 0, str, (sizeof(str) - 1));rt_thread_t thread = rt_thread_create("serial", serial_thread_entry, RT_NULL, 1024, 25, 10);if (thread != RT_NULL){rt_thread_startup(thread);}else{ret = RT_ERROR;}return ret;
}MSH_CMD_EXPORT(uart0_setup, uart0 setup example);int main(void)
{rt_pin_mode(LED_PIN, PIN_MODE_OUTPUT);while (1){rt_thread_mdelay(500);}
}

打开串口调试工具,打开对应的COM口,串口设置和上面的代码保持一致:波特率115200、数据位8位、停止位为1位、奇偶校验位为无

在这里插入图片描述

在RT-Thread Studio初始化uart0,使用msh终端输入uart0_setup命令

在这里插入图片描述

初始化成功,可以在串口调试工具看到以下信息

在这里插入图片描述

自定义串口消息,点击发送按钮,可以看到发出去的消息被开发板转发了回来,而LED也随即闪了一下

在这里插入图片描述

接收GPS模块定位数据

通过uart0连接ATGM332D GNSS模块,实物连接图如下

在这里插入图片描述

编码实现uart0串口通信,注意GNSS模块的波特率默认为9600,其它跟上面的example保持一致

#include <rtthread.h>
#include <rtdevice.h>
#include "drv_gpio.h"#define LED_PIN     GET_PIN(0, 1)
#define UART_DEVICE_NAME       "uart0"
#define BSP_UART4_RX_BUFSIZE 1024static rt_device_t serial;struct rx_msg
{rt_device_t dev;rt_size_t size;
};static struct rt_messagequeue rx_mq;static rt_err_t uart_input(rt_device_t dev, rt_size_t size)
{rt_pin_write(LED_PIN, PIN_LOW);struct rx_msg msg;rt_err_t result;msg.dev = dev;msg.size = size;result = rt_mq_send(&rx_mq, &msg, sizeof(msg));if (result == -RT_EFULL){rt_kprintf("message queue full!\n");}return result;
}static void serial_thread_entry(void *parameter)
{struct rx_msg msg;rt_err_t result;rt_uint32_t rx_length;static char rx_buffer[BSP_UART4_RX_BUFSIZE + 1];while (1){rt_memset(&msg, 0, sizeof(msg));result = rt_mq_recv(&rx_mq, &msg, sizeof(msg), RT_WAITING_FOREVER);
//        if (result == RT_EOK){rx_length = rt_device_read(msg.dev, 0, rx_buffer, msg.size);rx_buffer[rx_length] = '\0';rt_device_write(serial, 0, rx_buffer, rx_length);rt_pin_write(LED_PIN, PIN_HIGH);rt_kprintf("%s\n",rx_buffer);}}
}static int uart0_setup(int argc, char *argv[])
{rt_err_t ret = RT_EOK;char uart_name[RT_NAME_MAX];static char msg_pool[256];char str[] = "uart0 setup successfully!\r\n";if (argc == 2){rt_strncpy(uart_name, argv[1], RT_NAME_MAX);}else{rt_strncpy(uart_name, UART_DEVICE_NAME, RT_NAME_MAX);}serial = rt_device_find(uart_name);if (!serial){rt_kprintf("find %s failed!\n", uart_name);return RT_ERROR;}struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT;config.baud_rate = BAUD_RATE_9600;config.data_bits = DATA_BITS_8;config.stop_bits = STOP_BITS_1;config.bufsz     = 1024;config.parity    = PARITY_NONE;rt_device_control(serial, RT_DEVICE_CTRL_CONFIG, &config);rt_mq_init(&rx_mq, "rx_mq", msg_pool, sizeof(struct rx_msg), sizeof(msg_pool), RT_IPC_FLAG_FIFO);rt_device_open(serial, RT_DEVICE_FLAG_INT_RX);rt_device_set_rx_indicate(serial, uart_input);rt_device_write(serial, 0, str, (sizeof(str) - 1));rt_thread_t thread = rt_thread_create("serial", serial_thread_entry, RT_NULL, 1024, 25, 10);if (thread != RT_NULL){rt_thread_startup(thread);}else{ret = RT_ERROR;}return ret;
}MSH_CMD_EXPORT(uart0_setup, uart0 setup example);int main(void)
{rt_pin_mode(LED_PIN, PIN_MODE_OUTPUT);while (1){rt_thread_mdelay(500);}
}

在msh终端输入uart0_setup后GNSS数据读取结果如下

在这里插入图片描述

运行效果如下,可以看到GNSS报文以1Hz的频率打印,LED灯在不停地闪烁

PSoc62™开发板之串口通信

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

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

相关文章

凯越推出复古150踏板欧洲先上?DAE150/150亮相

今天临下班发现凯越在欧洲的官网上更新了一台复古踏板&#xff0c;外观别说还有点精致的意思&#xff0c;一共分为125和150两个配置&#xff0c;都是采用的水冷单缸发动机。 配置和参数等数据简单过一下&#xff0c;这种车型更多的是看外观了&#xff0c;仪表采用的LCD的显示屏…

MySQL之四大引擎、账号管理以及建库认识

目录 一、数据库存储引擎&#xff08;发动机&#xff09; 1.1、认识引擎 1.2、查看存储引擎 1.3、引擎常识 1.4、support字段说明 1.5、四大引擎 二、数据库管理 2.1、元数据库介绍&#xff1a; 2.2、分类&#xff1a; 2.3、增删改查以及使用操作 2.4、权限 三、数…

ArkTS语言应用开发入门指南与简单案例解析

文章目录 前言创建项目及其介绍简单案例学习本文总结问答回顾-学习前言 在前几节课中,我们已经了解了ArkTS语言的特点以及其基本语法。现在,我们将正式利用ArkTS来进行应用开发。本节课将通过一个快速入门案例,让大家熟悉开发工具的用法,并介绍UI的基础概念。 创建项目及…

Mnist手写体数字数据集介绍与在Pytorch中使用

1.介绍 MNIST&#xff08;Modified National Institute of Standards and Technology&#xff09;数据集是一个广泛用于机器学习和计算机视觉研究的常用数据集之一。它由手写数字图像组成&#xff0c;包括0到9的数字&#xff0c;每张图像都是28x28像素的灰度图像&#xff0c;图…

探索大模型语言(LLM)科技的革新

文章目录 一. 引言二. 了解大模型语言2.1 什么是LLM&#xff1f;2.2 大模型与大模型语言的区分 三. 机器学习3.1 AI开发3.2 机器学习服务 四. 大模型的应用场景五. 全篇总结 一. 引言 自然语言处理领域的发展取得了巨大的突破&#xff0c;其中广义语言模型&#xff08;LLM&…

pytorch学习笔记

torchvision处理图像的 pytorch官网上看数据集的包&#xff0c;COCO数据集目标检测、语义分割&#xff0c;cifar物体识别 预训练好的模型 这个模块是图片的处理 root-位置&#xff0c;train-创建的true是个训练集&#xff0c;transform 前面是输出图片的数据类型&#xff0c;“…

ByteTrack算法流程的简单示例

ByteTrack ByteTrack算法是将t帧检测出来的检测框集合 D t {\mathcal{D}_{t}} Dt​ 和t-1帧预测轨迹集合 T ~ t − 1 {\tilde{T}_{t-1}} T~t−1​ 进行匹配关联得到t帧的轨迹集合 T t {T_{t}} Tt​。 首先使用检测器检测t帧的图像得到检测框集合 D t {\mathcal{D}_{t}} …

md文件图片上传方案:Github+PicGo 搭建图床

文章目录 1. PicGo 下载2. 配置Github3. 配置PicGo4. PicGo集成Typora4.1 picGo监听端口设置 5. 测试 1. PicGo 下载 下载地址&#xff1a;https://molunerfinn.com/PicGo/ 尽量下载稳定版本 2. 配置Github 1. 创建一个新仓库&#xff0c;用于存放图片 2. 生成一个token&a…

【安卓的签名和权限】

Android 编译使用哪个key签名&#xff1f; 一看Android.mk 在我们内置某个apk的时候都会带有Android.mk&#xff0c;这里面就写明了该APK使用的是什么签名&#xff0c;如&#xff1a; LOCAL_CERTIFICATE : platform表明使用的是platform签名 LOCAL_CERTIFICATE : PRESIGNED…

SpringBoot整合ElasticSearch实现CRUD操作

本文来说下SpringBoot整合ES实现CRUD操作 文章目录 概述项目搭建ES简单的crud操作保存数据修改数据查看数据删除数据 本文小结 概述 SpringBoot支持两种技术和es交互。一种的jest&#xff0c;还有一种就是SpringData-ElasticSearch。根据引入的依赖不同而选择不同的技术。反正作…

代码随想录算法训练营Day16 | 654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树

LeetCode 654 最大二叉树 本题思路&#xff1a;我们可以看到每次其实这个找最大值&#xff0c;然后创建节点的过程就是一个二叉树的前序遍历的过程。所以&#xff0c;我们可以递归来完成它。 先创找到数组中&#xff0c;最大的值的下标&#xff0c;然后创建根节点然后根据下标…

c语言-整型在内存的存储

文章目录 前言一、整型数值在内存中的存储1.1 整型数值的表示形式1.2 二进制的表示形式1.3 整数在内存中存储 二、大端字节序存储和小端字节序存储2.1 大端字节序存储2.2 小端字节序存储2.3 练习 总结 前言 本篇文章叙述c语言中整型数据在内存中的存储方式。 一、整型数值在内…

Vue学习计划-Vue3--核心语法(一)OptionsAPI、CompositionAPI与setup

1. OptionsAPI与CompositionAPI Vue2的API设计是Options(配置)风格的Vue3的API设计是Composition(组合)风格的 Options API的弊端&#xff1a; Options类型的API&#xff0c;数据、方法、计算属性等&#xff0c;是分散在&#xff1a;data、methods、computed中的&#xff0c;若…

【操作系统xv6】学习记录2 -RISC-V Architecture

说明&#xff1a;看完这节&#xff0c;不会让你称为汇编程序员&#xff0c;知识操作系统的前置。 ref&#xff1a;https://binhack.readthedocs.io/zh/latest/assembly/mips.html https://www.bilibili.com/video/BV1w94y1a7i8/?p7 MIPS MIPS的意思是 “无内部互锁流水级的微…

Maple 2021安装包下载及安装教程

Maple 2021下载链接&#xff1a;https://docs.qq.com/doc/DUk9MQ1BPRHRYWU9s 1.鼠标右键解压到“Maple 2021” 2.选中Setup&#xff0c;鼠标右击选择“以管理员身份运行” 3.点击“Next” 4.选择I accept the agreement&#xff0c;点击“Next” 5.选择软件安装路径&#xff0c…

IDEA JAVA Spring Boot运行Hello World(1.8)

参考资料&#xff1a; Spring Boot运行Hello World - 知乎https://blog.csdn.net/weixin_44005516/article/details/108293228(解决bug)SpringBoot入门第一章&#xff1a;Hello World-java教程-PHP中文网 (仅参考如何运行程序)java 8安装教程 java 8安装教程_java8安装-CSDN博…

力扣:763. 划分字母区间(贪心,哈希)

题目&#xff1a; 给你一个字符串 s 。我们要把这个字符串划分为尽可能多的片段&#xff0c;同一字母最多出现在一个片段中。 注意&#xff0c;划分结果需要满足&#xff1a;将所有划分结果按顺序连接&#xff0c;得到的字符串仍然是 s 。 返回一个表示每个字符串片段的长度…

SpringBoot集成MQTT协议

简介 MQTT 可以被解释为一种低开销&#xff0c;低带宽占用的即时通讯协议&#xff0c;可以用较少的代码和带宽为远程设备连接提供实时可靠的消息服务&#xff0c;它适用于硬件性能低下的远程设备以及网络状况糟糕的环境下&#xff0c;因此 MQTT 协议在 IoT&#xff08;Interne…

1月3日代码随想录反转二叉树

226翻转二叉树 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1]示例 2&#xff1a; 输入&#xff1a;root [2,1,3] 输出&#xff1a;[2,3,…

原生JS做别踩白块游戏

思路 创建初始一个按钮并为他添加点击监听开始创建随机方块&#xff0c;并样式_box.offsetTop speed px结合setInterval使得方块不断下移创建和删除方块的原则&#xff1a;box.offsetTop>0&#xff08;可视区上部没有方块了&#xff09;时候需要创建一行方块&#xff0c;…