以一个挂接在APB2上的外设函数使能为例

A : RCC_APB2PeriphClockCmd();时钟使能函数

1 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

B : RCC_APB2Periph_AFIO是什么呢?

1 #define RCC_APB2Periph_AFIO  ((uint32_t)0x00000001) RCC_APB2Periph_AFIO就是代表十六进制 1

C: 知道RCC_APB2Periph_AFIO是什么之后接下来看看这个函数内的具体是如何定义的

 1 void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)
2 {
3 /* Check the parameters */
4 assert_param(IS_RCC_APB2_PERIPH(RCC_APB2Periph)); 这块在我的assert_param()函数文章中有解释
5 assert_param(IS_FUNCTIONAL_STATE(NewState));
6 if (NewState != DISABLE)
7 {
8 RCC->APB2ENR |= RCC_APB2Periph;//将RCC->APB2ENR寄存器赋值(本例赋值RCC_APB2Periph_AFIO也就是1)
9 } //RCC->APB2ENR是如何表示RCC下APB2外设时钟使能寄存器(RCC->APB2ENR)的呢?
10 else //H中有介绍但需要了解D-G
11 {
12 RCC->APB2ENR &= ~RCC_APB2Periph;
13 }
14 }

D:函数中有RCC,那RCC又是什么呢?

  1 #define RCC    ((RCC_TypeDef *) RCC_BASE)   //定义RCC对应为(RCC_TypeDef *) RCC_BASE

(RCC_BASE为RCC的基地址;RCC_TypeDef 为定义一种的结构体数据类型;(RCC_TypeDef *) RCC_BASE就是讲RCC_BASE强制转化为(RCC_TypeDef *)的地址通俗点说就是强制把RCC_BASE地址变成RCC_TypeDef数据类型的字节地址)

E:那又有疑问了Rcc基地址是啥?

就是对应STM32内核中RCC的物理基地址 (是一个常数)

  1 #define RCC_BASE   (AHBPERIPH_BASE + 0x1000)    //RCC基地址

F: 1 #define AHBPERIPH_BASE (PERIPH_BASE + 0x20000)  //AHB外设基地址

G:   1 #define PERIPH_BASE ((uint32_t)0x40000000)    //外设基地址 

H: RCC_TypeDef这个结构体有什么作用呢?

 1 typedef struct      //(D中)根据上面的解释RCC就是从RCC_BASE这个地址对应的RCC_TypeDef数据类型的内存,
2 { //而这段内存正好对应左边这些特殊功能寄存器的能存CR就是这段内存的起始的一小段
3 __IO uint32_t CR; //这一小段是unit32_t数据类型的内存,那RCC->APB2ENR就能访问APB2ENR这一小段
4 __IO uint32_t CFGR; //所以RCC->APB2ENR赋值就是对应APB2外设时钟使能寄存器(RCC->APB2ENR)赋值
5 __IO uint32_t CIR;
6 __IO uint32_t APB2RSTR;
7 __IO uint32_t APB1RSTR;
8 __IO uint32_t AHBENR;
9 __IO uint32_t APB2ENR;
10 __IO uint32_t APB1ENR;
11 __IO uint32_t BDCR;
12 __IO uint32_t CSR;
23 } RCC_TypeDef;
总结  C段中 RCC->APB2ENR |= RCC_APB2Periph;也就代表了将RCC_APB2Periph赋值RCC->APB2ENR本例中是把
RCC_APB2Periph_AFIO也就是十六进制的1赋给了RCC->APB2ENR
查看中文参考手册克制
RCC->APB2ENR寄存器赋值一是就是AFIOEN开启(看下图最后一个)
相应的A段代码RCC_APB2PeriphClockCmd (RCC_APB2Periph_AFIO,ENABLE)函数的意义就是把AFIO打开

中文参考手册对应的APB2外设时钟使能寄存器(RCC->APB2ENR)各位的功能

