野火霸天虎STM32F407笔记(一)—— 初始STM32、寄存器映射、GPIO框图讲解

野火霸天虎STM32F407笔记(一)—— 初始STM32、寄存器映射、GPIO框图讲解

初识STM32

一、什么是STM32

  1. STM32:
    • ST— 意法半导体,是一个公司名,即SOC厂商
    • M— Microelectronics的缩写,表示微控制器,大家注意微控制器(不能跑Linux)和微处理器(可以跑Linux)的区别
    • 32— 32bit的意思,表示这是一个32bit的微控制器
  2. 诞生背景:
    • 技术的更替,这个是最主要的原因
    • 市场的需求(成本、性能、功耗、GUI、操作系统),传统的8/16位的微控制器,久经岁月的洗礼,如今虽有余晖,当面对这些需求时更显的是捉襟见肘
    • ST的努力(产品线丰富、开发简单易上手—基于固件库开发(最本质区别)),让STM32在众多的基于Cortex-M内核的微控制器中脱引而出,成为最璀璨的新星。

二、STM32能做什么

STM32属于一个微控制器,自带了各种常用通信接口,功能非常强大

  1. 串口—USART,用于跟跟串口接口的设备通信,比如:USB转串口模块、ESP8266 WIFI、GPS模块,GSM 模块,串口屏、指纹识别模块
  2. 内部集成电路—I2C,用于跟I2C接口的设备通信,比如:EEPROM、电容屏、陀螺仪MPU6050、0.96寸OLED模块
  3. 串行通信接口—SPI,用于跟SPI接口的设备通信,比如:串行FLASH、以太网W5500、音频模块VS1053
  4. SDIO、FSMC的超级、I2S、SAI、ADC、GPIO

三、STM32怎么选型

  1. STM32分类
    在这里插入图片描述
  2. STM32的命名方法
    在这里插入图片描述
  3. 选择合适的MCU一个原则:花最少的钱,做最多的事,在确定项目需求的情况下,一般按照下面的顺序来选择合适的MCU。
  • 选择哪种内核的芯片,内核越高意味着功耗也越高
  • 选择多少引脚的芯片,引脚多少决定了资源的多少,也影响价格
  • 选择多少RAM和FLASH的芯片,FLASH越大,价格越贵
  • 还要考虑所选型号采购是否容易,供货是否稳定
  1. 分配原理图引脚:
    在这里插入图片描述
  2. 如何寻找引脚的功能说明
    在这里插入图片描述

寄存器映射

