stm32 笔记 IO 口点灯实验及 HAL 库使用

news2024/10/3 10:35:02

GPIO 概述

全称:general purpose intput output,通用输入输出接口。

顾名思义,既可作为输入框也可以作为输入口。

引脚不一定是 GPIO,有些引脚也作为复位或晶振等使用。

GPIO的八种工作模式

输入:浮空输入,上拉输入,下拉输入,模拟输入

输出:开漏输出,开漏复用功能,推挽式输出,推挽式复用功能

输入:

浮空输入:浮空状态上拉开关和下拉开关都是关闭,当引脚接到空气会输出无意义值

下拉输入:GPIO 将接入带有电阻的负极,此时 CPU 接收到该 GPIO 的信号为 0,假设给这个 GPIO 一个高电平,因为电阻的关系,并不会将高电平全都吸收,此时 CPU 接收到该 GPIO 的信号为 1。意味该GPIO高电平有效。

上拉输入:GPIO 将接入带有电阻的正极,此时 CPU 接收到该 GPIO 的信号为 1;假设给这个 GPIO 一个低电平,因为电阻的关系,并不会将低电平全都吸收,此时 CPU 接收到该 GPIO 的信号为 0。意味该GPIO低电平有效。

模拟输入:不接入上拉和下拉电阻,绕过施密特触发器,直接进入模拟口。

输出:

开漏输出:有输出时只让 vss 高电平,并不设置 vdd 低电平驱动。此种输出方式,需要设置接收端需设置下拉电阻。开漏复用功能,即从外设获取信息到输出缓冲区再输出。

推挽式输出:有信号时 vss 高,无信号时 vdd 低电平。接收端无需接上拉或下拉电阻。

GPIO 寄存器

每组 io 口由10个寄存器组成,如果芯片有 GPIOA~GPIOI 9个组,那么一定对应 9x10 = 10 个寄存器。

如果一个 io 口配置两位。32 位寄存器正好配置 16 位口;如果一个 io 只需要配置一个 io 口,一般高十六位保留。

 

BSRR寄存器较为抽象,来单独描述下:

这是一个 32 位寄存器,其中 31~16 位为 BR 对其置1即对输出寄存器置1,如置0则不产生改变。

如当前十六位寄存器值为:

0100 0000 0000 0000

我们对BSRR赋:

BSRR = 1000 0000 0000 0000 0000 0000 0000 0000

 则当前寄存器值为:

1100 000 0000 0000

15~0 位则为 BS 寄存器复位寄存器,对其置1即对输出寄存器置0,如置0则不产生改变。

如当前十六位寄存器值为:

0100 0000 0000 0000

我们对BSRR赋:

BSRR = 0000 0000 0000 0000 0100 0000 0000 0000

 则当前寄存器值为:

0000 000 0000 0000

15~0 位则为 BS 寄存器复位寄存器,对其置1即对输出寄存器置0,如置0则不产生改变。

寄存器点灯实验

对于灯泡来说,两边电平不一致即可点亮。此时让 GPIOB0 或 GPIOB1 给出低电平即可点亮 LED0 或者 LED1。 

 所以对于 GPIOB 来说应该至少设置三个寄存器即可点亮灯泡,分别是:

MODER 端口模式寄存器,设置为输出模式

OTYPER 端口输出类型寄存器,设置为推挽输出(设置为开漏也可以)

ODR 端口输出数据寄存器,设置为 0000 0000 0000 0000 全为 0 低电平即可

寄存器电灯

设置 GPIOB 时钟

在设置三个寄存器之前,应先对 GPIOB 时钟进行设置:

 参考 stm32 手册 53 页,GPIOB 属于 AHB1 总线。 

 

翻阅芯片手册,我们需要将 GPIOB 使能。

所以 AHB1ENR 寄存器应该被赋值成 00000000 00000000 00000000 00000010

换成十六进制代码就是:

//GPIOB 时钟 使能
RCC->AHB1ENR = 0x00000002;

配置输出模式

MODER 寄存器配置为输出模式,应该为 00000000 00000000 00000000 00000101

十六进制:

//输出模式 通用输出
GPIOB->MODER = 0x00000005;

配置输出类型

 

 

OTYPER 寄存器配置为推挽模式,应该为 00000000 00000000 00000000 00000000

 换成十六进制代码就是:

//推挽输出
GPIOB->OTYPER = 0x00000000;

寄存器配置

 

ODR 端口输出寄存器配置为: 00000000 00000000 00000000 00000000

低电平即可点亮灯泡,所以全设置为0

 换成十六进制代码就是:

	//寄存器
	GPIOB->ODR = 0x00000000;

