误解#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)

2023-11-12

#define GPIOA_BASE            (AHB1PERIPH_BASE + 0x0000)


typedef struct
{
  __IO uint32_t MODER;    /*!< GPIO port mode register,               Address offset: 0x00      */
  __IO uint32_t OTYPER;   /*!< GPIO port output type register,        Address offset: 0x04      */
  __IO uint32_t OSPEEDR;  /*!< GPIO port output speed register,       Address offset: 0x08      */
  __IO uint32_t PUPDR;    /*!< GPIO port pull-up/pull-down register,  Address offset: 0x0C      */
  __IO uint32_t IDR;      /*!< GPIO port input data register,         Address offset: 0x10      */
  __IO uint32_t ODR;      /*!< GPIO port output data register,        Address offset: 0x14      */
  __IO uint16_t BSRRL;    /*!< GPIO port bit set/reset low register,  Address offset: 0x18      */
  __IO uint16_t BSRRH;    /*!< GPIO port bit set/reset high register, Address offset: 0x1A      */
  __IO uint32_t LCKR;     /*!< GPIO port configuration lock register, Address offset: 0x1C      */
  __IO uint32_t AFR[2];   /*!< GPIO alternate function registers,     Address offset: 0x20-0x24 */

} GPIO_TypeDef;


#define GPIOA               ((GPIO_TypeDef *) GPIOA_BASE)


void GPIO_PinAFConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_PinSource, uint8_t GPIO_AF)
{
  uint32_t temp = 0x00;
  uint32_t temp_2 = 0x00;
  
  /* Check the parameters */
  assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
  assert_param(IS_GPIO_PIN_SOURCE(GPIO_PinSource));
  assert_param(IS_GPIO_AF(GPIO_AF));
  
  temp = ((uint32_t)(GPIO_AF) << ((uint32_t)((uint32_t)GPIO_PinSource & (uint32_t)0x07) * 4)) ;
  GPIOx->AFR[GPIO_PinSource >> 0x03] &= ~((uint32_t)0xF << ((uint32_t)((uint32_t)GPIO_PinSource & (uint32_t)0x07) * 4)) ;
  temp_2 = GPIOx->AFR[GPIO_PinSource >> 0x03] | temp;
  GPIOx->AFR[GPIO_PinSource >> 0x03] = temp_2;
}


这是STM32固件库中的GPIOx操作,今天有一个地方把我绕晕了,还好回过神来了。

大家都知道GPIOA_BASE            是寄存器中的地址。

我搞错的是,误以为将GPIOA替代声明变量的过程,这时候我就纳闷了,怎么声明的变量GPIOA_BASE是一个常数(地址)?

并且还在下面的GPIO_PinAFConfig()函数中反复调用声明?!

后来我才回过神来,((GPIO_TypeDef *) GPIOA_BASE)不是声明变量,是强制类型转换……

总之,这就是C语言与单片机软硬件对应上的一大关键点吧!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

