Diving into the STM32 HAL-----HAL_GPIO

1、怎么看待外设:

        从总线连接的角度看,外设和Core、DMA通过总线交换数据,正所谓要想富先修路。要注意,这些总线中的每一个都连接到不同的时钟源,这些时钟源决定了连接到该总线的外设操作的最大速度。

        从内存分配的角度看,外设位于0x4000 0000~0x5FFF FFFF。该区域进一步分为几个子区域,每个子区域对应于一个特定的外围设备。按下图,GPIOA 外设(管理连接到 PORT-A 的所有引脚)从 0x4800 0000 映射到 0x4800 03FF。通过修改和读取这些 Map 区域的每个 register 来控制外设。

        例如,GPIOA 外设的示例,要使能 PA5 引脚作为输出引脚,必须配置 MODER 寄存器,以便将位 [11:10] 配置为 01(对应于通用输出模式),如图所示。

        接下来,要将引脚拉高,我们必须在输出数据寄存器 (ODR) 中设置相应的位[5],根据下表,该位映射到 GPIOA + 0x14 内存位置,即 0x4800 0000 + 0x14。

        综合上述所讲,使用指针访问上述过程中GPIOA 外设映射内存,可写为:

int main(void) {volatile uint32_t *GPIOA_MODER = 0x0, *GPIOA_ODR = 0x0;GPIOA_MODER = (uint32_t*)0x48000000; // Address of the GPIOA->MODER registerGPIOA_ODR = (uint32_t*)(0x48000000 + 0x14); // Address of the GPIOA->ODR register//This ensures that the peripheral is enabled and connected to the AHB1 bus__HAL_RCC_GPIOA_CLK_ENABLE();*GPIOA_MODER = *GPIOA_MODER | 0x400; // Sets MODER[11:10] = 0x1*GPIOA_ODR = *GPIOA_ODR | 0x20; // Sets ODR[5] = 0x1, that is pulls PA5 highwhile(1);
}

 2、HAL handler

        HAL要做的就是把上面所说的外设映射抽象出来。通过为每个外设定义多个处理程序(handler)来完成。处理程序handler只不过是一个 C 结构体,这个结构体引用指向真正的外围地址。

        例如,将 GPIOA 定义为 GPIO_TypeDef 类型的指针,定义方式如下:

typedef struct {volatile uint32_t MODER;volatile uint32_t OTYPER;volatile uint32_t OSPEEDR;volatile uint32_t PUPDR;volatile uint32_t IDR;volatile uint32_t ODR;volatile uint32_t BSRR;volatile uint32_t LCKR;volatile uint32_t AFR[2];volatile uint32_t BRR;
} GPIO_TypeDef;GPIO_TypeDef *GPIOA = 0x48000000;
GPIOA->MODER |= 0x400;
GPIOA->ODR |= 0x20;

什么意思?就是在地址0x48000000开始的内存,建立了一个结构体,并以0x48000000基地址操作MODER、OTYPER等变量。

        在HAL中,已经定义了GPIOA,并将用户通过GPIO_InitStruct结构体设置的参数,使用HAL_GPIO_Init函数写入上面所说的GPIO_TypeDef结构体(在地址0x48000000开始的内存)。

/*Configure GPIO pin : PA5 */
GPIO_InitStruct.Pin = GPIO_PIN_5;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

3、GPIO配置

        要配置 GPIO,我们使用 HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init) 函数。GPIO_InitTypeDef 是用于配置 GPIO 的 C 结构体,其定义方式如下:

typedef struct {uint32_t Pin;uint32_t Mode;uint32_t Pull;uint32_t Speed;uint32_t Alternate;
} GPIO_InitTypeDef;

        设置所需的替代功能。例如,设置 PA3 可以用作USART2_RX(即它可以用作 USART/UART2 外设的 RX 引脚)。CubeMX 会自动为我们生成正确的初始化代码,如下所示:

/* Configure GPIO pins : PA2 PA3 */
GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
GPIO_InitStruct.Alternate = GPIO_AF1_USART2;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