一、看STM32

  1. 学会看丝印

  2. 懂得辨别正方向(芯片里面有一个大点,一个小点,小点指示的方向为正方向,对应的引脚为1脚,按照逆时针旋转为引脚顺序,一共有144个引脚。若没有小点,则丝印的左上角为1脚。)
    在这里插入图片描述

  3. 芯片架构图
    在这里插入图片描述

  4. 寄存器映射:给有特定功能的内存单元取一个别名(通过#define),这个别名就是我们经常说的寄存器,这个给已经分配好地址的有特定功能的内存单元取别名的过程就叫寄存器映射。

//通过寄存器别名访问内存单元
//GPIO端口全部输出高电平
#define GPIO_BASE 0x40021400
#define GPIO_ODR *(unsigned int*)(GPIO_BASE + 0x14)
GPIO_ODR = 0xff;
  1. 存储器映射:给存储器分配地址的过程叫存储器映射,再分配一个地址叫重映射。

二、C语言对寄存器的封装

//实现了所有GPIO的寄存器映射(C语言对寄存器的封装)

typedef unsigned int uint32_t;    
typedef unsigned short int uint16_t;

typedef struct
{	
	uint32_t MODER;
	uint32_t OTYPER;
	uint32_t OSPEEDR;
	uint32_t PUPDR;
	uint32_t IDR;
	uint32_t ODR;
	uint32_t BSRR;
	uint32_t LCKR;
	uint16_t AFRL;
	uint16_t AFRH;	
}GPIO_TypeDef;

#define GPIOA_BASE      (0x40020000)
#define GPIOB_BASE      (0x40020400)
#define GPIOC_BASE      (0x40020800)
#define GPIOD_BASE      (0x40020C00)
#define GPIOE_BASE      (0x40021000)
#define GPIOF_BASE      (0x40021400)


#define GPIOA      (GPIO_TypeDef *)GPIOA_BASE
#define GPIOB      (GPIO_TypeDef *)GPIOB_BASE
#define GPIOC      (GPIO_TypeDef *)GPIOC_BASE
#define GPIOD      (GPIO_TypeDef *)GPIOD_BASE
#define GPIOE      (GPIO_TypeDef *)GPIOE_BASE
#define GPIOF      (GPIO_TypeDef *)GPIOF_BASE


GPIOF->ODR = 0XFFFF;    //操作寄存器

新建工程电灯——寄存器版

#define GPIOF_BASE  ((unsigned int)0x40021400)
#define RCC_BASE    ((unsigned int)0x40023800)
	

#define GPIO_MODER  *(unsigned int*)(GPIOF_BASE + 0x00)
#define GPIO_OTYPER *(unsigned int*)(GPIOF_BASE + 0x04)
#define GPIOF_ODR   *(unsigned int*)(GPIOF_BASE + 0x14)

#define RCC_AHBIENR *(unsigned int*)(RCC_BASE + 0x30)
#include "stm32f4xx.h"

//软件延迟函数
void delay(unsigned int count)
{
	for( ; count !=0;count--);
	
}



int main()
{
	//第一步:开GPIO端口时钟
	RCC_AHBIENR |= (1<<5);
	
	//第二步:配置GPIO为输出
	GPIO_MODER &= ~(3<<(2*6));   //清除
	GPIO_MODER |= (1<<(2*6));
	
	//第三步:让GPIO输出0或者1,ODR寄存器或者BSRR寄存器
	GPIOF_ODR |= (1<<6);     //输出1,关灯
	
	
	while(1)
	{
		GPIOF_ODR &= ~(1<<6);   //输出0,开灯
		delay(0x0fffff);          //软件延时函数
		GPIOF_ODR |= (1<<6);     //输出1,关灯
		
		delay(0x0fffff);
		
	}
	
	
}

void SystemInit(void)
{
	
}

GPIO框图讲解

一、GPIO简介

GPIO—general purpose intput output是通用输入输出端口的简称,简单来说就是软件可控制的引脚,STM32芯片的GPIO引脚与外部设备连接起来,从而实现与外部通讯、控制以及数据采集的功能。(控制IO口输出0或者1.读取0外部0或者1)

问题1:GPIO跟引脚有什么区别?

  • 不是所有的引脚都是GPIO,也有其他分类

在这里插入图片描述

问题2:如何查找每一个GPIO的功能?

  • STM32官方英文数据手册查看

在这里插入图片描述

二、框图讲解

在这里插入图片描述

  1. 推挽输出
  • 可以输出高低电平,用于连接数字器件,高电平由VDD决定,低电平由VSS决定。
  • 推挽结构指两个三极管受两路互补的信号控制,总是在一个导通的时候另外一个截止,优点开关效率效率高,电流大,驱动能力强。
  • 输出高电平时,电流输出到负载,叫灌电流,可以理解成推,输出低电平时,负载电流流向芯片,叫拉电流,即挽。

在这里插入图片描述

  1. 开漏输出
  • 只能输出低电平,不能输出高电平。
  • 如果要输出高电平,则需要外接上拉。
  • 开漏输出具有“线与”功能,一个为低,全部为低,多用于I2C和SMBUS总线。

在这里插入图片描述

  1. TTL施密特触发器:低于1.8v为0,高于1.8V为1.
  2. GPIO输出初始化顺序
  • 确定GPIO是输入、通用输出、复用功能还是模拟输入。(模式寄存器:MODER)
  • 如果输出还要确定是推挽输出还是开漏输出 (输出类型寄存器 :OTYPER)
  • 配置输出的速度 (输出速度寄存器:OSPEEDR)
  • 输出的时候内部的上/下拉电阻要不要开启 (上拉/下拉寄存器:PUPDR)
  • 13
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值