误解#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE) 的相关文章

  • 如何更改闪存的起始地址?

    我正在使用 STM32F746ZG 和 FreeRTOS Flash的起始地址是0x08000000 但我想把它改成0x08040000 我通过谷歌搜索了这个问题 但没有找到解决方案 我更改了链接器脚本 如下所示 MEMORY RAM xr
  • CMSIS 库是否应该包含在版本控制中? [复制]

    这个问题在这里已经有答案了 通常 我曾经在版本控制中包含芯片供应商 ST 提供的设备特定标头和源以及 CMSIS Core 标头 数量不多 也没有更新的习惯 我使用STM32微控制器 但我不使用立方体框架 or the 标准外设库 最近 我
  • 当数据大小较小时,内存到内存 DMA 传输是否需要权衡?

    我正在学习 STM32 F4 微控制器 我正在尝试找出使用 DMA 的限制 根据我的理解和研究 我知道如果数据量较小 即设备使用DMA生成或消耗少量数据 则开销会增加 因为DMA传输需要DMA控制器执行操作 从而不必要地增加系统成本 我做了
  • 133-基于stm32单片机停车场车位管理系统Proteus仿真+源程序

    资料编号 133 一 功能介绍 1 采用stm32单片机 4位数码管 独立按键 制作一个基于stm32单片机停车场车位管理系统Proteus仿真 2 通过按键进行模拟车辆进出 并且通过程序计算出当前的剩余车位数量 3 将剩余的车位数量显示到
  • 136-基于stm32单片机家庭温湿度防漏水系统设计Proteus仿真+源程序

    资料编号 136 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DHT11传感器 蜂鸣器 制作一个基于stm32单片机家庭温湿度防漏水系统设计Proteus仿真 2 通过DHT11传感器检测当前温湿度 并且显示到L
  • rt-thread studio中新建5.0不能用

    文章目录 一 版本对比 二 文件和文件夹打斜杠 在使用RT Thread studio创建新工程5 0版本的时候 结果发现新建完成之后程序不能正常运行 但是创建4 10版本的时候却能运行 那肯定是新版本出现了BUG 一 版本对比 首先对比了
  • HAL库学习

    CMSIS简介 CMSIS Cortex Microcontroller Software Interface Standard 微控制器软件接口标准 由ARM和其合作的芯片厂商 ST NXP 软件工具厂商 KEIL IAR 共同制定的标准
  • SHT10温湿度传感器——STM32驱动

    实验效果 硬件外观 接线 3 3V供电 IIC通讯 代码获取 查看下方 END
  • 跟着野火学FreeRTOS:第一段(任务定义,切换以及临界段)

    在裸机系统中 系统的主体就是 C P U CPU CP U 按照预先设定的程序逻辑在 m a i n
  • 跟着野火学FreeRTOS:第一段(任务定义,切换以及临界段)

    在裸机系统中 系统的主体就是 C P U CPU CP U 按照预先设定的程序逻辑在 m a i n
  • 擦除后无法写入闪存

    所以我不能在擦除后直接写入内部闪存 如果写操作之前没有擦除操作 那么我可以 有什么想法吗 编程函数返回 成功写入 值 但查看内存时 没有写入任何数据 这是代码 uint32 t pageAddress 0x08008000 uint16 t
  • STM32的HAL中实现单按、长按和双按功能

    我正在尝试实现单击 双击和长按功能来执行不同的功能 到目前为止 我已经理解了单击和长按的逻辑 但我不知道如何检测双击 至于代码 我使用计数器实现了单击和长按 但代码仅停留在第一个 if 条件上 bool single press false
  • CMSIS & STM32,如何开始? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想在 STM32 上使用 CMSIS 启动项目 网上一搜 没找到具体的教程 有些使用 SPL 开始项
  • STM32F4XX的12位ADC采集数值超过4096&右对齐模式设置失败

    文章目录 一 前言 二 问题1 数值超过4096 三 问题1的排错过程 四 问题2 右对齐模式设置失败 五 问题2的解决方法 5 1 将ADC ExternalTrigConv设置为0 5 2 使用ADC StructInit 函数 一 前
  • for循环延时时间计算

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 pandas是什么 二 使用步骤 1 引入库 2 读入数据 总结 前言 之前做led点亮的实验 好像是被delay函数影响了 因为delay参数设置的不对
  • systick定时器

    systick定时器 文章目录 前言 一 前期疑惑 二 解答 1 关于systick是阻塞的吗 2 非阻塞 三 软件编写 总结 前言 这边记录systick相关知识点 一 前期疑惑 在学习systick志气啊 其实对于systick还是一脸
  • STM32 Nucleo 上的上升沿中断多次触发

    我正在使用 STM32 NUCLEO F401RE 微控制器板 我有一个扬声器 经过编程 当向上 向下推操纵杆时 可以按设定的量改变频率 我的问题是 有时 通常 当向上 向下推动操纵杆时 频率会增加 减少多次 这意味着 ISR 正在执行多次
  • HAL_Delay() 陷入无限循环

    我被 HAL Delay 函数困住了 当我调用此函数 HAL Delay 时 控制陷入无限循环 在寻找问题的过程中 我发现了这个 http www openstm32 org forumthread2145 threadId2146 htt
  • 哪些变量类型/大小在 STM32 微控制器上是原子的?

    以下是 STM32 微控制器上的数据类型 http www keil com support man docs armcc armcc chr1359125009502 htm http www keil com support man d
  • 当端点和 PMA 地址均更改时,CubeMX 生成的 USB HID 设备发送错误数据

    我正在调试我正在创建的复合设备的问题 并在新生成的仅 CubeMX 代码中重新创建了该问题 以使其更容易解决 我添加了少量代码main 让我发送 USB HID 鼠标点击 并在按下蓝色按钮时使 LED 闪烁 uint8 t click re

