历史上的今天
今天是: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寄存器。

GPIOC的使能位在BIT2 则 #DEFINE GPIOCEN (Unit32_t)0x0x00000004

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填充,可以证实以上的猜测。
史海拾趣
|
#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系统起来之后,修改一些配置,比如换个桌面背景,调整背光时间等,掉电之后重新启动又回到没有修改的状态。 如何实现掉电之后能够保存好修改的设置,在上电启动后这些设置还存在??? 希望各位大侠们能够赐教!!!… 查看全部问答> |
|
单片机音乐播放中歌曲的代码怎样弄出来的? 我看了网上的一些教程。。一个个的算很麻烦。。而且我对音乐不熟悉。 这样效率很低。。有没有一些快点的方法? 先在这里谢了~… 查看全部问答> |
|
编程环境:evc 程序的功能:点击按钮弹出对话框 情况说明: 在evc下采用MFC编写应用程序,实现点击按钮button1,弹出对话框,用鼠标点击,没有问题,可以正常运行,点击键盘上的ENTER键(确定),也可以弹出对话框。 由于需要进行按钮美化,将b ...… 查看全部问答> |
|
补上的,因为刚把相关的视频,相片都拷过来,而且整理了大半天,呵呵~ 希望大家谅解~ 我们是属于华南赛区的,7月23号决赛,也就是我来长沙的第四天~ 决赛是按进入决赛的队伍在预赛时的成绩排名,倒序跑的。 首先进行的是电磁组的,接着是 ...… 查看全部问答> |
|
最近想DIY一个遥控电源插座,希望大家给个建议:收集了一些资料,但感觉不太满意,如下:PH303A×2红外脉冲发射电路如下图所示,调节RP1,使其振荡频率为12kHz.红外遥控接收电路:… 查看全部问答> |




