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

### 回答1: STM32F407是ST公司推出的一款高性能微控制器,其具有丰富的外设和强大的处理能力,被广泛应用于各种嵌入式系统中。在使用STM32F407时,了解该微控制器的引脚图引脚定义是至关重要的。 该微控制器的引脚图如下图所示(图片来源于STM32F407数据手册): ![STM32F407引脚图](https://i.imgur.com/PJhM77R.jpg) 从引脚图可以看出,STM32F407共有196个引脚,其中144个是输入输出引脚,其余的引脚则用于复位、电源管理、中断、调试等功能。STM32F407引脚分布在两个不同的端口中,即Port A和Port B,每个端口都有16个引脚。其中,引脚0和引脚1用于串口通信(USART),引脚2和引脚3用于I2C总线通信,引脚5至引脚15可用作通用输入输出引脚(GPIO)。此外,STM32F407还有多个定时器、ADC模块、DAC模块、以太网接口、USB OTG接口等强大的外设,这些外设的控制也需要使用相应的引脚。 在使用STM32F407时,需要根据具体的应用场景进行引脚定义。通常情况下,可以通过STM32F407数据手册中的引脚功能表来查找每个引脚的具体功能,然后在程序中进行相应的引脚配置。例如,如果需要使用引脚PA5作为输出引脚,可以通过配置GPIOA的第5位来实现。引脚的具体配置方式可以参考STM32F407的开发文档或者相应的开发工具的使用说明。 ### 回答2: STM32F407是一种高性能的微控制器,它具有240 MHz的主频和其他丰富的特性。 STM32F407引脚图是一个矩阵,如下所示: ![STM32F407引脚图](https://www.rhydolabz.com/wiki/wp-content/uploads/2017/04/stm32f407_pin_diagram.jpg) 这张图中展示了STM32F407微控制器所具有的所有引脚。这些引脚被分为不同的组,如普通输入/输出、专用输入/输出、模拟输入等。这些引脚具有不同的数字以及字母标识,用于区分各种功能。每个引脚都有一个数字,以便进行快速索引,如图中所示。 以下是STM32F407引脚定义: - 电源引脚:连接电源输入和输出,包括正极和负极。 - 标准输入/输出引脚:支持常规的输入/输出功能。 - 专用输入/输出引脚:用于专用的输入/输出,如PWM信号、SPI、I2C等。 - 模拟输入引脚:用于采集模拟信号。 - 系统引脚:用于初始化系统,调试和其他系统操作。 通过读取STM32F407引脚图,并结合各个引脚的含义和实际应用,可以快速掌握STM32F407的工作原理和使用方法,从而更好地应用它的强大功能。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值