全部代码:

 在此之前需要设置整体时钟。

#include "sys.h"
#include "delay.h" 

int main(void)
{
	Stm32_Clock_Init(360,25,2,8);//设置时钟,180Mhz
	delay_init(180);		//初始化延时函数
	
	//GPIOB 时钟 使能
	RCC->AHB1ENR = 0x00000002;
	
	//输出模式 通用输出
	GPIOB->MODER = 0x00000005;
	
	//推挽输出
	GPIOB->OTYPER =0x00000000;
	
	//寄存器
	GPIOB->ODR = 0x00000000;
}

成功点亮 

HAL 库点灯

需要使用 GPIO_InitTypeDef 结构体定义寄存器类型。之后使用 HAL_GPIO_Init() 进行初始化。

 HAL_GPIO_WritePin() 函数则向GPIOB 置位

int main(void)
{
    HAL_Init();                     //初始化HAL库   
    Stm32_Clock_Init(360,25,2,8);   //设置时钟,180Mhz
    delay_init(180);                //初始化延时函数
    LED_Init();                     //初始化LED  
    
	GPIO_InitTypeDef GPIO_Initure;
    __HAL_RCC_GPIOB_CLK_ENABLE();           //开启GPIOB时钟
	
    GPIO_Initure.Pin=GPIO_PIN_0|GPIO_PIN_1; //PB1,0
    GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;  //推挽输出
    GPIO_Initure.Pull=GPIO_PULLUP;          //上拉
    GPIO_Initure.Speed=GPIO_SPEED_HIGH;     //高速
    HAL_GPIO_Init(GPIOB,&GPIO_Initure);
	
    HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_RESET);	//PB0置1,默认初始化后灯灭
    HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_RESET);	//PB1置1,默认初始化后灯灭
}

 

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

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

相关文章

甘露糖-酰基|mannose-Hydrazide|酰基-PEG-甘露糖

甘露糖-酰基|mannose-Hydrazide|酰基-PEG-甘露糖 酰基(acyl group),是指有机或无机含氧酸去掉一个或多个羟基后剩下的原子团,通式为R-M(O)-。 酰基(acyl group)指的是有机或无机含氧酸去掉羟基后剩下的一价原子团,通式为R-M(O)-。在有机化学…

论文调研

一、论文部分 基于傅里叶文档恢复的鲁棒文档去锐化与识别https://www.semanticscholar.org/paper/Fourier-Document-Restoration-for-Robust-Document-Xue-Tian/64dcd0cac46b936eb413f36b462be3b5b298c75b 1. 由于这篇论文没有给代码,所以在connected papers上查找…

Spring Security 安全框架 (一) 基础操作

1.password 登录密码 在 springboot 项目中 , 引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency><dependency><groupId>org.springfra…

因特网的组成,边缘之间的通讯方式,数据交换的方式

边缘之间的通讯方式有俩种&#xff1a; 1.客户服务器方式 2.对等方式&#xff08;pear-to-pear&#xff09; 什么是客户端服务器方式&#xff1f; 客户 (client) 和服务器 (server) 都是指通信中所涉及的两个应用进程。 客户-服务器方式所描述的是进程之间服务和被服务的关系…

QT菜单栏,工具栏,状态栏

1. 菜单栏 用代码来实现菜单栏&#xff1a; 头文件&#xff1a;mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H ​ #include <QMainWindow> ​ QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACE ​ class MainWindow : public QMai…

如何用JavaScript完美地区分双击和单击事件

通过一个悬浮球交互功能的案例来阐述问题&#xff0c;以及解决办法。 实现效果 类似微信里的悬浮窗效果&#xff0c;苹果手机的悬浮球功能效果 1.可以点击拖动&#xff0c;然后吸附在窗口边缘2.点击悬浮球&#xff0c;可以跳转界面&#xff0c;或者更改悬浮球的形态准备 1.移…

C++ 语法基础课2 —— printf 语句与判断结构

