- 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工作方式(通过寄存器进行设置)
- 4种输入模式
- 浮空输入(无上下拉电阻)
- 上拉输入(有上拉电阻)
- 下拉输入(有下拉电阻)
- 模拟输入(模拟信号)
- 4种输出模式
- 开漏输出(带上拉或者下拉)
- 开漏复用功能(带上拉或者下拉)
- 推挽式输出(带上拉或者下拉)
- 推挽式复用功能(带上拉或者下拉)
- 4种最大输出速度
- 2MHZ
- 25MHZ
- 50MHZ
- 100MHZ
注意点:
开漏输出只能输出0(低电平),若想出输出1(高电平),需要外部接上拉电阻。
推挽式输出可输出0(低电平)或者1(高电平)
寄存器地址查找
寄存器地址 = 寄存组基地址+偏移地址
寄存器查看
- LED灯开发
- 理解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