stm32寄存器开发led

  • STM32时钟分析

寄存器:寄存器的功能是存储二进制代码,它是由具有存储功能的触发器组合起来构成的。一个触发器可以存储1位二进制代码,故存放n位二进制代码的寄存器,需用n个触发器来构成

在计算机领域,寄存器是CPU内部的元件,包括通用寄存器、专用寄存器和控制寄存器。寄存器拥有非常高的读写速度,所以在寄存器之间的数据传送非常快。

控制寄存器:相当一排可通过0/1进行设置外设功能的开关,程序中通过地址查找到对应的寄存器,所以说控制寄存器的地址是唯一。

芯片时钟:芯片工作时,是需要脉冲,脉冲相当于给芯片起振,可保证芯片的正常工作,类似于人,心脏正常跳动,人体生命特征才能正常。

1HZ:一秒产生1个脉冲

频率换算单位:

1GHZ =  1000MHZ = 1000 000KHZ = 1000 000 000HZ

STM32时钟源

时钟源是可以产生器件。 

LSIRC 32KHZ     32 kHz 低速内部 RC (LSI RC)

LSEOSC 32.168KHZ 32.768 kHz 低速外部晶振( LSE 晶振)

16MHZ HSI RC 16MHZ  高速内部 RC (LSI RC)

4-26MHZ HSE OSC      4-26MHZ高速外部晶振(HSE 晶振) 开发板外部晶振为8MHZ

STM32主要总线时钟频率

SYSCLK 168MHZ

HCLK 168MHZ

AHB1/AHB2 168MHZ

APB1 42MHZ

APB2 84MHZ

  • GPIO分析

GPIO: GPIO(英语:General-purpose input/output),通用型之输入输出的简称。

GPIO分组

STM32F407ZET6(芯片型号)

    -  一共有7组IO口(PA  PB  PC  PD  PE  PF  PG)

    -  每组IO口有16个IO引脚

    -  一共16X7=112个IO引脚

外加2个PH0和PH1

一共114个IO口引脚

原理上GPIO连接与功能说明

每组(PA  PB  PC  PD  PE  PF  PG)通用 I/O 端口包括:

  • 4 个 32 位配置寄存器(GPIOx_MODER、GPIOx_OTYPER、GPIOx_OSPEEDR 和 GPIOx_PUPDR)。
  • 2 个 32 位数据寄存器(GPIOx_IDR 和 GPIOx_ODR)。
  • 1 个 32 位置位/复位寄存器 (GPIOx_BSRR)、
  • 1 个 32 位锁定寄存器(GPIOx_LCKR)
  • 2 个 32 位复用功能选择寄存器(GPIOx_AFRH 和 GPIOx_AFRL)。

 

 

 

GPIO工作方式寄存器设置GPIO工作方式

  1. 4种输入模式
    1. 浮空输入(没有上下拉电阻)
    2. 上拉输入(有上拉电阻)
    3. 下拉输入(有下拉电阻)
    4. 模拟输入
  2. 4种输出模式
    1. 开漏输出(带上拉或者下拉)
    2. 开漏复用功能(带上拉或者下拉)
    3. 推挽式输出(带上拉或者下拉)
    4. 推挽是复用功能(带上拉或者下拉)
  3. 4种最大输出速度
    1. 2MHZ
    2. 25MHZ
    3. 50MHZ
    4. 100MHZ

注意点:

开漏输出只能输出0(低电平),若想出输出1(高电平),需要外部接上拉电阻(类似到51单片机P0组)。

推挽式输出可输出0(低电平)或者1(高电平),这是常用模式

寄存器地址查找

寄存器地址 = 寄存组基地址+偏移地址

寄存器查看

  • LED灯开发
  1. 理解led灯原理图

LED0连接在PF9

PF9输出低电平(0),灯亮;PF9输出高电平(1),灯灭;

  1. 打开GPIOF组时钟

  1. 设置PF9灯为输出模式  输出推挽 上拉 速度(50MHZ)

4、通过GPIOF_BSRR控制LED灯亮与灭

#include "led.h"


/****************************************************
LED0连接在PF9(属于GPIOF组)
PF9输出低电平(0),灯亮;PF9输出高电平(1),灯灭;

*****************************************************/
void Led_Init(void)
{
	//打开GPIOF组时钟
	RCC_AHB1ENR |= (0x01<<5);
	
	//打开GPIOE组时钟
	RCC_AHB1ENR |= (0x01<<4);
	

	//输出模式LED0
	GPIOF_MODER &= ~(0x01<<19);
	GPIOF_MODER |= (0x01<<18);
	
	//输出模式LED1
	GPIOF_MODER &= ~(0x01<<21);
	GPIOF_MODER |= (0x01<<20);
	
	//输出模式LED2
	GPIOE_MODER &= ~(0x01<<27);
	GPIOE_MODER |= (0x01<<26);
	
	//输出模式LED3
	GPIOE_MODER &= ~(0x01<<29);
	GPIOE_MODER |= (0x01<<28);
	
	
	//推挽输出LED0
	GPIOF_OTYPER &= ~(0x01<<9);
	
	//推挽输出LED1
	GPIOF_OTYPER &= ~(0x01<<10);
	
	//推挽输出LED2
	GPIOE_OTYPER &= ~(0x01<<13);
	
	//推挽输出LED3
	GPIOE_OTYPER &= ~(0x01<<14);
	
	
	//上拉LED0
	GPIOF_PUPDR &= ~(0x01<<19);
	GPIOF_PUPDR |= (0x01<<18);
	
		//上拉LED1
	GPIOF_PUPDR &= ~(0x01<<21);
	GPIOF_PUPDR |= (0x01<<20);
	
	//上拉LED2
	GPIOE_PUPDR &= ~(0x01<<27);
	GPIOE_PUPDR |= (0x01<<26);
	
	//上拉LED3
	GPIOE_PUPDR &= ~(0x01<<29);
	GPIOE_PUPDR |= (0x01<<28);
	
	//50MHZ LED0
	GPIOF_OSPEEDR |=(0x01<<19);
	GPIOF_OSPEEDR &= ~(0x01<<18);	
	
	//50MHZ LED1
	GPIOF_OSPEEDR |=(0x01<<21);
	GPIOF_OSPEEDR &= ~(0x01<<20);
	
	//50MHZ LED2
	GPIOE_OSPEEDR |=(0x01<<27);
	GPIOE_OSPEEDR &= ~(0x01<<26);
	
	//50MHZ LED3
	GPIOE_OSPEEDR |=(0x01<<29);
	GPIOE_OSPEEDR &= ~(0x01<<28);

}
#ifndef __LED_H
#define __LED_H

