寄存器 :寄存器的功能是存储二进制代码,它是由具有存储功能的触发器组合起来构成的。一个触发器可以存储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 |
注意:外部晶振产生的脉冲是精准, RC振荡时钟产生的脉冲是不精准
STM32主要总线时钟频率
SYSCLK | 168MHZ |
---|---|
HCLK | 168MHZ |
AHB1/AHB2 | 168MHZ |
APB1 | 42MHZ |
APB2 | 84MHZ |
Al解释:
在STM32微控制器中,有一些关键的概念需要了解:
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口引脚(I:input O:output)
原理图上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工作方式)
n4种输入模式
q浮空输入(没有上下拉电阻)
q上拉输入(有上拉电阻)
q下拉输入(有下拉电阻)
q模拟输入
n4种输出模式
q开漏输出(带上拉或者下拉)
q开漏复用功能(带上拉或者下拉)
q推挽式输出(带上拉或者下拉)
q推挽是复用功能(带上拉或者下拉)
n4种最大输出速度
q2MHZ
q25MHZ
q50MHZ
q100MHZ
注意点:
开漏输出只能输出0(低电平),若想出输出1(高电平),需要外部接上拉电阻(类似到51单片机P0组)。
推挽式输出可输出0(低电平)或者1(高电平),这是常用模式
寄存器地址 = 寄存组基地址+偏移地址
寄存器查看
1、理解led灯原理图
LED0连接在PF9
PF9输出低电平(0),灯亮;PF9输出高电平(1),灯灭;
2、打开GPIOF组时钟
//将第5位置1 使能GPIOF组时钟
RCC_AHB1ENR |= (0x01< < 5);
3、设置PF9灯为输出模式 输出推挽 上拉 速度(50MHZ)
4、通过GPIOF_BSRR控制LED灯亮与灭
LED举例-1
一、led.h
#ifndef __LED_H
#define __LED_H
#include "stm32f4xx.h"
#define RCC_AHB1ENR (*((unsigned int *)(0x40023800+0x30))) //值强制类型转为地址,通过地址解引用,访问地址空间的值
#define GPIOF_MODER (*((unsigned int *)(0x40021400+0x00))) //值强制类型转为地址,通过地址解引用,访问地址空间的值
#define GPIOF_OTYPER (*((unsigned int *)(0x40021400+0x04))) //值强制类型转为地址,通过地址解引用,访问地址空间的值
#define GPIOF_OSPEEDR (*((unsigned int *)(0x40021400+0x08))) //值强制类型转为地址,通过地址解引用,访问地址空间的值
#define GPIOF_PUPDR (*((unsigned int *)(0x40021400+0x0C))) //值强制类型转为地址,通过地址解引用,访问地址空间的值
#define GPIOF_ODR (*((unsigned int *)(0x40021400+0x14))) //值强制类型转为地址,通过地址解引用,访问地址空间的值
#define GPIOF_BSRR (*((unsigned int *)(0x40021400+0x18))) //值强制类型转为地址,通过地址解引用,访问地址空间的值
void Led_Init(void);
#endif
二、led.c
#include "led.h"
/*********************************
引脚说明:
LED0 -- PF9
**********************************/
void Led_Init(void)
{
//将第5位置1 使能GPIOF组时钟
RCC_AHB1ENR |= (0x01< < 5);
//设置GPIOF9为输出模式
GPIOF_MODER &= ~(0x01< < 19); //19位清0
GPIOF_MODER |= (0x01< < 18); //18位置1
//设置GPIOF9为输出推挽
GPIOF_OTYPER &= ~(0x01< < 9); //9位清0
//设置GPIOF9为上拉
GPIOF_PUPDR &= ~(0x01< < 19); //19位清0
GPIOF_PUPDR |= (0x01< < 18); //18位置1
//设置GPIOF9输出速度50MHZ
GPIOF_OSPEEDR |= (0x01< < 19); //19位置1
GPIOF_OSPEEDR &= ~(0x01< < 18); //18位清0
}
三、main.c
#include "stm32f4xx.h"
#include "led.h"
// 延时函数
void delay(int n)
{
int i,j;
for(i=0; i< n; i++)
for(j=0; j< 30000; j++);
}
int main(void)
{
Led_Init();
while(1)
{
//BSRR 25位置1 ODR输出0 灯亮
GPIOF_BSRR |= (0x01< < 25);
delay(1000);
//BSRR 9位置1 ODR输出1 灯灭
GPIOF_BSRR |= (0x01< < 9);
delay(1000);
}
return 0;
}
四、作业拓展
上拉电阻和下拉电阻二者共同的作用是:避免电压的“悬浮”,造成电路的不稳定。
1、概念:将一个不确定的信号,通过一个电阻与电源VCC相连,固定在高电平;通过一个电阻与电源GND相连,固定在低电平
2、上拉是对器件注入电流,灌电流;下拉是对引脚进行分流,拉电流;
3、当一个接有上拉电阻的IO端口设置为输入状态时,它的常态为高电平。
LED流水灯举例-2
一、led.h
#ifndef __LED_H
#define __LED_H
#include "stm32f4xx.h"
#define RCC_AHB1ENR (*((unsigned int *)(0x40023800+0x30))) //值强制类型转为地址,通过地址解引用,访问地址空间的值
#define GPIOF_MODER (*((unsigned int *)(0x40021400+0x00))) //值强制类型转为地址,通过地址解引用,访问地址空间的值
#define GPIOF_OTYPER (*((unsigned int *)(0x40021400+0x04))) //值强制类型转为地址,通过地址解引用,访问地址空间的值
#define GPIOF_OSPEEDR (*((unsigned int *)(0x40021400+0x08))) //值强制类型转为地址,通过地址解引用,访问地址空间的值
#define GPIOF_PUPDR (*((unsigned int *)(0x40021400+0x0C))) //值强制类型转为地址,通过地址解引用,访问地址空间的值
#define GPIOF_ODR (*((unsigned int *)(0x40021400+0x14))) //值强制类型转为地址,通过地址解引用,访问地址空间的值
#define GPIOF_BSRR (*((unsigned int *)(0x40021400+0x18))) //值强制类型转为地址,通过地址解引用,访问地址空间的值
#define GPIOE_MODER (*((unsigned int *)(0x40021000+0x00))) //值强制类型转为地址,通过地址解引用,访问地址空间的值
#define GPIOE_OTYPER (*((unsigned int *)(0x40021000+0x04))) //值强制类型转为地址,通过地址解引用,访问地址空间的值
#define GPIOE_OSPEEDR (*((unsigned int *)(0x40021000+0x08))) //值强制类型转为地址,通过地址解引用,访问地址空间的值
#define GPIOE_PUPDR (*((unsigned int *)(0x40021000+0x0C))) //值强制类型转为地址,通过地址解引用,访问地址空间的值
#define GPIOE_ODR (*((unsigned int *)(0x40021000+0x14))) //值强制类型转为地址,通过地址解引用,访问地址空间的值
#define GPIOE_BSRR (*((unsigned int *)(0x40021000+0x18))) //值强制类型转为地址,通过地址解引用,访问地址空间的值
void Led_Init(void);
void Led0(void);
void Led1(void);
void Led2(void);
void Led3(void);
void Beep(void);
#endif
二、led.c
#include "led.h"
void Led_Init(void)
{
//将第5位置1 使能GPIOF组时钟
RCC_AHB1ENR |= (0x01< < 5);
//将第4位置1 使能GPIOE组时钟
RCC_AHB1ENR |= (0x01< < 4);
Led0();
Led1();
Led2();
Led3();
}
/*********************************
引脚说明:
LED0 -- PF9
**********************************/
void Led0()
{
//设置GPIOF9为输出模式
GPIOF_MODER &= ~(0x01< < 19); //19位清0
GPIOF_MODER |= (0x01< < 18); //18位置1
//设置GPIOF9为输出推挽
GPIOF_OTYPER &= ~(0x01< < 9); //9位清0
//设置GPIOF9为上拉
GPIOF_PUPDR &= ~(0x01< < 19); //19位清0
GPIOF_PUPDR |= (0x01< < 18); //18位置1
//设置GPIOF9输出速度50MHZ
GPIOF_OSPEEDR |= (0x01< < 19); //19位置1
GPIOF_OSPEEDR &= ~(0x01< < 18); //18位清0
}
/*********************************
引脚说明:
LED1 -- PF10
**********************************/
void Led1()
{
//设置GPIOF10为输出模式
GPIOF_MODER &= ~(0x01< < 21); //21位清0
GPIOF_MODER |= (0x01< < 20); //20位置1
//设置GPIOF9为输出推挽
GPIOF_OTYPER &= ~(0x01< < 10); //10位清0
//设置GPIOF9为上拉
GPIOF_PUPDR &= ~(0x01< < 21); //21位清0
GPIOF_PUPDR |= (0x01< < 20); //20位置1
//设置GPIOF9输出速度50MHZ
GPIOF_OSPEEDR |= (0x01< < 21); //21位置1
GPIOF_OSPEEDR &= ~(0x01< < 20); //20位清0
}
/*********************************
引脚说明:
LED2 -- PE13
**********************************/
void Led2()
{
//将第4位置1 使能GPIOE组时钟
RCC_AHB1ENR |= (0x01< < 4);
//设置GPIOF13为输出模式
GPIOE_MODER &= ~(0x01< < 27); //27位清0
GPIOE_MODER |= (0x01< < 26); //26位置1
//设置GPIOE输出速度为50MHZ
GPIOE_OSPEEDR |= (0x01< < 26); //26位置1
GPIOE_OSPEEDR &= ~(0x01< < 27); //27为清0
//设置GPIOE为上拉
GPIOE_PUPDR &= ~(0x01< < 27); //27位清0
GPIOE_PUPDR |= (0x01< < 26); //26位置1
//设置GPIOE为输出推挽
GPIOE_OTYPER &= ~(0x01< < 13); //13位清0
}
/*********************************
引脚说明:
LED3 -- PE14
**********************************/
void Led3()
{
//设置GPIOE14为输出模式
GPIOE_MODER &= ~(0x01< < 29); //29位清0
GPIOE_MODER |= (0x01< < 28); //28位置1
//设置GPIOE输出速度为50MHZ
GPIOE_OSPEEDR |= (0x01< < 28); //28位置1
GPIOE_OSPEEDR &= ~(0x01< < 29); //29为清0
//设置GPIOE为上拉
GPIOE_PUPDR &= ~(0x01< < 29); //29位清0
GPIOE_PUPDR |= (0x01< < 28); //28位置1
//设置GPIOE为输出推挽
GPIOE_OTYPER &= ~(0x01< < 14); //14位清0
}
三、main.c
#include "stm32f4xx.h"
#include "led.h"
void delay(int n)
{
int i,j;
for(i=0; i< n; i++)
for(j=0; j< 30000; j++);
}
int main(void)
{
Led_Init();
while(1)
{
//BSRR 25位置1 ODR输出0 Led0灯亮
GPIOF_BSRR |= (0x01< < 25);
delay(1000);
//BSRR 9位置1 ODR输出1 灯灭
GPIOF_BSRR |= (0x01< < 9);
//delay(1000);
//BSRR 26位置1 ODR输出0 Led1灯亮
GPIOF_BSRR |= (0x01< < 26);
delay(1000);
//BSRR 10位置1 ODR输出1 灯灭
GPIOF_BSRR |= (0x01< < 10);
//delay(1000);
//BSRR 29位置1 ODR输出0 Led2灯亮
GPIOE_BSRR |= (0x01< < 29);
delay(1000);
//BSRR 13位置1 ODR输出1 灯灭
GPIOE_BSRR |= (0x01< < 13);
//delay(1000);
//BSRR 30位置1 ODR输出0 Led3灯亮
GPIOE_BSRR |= (0x01< < 30);
delay(1000);
//BSRR 14位置1 ODR输出1 灯灭
GPIOE_BSRR |= (0x01< < 14);
//delay(1000);
//BSRR 24位置1 ODR输出0 蜂鸣器响
GPIOE_BSRR |= (0x01< < 30);
delay(1000);
//BSRR 8位置1 ODR输出1 蜂鸣器关
GPIOE_BSRR |= (0x01< < 14);
//BSRR 24位置1 ODR输出0 蜂鸣器响
GPIOF_BSRR |= (0x01< < 8);
delay(100);
}
return 0;
}
LED流水灯和蜂鸣器举例-3
一、beep.h
#ifndef __BEEP_H
#define __BEEP_H
#include "stm32f4xx.h"
#include "led.h"
void Beep_Init(void);
#endif
二、beep.c
#include "beep.h"
/*********************************
引脚说明:
Beep -- PF8
**********************************/
void Beep_Init(void)
{
//将第5位置1 使能GPIOF组时钟
RCC_AHB1ENR |= (0x01< < 5);
//设置GPIOF8为输出模式
GPIOF_MODER &= ~(0x03< < 16); //16、17位清0
GPIOF_MODER |= (0x01< < 16); //16位置1
//设置GPIOF8为输出推挽
GPIOF_OTYPER &= ~(0x01< < 8); //8位清0
//设置GPIOF8为下拉
GPIOF_PUPDR &= ~(0x03< < 16) ;
//设置GPIOF8输出速度100MHZ
GPIOF_OSPEEDR |= (0x01< < 17); //17位置1
GPIOF_OSPEEDR |= (0x01< < 16); //16位置1
}
三、main.c
#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< 30000; j++);
}
int main(void)
{
Beep_Init();
while(1)
{
//BSRR 24位置1 ODR输出0 蜂鸣器响
GPIOF_BSRR |= (0x01< < 8);
delay(100);
//BSRR 8位置1 ODR输出1 蜂鸣器关
GPIOF_BSRR |= (0x01< < 24);
delay(1000);
}
return 0;
}
全部0条评论
快来发表一下你的评论吧 !