历史上的今天

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

正在发生

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

发布者:快乐心跳 来源: eefocus关键字:STM32  GPIO  端口设置 手机看文章 扫描二维码
随时随地手机看文章

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填充,可以证实以上的猜测。


关键字:STM32  GPIO  端口设置 引用地址:STM32学习札记--GPIO端口设置

上一篇:STM32通用定时器的几个重要寄存器
下一篇:STM32学习札记--ADC的有关函数个人见解

推荐阅读

在设计“单片机控制线路板”时,一般需有4部分电路:“电源电路部分”、“晶振电路部分”、“复位电路部分”、“下载电路部分”;对不同的“IC芯片”,工作所需“电源电压”各不相同,大多为“+3.3V”或“+5.0V”;“晶振电路部分”和“复位电路部分”也需根据“芯片”对应的“datasheet”进行设计,特别是“复位电路部分”,必须参考手册,确定“低电平复...
总结一下出现的问题1、使用1Mhz频率,并通过修改分频系数将主机频率降至100Khz左右,项目需要,将频率改成16Mhz,发现数据写入不成功,分频系数没有错误,判断应该是没有那么大的分频可以分(这个还未确定),通过选择ACLK,并在基础时钟上设置分频,分到最低2Mhz,再在usci_i2c中设置分频系数,就可以了2、读写数据不一致万思不得其解,写入一段数据,发...
本设计包括两个终端,包括负责水卡充值(可选择金额)的充值终端和每次刷卡扣费两元的付费终端。制作成品时建议两个终端做在一块板子上,用跳帽切换两个51单片机的电源。主控芯片51单片机射频模块RC522射频卡M1卡S50以下是付费终端的程序#include "reg52.h"#include "main.h"#include "mfrc522.h"#include<intrins.h> //函数处理头文件 ...
企查查App显示,10月8日,广州小鹏汽车科技有限公司“车辆淹水的报警方法及系统、车辆和可读存储介质”专利获授权,公开号为CN110796834B。专利摘要显示,上述报警方法,通过摄像头获取的车辆所处的水面图像,并处理水面图像,进而得到水面图像的频率,由水面图像的频率判断车辆是否淹水,从而及时发出报警信息。这样既可以非接触地获得摄像头与水面的距离...

史海拾趣

问答坊 | AI 解惑

我也想学习电子设计和单片机又不知从哪里开始学好.请高手指点!

我也想学习电子设计和单片机又不知从哪里开始学好.请高手指点!…

查看全部问答∨

模拟电子技术重点难点及典型题精解2

模拟电子技术重点难点及典型题精解2 [ 本帖最后由 linda_xia 于 2010-3-26 11:31 编辑 ]…

查看全部问答∨

Keil C编译常见告警与错误信息的解释及排除方法

1. Warning 280:’i’:unreferenced local variable 说明 局部变量 i 在函数中未作任何的存取操作 解决方法 消除函数中 i变量的宣告 2 Warning 206:’Music3’:missing function-prototype 说明 Music3( )函数未作宣告 或未作外部宣告 ...…

查看全部问答∨

五种PWM反馈控制模式研究

五种PWM反馈控制模式研究…

查看全部问答∨

u-boot LCD显示问题

最近调试u-boot 下 lcd显示,由于原配的lcd为320*240的TFT,现在我要改为640*480,修改参数后发现显示是稳定的,但是显示3块错开的相同的内容(分别在屏幕的上中下的位置),不知是什么原因。有人碰到过吗;请问是什么原因呢?…

查看全部问答∨

一个简单的广告灯程序 请高手指点!

1. 实验任务 利用取表的方法,使端口P1做单一灯的变化:左移2次,右移2次,闪烁2次(延时的时间0.2秒)。 麻烦帮忙检查下下面代码有什么问题,实在看不出来错在哪里 程序代码: ORG 0 START: MOV DPTR,#TABLE LOOP: CLR A MOVC A,@A+DPTR ...…

查看全部问答∨

Bios Boot Loader的错误

按照PB帮助文档作的BLDR,NK.bin也可以通过网络或者在终端运行,PB是5.0的版本. 以下是错误信息: Microsoft Windows CE BIOS Bootloader Version 2.2 (Built Mar 13 2004) WARNING: code=0x7. WARNING: code=0x13. WARNING: code=0x7. WARNING: ...…

查看全部问答∨

嵌入式Linux操作系统实时性的分析

一、引言 Linux本身为分时操作系统,其系统目标为较好的平均响应时间和较高的吞吐量,而实时系统则主要考虑任务的按时完成、尽量减少进程运行的不可预测性等。但与商业嵌入式操作系统相比Linux遵循GPL,具有源代码开放、定制方便、支持广泛的计算 ...…

查看全部问答∨

CycloneII特殊管脚的使用

1/1.I/O, ASDO 在AS 模式下是专用输出脚,在PS 和JTAG 模式下可以当I/O 脚来用。在AS 模式下,这个脚是CII 向串行配置芯片发送控制信号的脚。也是用来从配置芯片中读配置数据的脚。在AS 模式下,ASDO 有一个内部的上拉电阻,一直有效,配置完成后 ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved