AI嵌入式K210项目(5)-串口通讯

文章目录

  • 前言
  • 一、什么是UART?
  • 二、K210的UART
  • 三、实验过程
  • 总结


前言

串口通讯是平时大家进行调试最常用的方法,嵌入式应用通常要求一个简单的并且占用系统资源少的方法来传输数据。通用异步收发传输器 (UART)即可以满足这些要求,它能够灵活地与外部设备进行全双工数据交换,那么本章我们来了解下,本节课主要学习K210的串口通讯。


一、什么是UART?

串口通讯是指外设和计算机间,通过数据信号线、地线等,按位(bit)进行传输数据(发送和接收)的一种通讯方式,一个字符一个字符地传输,每个字符一位一位地传输,并且传输一个字符时,总是以“起始位”开始,以“停止位”结束,字符之间没有固定的时间间隔要求,但是数据是低位在前,高位在后,然后接上奇偶检验位。

在这里插入图片描述
串口支持全双工通讯,也就是使用一根线发送数据的同时,用另一根线接收数据。串口通讯最重要的参数是波特率、数据位、停止位和奇偶校验,对于两个通讯的端口,这些参数是必须设置为相同的。
也可以参考我的这篇文章STM32开发(7)----CubeMX配置串口通讯(轮询方式)

二、K210的UART

Tpye-C接口连接到串口芯片,具有供电和串口传输数据的功能,下载程序也是通过串口传输数据的功能把固件传输到K210芯片上的。

Type-C接口是目前主流的数据传输连接接口,市面上很多智能手机也是使用Type-C接口给手机充电和传输数据。Type-C接口是可以正反插的,不用担心反向拿反而插不进的问题。

