STM32F407 跑马灯 寄存器版 个人笔记

更多原理请参考跑马灯 库函数版 个人笔记

步骤

  1. 使能IO口时钟。配置相关寄存器寄存器RCC->AHB1ENR

  2. 初始化IO口模式。配置四个配置寄存器
    GPIOx_MODER/ GPIOx_OTYPER/ GPIOx_OSPEEDR/ GPIOx_PUPDR

  3. 操作IO口,输出高低电平。配置寄存器GPIOX_ODR或者BSRRL/BSRRH。

代码

led.c

#include "led.h"
#include "stm32f4xx.h"
void LED_Init(){
    //1.使能pf9 和pf 10 的时钟
    //打开中文参考手册,找到时钟使能寄存器ah
    /*
    6.3.12 RCC AHB1 外设时钟使能寄存器 (RCC_AHB1ENR)
    */
    //查手册知,PF是第五位,故第五位置1,其余位不变
    RCC->AHB1ENR |= 1<<5;

    
    //2.GPIO_init
    //GPIOF)_9
    GPIOF->MODER &= ~(3<<2*9);   //查手册知,19,18位为01(通用输出模式)先都置为0    ;        gpiof9,每个引脚两位
    GPIOF->MODER |= 1<<2*9;      //再把18位置为1
    
    GPIOF->OSPEEDR &= ~(3<<2*9);  //19~18   10  fast 50MHz
    GPIOF->OSPEEDR |= 2<<2*9;
    
    GPIOF->PUPDR &= ~(3<<2*9);  //查手册知,19,18位为01
    GPIOF->PUPDR|= 1<<2*9; 
    
    GPIOF->OTYPER &= ~(1<<9);    //第九\十位为0
    

    //GPIOF)_10
    GPIOF->MODER &= ~(3<<2*10);   //查手册知,19,18位为01(通用输出模式)先都置为0    ;        gpiof9,每个引脚两位
    GPIOF->MODER |= 1<<2*10;      //再把18位置为1
    
    GPIOF->OSPEEDR &= ~(3<<2*10);  //19~18   10  fast 50MHz
    GPIOF->OSPEEDR |= 2<<2*10;
    
    GPIOF->PUPDR &= ~(3<<2*10);  //查手册知,19,18位为01
    GPIOF->PUPDR|= 1<<2*10; 
    
    GPIOF->OTYPER &= ~(1<<10);    //第九\十位为0
    
    //3.输出高低电平
    GPIOF->ODR |= 1<<9;
    GPIOF->ODR |= 1<<10;
}

led.h

#ifndef __LED_H
#define __LED_H
void LED_Init(void);
#endif

main.c

#include "stm32f4xx.h"
#include "led.h"
#include "delay.h"
int main()
{
    delay_init(168);
    LED_Init();
    while(1){
        Stm32_Clock_Init(336,8,2,7);//设置时钟,168Mhz,(先开始没加这一句,延时速度很慢)
        GPIOF->ODR &=~(1<<9);
        GPIOF->ODR |=1<<10;
        delay_ms(500);
    
        
        GPIOF->ODR |=1<<9;
        GPIOF->ODR &=~(1<<10);
        delay_ms(500);
    }
}


转载于:https://www.cnblogs.com/YuQiao0303/p/10006174.html

你可能感兴趣的:(STM32F407 跑马灯 寄存器版 个人笔记)