三、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://xiahunao.cn/news/3247380.html

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

相关文章

【Java项目笔记】01项目介绍

一、技术框架 1.后端服务 Spring Boot为主体框架 Spring MVC为Web框架 MyBatis、MyBatis Plus为持久层框架,负责数据库的读写 阿里云短信服务 2.存储服务 MySql redis缓存数据 MinIO为对象存储,存储非结构化数据(图片、视频、音频&a…

防溺水预警系统引领水域安全新篇章

一、系统概述 随着人们对水域活动的需求增加,溺水事故频发,给人们的生命安全带来了严重威胁。然而,如今,一项创新科技正在以强大的功能和无限的潜力引领着水域安全的新篇章。智能防溺水预警系统,作为一种集成了智能感知…

神经网络构造

目录 一、神经网络骨架:二、卷积操作:三、卷积层:四、池化层:五、激活函数(以ReLU为例): 一、神经网络骨架: import torch from torch import nn#神经网络 class CLH(nn.Module):de…

【概率论三】参数估计:点估计(矩估计、极大似然法)、区间估计

文章目录 一. 点估计1. 矩估计法2. 极大似然法2.1. 似然函数2.2. 极大似然估计法 3. 评价估计量的标准3.1. 无偏性3.2. 有效性3.3. 一致性 二. 区间估计1. 区间估计的概念2. 正态总体参数的区间估计 参数估计讲什么 由样本来确定未知参数参数估计分为点估计与区间估计 一. 点估…

Golang面试题整理(持续更新...)

文章目录 Golang面试题总结一、基础知识1、defer相关2、rune 类型3、context包4、Go 竞态、内存逃逸分析5、Goroutine 和线程的区别6、Go 里面并发安全的数据类型7、Go 中常用的并发模型8、Go 中安全读写共享变量方式9、Go 面向对象是如何实现的10、make 和 new 的区别11、Go 关…

【Pytorch】RNN for Name Classification

参考学习来自: 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…

【linux】信号的理论概述和实操

目录 理论篇 信号概述 信号的分类 信号机制 理解硬件中断 异步 信号对应的三种动作 信号产生的条件 终端按键 系统调用 软件条件 硬件异常 除0错误 野指针 OS对于错误的态度 信号在进程中的内核数据结构 信号的处理 CPU的内核态和用户态概述 进程处理信号的时…

dom4j 操作 xml 之按照顺序插入标签

最近学了一下 dom4j 操作 xml 文件,特此记录一下。 public class Dom4jNullTagFiller {public static void main(String[] args) throws DocumentException {SAXReader reader new SAXReader();//加载 xml 文件Document document reader.read("C:\\Users\\24…

Hadoop3:MR程序的数据倾斜问题处理

一、数据倾斜 什么是数据倾斜? 学过Redis集群的都知道数据倾斜这个问题。 就是大量数据,分配不均匀的现象。 二、MR数据倾斜 1、怎么判断出现数据倾斜? 数据频率倾斜——某一个区域的数据量要远远大于其他区域。 数据大小倾斜——部分记…

[iOS]浅析isa指针

[iOS]浅析isa指针 文章目录 [iOS]浅析isa指针isa指针isa的结构isa的初始化注意事项 上一篇留的悬念不止分类的实现 还有isa指针到底是什么 它是怎么工作的 class方法又是怎么运作的 class_data_bits_t bits; // class_rw_t * plus custom rr/alloc flags 这里面的class又是何方…

【BUG】已解决:Uncaught SyntaxError: Unexpected token ‘<‘

已解决:Could not install packages due to an EnvironmentError: [Errno 13] Permission denied 欢迎来到我的主页,我是博主英杰,211科班出身,就职于医疗科技公司,热衷分享知识,武汉城市开发者社区主理人 …

用 WireShark 抓住 TCP

Wireshark 是帮助我们分析网络请求的利器,建议每个同学都装一个。我们先用 Wireshark 抓取一个完整的连接建立、发送数据、断开连接的过程。 简单的介绍一下操作流程。 1、首先打开 Wireshark,在欢迎界面会列出当前机器上的所有网口、虚机网口等可以抓取…

Nginx、LNMP万字详解

目录 Nginx 特点 Nginx安装 添加Nginx服务 Nginx配置文件 全局配置 HTTP配置 状态统计页面 Nginx访问控制 授权用户 授权IP 虚拟主机 基于域名 测试 基于IP 测试 基于端口 测试 LNAMP 解析方式 LNMP转发php-fpm解析 Nginx代理LAMP解析 LNMP部署示例 实…

github汉化

GitHub: Let’s build from here GitHub 进入后在顶部搜索栏直接搜索 选第一个点进去后根据教程安装即可 注意如果是chrome浏览器的话 安装篡改猴如果这个问题参考这个链接 chrome浏览器安装篡改猴脚本不执行(Please enable developer mode to allow userscript…

数据结构(单链表算法题)

1.删除链表中等于给定值 val 的所有节点。 OJ链接 typedef struct ListNode ListNode;struct ListNode {int val;struct ListNode* next; };struct ListNode* removeElements(struct ListNode* head, int val) {//创建新链表ListNode* newhead, *newtail;newhead newtail N…

IDEA工具中Java语言写小工具遇到的问题

一:读取excel时遇到 org/apache/poi/ss/usermodel/WorkbookProvider 解决办法: 在pom.xml中把poi的引文包放在最前面即可

小技巧:通过命令行和网络连接获取电脑所连wifi密码

方法一:命令行 第一步,命令行输入下列命令,获取连接过的wifi netsh wlan show profile 第二步,输入以下命令查看你想看的wifi密码(红色改为你获取的任意一个wifi名称) netsh wlan show profile happy key…

高数知识补充----矩阵、行列式、数学符号

矩阵计算 参考链接:矩阵如何运算?——线性代数_矩阵计算-CSDN博客 行列式计算 参考链接:实用的行列式计算方法 —— 线性代数(det)_det线性代数-CSDN博客 参考链接:行列式的计算方法(含四种,…

云计算监控减少网络安全事件的五种方法

当企业没有对其IT基础设施采取足够的保护措施时,就会发生网络安全事件。网络罪犯利用其漏洞注入恶意软件或提取敏感信息。许多这样的漏洞存在于使用云计算平台进行操作的企业中。 云计算使企业在市场上更具生产力、效率和竞争力。这是因为他们的员工即使不在同一地点…

【ECharts】使用 ECharts 处理不同时间节点的数据系列展示

使用 ECharts 处理不同时间节点的数据系列展示 在数据可视化中,我们经常遇到这样的问题:不同数据系列的数据点在时间轴上并不对齐。这种情况下,如果直接在 ECharts 中展示,图表可能会出现混乱或不准确。本文将通过一个示例代码&a…