stm32 中库函数、结构体、地址的强制类型转换、相应特殊功能寄存器之间的关系
以一个挂接在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)各位的功能
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