三、GPIO口

我们在刚接触C语言时,写的第一个程序必定是hello world,其他的编程语言也是这样类似的代码是告诉我们进入了编程的世界,在单片机中也不例外,不过我们的传统就是点亮第一个LED灯,点亮电阻,电容的兄弟,也是挺厉害🤭的但是没有必要。

一、创建工程

         在这一章中,我们将了解到这款芯片的初始化配置,我们参考了网上的一些资料,和沁恒官方所提供的手册和例程

        如果还不了解使用这款芯片所用的软件和如何新建工程,可以去阅读专栏的前面两章阅读的地址我放在下面:
1.软件安装icon-default.png?t=N7T8https://blog.csdn.net/jzkj201/article/details/140397936

2.创建工程icon-default.png?t=N7T8https://blog.csdn.net/jzkj201/article/details/140443312

二、这篇文章能了解什么

        我们在正式开始点亮第一个LED灯前,先了解一下读了这篇能获得什么:

  1. 部分GPIO库函数的解读
  2. GPIO的初始化
  3. GPIO函数的写操作
  4. 延迟函数
  5. 代码程序

 2.1 部分GPIO库函数的解读

        找到图片的位置我们就可以看到,这款RISC-V架构的单片机的库函数了,学过STM32标准库的小伙伴,我相信你们也可以快速读懂库函数的。

2.2 GPIO的初始化

        为了方便程序的代码的管理,我新建了一个文件夹,用于放置相关代码的初始化和代码。感兴趣的小伙伴,可以自己搜索如何设置,后续我也会出相关的教材。如果现在不知道怎么创建的小伙伴,可以将初始化的代码,复制到int man()里面while函数的上面,就可以完成GPIO的初始化。

        下面我们就来看看这些代码表示什么意思。

void LED_Init(){GPIO_InitTypeDef GPIO_InitStructure = {0};RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);
}

1.声明并初始化GPIO初始化结构体:

GPIO_InitTypeDef GPIO_InitStructure = {0};
GPIO_InitTypeDef 是一个结构体类型,用于存储GPIO初始化的配置参数。
GPIO_InitStructure = {0}; 将这个结构体初始化为0,以确保所有成员变量都被设置为默认值。


2.使能GPIOA的时钟:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd() 函数用于使能或失能外设的时钟。
RCC_APB2Periph_GPIOA 是GPIOA端口的时钟。
ENABLE 参数表示使能这个时钟。使能GPIOA的时钟是必要的,因为在配置和使用GPIOA引脚之前,必须先使能它的时钟。


3.配置GPIO引脚:
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
GPIO_Pin_0 | GPIO_Pin_1 指定要初始化的引脚为GPIOA的引脚0和引脚1。通过使用位或运算符|,可以同时选择多个引脚。

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Mode_Out_PP 设置引脚模式为推挽输出模式。(小伙伴们可以去了解数据手册中的其他几个输出模式)

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Speed_50MHz 设置引脚的速度为50MHz。速度配置决定了引脚的最大切换速度,即引脚能够多快地从高电平切换到低电平或者反之。50MHz是较高的切换速度,适用于快速开关操作。


4.调用官方的库函数:

GPIO_Init(GPIOA, &GPIO_InitStructure); 
GPIO_Init() 函数使用上面设置的参数初始化GPIOA的引脚。

GPIOA 是要初始化的GPIO端口。&GPIO_InitStructure 是一个指向结构体的指针,该结构体包含初始化参数。
通过这个函数,GPIOA的引脚0和引脚1被配置为推挽输出模式,并准备以50MHz的速度操作。这些引脚现在可以用来控制LED或者其他输出设备。

2.3 GPIO函数的写操作 

 初始化GPIO口后,现在就可以对LED灯进行操作,在操作前我们先看看"ch32v30x_gpio.h"中的

void GPIO_WriteBit(GPI_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);
这两个函数.

GPIO_WriteBit函数

参数说明:
  • GPIOx:指向GPIO端口基地址的指针,可以是GPIOA到GPIOG之一。
  • GPIO_Pin:要写入的端口引脚,可以是GPIO_Pin_x,其中x可以是0到15。
  • BitVal:要写入引脚的值,可以是Bit_RESETBit_SET
功能实现:
  • 判断BitVal是否为Bit_RESET。如果不是Bit_RESET,即为Bit_SET
    • GPIOx->BSHR = GPIO_Pin; 将选定的引脚置位(设置为高电平)。
  • 否则(BitValBit_RESET):
    • GPIOx->BCR = GPIO_Pin; 将选定的引脚清零(设置为低电平)

GPIO_WriteBit函数

参数说明:
  • GPIOx:指向GPIO端口基地址的指针,可以是GPIOA到GPIOG之一。
  • PortVal:要写入端口输出数据寄存器的值。
功能实现:
  • GPIOx->OUTDR = PortVal;PortVal的值写入到指定的GPIO端口的输出数据寄存器(OUTDR)。这会一次性地设置该端口所有引脚的状态。