4、驱动 GPIO

GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);
void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin);

5、STM32CubeMx配置,自动生成LED示例程序。

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

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

相关文章

【表格解决问题】EXCEL行数过多,WPS如何按逐行分别打印多个纸张中

1 问题描述 如图:我的表格行数太多了。打印在一张纸上有点不太好看 2 解决方式 Step01:先选中你需要打印的部分,找到【页面】->【打印区域】->【设置打印区域】 Step02:先选中一行,找到【插入分页符】 Step0…

提升安全上网体验:Windows 11 启用 DOH(阿里公共DNS)

文章目录 阿里公共 DNS 介绍免费开通云解析 DNS 服务Windows 编辑 DNS 设置配置 IPv4配置 IPv6 路由器配置 DNS 阿里公共 DNS 介绍 https://alidns.com/ 免费开通云解析 DNS 服务 https://dnsnext.console.aliyun.com/pubDNS 开通服务后,获取 DOH 模板&#xff0…

如何在Linux下部署自己的ZFile开源网盘

ZFile 项目介绍 ZFile是一个功能强大、灵活的开源网盘系统,为用户提供安全便捷的文件存储和共享方案。 项目概述 ZFile由ZFile, Inc.开发和维护,基于Docusaurus构建。其用户友好的界面支持多种文件存储和共享功能,并具备高度的可定制性和扩…

Spring AI : 让ChatGPT成为你构建应用的核心亮点