通用UART 为UART1、UART2 和UART3,支持异步通信(RS232 和RS485 和IRDA,通信速率可达到5Mbps。UART 支持CTS 和RTS 信号的硬件管理以及软件流控(XON 和XOFF)。3 个接口均可被DMA 访问或者CPU 直接访问。每次传输数据为8字节,支持异步时钟,可单独配置数据时钟,实现全双工模式,保证两个时钟域中数据同步。

uart默认为RS232模式,也可以配置为软件可编程式RS485模式。
K210 Tpye-C接口连接K210的IO4和IO5接口,其中IO4为K210芯片的接收引脚,IO5为K210芯片的发送引脚。
在这里插入图片描述
对应的头文件 uart.h
为用户提供以下接口
• uart_init
• uart_config (0.6.0 后不再支持,请使用 uart_configure)
• uart_configure
• uart_send_data
• uart_send_data_dma
• uart_send_data_dma_irq
• uart_receive_data
• uart_receive_data_dma第 11 章 通用异步收发传输器 (UART) 125
• uart_receive_data_dma_irq
• uart_receive_data_dma_irq
• uart_irq_register
• uart_irq_deregister
• uart_set_work_mode
• uart_set_rede_polarity
• uart_set_rede_enable
• uart_set_tat
• uart_set_det
• uart_debug_init
• uart_handle_data_dma

三、实验过程

新建一个uart的文件夹,在里面新建main.c,以后也都是这样,我们每一个实验放一个文件夹
在这里插入图片描述

#include "fpioa.h"
#include "uart.h"
#include <string.h>
// 硬件IO口,与原理图对应
#define PIN_UART_USB_RX       (4)
#define PIN_UART_USB_TX       (5)/*****************************SOFTWARE-GPIO********************************/
// 软件GPIO口,与程序对应
#define UART_USB_NUM           UART_DEVICE_3/*****************************FUNC-GPIO************************************/
// GPIO口的功能,绑定到硬件IO口
#define FUNC_UART_USB_RX       (FUNC_UART1_RX + UART_USB_NUM * 2)
#define FUNC_UART_USB_TX       (FUNC_UART1_TX + UART_USB_NUM * 2)/**
* Function       hardware_init
* @brief         硬件初始化,绑定GPIO口
* @param[in]     void
* @param[out]    void
* @retval        void
* @par History   无
*/
void hardware_init(void)
{// fpioa映射fpioa_set_function(PIN_UART_USB_RX, FUNC_UART_USB_RX);fpioa_set_function(PIN_UART_USB_TX, FUNC_UART_USB_TX);
}/**
* Function       main
* @brief         主函数,程序的入口
* @param[in]     void
* @param[out]    void
* @retval        0
* @par History   无
*/
int main(void)
{hardware_init();// 初始化串口3,设置波特率为115200uart_init(UART_USB_NUM);uart_configure(UART_USB_NUM, 115200, UART_BITWIDTH_8BIT, UART_STOP_1, UART_PARITY_NONE);/* 开机发送hello yahboom! */char *hello = {"hello world!\n"};uart_send_data(UART_USB_NUM, hello, strlen(hello));char recv = 0;while (1){/* 等待串口信息,并通过串口发送出去 */while(uart_receive_data(UART_USB_NUM, &recv, 1)){uart_send_data(UART_USB_NUM, &recv, 1);}}return 0;
}

代码写好后,我们开始编译,注意:如果你编译过程中出现错误,可以先make clean掉之前生成的过程文件,重新生成

cd build
//注意这里的目标文件目录改成uart,和刚才新建的文件夹名称一致
cmake .. -DPROJ=uart  -G "MinGW Makefiles"
make

烧录
在这里插入图片描述
然后来看看结果吧
在这里插入图片描述
那么还有其他方式进行串口输出调试吗?我们习惯用printf进行调试;这个系统初始化时候已经帮我们做好了一起来看看user_entry.c文件
系统在初始化bsp是有已经注册系统输出回调函数,printf 时会调用该函数。系统默认使用 UART3,如果需要修改 UART 则调用
uartdebuginit 函数,具体请到 uart 章节查看该函数;

void _init_bsp(int core_id, int number_of_cores)
{extern int main(int argc, char* argv[]);extern void __libc_init_array(void);extern void __libc_fini_array(void);if (core_id == 0){/* Initialize bss data to 0 */init_bss();/* Init UART */fpioa_set_function(4, FUNC_UART3_RX);fpioa_set_function(5, FUNC_UART3_TX);uart_debug_init(UART_DEVICE_3);/* Init FPIOA */fpioa_init();/* Register finalization function */atexit(__libc_fini_array);/* Init libc array for C++ */__libc_init_array();/* Get reset status */sysctl_get_reset_status();/* Init plic */plic_init();/* Enable global interrupt */sysctl_enable_irq();}

因此我们直接使用printf之类的函数也是可以的,写个简单的示例如下:
这里注意包含头文件

#include <bsp.h>
#include <sysctl.h>int main(void)
{int data;printf("Hello world\n");/* Clear stdin buffer before scanf */sys_stdin_flush();scanf("%d", &data);printf("\nData is %d\n", data);while(1)continue;return 0;
}

代码编译

cd build
//注意这里的目标文件目录改成uart,和刚才新建的文件夹名称一致
cmake .. -DPROJ=printf  -G "MinGW Makefiles"
make

烧录
在这里插入图片描述
这个方式是不是更简单?以后我们就直接用printf进行打印了


总结

本章介绍了K210 串口通讯的相关知识
K210总共有三个,分别是UART1,UART2和UART3;uart默认使用RS232模式,可以另外配置成可编程式RS485模式;uart的引脚如果映射到其他硬件引脚上,需要连接其他串口芯片如CH340上才可以显示数据。

注册系统输出回调函数,printf 时会调用该函数。系统默认使用 UART3,如果需要修改 UART 则调用
uartdebuginit 函数,以后我们直接使用printf进行调试即可

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

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

相关文章

odoo16 权限继承修改字段显示2

odoo16 权限继承修改字段显示2 上次文章写道:最近在搭建的一个服装批发中心使用的进销存一体化项目,由于客户文化水平低,不想在发货界面显示 好多无用功能,有些是有用的,有些是他不关心的。占在用户角度考虑,用不到的功能都是垃圾。有他们的道理。在隐藏的过程中,出现了…

2011 年考研数二真题解析

一、选择题 【01】【02】【03】【04】【05】【06】【07】【08】 二、填空题 【09】【10】【11】【12】【13】【14】 三、解答题 【15】【16】【17】【18】【19】【20】【21】【22】【23】

A-B 数对(洛谷)

A-B 数对 题目背景 出题是一件痛苦的事情&#xff01; 相同的题目看多了也会有审美疲劳&#xff0c;于是我舍弃了大家所熟悉的 AB Problem&#xff0c;改用 A-B 了哈哈&#xff01; 题目描述 给出一串正整数数列以及一个正整数 C&#xff0c;要求计算出所有满足 A - B C 的数…

运筹说 第90期 | 网络计划-图解评审法

前述章节的网络计划方法主要研究以时间为主要参数的确定型网络模型&#xff0c;其中的概率型网络模型也只讨论工作公式的不确定性&#xff0c;并没有对事项或工作的不确定性进行讨论。由于这类网络模型的建立有严格的规则&#xff0c;大量研究与开发类计划尚无法表达。因从本期…

vue中el-radio无法默认选中

页面上不生效&#xff0c;默认什么都不选中 <el-radio-group v-model"queryParams.videoUrlType"><el-radio :label"1">本地上传</el-radio><el-radio :label"2">外部链接</el-radio> </el-radio-group>da…

污水处理厂能耗分析系统,高效节能保护环境的利器

在城市化发展中&#xff0c;水污染问题也愈发凸显&#xff0c;在污水处理过程中&#xff0c;所产生的能源相对较多&#xff0c;企能源消耗的量就比较大&#xff0c;所以成本就会较高。因此&#xff0c;应对污水处理的具体情况需要进行深入分析与研究&#xff0c;明确具体消耗情…

Lamp架构从入门到精通

系列文章目录 lnmp架构 lnmp架构-nginx负载均衡以及高可用 系列文章目录一、源码编译configure(检测预编译环境是否可行)makemake install优化关闭Debug 二、 nginx负载均衡三、nginx的高并发nginx work数量的设定nginx work进程与cpu的静态绑定压力测试nginx高并发修改操作系…

使用 Apache POI XDGF 读取 vsdx 文件

引入依赖 <dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.22.1</version> </dependency> <dependency><groupId>org.apache.logging.log4j</groupI…

org.openjdk.jmh 的 pom 引用

<dependencies><dependency><groupId>org.openjdk.jmh</groupId><artifactId>jmh-core</artifactId><version>1.29</version></dependency> </dependencies>这将从 Maven 中央存储库下载 org.openjdk.jmh 依赖项的…

Spring AOP 源码分析

【阅读前提】&#xff1a; 需了解AOP注解开发流程&#xff1a;链接 一、注解 EnableAspectJAutoProxy 在配置类中添加注解EnableAspectJAutoProxy&#xff0c;便开启了AOP&#xff08;面向切面编程&#xff09; 功能。此注解也是了解AOP源码的入口。 EnableAspectJAutoProxy…

训练营第四十九天 | ● 121. 买卖股票的最佳时机 ● 122.买卖股票的最佳时机II

121. 买卖股票的最佳时机 持有&#xff1a;第i-1天持有&#xff1b;第i天买入 不持有&#xff1a;第i-1天不持有&#xff1b;第i天卖出 代码随想录 class Solution {public int maxProfit(int[] prices) {//动态规划if(prices null || prices.length 0) return 0;int n pri…

编码技巧:如何在Golang中高效解析和生成XML

编码技巧&#xff1a;如何在Golang中高效解析和生成XML 引言Golang中的XML基础解析XML文件生成XML文件错误处理和调试高级技巧和最佳实践总结 引言 在当今数据驱动的编程世界中&#xff0c;有效地处理各种数据格式是每个开发人员必备的技能之一。其中&#xff0c;XML&#xff…

【人工智能:现代方法】第19章:样例学习

智能体学习&#xff08;learning&#xff09;&#xff1a;一个智能体通过对世界进行观测来提高它的性能机器学习&#xff08;machine learning&#xff09;&#xff1a;智能体是一台计算机 —— 一台计算机观测到一些数据&#xff0c;基于这些数据构建一个模型&#xff08;mode…

并发编程之三大特性及JMM内存模型

目录 原子性 如何保证原子性 可见性 如何保证可见性 有序性 如何保证有序性 Java内存模型(JMM内存模型) Java内存模型的一些关键概念&#xff1a; 主内存与工作内存交互协议 Java内存模型通过以下手段来确保多线程程序的正确性&#xff1a; 锁机制 volatile volat…

说说JavaScript数字精度丢失的问题,如何解决?

在 JavaScript 中&#xff0c;数字精度丢失是一种普遍的问题。这是因为 JavaScript 内部的数字均以 IEEE 754 标准的双精度浮点数格式存储&#xff0c;这种格式只能精确表示有限个小数&#xff0c;而对于一些无限循环小数或无理数&#xff0c;无法精确表示&#xff0c;就会出现…

1-数组-有效的数独

这是数组的第一题&#xff0c;从现在开始开启数组篇章。力扣链接。 请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 &#xff0c;验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的…

Fpga开发笔记(二):高云FPGA发开发软件Gowin和高云fpga基本开发过程

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/135620590 红胖子网络科技博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬…

【Redis配置】Linux下的Redis安装配置

压缩包方式的Redis下载与安装 进入官网 Redis官网&#xff1a;https://redis.io/download/ 往下翻可以找到其他版本的Redis&#xff0c;或者访问https://download.redis.io/releases/查找自己所需Redis版本。 下载自己所需版本 此处我选择下载的是6.2.14版本 上传到Linux…

墙地砖外形检测的技术方案-图像分割

基础原理 由于对碗口进行缺口检测&#xff0c;因此只需要碗口的边界信息。得到陶瓷碗区域填充后的图像&#xff0c;对图像进行边缘检测。这是属于图像分割中的内容&#xff0c;在图像的边缘中&#xff0c;可以利用导数算子对数字图像求差分&#xff0c;将边缘提取出来。 案例…

Vue:将以往的JQ页面,重构成Vue组件页面(组件化编码大致流程)

一、实现静态组件 组件要按照功能点拆分&#xff0c;命名不要与HTML元素冲突。 1、根据UI提供的原型图&#xff0c;进行结构设计&#xff0c;结构设计的粒度以是否方便给组件起名字为依据。并梳理好对应组件的层级依赖关系。 2、设计好结构后&#xff0c;开始写对应的组件&am…