2.4 延迟函数

        了解GPIO写操作的相关函数后,我们就来了解一下沁恒微电子官方给我提供的一些延迟函数,方便后续的LED灯的闪烁,流水灯,跑马灯等程序的编写。有关与延迟函数的库在debug.h

void Delay_Init(void)

void Delay_Us(uint32_t n)

void Delay_Ms(uint32_t n)

Delay_Init 函数

初始化延迟功能,计算并设置延迟计数变量。

功能:
  • SystemCoreClock 是系统核心时钟的频率。
  • p_us 是系统核心时钟频率除以8000000的结果,表示每个微秒的计数值。
  • p_ms 是每个微秒的计数值乘以1000,表示每个毫秒的计数值。

Delay_Us 函数

实现微秒级延迟。

  • 清除SysTick状态寄存器的第0位。
  • 计算延迟计数值 i,等于 n(微秒数)乘以 p_us
  • 将计数值 i 写入SysTick的比较寄存器(CMP)。
  • 设置SysTick控制寄存器:
    • 第4位:使能SysTick定时器。
    • 第5位和第0位:启动SysTick定时器。
  • 等待直到SysTick状态寄存器的第0位被置位,表示延迟结束。
  • 清除SysTick控制寄存器的第0位,停止定时器。

Delay_Ms 函数 

实现毫秒级延迟。

  • 清除SysTick状态寄存器的第0位。
  • 计算延迟计数值 i,等于 n(毫秒数)乘以 p_ms
  • 将计数值 i 写入SysTick的比较寄存器(CMP)。
  • 设置SysTick控制寄存器:
    • 第4位:使能SysTick定时器。
    • 第5位和第0位:启动SysTick定时器。
  • 等待直到SysTick状态寄存器的第0位被置位,表示延迟结束。
  • 清除SysTick控制寄存器的第0位,停止定时器。

好了,我们了解了一些基本的函数,那现在就开始来写代码吧。

2.5 代码程序

int main(void)
{NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);SystemCoreClockUpdate();Delay_Init();USART_Printf_Init(115200);	printf("SystemClk:%d\r\n",SystemCoreClock);printf( "ChipID:%08x\r\n", DBGMCU_GetCHIPID() );printf("This is printf example\r\n");LED_Init();while(1){GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_RESET);GPIO_WriteBit(GPIOA, GPIO_Pin_1, Bit_RESET);}
}

以上这段段代码就实现了LED1和LED2的点亮,目前我并没有最main函数内的串口等相关函数进行修改,后续会根据实际情况对main函数内的函数进行精简。

Tips:为什么在给相应的GPIO置低电平的时候LED灯才会亮呢?下面我们只需要看官方给的原理图就能明白,小伙伴根据自己的原理,给出合理的电平信号,来点亮你的LED灯吧。

2.5.1LED灯电路原理图

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

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

相关文章

【PPT笔记】1-3节 | 默认设置/快捷键/合并形状

文章目录 说明笔记1 默认设置1.1 OFFICE版本选择1.1.1 Office某某数字专属系列1.1.2 Office3651.1.3 产品信息怎么看 1.2 默认设置1.2.1 暗夜模式1.2.2 无限撤回1.2.3 自动保存(Office2013版本及以上)1.2.4 图片压缩1.2.5 字体嵌入1.2.6 多格式导出1.2.7…

Python 在Word表格中插入、删除行或列

Word文档中的表格可以用于组织和展示数据。在实际应用过程中,有时为了调整表格的结构或适应不同的数据展示需求,我们可能会需要插入、删除行或列。以下提供了几种使用Python在Word表格中插入或删除行、列的方法供参考: 文章目录 Python 在Wo…

内容安全(深度行为检测技术、IPS、AV、入侵检测方法)

