一、前期准备:
1、STM32F4xx中文参考手册.pdf
先上代码
#include "stm32f4xx.h"
#define RCC_AHB1ENR ( *(volatile unsigned int *)(0x40023800 + 0x30) ) //AHB1时钟使能寄存器
#define GPIOF_MODER ( *(volatile unsigned int *)(0x40021400 + 0x00) ) //GPIOF端口模式寄存器
#define GPIOF_OTYPER ( *(volatile unsigned int *)(0x40021400 + 0x04) ) //GPIOF端口输出类型寄存器
#define GPIOF_OSPEEDR ( *(volatile unsigned int *)(0x40021400 + 0x08) ) //GPIOF端口输出速度寄存器
#define GPIOF_PUPDR ( *(volatile unsigned int *)(0x40021400 + 0x0C) ) //GPIOF端口上下拉寄存器
#define GPIOF_ODR ( *(volatile unsigned int *)(0x40021400 + 0x14) ) //GPIOF端口输出数据寄存器
#define GPIOA_MODER ( *(volatile unsigned int *)(0x40020000 + 0x00) ) //GPIOA端口模式寄存器
#define GPIOA_IDR ( *(volatile unsigned int *)(0x40020000 + 0x10) ) //GPIOA输入数据寄存器
int main()
{
//1.打开时钟 GPIOF PF9 GPIOA PA0
// RCC_AHB1ENR |= (1<<5);
// RCC_AHB1ENR |= (1<<0);
RCC->AHB1ENR |= (1<<5);
//2.配置PF9 PA0
GPIOF_MODER |= (1<<18);
GPIOF_MODER &= ~(1<<19); //输出模式
GPIOF_OTYPER &= ~(1<<9); //推挽输出
GPIOF_OSPEEDR |= (3<<18); //输出速率
GPIOF_PUPDR |= (1<<18);
GPIOF_PUPDR &= ~(1<<19); //上拉输出
GPIOA_MODER &= ~(1<<0);
GPIOA_MODER &= ~(1<<1); //输入模式
GPIOF_ODR |= (1<<9); //输出低电平 灯灭
while(1)
{
if( GPIOA_IDR & 0x1 )
{
GPIOF_ODR &= ~(1<<9); //输出低电平 灯亮
}
else
{
GPIOF_ODR |= (1<<9); //输出低电平 灯灭
}
}
}
这个代码是基于STM32寄存器开发之点亮led灯 的基础上做了调整,用按键实现点亮led灯,本文章仅介绍按键部分的代码。
#define GPIOA_MODER ( *(volatile unsigned int *)(0x40020000 + 0x00) ) //GPIOA端口模式寄存器
章节:2.3 存储器映射
上图得知GPIOA的起始地址是0x40020000
因为按键的串口位置是PF0,它在0位置
#define GPIOA_IDR ( *(volatile unsigned int *)(0x40020000 + 0x10) ) //GPIOA输入数据寄存器
输入数据寄存器偏移地址是0x10
GPIOA_MODER &= ~(1<<0);
GPIOA_MODER &= ~(1<<1); //输入模式
while(1)
{
if( GPIOA_IDR & 0x1 )
{
GPIOF_ODR &= ~(1<<9); //输出低电平 灯亮
}
else
{
GPIOF_ODR |= (1<<9); //输出低电平 灯灭
}
}