@/"...
1> 概述
GPIO(General-Purpose Input output)通用输入输出_控制器,属于器的一种,类似于热水器,灭火器,充电器…
STM32F407共有【9】个GPIO控制器,GPIOA~GPIOI。
2> 硬件电路
2.1> GPIO内部框图
1> GPIO内部方框图中只列出部分寄存器;
2> 省略时钟电路;
详细电路参考:《芯片接口库 I/O Library和ESD 电路的研发设计应用》
2.2> GPIO寄存器列表
2.3> GPIO功能描述
2.4> 电路实例
2.5> 硬件抽象
对于程序设计人员,使用GPIO控制器时,可抽象为一个黑盒子;
3> 程序设计
3.1> 功能需求
控制1个LED灯,ON/OFF, 频率无要求,人类看得见实验现象即可;
3.2> 流程图
流程图:表示程序的结构;
时序电路都需要时钟,时钟使能不可漏写;
3.3> 寄存器地址
寄存器地址的映射是连续的,使操作简单;
3.4> 程序 Ver_1
// 核心代码
int main ()
{
unsigned int *RCC_AHB1ENER = (unsigned int *)(0x40023800 + 0x30);
unsigned int *GPIOF_MODER = (unsigned int *)(0x40021400 + 0x00);
unsigned int *GPIOF_OTYPER = (unsigned int *)(0x40021400 + 0x04);
unsigned int *GPIOF_ODR = (unsigned int *)(0x40021400 + 0x14);
/* 1> GPIOF clk : Enable*/
*RCC_AHB1ENER |= (1<<5);
/* 2> Configure GPIOF9: OUTPUT */
*GPIOF_MODER |= (1<<18);
/* 3> Confgiure GPIOF9 output type: Push-pull */
*GPIOF_OTYPER &= (~(1<<9));
while (1) {
*GPIOF_ODR = (*GPIOF_ODR) & (~(1<<9));
delay(1000000);
*GPIOF_ODR = (*GPIOF_ODR) | (1<<9);
delay(1000000);
}
}
3.5> 程序 Ver_2
用结构体来描述GPIO寄存器地址,
使用,修改,阅读都方便;
// 核心代码
typedef struct GPIO {
unsigned int MODER;
unsigned int OTYPER;
unsigned int OSPENDER;
unsigned int PUPDR;
unsigned int IDR;
unsigned int ODR;
unsigned int BSRR;
unsigned int LCKR;
unsigned int AFRL;
unsigned int AFRH;
} GPIO_TypeDef;
//#define GPIOF ((GPIO_TypeDef *) 0x40021400)
void delay (int tim);
int main ()
{
unsigned int *RCC_AHB1ENER = (unsigned int *)(0x40023800 + 0x30);
GPIO_TypeDef *GPIOF = ((GPIO_TypeDef *)0x40021400);
/* 1> GPIOF clk : Enable*/
*RCC_AHB1ENER |= (1<<5);
/* 2> Configure GPIOF9: OUTPUT */
GPIOF->MODER |= (1<<18);
/* 3> Confgiure GPIOF9 output type: Push-pull */
GPIOF->OTYPER &= (~(1<<9));
while (1) {
GPIOF->ODR &= (~(1<<9));
delay(100000);
GPIOF->ODR |= (1<<9);
delay(1000000);
}
}