历史上的今天
返回首页

历史上的今天

今天是:2024年10月15日(星期二)

正在发生

2018年10月15日 | STM32学习札记--GPIO端口设置

2018-10-15 来源:eefocus

GPIOx(x=A,B,C,D,E,H)引脚配置需要几个方面:  (配例的工程函数是可以到官网上下载使用手册的)

1,首先肯定是要将相应的引脚口挂在到的AHB/APB的时钟使能,即配置RCC_AHBENR寄存器。

STM32学习札记--GPIO端口设置
GPIOC的使能位在BIT2  则 #DEFINE  GPIOCEN      (Unit32_t)0x0x00000004

STM32学习札记--GPIO端口设置

RCC的起始地址为0x4002 3800

#define PERIPH_BASE             ((uint32_t)0x40000000) 

#define AHBPERIPH_BASE      (PERIPH_BASE + 0x20000)

#define RCC_BASE                  (AHBPERIPH_BASE + 0x3800)


再定义RCC寄存器结构体

typedef struct

 {

  __IO uint32_t CR;

  __IO uint32_t ICSCR;

  __IO uint32_t CFGR;

  __IO uint32_t CIR;

  __IO uint32_t AHBRSTR;

  __IO uint32_t APB2RSTR;

  __IO uint32_t APB1RSTR;

  __IO uint32_t AHBENR;

  __IO uint32_t APB2ENR;

  __IO uint32_t APB1ENR;

  __IO uint32_t AHBLPENR;

  __IO uint32_t APB2LPENR;

  __IO uint32_t APB1LPENR;      

  __IO uint32_t CSR;    

} RCC_TypeDef;


#define RCC               ((RCC_TypeDef *) RCC_BASE)  

此处真的是很精妙,既把RCC定义成了一结构体,也阐明了它引用的地址。直接可以使用

void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState)

{

    assert_param(IS_RCC_AHB_PERIPH(RCC_AHBPeriph));

    assert_param(IS_FUNCTIONAL_STATE(NewState));  

    if (NewState  != DISABLE)  {

        RCC->AHBENR |= RCC_AHBPeriph;

     }

    else {

        RCC->AHBENR &= ~RCC_AHBPeriph;

     }

}


函数调用:RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE);

       其中:#define RCC_AHBPeriph_GPIOC       RCC_AHBENR_GPIOCEN

                 #DEFINE  GPIOCEN        (Unit32_t)0x0x00000004

RCC->AHBENR|=RCC_AHBPeriph   等价于  RCC->AHBENR=RCC->AHBENR|0x0x00000004,使得RCC_AHBENR寄存器中GPIOC的使能位置1;

但个人也有疑问:结构体中寄存器变量的位置如何确定?

 隔天小哥自己阅读代码结构发现不同外设结构体的设置都是不同的,参照芯片手册后发现一个有趣的现象。

推测结构体内部成员的地址值是向上增长的,相应的寄存器成员变量地址也就确定了。

以下是结构体对照:

typedef struct                   # typedef struct  

{                                        #  {  

  __IO uint32_t KR;            #    __IO uint16_t CR1;

  __IO uint32_t PR;            #            uint16_t  RESERVED0;

  __IO uint32_t RLR;          #    __IO uint16_t CR2;

  __IO uint32_t SR;            #            uint16_t  RESERVED1;

} IWDG_TypeDef;             #    __IO uint16_t SR;

~~~~~~~~~~~~          #        uint16_t  RESERVED2;

 ~~~~~~~~~~~~      #    __IO  uint16_t DR;

~~~~~~~~~~~~          #             uint16_t  RESERVED3;

~~~~~~~~~~~~          #     __IO uint16_t CRCPR;

~~~~~~~~~~~~          #             uint16_t  RESERVED4;

~~~~~~~~~~~~          #     __IO uint16_t RXCRCR; 

~~~~~~~~~~~~                         uint16_t  RESERVED5;

~~~~~~~~~~~~                 __IO uint16_t TXCRCR;

~~~~~~~~~~~~                         uint16_t  RESERVED6;  

~~~~~~~~~~~~                 } SPI_TypeDef;

波浪线仅为对齐好看使用

IWDG寄存器占据四字节的定义为 __IO uint32_t 类型

SPI     寄存器占据两字节的定义为 __IO uint16_t 类型,中间空出的则用 uint16_t  RESERVED填充,可以证实以上的猜测。


推荐阅读

史海拾趣

上海国芯(Gcore)公司的发展小趣事
优化电源设计,加入滤波电容等元件以减小电源波动对电路的影响;采用温度补偿等措施提高电路的温度稳定性。
ADLINK公司的发展小趣事
优化电源设计,加入滤波电容等元件以减小电源波动对电路的影响;采用温度补偿等措施提高电路的温度稳定性。
C&K Components公司的发展小趣事

