设置堆栈 初始化环境
添加头文件
选择正确的型号(点开魔法棒)
时钟
控制外设使能与否就是控制这个外设的时钟
以LED为例
- 查看原理图
- 查看总线架构
- 找到RCC(复位和时钟控制) 基地址
- 基地址:0x4002 3800
- 接着找到RCC AHB1 外设时钟使能寄存器 (RCC_AHB1ENR)
- 得到 偏移地址:0x30
RCC_AHB1ENR的地址就为基地址 + 偏移地址 其他以此类推
- AHB1 外设时钟使能寄存器 使能
推挽模式 寄存器操作 控制时钟
配置寄存器进行相应的模式配置
通过端口配置表(表28)配置相应的位配置不同的模式
再次展示我们的原理图
注:
OT0 OT1 分别对应GPIO端口0 端口1 以此类推
(输出速度越快 功耗越大 这里的速度指的是GPIO电平翻转的速度 就是高低电平变化的速度)
/*
使用寄存器的方法点亮LED灯
*/
#include "stm32f4xx.h"
/**
* 主函数
*/
int main(void)
{
/*开启 GPIOH 时钟,使用外设时都要先开启它的时钟*/
RCC_AHB1ENR |= (1<<7);
/* LED 端口初始化 */
/*GPIOH MODER10清空*/
GPIOH_MODER &= ~( 0x03<< (2*10));
/*PH10 MODER10 = 01b 输出模式*/
GPIOH_MODER |= (1<<2*10);
/*GPIOH OTYPER10清空*/
GPIOH_OTYPER &= ~(1<<1*10);
/*PH10 OTYPER10 = 0b 推挽模式*/
GPIOH_OTYPER |= (0<<1*10);
/*GPIOH OSPEEDR10清空*/
GPIOH_OSPEEDR &= ~(0x03<<2*10);
/*PH10 OSPEEDR10 = 0b 速率2MHz*/
GPIOH_OSPEEDR |= (0<<2*10);
/*GPIOH PUPDR10清空*/
GPIOH_PUPDR &= ~(0x03<<2*10);
/*PH10 PUPDR10 = 01b 上拉模式*/
GPIOH_PUPDR |= (1<<2*10);
/*PH10 BSRR寄存器的 BR10置1,使引脚输出低电平*/
GPIOH_BSRR |= (1<<16<<10);
/*PH10 BSRR寄存器的 BS10置1,使引脚输出高电平*/
//GPIOH_BSRR |= (1<<10);
while(1);
}
// 函数为空,目的是为了骗过编译器不报错
void SystemInit(void)
{
}