STM32F407ZG_入门

目录

1.首选学习/讨论资源:

2.打牢基础

3.命名规则:STM32F407ZGT6

4.程序下载

5.创建项目:

6.Keil环境的美化:

7.extern外部声明:

8.typedef类型别名:

9.STM32_GPIO工作原理:

9.1 端口复用功能:

9.2 端口重映射功能:

9.3 STM32所用的I/O口都可以作为外部中断;

9.4 GPIO:

9.4.1 GPIO是什么?

9.4.2 GPIO简介:

9.4.3 GPIO主要特性:

9.4.4 GPIO主要功能:

9.4.5 IO引脚复用器和映射:

9.4.6 GPIO端口模式寄存器(GPIOx_MODER)

9.4.7 GPIO端口输出类型寄存器 (GPIOx_OTYPER)

9.4.8 GPIO输出速度寄存器 (GPIOx_OSPEEDR)

9.4.9 GPIO端口上拉下拉寄存器 (GPIOx_PUPDR)

9.4.10 GPIO_16个IO端口


1.首选学习/讨论资源:

        开源电子网STM32-F3/F4/F7/H7专区-OpenEdv-开源电子网;

2.打牢基础

         MCU最基本的外设主要包括:GPIO输入输出;外部中断;定时器;串口;学习完最基本的外设需要在此基础上学习更加高级的外设接口:SPI、IIC、WDG、AD/DA、UCOS、FATFS等等;根据我们多年的学习经验,想要学习一个新事物,必须打牢基础,认真分析基础知识。

3.命名规则:STM32F407ZGT6

        STM32:基于ARM( ARM 即Advanced RISC Machines的缩写,既可以认为是一个公司的名字,也可以认为是对一类微处理器的通称,还可以认为是一种技术的名字。)的32位微处理器;

        F:通用类型;

        407:产品子系列;ag:101/102/103/104;

        Z:引脚数目;z=144脚;

        G:1024k字节的闪存存储器;

        T:封装类型;

        6:可适应温度;

4.程序下载

        STM32程序下载有两个方式:FLYMCU或者JLINK(在此选择ST-LINK,和JLINK不尽相同)下载;

        一、FLYMCU下载不同于51单片机的是:存在串口1、串口2、串口3;分别为TX/RX;但需要注意,通过串口下载只能通过串口1,即PA9,PA10引脚;下载工具配置:1.搜索串口,选在CH340串口;2.选择波特率,F1板子不同于F4板子,F4板子波特率设置76800,不宜过高;STMISP勾选效验和编程后执行;3.不要勾选选择字节区;4. 选择:DTR低电平复位,RTS高电平进bootLoader;

        二、ST-LINK下载;ST-LINK下载需要配置Keil;首先,Debug需要勾选---Run to main;选择ST-Link Debugger,Setting,在Port优先选择SW(占内存小),Max选择4MHz(1-5MHz均可),Flash Down Load勾选Reset and Run;Add处---板子相应配置(在此特别注意不同板子的配置不同,根据自己的板子去配置);Utilities处勾选Use Debug Driver;STM32F407ZGT6选择STM32F4xx Flash;在此推荐使用ST-LINK下载,ST-LINK不仅仅可以用来下载程序,很重要的功能是可以用来调试程序;

        在调试ST-LINK的过程中,遇到了很多困难,在此分享给大家,希望对初学者有一定的帮助;

        Firstly,如果初学者考虑选择ST-LINK下载程序,电脑一定要下载ST-LINK驱动,如安装成功,电脑的硬件处会显示STM32 STLINK(不同系统可能显示的不同,WIN10显示如前所示);下载首先安装dpinst_amd64.exe,如果安装没有报错,安装驱动成功;如果不巧,安装报错,不要气馁,作为报错的其中一员,提供解决方案如下,安装失败在ST-LINK旁会附带黄色感叹号,直接点击设备名称,在弹出的界面点击更新设备驱动,选择本地驱动文件的地址进行更新即可;

        Secondly,在配置Keil时,出现“ST-LINK USB communication error”报错的解决方案;经查找,该报错的原因是Keil版本和ST-LINK版本不兼容所造成的,需要更新ST-LINK固件库,满足Keil高版本的要求;更新固件库流程如下:打开ST-LINK固件升级包,Window电脑选择Window文件 ,点击ST-LinkUpgrade.exe,Device -connect,如果连接失败,尝试重新接入ST-Link即可,点击YES,完成升级;

