STM32第二天

  • 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(PCLK1)

APB2 84MHZ(PCLK2)

  • 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口引脚

STM32芯片型号解析

原理上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工作方式通过寄存器进行设置

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

注意点:

开漏输出只能输出0(低电平),若想出输出1(高电平),需要外部接上拉电阻。

推挽式输出可输出0(低电平)或者1(高电平)

寄存器地址查找

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

寄存器查看

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

LED0连接在PF9

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

2.打开GPIOF组时钟

在STM32芯片中,所有的外设时钟是不打开,为了降低功耗

RCC_AHB1ENR |=(0x01<<5);

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

//PF9为输出模式 [19:18] = 0:1

GPIOF_MODER &= ~(0x01<<19);

GPIOF_MODER |=  (0x01<<18);

//PF9为推挽输出 [9] = 0

GPIOF_OTYPER &= ~(0x01<<9);

//PF9为输出速度(50MHZ) [19:18] = 1:0

GPIOF_OSPEEDR |=  (0x01<<19);

GPIOF_OSPEEDR &= ~(0x01<<18);

//PF9为上拉 [19:18] =0:1

GPIOF_PUPDR &= ~(0x01<<19);

GPIOF_PUPDR |=  (0x01<<18);

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

        //BSRR第25置1,ODR输出0, 灯亮
        GPIOF_BSRR |= (0x01<<25);

        //BSRR第9置1,ODR输出1, 灯灭
        GPIOF_BSRR |= (0x01<<9);    

led走马灯的实现 

main.c

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

void delay(int t)
{
	int i,j;
	for(j=0;j<t;j++)
		for(i=0;i<40000;i++);
}

int main(void)
{
	int i;
	
	LED_Init();
	//流水灯
	while(1)
	{
		GPIOF_BSRR  |= (0x01 <<25); //LED0亮
		for(i = 0;i<5000000;i++);
		
		GPIOF_BSRR  |= (0x01 <<9);	//LED0灭
		for(i = 0;i<5000000;i++);
		
		GPIOF_BSRR  |= (0x01 <<26); //LED1亮
		for(i = 0;i<5000000;i++);
		
		GPIOF_BSRR  |= (0x01 <<10);	//LED1灭
		for(i = 0;i<5000000;i++);		
		
		GPIOE_BSRR  |= (0x01 <<29);	//LED2亮
		for(i = 0;i<5000000;i++);
		
		GPIOE_BSRR  |= (0x01 <<13);//LED2灭
		for(i = 0;i<5000000;i++);
		
		GPIOE_BSRR  |= (0x01 <<30);	//LED1亮
		for(i = 0;i<5000000;i++);
		
		GPIOE_BSRR  |= (0x01 <<14);//LED3灭
		for(i = 0;i<5000000;i++);	
	
	}
//	BEEP_Init();
//	while(1)
//	{
//		GPIOF_BSRR|=1<<24;
//		delay(100);
//		GPIOF_BSRR|=1<<8;
//		delay(100);
//	
//	}	

	return 0;
}

led.c

#include "led.h"

/************************************
引脚说明:LED0 PF9
		  LED1 PF10
		  LED2 PE13
		  LED3 PE14
*************************************/
void LED_Init(void)
{
	//打开GPIOE组时钟
	RCC_AHB1ENR |= (0x01 << 4);
	//打开GPIOF组时钟
	RCC_AHB1ENR |= (0x01 << 5);
	
	
	//PF9为输出模式[19:18]=0:1  
	GPIOF_MODER &= ~(1 << 19);
	GPIOF_MODER |= 1 << 18;
	
	//PF10为输出模式[21:20]=0:1
	GPIOF_MODER &= ~(1 << 21);
	GPIOF_MODER |= 1 << 20;
	
	
	//PE13为输出模式[27:26]=0:1  
	GPIOE_MODER &= ~(1 << 27);
	GPIOE_MODER |= 1 << 26;
	
	
	//PE14为输出模式[29:28]=0:1
	GPIOE_MODER &= ~(1 << 29);
	GPIOE_MODER |= 1 << 28;
	

	
	//推挽输出 [9]=0  推挽输出 [10]=0
	GPIOF_OTYPER &= ~(1 << 9);
	GPIOF_OTYPER &= ~(1 << 10);
	
	//推挽输出 [13]=0  推挽输出 [14]=0
	GPIOE_OTYPER &= ~(1 << 13);
	GPIOE_OTYPER &= ~(1 << 14);

	
	//输出速度50MHz[19:18]=1:0  输出速度50MHz[21:20]=1:0
	GPIOF_OSPEEDER |= 1 << 19;
	GPIOF_OSPEEDER &= ~(1 << 18);
	
	GPIOF_OSPEEDER |= 1 << 21;
	GPIOF_OSPEEDER &= ~(1 << 20);
	
	//输出速度50MHz[27:26]=1:0  输出速度50MHz[29:28]=1:0
	GPIOE_OSPEEDER |= 1 << 27;
	GPIOE_OSPEEDER &= ~(1 << 26);
	
	GPIOE_OSPEEDER |= 1 << 29;
	GPIOE_OSPEEDER &= ~(1 << 28);
	
	//上拉[19:18]=0:1  上拉[21:20]=0:1
	GPIOF_PUPDR &= ~(1 << 19);
	GPIOF_PUPDR |= 1 << 18;
	
	GPIOF_PUPDR &= ~(1 << 21);
	GPIOF_PUPDR |= 1 << 20;
	
	//上拉[27:26]=0:1  上拉[29:28]=0:1
	GPIOE_PUPDR &= ~(1 << 27);
	GPIOE_PUPDR |= 1 << 26;
	
	GPIOE_PUPDR &= ~(1 << 29);
	GPIOE_PUPDR |= 1 << 28;
	

	
	
}

led.h

#ifndef __LED_H_
#define __LED_H_

#include "stm32f4xx.h"

#define RCC_AHB1ENR  *((volatile unsigned int *)(0x40023800 + 0x30))

#define GPIOF_MODER  	*((volatile unsigned int *)(0x40021400))
#define GPIOF_OTYPER  	*((volatile unsigned int *)(0x40021404))
#define GPIOF_OSPEEDER  *((volatile unsigned int *)(0x40021408))
#define GPIOF_PUPDR  	*((volatile unsigned int *)(0x4002140C))
#define GPIOF_BSRR  	*((volatile unsigned int *)(0x40021418))
	
#define GPIOE_MODER  	*((volatile unsigned int *)(0x40021000))
#define GPIOE_OTYPER  	*((volatile unsigned int *)(0x40021004))
#define GPIOE_OSPEEDER  *((volatile unsigned int *)(0x40021008))
#define GPIOE_PUPDR  	*((volatile unsigned int *)(0x4002100C))
#define GPIOE_BSRR  	*((volatile unsigned int *)(0x40021018))


void LED_Init(void);

#endif

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值