CH32V307环境参数在线监测系统(一)

news2024/11/28 6:27:50

CH32V307环境参数在线监测系统是以CH32V307VCT6为核心,由ESP8266模块、DHT11温湿度传感器模块、TFT LCD显示屏组成。系统实物图如下所示:

     系统功能主要有RTC实时时钟、WIFI网络授时、DHT11温度测量、温湿度数据实时上传到onenet平台、屏幕定时刷新等功能。本例程主要用到CH32V307的GPIO、串口、AD转换、定时器、RTC功能。今天先来看一下GPIO端口操作。 

CH32V307官方例程提供了GPIO应用的基本案例。官方案例代码主函数如下:

     主程序首先是通过NVIC_PriorityGroupConfig配置优先级分组-抢占优先级和次优先级,然后根据时钟寄存器值更新系统核心时钟变量,官方例程默认采用外部高速时钟作为时钟源,倍频至96MHZ。Delay_Init为ms级延时函数。初始化串口,用于输出调试信息。然后就是通过初始化函数初始PD0。在while循环中,通过GPIO_WriteBit函数对PD0进行写操作。        一般而言,嵌入式系统在正式工作前,都要进行一些初始化工作,比如GPIO使用前,先进行GPIO的初始化,如官方例程GPIO_Toggle_INIT函数,一般我们写成一个函数的形式。GPIO初始化函数如下图所示,

      这里GPIO初始化函数首先定义了一个GPIO_InitTypeDef类型的结构体变量。右键打开其声明可以看到这个结构变量的成员如下:有GPIO_Pin、GPIO_Speed和GPIO_Mode三个成员变量。

      这里GPIO_Pin就是需要配置的引脚。在ch32v30x_gpio.h的头文件中可以看到其预定义,如下图所示

GPIO_Speed为所选择的初始化引脚的输出响应速度这个速度是指I/O口驱动电路的响应速度而不是输出信号的速度,输出信号的速度与程序有关),芯片内部在I/O口的输出部分安排了多个响应速度不同的输出驱动电路,可以根据需要选择合适的驱动电路。在输出模式时可选速度如下:10MHz、2MHz、50MHz

      这里需要注意:高频的驱动电路,噪声也高,当不需要高的输出频率时,请选用低频驱动电路,这个非常有利于提高系统的电磁干扰(EMI)性能。当然如果要输出较高频率的信号,但却选用了较低频率的驱动模块,很可能会得到失真的输出信号。关键是GPIO的引脚速度跟应用匹配,推荐10倍以上。对于串口,假如最大波特率只需要115.2K,那么用2M的GPIO的引脚速度就够了,既省电也噪声小;对于IIC接口,假如用400K的传输速率,若想把余量留大些,那么用2M的GPIO的引脚速度或许不够。这时可以选择10M的GPIO引脚速度;对于SPI通信,假如使用18M或9M的传输速率,用10M的GPIO的引脚速度显然不够,需要选用50M的GPIO的引脚速度。

   GPIO_Mode所选择引脚的操作模式,CH32V307系列的MCU的输入/输出引脚可配置为一下8种模式(4种输入模式+2种输出模式+2种复用输出模式)。

GPIO_Mode_AIN为模拟输入,ADC对应的引脚配置引脚为模拟输入

GPIO_Mode_IN_FLOATING为浮空输入

GPIO_Mode_IPD带下拉输入

GPIO_Mode_IPU带上拉输入

GPIO_Mode_Out_OD开漏输出,要得到高电平状态需要上拉电阻才行如果引脚不连接外部的上拉电阻,则只能输出低电平。

1.开漏输出的这一特性一个明显的优势就是可以很方便的调节输出的电平,因为输出电平完全由上拉电阻连接的电源电平决定。所以在需要进行电平转换的地方,非常适合使用开漏输出。

2.开漏输出的这一特性另一个好处在于可以实现"线与"功能,所谓的"线与"指的是多个信号线直接连接在一起,只有当所有信号全部为高电平时,合在一起的总线为高电平;只要有任意一个或者多个信号为低电平,则总线为低电平。而推挽输出就不行,如果高电平和低电平连在一起,会出现电流倒灌,损坏器件。

    GPIO_Mode_Out_PP推免输出,推挽输出结构是由两个MOS或者三极管收到互补控制的信号控制,两个管子始终一个在导通,一个在截止,如下图所示:

      推挽输出的最大特点是可以真正能真正的输出高电平和低电平,在两种电平下都具有驱动能力。所谓的驱动能力,就是指输出电流的能力。推免式输出既可以提高电路的负载能力,又能提高开关速度,且导通损耗小效率高。输出既可以向负载灌电流(作为输出),也可以从负载抽取电流(作为输入)。

GPIO_Mode_AF_OD复用功能的推免输出