5.创建项目:

        创建一个项目的过程严格按照STM32中文手册创建即可;在此需要强调的一点是:在导入项目   .C   文件时,注意:stm32f4xx_fmc.c(STM32F42和STM32F43系列才会用到)一定要删掉;经本人测试,如果不删掉该文件,最简单的LED实验会报错30处,所以切记该文件一定要删掉;另外需要注意的是:在创建项目时,基于Keil的所有设置都需要建立在英文下,中文的设计一律无效;包括标点符号都需要在英文状态下输出;

        创建一个工程的实质:学习如何创建工程,并不仅仅局限于STM32开发板的学习,更多的是要学会拿到一个新的开发板,如何去创建一个工程,创建一个工程最基本的需要一个main函数;同时很重要的需要一个startup_stm32f40_41xxx.s的起始文件;保证无论运行哪一个程序,我都要先去运行这个起始文件;其他的  .c  文件都是基于本次所要实现功能而设置的;包括延迟函数等等;

6.Keil环境的美化:

        Edit->Configuration 进行设置即可;

7.extern外部声明:

        extern unsigned int USART_RX_STA;外部声明的意思是说我们在main.c文件中使用USART_RX_STA;使用外部声明不需要再次定义,extern的存在就是要告诉程序,USART_RX_STA已经在其他文件中定义过了,让程序自行去寻找;在此我不再定义而直接使用;

8.typedef类型别名:

        在结构体中:

struct_GPIO
{
	_IO uint32_t MODER;
	_IO_uint32_t OTYPER;
}

        定义结构体GPIO:   struct _GPIO   GPIOA;   可以更简洁的通过Typedef定义;

typedef struct
{
	_IO uint32_t MODER;
	_IO_uint32_t OTYPER;
}GPIO_Typedef;

        在此:  GPIO_Typedef   和   struct_GPIO    功能是相同的;

9.STM32_GPIO工作原理:

9.1 端口复用功能:

        STM32的绝大多数端口都具有端口复用功能,所谓复用,就是端口不仅仅只做I/O接口,还可以作为一些外设的引脚,比如STM32_A9_A10引脚,既作为I/O引脚,又作为串口输入输出引脚;51单片机,P2^4/P2^5引脚既作为控制LED等引脚,又作为外部中断引脚;其作用:最大限度利用端口资源;

9.2 端口重映射功能:

        把某些功能引脚映射到其他引脚;简单来说就是比如STM32_A9_A10串口输入输出引脚,同时可以映射到其他引脚,也就是其他引脚在端口复用功能下,不仅仅做I/O接口,还具备串口输入输出;其作用:方便PCB布线;

9.3 STM32所用的I/O口都可以作为外部中断

        而51单片机只有两个I/O口可以作为外部中断;再次体现STM32功能的强大;

9.4 GPIO:

9.4.1 GPIO是什么?

        GPIO,英文全称General-Purpose IO ports,也可以称为通用IO口。在嵌入式的系统中,通常存在着数量众多的GPIO接口,对于结构比较简单的外部设备,有的需要CPU为之提供控制手段,有的则需要CPU为之提供输入信号。在对这些设备进行控制时,使用传统的串行口和并行口都不合适,所以在微控制芯片上一般都会提供“通用可编程IO接口”,即GPIO;

        GPIO至少含有两个寄存器,即通用IO控制寄存器、通用IO数据寄存器。数据寄存器直接接到芯片的外部,控制寄存器对每一位寄存器的作用,即信号流通的方向加以设置。这样,有无GPIO接口成为微控制器区别于微处理器的一个重要特征。

9.4.2 GPIO简介:

        STM32F4xx系列每个通用的I/O端口包括4个32位配置(控制)寄存器(GPIOx_MODER、GPIOx_OTYPER、GPIOx_OSPOSPEEDR、GPIOx_PUPDR)2个32位数据寄存器(GPIOx_IDR、GPIOx_ODR)1个32位置位/复位寄存器(GPIOx_BSRR)1个32位锁定寄存器(GPIOx_LCKR)2个32位复位功能选择寄存器(GPIOx_AFRH、GPIOx_AFRL);共10个寄存器;

        4个32位的控制寄存器GPIOx_MODER主要用于选择IO方向(上拉、下拉、浮空、模拟),GPIOx_OTYPER主要用于选择输出类型(开漏、推挽),GPIOx_OSPOSPEEDR主要用于选择相应的速度(无论采用哪种IO方向,都直接将IO速度接到GPIOx_OSPOSPEEDR寄存器位),GPIOx_PUPDR主要用于选择上拉还是下拉。

        2个32位数据寄存器中GPIOx_ODR用于存储待输出的数据,可对其进行读/写访问,通过IO口将输出的数据存储到GPIOx_IDR中,它是一个只读寄存器。GPIOx_IDR输入数据寄存器是一个只读寄存器;GPIOx_ODR输出数据寄存器这些位可通过软件读取和写入;

        1个32位置位/复位寄存器GPIOx_BSRR它允许应用程序在输出数据寄存器GPIOx_ODR中对各个单独的数据执行置位和复位操作;1个32位置位/复位寄存器GPIOx_BSRR是输出寄存器GPIOx_ODR的两倍;即GPIOx_ODR对应GPIOx_BSRR中两个控制位:BSRR(i) 和 BSRR(i+SIZE)。当写入 1 时,BSRR(i) 位会置位对应的 ODR(i) 位。当写入 1 时,BSRR(i+SIZE) 位会清零 ODR(i) 对应的位。在 GPIOx_BSRR 中向任何位写入 0 都不会对 GPIOx_ODR 中的对应位产生任何影响。如果 在 GPIOx_BSRR 中同时尝试对某个位执行置位和清零操作,则置位操作优先。

        1个32位锁定寄存器(GPIOx_LCKR):当特定的写程序应用到GPIOx_LCKR时,可以冻结GPIO控制寄存器。冻结的寄存器包括4个32位控制寄存器(GPIOx_MODER、GPIOx_OTYPER、GPIOx_OSPEEDR、GPIOx_PUPDR)和2个32位数据寄存器(GPIOx_AFRL 和 GPIOx_AFRH)。要对 GPIOx_LCKR 寄存器执行写操作,必须应用特定的写/读序列。当正确的 LOCK 序列应用到此寄存器的第 16 位后,会使用 LCKR[15:0] 的值来锁定 I/O 的配置(在写序列期间,LCKR[15:0] 的值必须相同)。将 LOCK 序列应用到某个端口位后,在执行下一次复位之前,将无法对该端口位的值进行修改。每个 GPIOx_LCKR 位都会冻结控制寄存器(GPIOx_MODER、GPIOx_OTYPER、GPIOx_OSPEEDR、GPIOx_PUPDR、GPIOx_AFRL 和 GPIOx_AFRH)中的对应位。

        2个32位复位功能选择寄存器(GPIOx_AFRH、GPIOx_AFRL)意味着可使用 GPIOx_AFRL 和 GPIOx_AFRH 复用功能寄存器在每个 GPIO 上复用多个可 用的外设功能。

9.4.3 GPIO主要特性:

