三、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.mzph.cn/pingmian/48361.shtml

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

相关文章

[CSS] 浮动布局的深入理解与应用

文章目录 浮动的简介元素浮动后的特点解决浮动产生的影响浮动后的影响解决浮动产生的影响 浮动相关属性实际应用示例示例1:图片与文字环绕示例2:多列布局示例3:响应式布局 总结 浮动布局是CSS中一种非常强大的布局方式,最初设计用…

java项目(knife4j使用,静态资源未放在static资源包下,公共字段自动填充,Spring Cache与Spring Task)

Knife4j(生成接口文档) 使用swagger你只需要按照它的规范去定义接口及接口相关的信息,就可以做到生成接口文档,以及在线接口调试页面。官网:https://swagger.io/ Knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案。…

JMeter请求导出Excel

前言 今天记录一个使用JMeter模拟浏览器请求后端导出,并下载Excel到指定位置的过程 创建请求 同样先创建一个线程组,再创建一个请求,设置好请求路径,端口号等 查看结果树 右键--添加--监听器--查看结果树 这里可以查看&#…

Windows搭建RTMP视频流服务器

参考了一篇文章,见文末。 博客中nginx下载地址失效,附上一个有效的地址: Index of /download/ 另外,在搭建过程中,遇到的问题总结如下: 1 两个压缩包下载解压并重命名后,需要 将nginx-rtmp…

【Linux】编辑器vscode与linux的联动

1.vscode简单学习 vscode是编辑器,可以写各种语言的程序 下载链接:Download Visual Studio Code - Mac, Linux, Windows 来用一下vscode 我们保存了就能在我们的那个文件夹里面看到这个 这个就是编辑器,跟我们的文本文件好像差不多&#…

栈及栈的应用(有效的括号 力扣20)

栈的概念 栈是一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。 画个图理解一下 咱们可以观…

在项目中加入 husky + lint-staged + eslint,代码检测格式化

背景 由于日常工作的多人协作中,会因为个人代码编写风格导致代码在不同人电脑上,会有异常代码格式的提示,为了解决这个小问题,我们可以使用 husky lint-staged 来对代码进行一定程度上的格式化,使格式风格统一&#x…

jenkins 使用教程

1. 安装最新长期稳定版 2.426.1 Redhat Jenkins Packages sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo --no-check-certificate sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io-2023.key yum insta…

ubuntu20.04支持win10远程桌面连接

1. 安装xrdp sudo apt install xrdp 2. 检查xrdp状态 sudo systemctl status xrdp 要处于running状态 3.(若为Ubuntu 20)添加xrdp至ssl-cert sudo adduser xrdp ssl-cert 4. 重启服务 sudo systemctl restart xrdp 5. window 远程桌面连接&am…

大模型实战—大模型赋能网络爬虫

大模型赋能网络爬虫 简单来说,网页抓取就是从网站抓取数据和内容,然后将这些数据保存为XML、Excel或SQL格式。除了用于生成潜在客户、监控竞争对手和市场研究外,网页抓取工具还可以用于自动化你的数据收集过程。 借助AI网页抓取工具,可以解决手动或纯基于代码的抓取工具的…

Springcloud之gateway的使用详解

官网地址&#xff1a;https://docs.spring.io/spring-cloud-gateway/docs/4.0.4/reference/html/ 1.网关入门 helloword 网关不依赖start-web 导入的pom&#xff1a; <!--gateway--> <dependency><groupIdorg.springframework.cloud</groupId><arti…

openEuler 知:版本比较

文章目录 前言工具oe_diffoepkg 前言 本文的“版本比较”主要是指比较 openEuler 操作系统两个版本之间的 rpm 包的版本差异&#xff0c;只比较版本差异&#xff0c;不比较文件内容的差异。 比较版本主要用于分析两个操作系统版本之间软件包的版本变化。 工具 oe_diff 工具…

CUDA编程00 - 配置CUDA开发环境

第一步&#xff1a; 在一台装有Nvidia显卡和驱动的机器上&#xff0c;用nvidia-smi命令查看显卡所支持cuda版本 第二步&#xff1a; 到Nvidia官网下载CUDA Toolkit并安装&#xff0c;CUDA Toolkit Archive | NVIDIA Developer 安装时按提示下一步即可&#xff0c;安装完成用 …

【端智能】端智能技术演进与实践

什么是端智能技术 端智能&#xff08;On-Device Machine Learning&#xff09;是指把机器/深度学习算法模型应用和部署到端设备上&#xff0c;这里“端设备”是相对于云服务而言的&#xff0c;可以是手机&#xff0c;也可以是物联网IoT设备。 Google对端智能的介绍&#xff1…

系统架构设计师教程(清华第二版) 第3章 信息系统基础知识-3.2 业务处理系统-解读

教材中,一会儿“业务处理系统”,一会儿“事务处理系统”,语法毛病一堆。真是清华的水平!!! 系统架构设计师教程 第3章 信息系统基础知识-3.2 业务处理系统 3.2.1 业务处理系统的概念3.2.2 业务处理系统的功能3.2.2.1 数据输入3.2.2.2 数据处理3.2.2.2.1 批处理 (Batch …

计算机体系结构||指令的调度和延迟分布(3)

实验3 指令的调度和延迟分布 3.1实验目的 &#xff08;1&#xff09;加深对指令调度技术的理解。 &#xff08;2&#xff09;加深对延迟分支技术的理解。 &#xff08;3&#xff09;熟练掌握用指令调度技术来解决流水线中的数据冲突的方法。 &#xff08;4&#xff09;进一…

使用AI给编程赋能

传送门&#xff1a;https://www.bilibili.com/video/BV1pf421B71v?p23&vd_source092ecb16e8482a7243d0f8f7718c31a2 1. AIGC AI&#xff08;Artificial Intelligence&#xff09;&#xff1a;人工智能&#xff0c;是计算机科学体系下的一个学科&#xff0c;是指通过计算机…

c# 开发AutoCAD扩展

在C#中开发AutoCAD扩展涉及使用AutoCAD的.NET API&#xff0c; 利用AutoCAD的功能并创建自定义命令、对话框、块、图层和其他图形元素。以下是一些关键步骤和概念&#xff0c;可以帮助你开始使用C#开发AutoCAD扩展&#xff1a; 准备开发环境 安装AutoCAD&#xff1a;确保你有一…

【Linux】线程互斥和同步

目录 线程互斥 相关概念 互斥量mutex 互斥量的接口 初始化互斥量 销毁互斥量 互斥量加锁/解锁 可重入VS线程安全 概念 可重入与线程安全的联系 可重入与线程安全的区别 死锁 死锁的四个必要条件 避免死锁 避免死锁的算法 线程同步 条件变量 条件变量函数 初始…

语义分割——为什么单通道8bit灰度图像能显示多种色块???

目录 一、问题二、解答2.1 标签图的实际存储格式2.2 标签图的显示颜色2.3 颜色映射示例 三、应用颜色映射3.1 OpenCV显示标签图3.2 Matplotlib显示标签图 四、总结 一、问题 大家在做语义分割时不知道有没有这样的疑惑&#xff0c;使用打标签工具后&#xff0c;标签图是单通道…