GPIO_Mode_AF_PP复用功能的开漏输出

GPIO_Toggle_INIT初始化代码功能就是初始化PD0为普通推免输出模式,通过PD0控制LED灯闪烁。其中GPIO_Init(GPIOA, &GPIO_InitStructure);这个函数的第一个参数GPIOD为宏定义,其相关的宏定义如下:((GPIO_TypeDef *) GPIOD_BASE)

GPIOD_BASE            (APB2PERIPH_BASE + 0x1400)

      对照官方手册寄存器映射表如下图所示,可以看到这里宏定义其实为GPIOD寄存器组的首地址。而第二个参数就是定义的结构变量是用户对GPIOD端口的参数设置的首地址,就是上面我们介绍的端口号、模式和速度。CH32单片机使用固件库函数完成对外设初始化都是采用这种规范。

另外在初始化代码中还有一句语句是RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);

      这句代码是开启GPIOD的时钟输出功能CH32系列单片机和STM32系列单片机一样外设带有时钟输出使能控制,如AHB总线时钟、内核时钟、各种外设APB1APB2外设、ADC时钟等。因此要使用GPIOD模块时,必须先使能对应的时钟。这里GPIOGPIOAGPIOBGPIOCGPIOD)连接外设总线上APB2上,如下图所示。因此通过以下代码使能其时钟。RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);

在while循环中,通过GPIO_WriteBit函数对PD0进行写操作。

       ch32v30x_gpio.c文件中我们看到GPIO_WriteBit的源代码,看芯片手册,可知这里BSHRBCR分别为端口置位/复位寄存器。注意这两个寄存器写0没有影响,写1则会置为或者复位。

      对于上面的代码,我们也可以直接对寄存器访问来编写程序,寄存器直接操作如下:

本编文章对GPIO操作代码分析就到这里。本项目用到IO口配置如下:

1.串口通信引脚配置

      这里串口通信引脚使用的是PA2作为发送,PA3作为接收。所以PA2这个引脚配置为功能复用推免输出。PA3作为接收引脚属于输入,这里配置为浮空输入模式。

2.LED指示灯引脚配置

3.LCD显示屏接口引脚

4.DHT11相关引脚初始化

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

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

相关文章

在Docker上安装和运行MySQL容器(纯步骤)

在Docker上安装和运行MySQL步骤 本文章只有操作步骤,没有原理解释,只是在学习当中提醒自己安装步骤。 第一步:从远程仓库拉取MySQL镜像 1.从远程仓库搜索mysql镜像 docker search mysql2.pull拉取镜像 这里我选择的是mysql的5.7版本 docker…

盘点 5 个 yyds 的 AI 绘画辅助工具

国外著名的 AI 作图工具 Midjourney、Stable Diiffusion 都可以根据你输入的指令生成一张图片。 如果你想输出高质量的图片,需要掌握一些 prompt 指令技巧。本文章便盘点了 5 个 GitHub 上的开源项目,引领你更好的上手 AI 作图。 本期推荐开源项目目录&…

软件杯龙源风电赛题培训!千万分钟数据和全流程基线等你来战

‍‍ “中国软件杯”大学生软件设计大赛是一项面向中国在校学生的公益性赛事,大赛由国家工业和信息化部、教育部、江苏省人民政府共同主办,是全国软件行业规格最高、最具影响力的国家级一类赛事。其中,作为重点赛题的龙源风电赛,上…

我们分析了9.12亿篇博客文章,得出了11条内容营销发现

我们分析了 9.12 亿篇博客文章,想要更好地了解目前的内容营销领域。 具体来说,我们研究了这些文章的内容格式、字数和标题等因素与社交媒体分享和反向链接的关联性。 在我们的数据合作伙伴BuzzSumo的帮助下,我们有了一些非常有趣的发现。 …

Dex-Net使用手册————GQCNN网络

1. Dex-Net Package GitHub - BerkeleyAutomation/dex-net 🎈dex-net Python 包用于打开、读取和编写 HDF5 数据库的 3D 对象模型、平行下颚抓取和掌握鲁棒性指标。 🎈HDF5数据库还可用于生成大量数据集,将点云和抓取的元组与二进制抓取鲁棒…

【Python】【进阶篇】12、搭建Django开发环境

目录 搭建Django开发环境1. 安装Python解释器2. 安装MySQL数据库3. 安装Python包管理器4. 安装 Pycharm IDE 搭建Django开发环境 上一章我们介绍了 Django 框架的重要组件,常言道“工欲善其事,必先利其器”,在正式创建 Django 项目之前&…

AI绘画——Lora模型Niji-Expressive V2 launch(灵动优雅,张力尽显)