●受控 I/O 多达 16 个

●输出状态:推挽或开漏 + 上拉/下拉

●从输出数据寄存器 (GPIOx_ODR) 或外设(复用功能输出)输出数据

●可为每个 I/O 选择不同的速度

●输入状态:浮空、上拉/下拉、模拟

●将数据输入到输入数据寄存器 (GPIOx_IDR) 或外设(复用功能输入)

●置位和复位寄存器 (GPIOx_BSRR),对 GPIOx_ODR 具有按位写权限

●锁定机制 (GPIOx_LCKR),可冻结 I/O 配置

●模拟功能

●复用功能输入/输出选择寄存器(一个 I/O 最多可具有 16 个复用功能)

●快速翻转,每次翻转最快只需要两个时钟周期

●引脚复用非常灵活,允许将 I/O 引脚用作 GPIO 或多种外设功能中的一种

9.4.4 GPIO主要功能:

        四个输入:输入浮空、输入上拉、输入下拉、模拟功能;

输入浮空:顾名思义,就是浮在空中,既不上去也不下来,也就是没有上拉电阻把你拉上去,也没有下拉电阻把你拉下来,最大的特点就是电压的不确定性,可能是0V,也可能是VCC;

        对 I/O 端口进行编程作为输入时:

        ●输出缓冲器被关闭

        ●施密特触发器输入被打开

        ●根据 GPIOx_PUPDR 寄存器中的值决定是否打开上拉和下拉电阻

        ●输入数据寄存器每隔 1 个 AHB1 时钟周期对 I/O 引脚上的数据进行一次采样

        ●对输入数据寄存器的读访问可获取 I/O 状态

        四个输出:具有上拉和下拉功能的开漏输出(推挽输出、复用功能推挽、复用功能开漏);

开漏输出:GPIO_Mode_OUT_OD(开漏输出);GPIO_Mode_AF_OD(复用开漏输出);开漏模式下,GPIO输出0对应IO口接GND,GPIO输出1对应IO口处于高阻态状态(浮空状态),需要接上拉电阻才能输出高电平;

推挽输出:GPIO_Mode_OUT_PP(推挽输出);GPIO_Mode_AF_PP(复用推挽输出);推挽模式下,GPIO输出0对应IO接GND,输出1对应IO口接VCC;

        对 I/O 端口进行编程作为输出时:

        ●输出缓冲器被打开:

                —、开漏模式:输出寄存器中的“0”可激活 N-MOS,而输出寄存器中的“1”会使端 口保持高组态 (Hi-Z)(P-MOS 始终不激活)。

                二、推挽模式:输出寄存器中的“0”可激活 N-MOS,而输出寄存器中的“1”可激活 P-MOS。

        ●施密特触发器输入被打开

        ●根据 GPIOx_PUPDR 寄存器中的值决定是否打开弱上拉电阻和下拉电阻

        ●输入数据寄存器每隔 1 个 AHB1 时钟周期对 I/O 引脚上的数据进行一次采样

        ●对输入数据寄存器的读访问可获取 I/O 状态        

        ●对输出数据寄存器的读访问可获取最后的写入值

推挽输出和开漏输出的区别:就电流大小而言,开漏输出输出的是弱电流(基本上可以说是没电流),只是给外部一个电平信号,根本没有驱动能力;而推挽输出输出的是强电流,是具有驱动能力的。举个简单例子:STM32控制LED时,如果是开漏输出电流的话,LED灯是根本不会亮的。总的来说,开漏输出能实现的,推挽输出都能实现,开漏输出通常用于信号的处理;例如:IIC、SPI等。

每个IO端口均可自由进行编程,但IO端口寄存器必须按照32位字、半字或字节进行访问。