文章目录1. printf 输出格式(#include<cstdio>)1.1 int、float、double、char 等类型的输出格式1.2 所有输出的变量均可包含在一个字符串中1.2.1 练习11.2.2 练习21.3 扩展功能2. if 语句2.1 基本 if-else 语句2.1.1 练习12.1.2 练习22.1.3 练习42.2 常用比较运算符2.3 i…

金融业数字化聚焦容器云,全闪存为什么是点睛之笔?

文|螳螂观察 作者|李永华 刻板、保守、小心翼翼…… 很多人对金融业尤其是银行在数字化创新方面的印象&#xff0c;都是如此。 这个印象到底对不对&#xff1f; 答案可能是&#xff0c;既对&#xff0c;又不对。 对的地方在于&#xff0c;出于合规等要求&#xff0c;一个…

[附源码]计算机毕业设计JAVA点餐系统

[附源码]计算机毕业设计JAVA点餐系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven…

采集平台-大数据平台数据采集系统

随着社会的发展。人们也是越来越离不开互联网&#xff0c;今天小编就给大家盘点一下免费的采集平台&#xff0c;只需要点几下鼠标就能轻松爬取数据&#xff0c;不管是导出excel还是自动发布到网站都支持。详细参考图片一、二、三、四&#xff01; 企业人员 通过爬取动态网页数…

android 静默升级 卸载功能实现

一、近期需要实现一个apk静默升级卸载自启动功能&#xff0c;首先需要获取系统root权限才能执行静默升级&#xff0c;下面不墨迹直接上代码. 首先是MainActivity 页面 package com.example.tiaoshiapkjingmo;import androidx.appcompat.app.AppCompatActivity; import okhttp3.…

如何利用 promise 影响代码的执行顺序?

如何利用 promise 影响代码的执行顺序&#xff1f; 我们写代码的时候&#xff0c;经常会遇到这样的场景。2个不同组件&#xff0c;它们的生命周期本身都是相互独立&#xff0c;毫无关联的&#xff0c;但是它们调用的接口&#xff0c;存在相互依赖的情况。 我举个例子&#xf…

windows中Mysql数据库的安装和卸载

以安装包“mysql-5.7.35-win32.zip”为例&#xff0c;推荐安装5.7最新版本 一、安装 1、根据自己操作系统版本下载32位或64位的安装包&#xff0c;也可去官网下载&#xff0c;建议下载如下图压缩包 将下载的解压包解压&#xff0c;目录结构如下&#xff1a; 2、新建文件“my.…

IC工程师入门必学,Verilog零基础入门教程

近年来&#xff0c;IC行业发展火热&#xff0c;薪资待遇高&#xff0c;发展前景好&#xff0c;所以成了很多人转行的首选。但IC行业入行门槛高&#xff0c;需要具备相关的知识技能。比如工程师必须至少掌握一种HDL语言。 一般在HDL语言中&#xff0c;Verilog相对来说更加易学、…

负载均衡架构设计技巧

负载均衡算法 轮询&随机 基本原理 轮询&#xff1a;将请求依次发给服务器 随机&#xff1a;将请求随机发给服务器 适用场景 通用&#xff0c;无状态的负载均衡 优缺点 实现简单不会判断服务器状态&#xff0c;除非服务器连接丢失 问题场景 某个服务器当前因为触发…

Java面向对象---尚硅谷Java入门视频学习

1.类和对象 1.1创建过程 对象是将内存地址赋值给了变量&#xff0c;所以变量其实引用了内存中的对象&#xff0c;所以称之为引用变量&#xff0c;而变量的类型&#xff08;即类&#xff09;称之为引用数据类型。 堆&#xff08;Heap&#xff09;&#xff0c;此内存区域的唯…

关于pytorch的数据处理-数据加载Dataset

目录 1. 数据加载 2. Dataset __init__ __getitem__ __len__ 测试一下 完整代码 3. Dataset - ImageFolder 1. 数据加载 最近在使用 Unet 做图像分割&#xff0c;设计到 处理数据有关的工作&#xff0c;查了点资料&#xff0c;做一些简单的总结 在pytorch 中&#x…

Thinkphp安装报错解决办法

跟着官方文档的步骤安装thinkphp报错该如何解决&#xff1a; 前言 ThinkPHP无需安装过程&#xff0c;但是需要把ThinkPHP框架放入WEB运行环境&#xff08;前提是你的WEB运行环境没有问题&#xff09;。 一、Thinkphp安装以及报错解决方式 Thinkphp官网&#xff1a;安装ThinkP…

Mysql为何不推荐写多表SQL

前言 在大部分情况下&#xff0c;单表并不是比多表快单表优势在于理解成本与可控性有时候你觉得单表SQL不好写的时候&#xff0c;你改更新的是表结构 现状 在我们学习MySql的路程之中&#xff0c;估计不少人告诫我们不要写长语句。 至于为什么&#xff0c;确实很少人提起。 …

2.6 用一套万能文案公式来拆解4个小红书爆文案例【玩赚小红书】

公式细分人群他们的痛点数字干货分享情感共鸣 我们一个一个来看。 ​ ​ 一、《9平次卧小房间&#xff0c;再见了传统榻榻米&#xff08;附户型图&#xff09;》 家装类&#xff1a;避坑/攻略/小价钱装出大效果/装修效果拔群 标题直接点出了目标人群的需求&#xff1a;如何…