目录 Niji-Expressive V2 launch!! 灵动优雅,张力尽显 Vivid and elegant, full of tension 模型演示(多图预警) Niji-Expressive V2 launch!! 灵动优雅,张力尽显 本次升级泛用性,能在更多模型和采样方式上适用 …

《一文带你读懂:云原生时代业务监控》

点击上方蓝字关注我们! 对业务来说,完备的应用健康性和数据指标的监控非常重要,通过采集准确的监控指标、配置合理的告警机制,我们能够提前或者尽早发现问题,并做出响应、解决问题,进而保证产品的稳定性&am…

vue性能优化之虚拟列表滚动

一、前言 前端的性能瓶颈那就是页面的卡顿,当然这种页面的卡顿包含了多种原因。 例如HTTP请求过多导致数据加载变慢,下载的静态文件非常大导致页面加载时间很长,js中一些算法响应的时间过长等。很多前端工程师都花费很多的精力在dom渲染上来…

Java 入门 - 语法基础

hello world public class Hello {public static void main(String[] args) {System.out.println("hello world");} } 复制代码 public: 是关键字;表示公开的class: 是关键字;用来定义类Hello: 是类名;大小写敏感;命名…

BFS算法专题

BFS算法专题 框架篇LeetCode 111. 二叉树的最小深度解题思路代码实现 LeetCode 752. 打开转盘锁解题思路代码实现 LeetCode 773. 滑动谜题解题思路代码实现 总结 不要纠结,干就完事了,熟练度很重要!!!多练习&#xff0…

Vivado约束添加方法:一文全面解析IO和时序约束

FPGA开发离不开IO约束和时序约束,IO约束用于确定输入/输出端口的物理端口和电气特性,与芯片和电路设计有关。而时序约束则用于设定FPGA设计中的时序特性,以确保系统能够在预期时钟频率下正常运行。本文将介绍vivado中常见的设置约束的方法。 …

mysql 如何避免索引失效

案例演示 建表及初始化数据 CREATE TABLE staffs (id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(24) NOT NULL DEFAULT ,age INT NOT NULL DEFAULT 0,pos VARCHAR(20) NOT NULL DEFAULT ,#职位add_time TIMESTAMP NOT NULL DEFAULT CURREN…

二维码在设备点维一体化管理中的应用

随着科技发展,设备点维一体化管理体系应运而生,该管理体系的出现让设备维护保养变得更加高效精细化。 设备点维一体化管理体系以设备点检和维护保养为基础,通过日常、专业及精密点检,对点检测得的数据和设备给油脂保养情况进行统…

一个开源、免费在线数据建模、元数据管理平台,简单易用

一、开源项目简介 ERD Online 是一个开源、免费在线数据建模、元数据管理平台。提供简单易用的元数据设计、关系图设计、SQL查询等功能,辅以版本、导入、导出、数据源、SQL解析、审计、团队协作等功能、方便我们快速、安全的管理数据库中的元数据。 二、开源协议 …

全国各省份影像下载地址(11级别)

安徽省https://pan.baidu.com/s/1fMuWhVZFvSH1UlCGU1bPpA?pwdeasy澳门特别行政区https://pan.baidu.com/s/1aU2D4o2bfeHTJTb6AkUtVA?pwdeasy北京市https://pan.baidu.com/s/1eaNzAWm1pUx_rjhD_wHHhA?pwdeasy福建省百度网盘 请输入提取码甘肃省https://pan.baidu.com/s/1mAqf…

【Tools系列】IDA远程调试Linux文件

Date: 2023.4.28 文章目录 1、工具安装2、IDA+linux_server参考1、工具安装 IDA Pro 7.2 2、IDA+linux_server (1)进入到IDA的安装目录,找到文件夹/dbgsrv,其中有两个文件linux_server和linux_server64,分别为32位的服务端和64位的服务端,可根据调试目标进行选择。并将…

RocketMQ第二节(安装和模块详解)

目录 1:RocketMQ安装 1.1:下载安装包解压 1.2:修改运行配置 1.3:运行RocketMQ 1.3.1:启动NameServer 1.3.2:启动Broker 1.4:消息收发 1.5:服务关闭 2:RocketMQ模…

八部门联合推动IPv6创新发展 知道创宇助力IPv6快速安全改造

近日,工业和信息化部、中央网信办、国家发展改革委、教育部、交通运输部、人民银行、国务院国资委、国家能源局等八部门联合印发《关于推进IPv6技术演进和应用创新发展的实施意见》(以下简称“《实施意见》”),提出到2025年底&…

换个花样玩C++(3)const_cast不是一行代码这么简单

我先不说const_cast的事情,还是回到我们之前遇到的一个问题,先看代码 示例1 #include <iostream> int main() {const int a = 1;int* p = (int*)(&a);*p = 100; std::cout << a; } 这段代码里,本来想通过指针p里修改a的值,vs调试看下来a的值在*p=100;这…