stm32 中库函数、结构体、地址的强制类型转换、相应特殊功能寄存器之间的关系的更多相关文章

  1. C语言结构体指针成员强制类型转换

    #include <stdio.h> #include <stdlib.h> typedef struct ListElmt_ { void *data; struct Lis ...

  2. 由结构体成员地址计算结构体地址——list_entry()原理详解

    #define list_entry(ptr, type, member) container_of(ptr, type, member) 在进行编程的时候,我们经常在知道结构体地址的情况下,寻找其中 ...

  3. C/C++中的结构体

    结构体定义 结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合,也叫结构.   结构体作用 结构体和其他类型基础数据类型一样,例如int类型,char类型 只不过结构体可以做成 ...

  4. 再识C中的结构体

    在前面认识C中的结构体中我介绍了结构体的基础知识,下面通过这段代码来回顾一下: #include<stdio.h> #define LEN 20 struct Student{ //定义结 ...

  5. 关于C语言中结构体中的结构体成员导致的字节对齐问题

    关于结构体的字节对齐是什么,就不赘述,再此附上一篇文章,介绍字节对齐:http://www.linuxsong.org/2010/09/c-byte-alignment/ 这里的结构体字节对齐的数据类 ...

  6. C语言中处理结构体的原理

    汇编中有几种寻址方式,分别是直接寻址:(ds:[idata]).寄存器间接寻址(ds:[bx]).寄存器相对寻址(ds:[bx + idata].ds:[bx + si])基址变址寻址(ds:[bx ...

  7. x264中重要结构体参数解释,参数设置,函数说明 <转>

    x264中重要结构体参数解释http://www.usr.cc/thread-51995-1-3.htmlx264参数设置http://www.usr.cc/thread-51996-1-3.html ...

  8. [转]C#中的结构体与类的区别

    C#中的结构体与类的区别   经常听到有朋友在讨论C#中的结构与类有什么区别.正好这几日闲来无事,自己总结一下,希望大家指点. 1. 首先是语法定义上的区别啦,这个就不用多说了.定义类使用关键字cla ...

  9. 《挑战30天C++入门极限》新手入门:C/C++中的结构体

        新手入门:C/C++中的结构体 什么是结构体? 简单的来说,结构体就是一个可以包含不同数据类型的一个结构,它是一种可以自己定义的数据类型,它的特点和数组主要有两点不同,首先结构体可以在一个结构 ...

随机推荐

  1. Shell脚本实现网络连通性检查Ping+Telnet

    转至:https://blog.csdn.net/AngelLBS/article/details/89382136 #!/bin/sh ############################### ...

  2. weblogic集群自动批量化补丁升级

    转至:http://blog.itpub.net/28833846/viewspace-2726722/ 一.前言介绍 Weblogic是一种基于J2EE架构的中间件,用于开发.集成.部署和管理大型分 ...

  3. python爬虫之抓取小说(逆天邪神)

    2022-03-06 23:05:11 申明:自我娱乐,对自我学习过程的总结. 正文: 环境: 系统:win10, python版本:python3.10.2, 工具:pycharm. 项目目标: 实 ...

  4. Pandas:plot相关函数

    0.注意事项 及 各种错误 1)绘制bar图时,如果出现重复的x值被合并到一个情况(导致X轴应该显示内容有缺失),可能是由于Pandas版本太低: 2)无法设置中文title,在代码中加入两句话: p ...

  5. Python第一讲以及计算机基础

    本周课程安排 python基础(五天) 下周课程安排 tableau图形化表制作 下下周课程安排 spss 今日内容概要 计算机发展史 计算机主要硬件 编程与编程语言 python解释器及IDE编辑器 ...

  6. C#10新特性-全局和隐式usings

    .NET 6发布后支持C#10,C# 10 向 C# 语言添加了很多功能,今天我们分享一下全局和隐式usings的使用: using 指令简化了使用命名空间的方式. C# 10 包括一个新的全局 us ...

  7. JZ-062-二叉查找树的第 K 个结点

    二叉查找树的第 K 个结点 题目描述 给定一棵二叉搜索树,请找出其中的第k小的结点. 题目链接: 二叉查找树的第 K 个结点 代码 /** * 标题:二叉查找树的第 K 个结点 * 题目描述 * 给定 ...

  8. LeetCode-011-盛最多水的容器

    盛最多水的容器 题目描述:给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) .在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, ...

  9. 论文翻译:2020_DCCRN: Deep Complex Convolution Recurrent Network for Phase-Aware Speech Enhancement

    论文地址:DCCRN:用于相位感知语音增强的深度复杂卷积循环网络 论文代码:https://paperswithcode.com/paper/dccrn-deep-complex-convolutio ...

  10. c++11 实现枚举值到枚举名的转换

    效果 ``` ENUM_DEFINE ( Color, Red, Blue, ) EnumHelper(Color::Red) -> "Red" EnumHelper(Col ...