随机推荐

  • HTTP 499 状态码 nginx下 499错误的解决办法

    HTTP 499 状态码 nginx下 499错误的解决办法 日志记录中HTTP状态码出现499错误有多种情况 比如nginx反代到一个永远打不开的后端 日志状态记录就会是499 发送字节数是0 经常有用户反馈网站系统时好时坏 因为线上的产
  • 【转】Robust regression(稳健回归)

    Robust regression 稳健回归 语法 b robustfit X y b robustfit X y wfun tune b robustfit X y wfun tune const b stats robustfit 描述
  • 在服务器上用conda创建新的python环境报错(PackagesNotFoundError)

    主要参考这篇博客 https blog csdn net weixin 43815222 article details 108549497 报错截图 prefix 后跟的是我的虚拟环境路径 home envs assignmaterial
  • 汉诺塔——递归的应用

    关于汉诺塔的原理 可看这里 点击打开链接 下面是源代码 include
  • SpringBoot参数校验--List类型

    我们在写后台接口的时候 通常会定义DTO来接收参数 在DTO中使用注解书写验证的规则 然后在Controller层使用 validated注解来验证自己制定的校验规则 但当我们的接口接收的参数为List
  • 面试题,说说你对spring IOC和AOP的理解

    在面试中 经常会问 说说你对spring IOC和AOP的理解 问题很宽泛 似乎不知道从何说起 回答思路 1 先用通俗易懂的话解释下何为IOC和AOP 2 各自的实现原理 3 自己的项目中如何使用 以下是个人的一些总结 仅供参考 1 IOC
  • java异常处理

    目录 异常概述与异常体系结构 常见异常2 数组下标越界异常 空指针异常 异常的运算 转换不兼容 异常处理机制一 异常处理机制二 手动抛出异常 用户自定义异常类 总结 异常概述与异常体系结构 在使用计算机语言进行项目开发的过程中 即使程序员把
  • 在winform中屏蔽双击最大化或最小化窗体(C#实现),禁用任务管理器结束程序

    在需要屏蔽双击窗体最大化 最小化 关闭 拖拽窗体中写入以下代码 可以根据需要取舍代码 protected override void WndProc ref Message m if m Msg 0x112 switch int m WPa
  • 数组方法对字符串使用时,需要注意的地方

    在平时工作或者练习的时候 我们有时会使用数组的方法去处理字符串 在使用时 我们可以发现有些方法可以对字符串使用 但是有一些不能 那么 这个规律究竟是什么 为什么有的可以使用 而有的不能使用 那些不能使用的原因是什么 分析思路 我们可以看到
  • 程序员到底要怎么找女朋友?

    漫小话碎碎念 新弄了个小专栏 以两三格漫画的形式给大家呈现一些只有程序猿才能看懂的梗 刚开始着手弄这个part 一切都还不太成熟 也欢迎大家在留言区提出一些建议 可以是一些梗 可以是形象整改 表达形式 都好 目前定在每周五发 毕竟工作了一周
  • windows驱动程序开发初探

    最近 由于需求推动 自己得开始学一下在windows下如何开发驱动程序 虽然 后来由于其他的原因使得学习没继续下去 但是我还是把一些粗略的学习经历与体会写在这里 方便自己日后卷土重来 也方便其他的对windows开发一窍不通的有志之士参考一
  • IP地址判断有效性

    IP地址判断有效性 标签 空格分隔 OJ 算法 1 题目 判断输入的字符串是不是一个有效的IP地址 详细描述 请实现如下接口 boolisIPAddressValid constchar pszIPAddr 输入 pszIPAddr 字符串
  • 基于选择排序的一些想法

    选择排序的工作原理是 每一次从待排序的数据中选出最小 或最大 的一个元素 存放在序列的起始位置 然后 再从剩余未排序元素中继续寻找最小 大 元素 放到已排序序列的末尾 以此类推 直到全部待排序的数据元素排完 优化思路是 每次循环都同时找出最
  • Elasticsearch之聚合aggregations

    聚合可以让我们极其方便的实现对数据的统计 分析 例如 什么品牌的手机最受欢迎 这些手机的平均价格 最高价格 最低价格 这些手机每月的销售情况如何 实现这些统计功能的比数据库的sql要方便的多 而且查询速度非常快 可以实现实时搜索效果 1 基
  • Paimon 学习笔记

    本博客对应于 B 站尚硅谷教学视频 尚硅谷大数据Apache Paimon教程 流式数据湖平台 为视频对应笔记的相关整理 1 概述 1 1 简介 Flink 社区希望能够将 Flink 的 Streaming 实时计算能力和 Lakehou
  • Docker boot2docker镜像默认用户和密码

    用户 密码 进入方式 docker tcuser ssh root command sudo i docker用户下执行
  • 记录一个iOS实现视频分片缓存拖拽快进不能播放的问题

    代码现状 首先来看一下我们将视频数据塞给请求的代码 void finishLoadingWithLoadingRequest IdiotResourceTask task printf 哈哈执行到这里执行到到这里 n printf 哈哈哈数
  • 【目标检测-YOLO】YOLOv5-5.0v-损失函数(第四篇)

    YOLO Input Backbone Neck Head 置信度Loss 坐标回归Loss 分类Loss v1 448 448 GoogleNet FC 2 MSE v2 32x D
  • mod_jk 分析

    mod jk 分析 1 mod jk 模块的总体功能 由于 tomcat 的 HTTP 处理部分都由 Java 所写 5 5 12 版本以后出现了 native 库 用以 提高其 I O 和 SSL 的性能 1 在高并发的情况下负载较高 而
  • 误解#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)

    define GPIOA BASE AHB1PERIPH BASE 0x0000 typedef struct IO uint32 t MODER lt GPIO port mode register Address offset 0x00