1、深度行为检测技术 深度行为检测技术:是一种基于深度学习和机器学习的技术,它通过分析用户在网络中的行为模式,识别异常或潜在威胁行为,从而保护网络安全和内容安全 分类: 深度包检测技术(Deep Packet…

k8s核心操作_存储抽象_K8S中使用Secret功能来存储密码_使用免密拉取镜像_k8s核心实战总结---分布式云原生部署架构搭建033

注意在看的时候一定要把 dxxxx中的xxxx换成--o----c----k----e----r 然后我们再来看一个k8s中的secret的功能,这个功能 用来存储密码的,configMap是用来存配置的 比如我们有个pod,他的镜像,如果是需要密码的,那么 我们现在是从公共仓库拉取的,如果我们从私有仓库拉取,有密码…

无需业务改造,一套数据库满足 OLTP 和 OLAP,GaiaDB 发布并行查询能力

在企业中通常存在两类数据处理场景,一类是在线事务处理场景(OLTP),例如交易系统,另一类是在线分析处理场景(OLAP),例如业务报表。 OLTP 数据库擅长处理数据的增、删、改&#xff0c…

【Arduino IDE】安装及开发环境、ESP32库

一、Arduino IDE下载 二、Arduino IDE安装 三、ESP32库 四、Arduino-ESP32库配置 五、新建ESP32-S3N15R8工程文件 乐鑫官网 Arduino官方下载地址 Arduino官方社区 Arduino中文社区 一、Arduino IDE下载 ESP-IDF、MicroPython和Arduino是三种不同的开发框架,各自适…

防火墙之双机热备篇

为什么要在防火墙上配置双机热备技术呢? 相信大家都知道,为了提高可靠性,避免单点故障 肯定有聪明的小伙伴会想到那为什么不直接多配置两台防火墙,然后再将他们进行线路冗余,不就完成备份了吗? 答案是不…

使用Django框架实现音频上传功能

数据库设计(models.py) class Music(models.Model):""" 音乐 """name models.CharField(verbose_name"音乐名字", max_length32)singer models.CharField(verbose_name"歌手", max_length32)# 本质…

R语言实现神经网络ANN

# 常用激活函数 # 自定义Sigmoid函数 sigmod <- function(x){return(1/(1exp(-x))) } # 绘制Sigmoid曲线 x <- seq(-10,10,length.out 100) plot(x,sigmod(x),type l,col blue,lwd 2,xlab NA,ylab NA,main Sigmoid函数曲线)# 自定义Tanh函数 tanh <- function(…

QT-RTSP相机监控视频流

QT-RTSP相机监控视频流 一、演示效果二、关键程序三、下载链接 一、演示效果 二、关键程序 #include "mainwindow.h"#include <QDebug>MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), m_settings("outSmart", "LiveWatcher&…

Web开发:卡片翻转效果(HTML、CSS)

目录 一、实现效果 二、完整代码 三、实现过程 1、页面结构 2、初始样式 3、翻转效果 4、图片大小问题 一、实现效果 如下图所示&#xff0c;当鼠标移入某个盒子&#xff0c;就反转这个盒子&#xff0c;并显示其背面的内容——卡片翻转效果&#xff1b; 卡片翻转效果 二…

Java二十三种设计模式-工厂方法模式(2/23)

工厂方法模式&#xff1a;设计模式中的瑞士军刀 引言 在软件开发中&#xff0c;工厂方法模式是一种常用的创建型设计模式&#xff0c;它用于处理对象的创建&#xff0c;将对象的实例化推迟到子类中进行。这种模式不仅简化了对象的创建过程&#xff0c;还提高了代码的可维护性…

基于Vue CLI 3构建Vue3项目(Vue2也可参考)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

Android Framework学习笔记(4)----Zygote进程

Zygote的启动流程 Init进程启动后&#xff0c;会加载并执行init.rc文件。该.rc文件中&#xff0c;就包含启动Zygote进程的Action。详见“RC文件解析”章节。 根据Zygote对应的RC文件&#xff0c;可知Zygote进程是由/system/bin/app_process程序来创建的。 app_process大致处…

【Java--数据结构】二叉树oj题(上)

前言 欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 判断是否是相同的树 oj链接 要判断树是否一样&#xff0c;要满足3个条件 根的 结构 和 值 一样左子树的结构和值一样右子树的结构和值一样 所以就可以总结以下思路…

【Pytorch】RNN for Name Classification

参考学习来自&#xff1a; https://pytorch.org/tutorials/intermediate/char_rnn_classification_tutorial.htmlRNN完成姓名分类https://download.pytorch.org/tutorial/data.zip 导入库 import glob # 用于查找符合规则的文件名 import os import unicodedata import stri…

【Powershell】超越限制:获取Azure AD登录日志

你是否正在寻找一种方法来追踪 Azure Active Directory&#xff08;Azure AD&#xff09;中用户的登录活动&#xff1f; 如果是的话&#xff0c;查看Azure AD用户登录日志最简单的方法是使用Microsoft Entra管理中心。打开 https://entra.microsoft.com/&#xff0c;然后进入 监…

taro小程序terser-webpack-plugin插件不生效(vue2版本)

背景 最近在做公司内部的小程序脚手架&#xff0c;为了兼容老项目和旧项目&#xff0c;做了vue2taro,vue3taro两个模板&#xff0c;发现terser-webpack-plugin在vue2和vue3中的使用方式并不相同&#xff0c;同样的配置在vue3webpack5中生效&#xff0c;但是在vue2webpack4中就…

学习Python的IDE功能--(一)入门导览

项目视图是主要工具窗口之一。它包含项目目录、SDK 特定的外部库和临时文件。点击带条纹的按钮可以预览演示项目。您也可以按Alt1打开。点击以打开项目视图&#xff0c;展开项目目录以查看项目文件。双击以打开welcome.py。 切换到"学习"工具窗口继续学习本课次。…

ELK企业级日志分析

目 录 一、ELK简介 1.1 elasticsearch简介 1.2 logstash简介 1.3 kibana简介 1.4 ELK的好处 1.5 ELK的工作原理 二、部署ELK 2.1 部署elasticsearch(集群) 2.1.1 修改配置文件 2.1.2 修改系统参数 2.1.2.1 修改systemmd服务管理器 2.1.2.2 性能调优参数 2.1.2.3 …