本文是一篇介绍spring ai的文章,主要介绍了生成文本内容,以及读取图片中内容两个能力。 之所以介绍这两个能力,是因为 大模型目前最适合做的事情有两个: 1) 非结构化数据的结构化(图片转文字,…

Windows 命令提示符(cmd)中输入 mysql 并收到错误消息“MySQL不是内部或外部命令,也不是可运行的程序或批处理文件?

目录 背景: 过程: 1.找到MySQL安装的路径 2.编辑环境变量 3.打开cmd,输入mysql --version测试成功 总结: 背景: 很早之前安装了Mysql数据库,想查询一下当前安装的MySQL客户端的版本号,我在命令行界面输入mysql --verion命令回…

履带式排爆演习训练机器人技术详解

履带式排爆演习训练机器人是现代反恐、救援及危险环境处理领域中的重要工具。它们结合了先进的机械设计、智能感知、精确控制及高效算法,能够在复杂、危险的环境中执行排爆、侦察、取样等多种高风险任务,极大地保障了人员安全。 技术特点 1. 卓越的地面…

基于SSM医院门诊互联电子病历管理系统的设计

管理员账户功能包括:系统首页,个人中心,用户管理,医生管理,项目分类管理,项目信息管理,预约信息管理,检查信息管理,系统管理 用户账号功能包括:系统首页&…

PVE定时开启关闭虚拟机,实现PVE中群晖虚拟机的定时开机和关闭

如果在PVE中安装了群晖,又不想每天关闭PVE(不在家,怕服务器起不来),因此想每天定时关闭开启黑群晖和其他虚拟机释放资源。 在网上查了很多,说在crontab添加命令 00 2 * * * pvesh create /nodes/pve/qemu/102/status/stop 00 6 …

【数据结构】宜宾大学-计院-实验六

实验 6 栈和队列(综合实验) 实验目的:实验内容:进制转换问题:第1题测试结果:第1题代码实现: 括号匹配问题:第2题测试结果:第2题代码实现: 回文字符串问题&…

java并发编程-CAS详解

一定要看这个链接的视频,讲解十分清楚!!! 【【Java并发】面试官问我CAS、乐观锁、悲观锁,我反手就是骑脸输出】 https://www.bilibili.com/video/BV1ff4y1q7we/?share_sourcecopy_web&vd_sourceafbacdc02063c57e7…

【C/C++】qsort函数的学习与使用

零.导言 在之前的文章中,我介绍了冒泡排序,即按ASCII码值把元素从小到大排序(文章链接我放在了第五部分,有兴趣的小伙伴可以求看看)。而今天我将继续介绍qsort函数,这个函数可以起到和冒泡排序一样的作用&a…

华为实时视频使用FLV播放RTSP流

import flvjs from ‘flv.js’; 安装flv <video style"width:100%;height:100%;" ref"videoHWRef" ></video>// src 华为rtsp流 rtsp://admin:Huaweivideo10.10.8.151:554/xxx/trackID1// url 需要后端提供视频源地址playVideo() {if (fl…

【STM32】通过 DWT 实现毫秒级延时

目录 零、前言一、DWT1、DEMCR2、DWT_CTRL3、DWT_CYCCNT 二、实现代码三、测试 零、前言 在 FreeRTOS 中&#xff0c;SysTick 被用于作为调度器的一部分进行任务调度&#xff0c;那么如果我需要使用软件模拟通信&#xff0c;例如软件 I2C&#xff0c;需要使用 delay&#xff0…

如何在Linux系统中使用Ansible进行自动化部署

如何在Linux系统中使用Ansible进行自动化部署 Ansible简介 安装Ansible 在Debian/Ubuntu系统中安装 在CentOS/RHEL系统中安装 启动Ansible服务 Ansible基本概念 Inventory Playbook Module 配置Ansible 测试Ansible配置 执行Ansible Playbook Ansible模块 文件模块 包管理模块…

「Mac畅玩鸿蒙与硬件20」鸿蒙UI组件篇10 - Canvas 组件自定义绘图

Canvas 组件在鸿蒙应用中用于绘制自定义图形,提供丰富的绘制功能和灵活的定制能力。通过 Canvas,可以创建矩形、圆形、路径、文本等基础图形,为鸿蒙应用增添个性化的视觉效果。本篇将介绍 Canvas 组件的基础操作,涵盖绘制矩形、圆形、路径和文本的实例。 关键词 Canvas 组件…

从零开始构建 ChatGPT

今天&#xff0c;我们要介绍的是一个名为 LLMs-from-scratch 的 GitHub 项目&#xff0c;它由开发者 rasbt 精心打造&#xff0c;旨在一步步教你如何使用 PyTorch 从零开始实现一个类似 ChatGPT 的大型语言模型&#xff08;LLM&#xff09;。 这是一个教育性质的开源项目&…

【Git】Git常用命令

目录 1 前言2 git命令2.1 branch2.2 checkout2.3 pull and push2.4 config2.4.1 Proxy 2.5 tag2.6 rebase2.7 patch2.8 remote2.9 submodule2.10 rm2.10 gitignore2.11 某个commit更改了哪些文件2.12 clean 3 结束语 1 前言 本章记录总结在使用git过程中常用的一些命令&#x…

redis分布式锁在项目中的应用总结

项目应用 应用1 redis分布式锁实现两个操作的原子性 需求&#xff1a;实现一人一单业务逻辑时&#xff08;如果能走到这个逻辑&#xff0c;代表库存是充足的&#xff09;&#xff0c;我们需要 先查询订单 如果订单不存在即没有买过则创建订单 这两个步骤我们要保证是原子…

前端 react 面试题(二)

文章目录 hooks的使用规则为什么hooks要确保在函数组件的最顶层,而不能放置在循环或者条件语句中。react的事件模型react的合成事件是如何实现的react事件传参,可以使用箭头函数或bind方法,这两种哪一种更好使用箭头函数:使用`bind`方法:react的事件模型和vue的区别React …

1分钟解决Excel打开CSV文件出现乱码问题

一、编码问题 1、不同编码格式 CSV 文件有多种编码格式&#xff0c;如 UTF - 8、UTF - 16、ANSI 等。如果 CSV 文件是 UTF - 8 编码&#xff0c;而 Excel 默认使用的是 ANSI 编码打开&#xff0c;就可能出现乱码。例如&#xff0c;许多从网络应用程序或非 Windows 系统生成的 …