01、原子战舰 点亮LED(寄存器)

位操作

  • 指定的某一位数置1

    x|=(1<<y)

  • 指定的某一位数置0

    x&=~(1<<y)

硬件设计

在这里插入图片描述

led.c

#include "led.h"
//初始化 PB5 和 PE5 为输出口.并使能这两个口的时钟
//LED IO 初始化
void LED_Init(void)
{
	RCC->APB2ENR|=1<<3; //使能 PORTB 时钟
	RCC->APB2ENR|=1<<6; //使能 PORTE 时钟
	GPIOB->CRL&=0XFF0FFFFF; //清零 不影响其它位的设置
	GPIOB->CRL|=0X00300000;//PB.5 推挽输出
	GPIOB->ODR|=1<<5; //PB.5 输出高
	GPIOE->CRL&=0XFF0FFFFF;
	GPIOE->CRL|=0X00300000;//PE.5 推挽输出
	GPIOE->ODR|=1<<5; //PE.5 输出高
}

LED_Init(void),该函数的功能就是用来实现配置 PB5和 PE5 为推挽输出。

使能时钟

在配置 STM32 外设的时候,任何时候都要先使能该外设的时钟!APB2ENR 是 APB2 总线上的外设时钟使能寄存器。
在这里插入图片描述
我们要使能的 PORTB 和 PORTE 的时钟使能位,分别在 bit3 和 bit6,只要将这两位置 1 就可以使能 PORTB 和 PORTE 的时钟了。

设置输出模式(CRL)

PB5 和 PE5 的模式为推挽输出,输出速度50M。 0011=3
在这里插入图片描述

设置输出(ODR)

默认输出 1
在这里插入图片描述

main

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

int main(void)
{				 
	Stm32_Clock_Init(9);//系统时钟设置
	delay_init(72);	  	//延时初始化
    
	LED_Init();
    while(1)
    {
        GPIOB->ODR|=1<<5;
        
        GPIOE->ODR|=1<<5;
        delay_ms(500);
    
        GPIOB->ODR&=~(1<<5);
        
        GPIOE->ODR&=~(1<<5);
        delay_ms(500);
    }
} 
发布了274 篇原创文章 · 获赞 97 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/imxlw00/article/details/104447055