STM32F407ZG_入门_第1张图片

         根据上图,当我进行GPIO输入时,会从右侧IO引脚进入,浮空输入会平滑的向左,既不经过上拉电阻,也不经过下拉电阻,通过TTL施密特触发器,输出到数据寄存器进行读取;上拉输入和下拉输入分别经过上拉电阻和下拉电阻进行输入;模拟输入就是通过上方模拟箭头进行输入;输出主要从左侧进行,首先通过置位/复位寄存器,来到输出数据寄存器,当输出0时,N-MOS管启动,IO引脚输出0;当输出1时,P-MOS管启动,IO引脚输出1;

9.4.5 IO引脚复用器和映射:

        当微控制器IO引脚通过一个复用器连接到板载外设/模块,该复用器一次仅允许一个外设的复用功能(AF)连接到IO引脚,这样可以确保共用一个IO引脚的外设之间不会发生冲突;简单来说就是STM32微控制器的IO引脚不仅仅作为GPIO接口,也作为一些外设的接口,例如中断、定时器、蜂鸣器、电机、按键等等,当复位功能启动时,每次只允许一个外设的引脚连接,就是同一个引脚,假如我既接着按键,又接着蜂鸣器,想要使用按键功能时,蜂鸣器的接口就会关闭,避免不同外设之间发生冲突;

        每一个IO引脚都有一个复用器,复用器采用16路服用功能输出(AF0-AF15),可通过复用功能控制寄存器对这些输入进行配置;GPIOx_AFRL针对引脚0-7;GPIOx_AFRH针对引脚8-15;

STM32F407ZG_入门_第2张图片

 2个32位的GPIO复位控制寄存器会为AF0-AF15选择专用的复用功能;

9.4.6 GPIO端口模式寄存器(GPIOx_MODER)

        GPIO端口模式寄存器(GPIOx_MODER)选择端口模式(上拉、下拉、浮空、模拟);

        位2y:2y+1  MODERy[1:0]:这些位通过软件写入,用于配置IO方向模式;

        00:输入(复位状态);

        01:通用输出模式;

        10:复用功能模式;

        11:模拟模式;   

9.4.7 GPIO端口输出类型寄存器 (GPIOx_OTYPER)

        GPIO端口输出类型寄存器(GPIOx_OTYPER)选择输出类型(推挽、开漏);

        这些位通过软件写入,用于配置 I/O 端口的输出类型。

        0:输出推挽(复位状态)

         1:输出开漏

9.4.8 GPIO输出速度寄存器 (GPIOx_OSPEEDR)

        这些位通过软件写入,用于配置 I/O 输出速度。

        00:2 MHz(低速)

        01:25 MHz(中速)

        10:50 MHz(快速)         

        11:30 pF 时为 100 MHz(高速)(15 pF 时为 80 MHz 输出(最大速度))

9.4.9 GPIO端口上拉下拉寄存器 (GPIOx_PUPDR)

        这些位通过软件写入,用于配置 I/O 上拉或下拉。

        00:无上拉或下拉

        01:上拉

        10:下拉

        11:保留

9.4.10 GPIO_16个IO端口

        通过原理图可以看到STM32_MCU微控制器含有7组IO接口(PA0-PA15、PB0-PB15、PC0-PC15、PD0-PD15PE0-PE15、PF0-PF15、PG0-PG15)每组IO口含有下面10个寄存器。一共可以控制一组GPIO的16个IO口;

        GPIOx_MODER:端口模式寄存器

        GPIOx_OTYPER:端口输出类型寄存器

        GPIOx_OSPEEDR:端口输出速度寄存器

        GPIOx_PUPDR:端口上拉下拉寄存器

        GPIOx_IDR:端口输入数据寄存器

        GPIOx_ODR:端口输出数据寄存器

        GPIOx_BSRR:端口置位/复位寄存器

        GPIOx_LCKR:端口配置锁存寄存器

        GPIOx_AFRL、GPIOx_AFRH:两个复位功能寄存器

         

你可能感兴趣的:(STM32,stm32,嵌入式硬件,单片机)