#include "stm32f4xx.h"


#define RCC_AHB1ENR  		*((volatile unsigned int *)(0x40023800+0x30))  //值强制转化为地址,地址通过解引用,即可访问地址空间


//GPIOF组寄存器
#define	 GPIOF_MODER		*((volatile unsigned int *)(0x40021400+0x00))  //值强制转化为地址,地址通过解引用,即可访问地址空间
#define	 GPIOF_OTYPER		*((volatile unsigned int *)(0x40021400+0x04))  //值强制转化为地址,地址通过解引用,即可访问地址空间
#define  GPIOF_OSPEEDR		*((volatile unsigned int *)(0x40021400+0x08))  //值强制转化为地址,地址通过解引用,即可访问地址空间
#define  GPIOF_PUPDR		*((volatile unsigned int *)(0x40021400+0x0C))  //值强制转化为地址,地址通过解引用,即可访问地址空间
#define  GPIOF_BSRR			*((volatile unsigned int *)(0x40021400+0x18))  //值强制转化为地址,地址通过解引用,即可访问地址空间


//GPIOE组寄存器
#define	 GPIOE_MODER		*((volatile unsigned int *)(0x40021000+0x00))  //值强制转化为地址,地址通过解引用,即可访问地址空间
#define	 GPIOE_OTYPER		*((volatile unsigned int *)(0x40021000+0x04))  //值强制转化为地址,地址通过解引用,即可访问地址空间
#define  GPIOE_OSPEEDR		*((volatile unsigned int *)(0x40021000+0x08))  //值强制转化为地址,地址通过解引用,即可访问地址空间
#define  GPIOE_PUPDR		*((volatile unsigned int *)(0x40021000+0x0C))  //值强制转化为地址,地址通过解引用,即可访问地址空间
#define  GPIOE_BSRR			*((volatile unsigned int *)(0x40021000+0x18))  //值强制转化为地址,地址通过解引用,即可访问地址空间




void Led_Init(void);

#endif
#include "stm32f4xx.h"
#include "led.h"
#include "beep.h"

void delay(int n)
{
	int i, j;

	for(i=0; i<n; i++)
		for(j=0; j<20000; j++);
}


int main(void)
{
	Beep_init();
	
	while(1)
	{
	
		//Beep叫
		GPIOF_BSRR |= (0x01<<24);
		delay(1000);
		//Beep不叫
		GPIOF_BSRR |= (0x01<<8);
		delay(1000);
	
	}
	
	
	
	//Led_Init();
	
	
	
	/*while(1)
	{
		//LED0亮
		GPIOF_BSRR |= (0x01<<25);
		//LED1灭
		GPIOF_BSRR |= (0x01<<10);
		//LED2灭
		GPIOE_BSRR |= (0x01<<13);
		//LED3灭
		GPIOE_BSRR |= (0x01<<14);
		delay(1000);
		
		//LED0灭
		GPIOF_BSRR |= (0x01<<9);
		//LED1亮
		GPIOF_BSRR |= (0x01<<26);
			//LED2灭
		GPIOE_BSRR |= (0x01<<13);
		//LED3灭
		GPIOE_BSRR |= (0x01<<14);
		delay(1000);
		
		
		//LED0灭
		GPIOF_BSRR |= (0x01<<9);
		//LED1灭
		GPIOF_BSRR |= (0x01<<10);
		//LED2亮
		GPIOE_BSRR |= (0x01<<29);
		//LED3灭
		GPIOE_BSRR |= (0x01<<14);
		delay(1000);
		
			//LED0灭
		GPIOF_BSRR |= (0x01<<9);
		//LED1灭
		GPIOF_BSRR |= (0x01<<10);
		//LED2灭
		GPIOE_BSRR |= (0x01<<13);
		//LED3亮
		GPIOE_BSRR |= (0x01<<30);
		delay(1000);
		
		//LED0灭
		GPIOF_BSRR |= (0x01<<9);
		//LED1灭
		GPIOF_BSRR |= (0x01<<10);
		//LED2灭
		GPIOE_BSRR |= (0x01<<13);
		//LED3灭
		GPIOE_BSRR |= (0x01<<14);
		delay(1000);
	
	}*/
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hqb_newfarmer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值