跑马灯实验-寄存器版

硬件连接:

PF9----LED0

PF10--LED1


1)使能IO口时钟。配置相关寄存器RCC->AHB1ENR。时钟使能寄存器,用到哪个外设就要开启响应的时钟使能。


2)初始化IO口模式。配置四个配置寄存器

GPIOx_MODER/GPIOx_OTYPER/GPIOx_OSPEEDR/GPIOx_PUPDR


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


//

#ifndef __LED_F                 //if not defined测试__LED_F是否被宏定义过
#define __LED_F               //如果没有被宏定义过,宏定义__LED_F,并编译下面的程序段1
void LED_Init(void);            //程序段1

#else                                    //如果被宏定义过,则直接执行程序段2

                                              //程序段2

#endif


//

#include "led.h"
#include "stm32f4xx.h"

void LED_Init(void)
{

    RCC->AHB1ENR|=1<<5;        

   //F9

    GPIOF->MODER &=~(3<<(2*9));                  //其他位置数值不变,将18.19位置0
    GPIOF->MODER |=1<<(2*9);                         //其他位置数值不变,将18.19位置0和1.
                                                                                //位运算时,位和1进行与运算以及和0进行或运算时,数值都不发生变化
    GPIOF->OSPEEDR &=~(3<<(2*9));
    GPIOF->OSPEEDR |=2<<(2*9);
    GPIOF->OTYPER &=~(1<<9);
    GPIOF->OTYPER |=0<<9;
    GPIOF->PUPDR &=~(3<<(2*9));
    GPIOF->PUPDR |=1<<(2*9);
    GPIOF->ODR |=1<<9;    //1

    GPIOF->ODR &=~(1<<9); //0

    //F10

    GPIOF->MODER &=~(3<<(2*10)); 
    GPIOF->MODER |=1<<(2*10); 
    GPIOF->OSPEEDR &=~(3<<(2*10));
    GPIOF->OSPEEDR |=2<<(2*10);
    GPIOF->OTYPER &=~(1<<10);
    GPIOF->OTYPER |=0<<10;
    GPIOF->PUPDR &=~(3<<(2*10));
    GPIOF->PUPDR |=1<<(2*10);
    GPIOF->ODR |=1<<10;
}

//

#include "stm32f4xx.h"
#include "led.h"
#include "delay.h"

int main(void)
{
    delay_init(168);                               //初始化延时函数
    LED_Init();                                        //初始化LED端口
    while(1)
    {
        GPIOF->ODR &=~(1<<9); //0
        GPIOF->ODR &=~(1<<10);
        delay_ms(500);
        GPIOF->ODR |=1<<9;    //1
        GPIOF->ODR |=1<<10;
        delay_ms(500);
    
    }
}


你可能感兴趣的:(STM32)