进入千禧年代,随着全球经济的融合和科技的快速发展,ITT Industries看中了C&K在开关领域的领先地位和强大实力,决定对其进行收购。这次并购使C&K成为ITT的开关部门,但公司仍然保留了C&K的名称和品牌。并购后的C&K借助ITT的全球资源和平台优势,进一步提升了自身的研发能力和市场竞争力,实现了更快速的发展。

Circuit Assembly公司的发展小趣事

进入千禧年代,随着全球经济的融合和科技的快速发展,ITT Industries看中了C&K在开关领域的领先地位和强大实力,决定对其进行收购。这次并购使C&K成为ITT的开关部门,但公司仍然保留了C&K的名称和品牌。并购后的C&K借助ITT的全球资源和平台优势,进一步提升了自身的研发能力和市场竞争力,实现了更快速的发展。

C-MEDIA公司的发展小趣事

近年来,网络游戏市场呈现出蓬勃发展的态势,C-MEDIA公司也看到了其中的商机。于是,公司通过收购C&C Media,进一步深入日本网络游戏市场。这次收购不仅帮助C-MEDIA公司把握了该市场的成长机遇,也有效地拓展了其海外运营实力。C&C Media旗下的网络游戏门户网站“MK-STYLE”为个人用户提供了丰富的网络游戏服务,进一步巩固了C-MEDIA在网络游戏领域的市场地位。

Einfochips公司的发展小趣事

Einfochips公司一直致力于嵌入式系统的创新与发展。在某一时期,该公司推出了Eragon600,一款基于Qualcomm Snapdragon 600处理器的全新嵌入式开发平台。这一平台的推出,标志着Einfochips在嵌入式系统开发领域取得了重要突破。Eragon600不仅具备强大的处理能力,还适用于多种行业,包括工业、安全与监控、信息、娱乐等。在多个领域的广泛应用,进一步巩固了Einfochips在嵌入式系统开发领域的领先地位。

问答坊 | AI 解惑

如下代码为什么不能实现动态扫描

#include #include unsigned char LED_CODE[]={0x3f,0x6,0x5b,0x4f,0x66,0x6d,0x7d,0x7,0x7f,0x6f}; void delay(void) { int k;   for(k=0;k…

查看全部问答>

求助:WINCE系统运行后,如何保存个人修改的设置?

WINCE系统起来之后,修改一些配置,比如换个桌面背景,调整背光时间等,掉电之后重新启动又回到没有修改的状态。 如何实现掉电之后能够保存好修改的设置,在上电启动后这些设置还存在??? 希望各位大侠们能够赐教!!!…

查看全部问答>

单片机音乐播放中歌曲的代码

单片机音乐播放中歌曲的代码怎样弄出来的? 我看了网上的一些教程。。一个个的算很麻烦。。而且我对音乐不熟悉。 这样效率很低。。有没有一些快点的方法? 先在这里谢了~…

查看全部问答>

关于evc的按钮问题

编程环境:evc 程序的功能:点击按钮弹出对话框 情况说明: 在evc下采用MFC编写应用程序,实现点击按钮button1,弹出对话框,用鼠标点击,没有问题,可以正常运行,点击键盘上的ENTER键(确定),也可以弹出对话框。 由于需要进行按钮美化,将b ...…

查看全部问答>

我在wince中用

我在wince中用SendMessage(m_hCtlHtml, DTM_NAVIGATE, \"file://\\\\files\\\\a.htm\")方法显示了一个网页,但是其中的链接都不能点击,这是为什么?求大家帮帮我!谢谢~…

查看全部问答>

来长沙参加飞思卡尔智能车竞赛第四天。。。。

补上的,因为刚把相关的视频,相片都拷过来,而且整理了大半天,呵呵~ 希望大家谅解~ 我们是属于华南赛区的,7月23号决赛,也就是我来长沙的第四天~ 决赛是按进入决赛的队伍在预赛时的成绩排名,倒序跑的。 首先进行的是电磁组的,接着是 ...…

查看全部问答>

DIY一个遥控电源插座

最近想DIY一个遥控电源插座,希望大家给个建议:收集了一些资料,但感觉不太满意,如下:PH303A×2红外脉冲发射电路如下图所示,调节RP1,使其振荡频率为12kHz.红外遥控接收电路:…

查看全部问答>

求解释!出奇稳定的相机

本帖最后由 qwqwqw2088 于 2014-1-9 22:08 编辑 也许你见过,或研究过,出奇稳定的相机稳定器,灵感来自鸡头稳定性?求解释 …

查看全部问答>

传感器的选择

各位,我想请教大家一个问题。对于像油罐车这种密闭空间液体的液量测量可以用什么传感器实时监控其液量变化呢?(包括行驶过称中)。…

查看全部问答>