目录

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位字、半字或字节进行访问。

根据上图,当我进行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;

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:两个复位功能寄存器

STM32F407ZG_入门相关推荐

  1. 用Construct 2制作入门小游戏~

    今天在软导课上了解到了Construct 2这个神器,本零基础菜鸟决定尝试做一个简单的小游戏(实际上是入门的教程啊= = 首先呢,肯定是到官网下载软件啊,点击我下载~ 等安装完毕后我便按照新手教程开始 ...

  2. Docker入门六部曲——Swarm

    原文链接:http://www.dubby.cn/detail.html?id=8738 准备工作 安装Docker(版本最低1.13). 安装好Docker Compose,上一篇文章介绍过的. 安 ...

  3. Docker入门六部曲——Stack

    原文链接:http://www.dubby.cn/detail.html?id=8739 准备知识 安装Docker(版本最低1.13). 阅读完Docker入门六部曲--Swarm,并且完成其中介绍 ...

  4. Docker入门六部曲——服务

    原文链接:http://www.dubby.cn/detail.html?id=8735 准备 已经安装好Docker 1.13或者以上的版本. 安装好Docker Compose.如果你是用的是Do ...

  5. 【springboot】入门

    简介: springBoot是spring团队为了整合spring全家桶中的系列框架做研究出来的一个轻量级框架.随着spring4.0推出而推出,springBoot可以説是J2SEE的一站式解决方案 ...

  6. SpringBoot (一) :入门篇 Hello World

    什么是SpringBoot Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不 ...

  7. 入门指南目录页 -PaddlePaddle 飞桨 入门指南 FAQ合集-深度学习问题

    入门指南目录页 -PaddlePaddle 飞桨 入门指南 FAQ合集 GT_Zhang关注 0.1012019.08.01 18:43:34字数 1,874阅读 795 Hi,欢迎各位来自Paddl ...

  8. 5 分钟入门 Google 最强NLP模型:BERT

    BERT (Bidirectional Encoder Representations from Transformers) 10月11日,Google AI Language 发布了论文 BERT: ...

  9. 命名实体识别入门教程(必看)

    关于开发自己的命名实体识别先期思路: 虽然网上有很多相关代码,但实际如何入门材料较少,故整理下: CRF:先期可以用人民日报语料库去做,步骤如下: https://blog.csdn.net/hude ...

最新文章

  1. Reddit票选 | 2019年绝对不能错过的机器学习论文
  2. 2021年科研学术海报Poster模板
  3. Element UI——滚动条组件(ElScrollBar)修改.el-scrollbar__wrap和el-scrollbar__view的CSS属性
  4. ansys经典界面分析工字钢_ANSYS做一个工字钢的热分析
  5. 12. GD32F103C8T6入门教程-定时器-3路pwm输出
  6. echart 折线图、柱状图、饼图、环形图颜色修改
  7. HTML5的input color系统颜色选择器
  8. 【数据结构笔记46】Sort with Swap(0,*)只允许交换0的排序
  9. js判断对象上是否含有某个属性
  10. Android补间动画使用
  11. ffmpeg命令录制windows音视频
  12. Linux下oracle11Gr2(64位)安装说明
  13. 哪种深度学习框架发展最快?
  14. html圆形波浪流量统计,HTML-波浪水球
  15. linux下modprobe命令参数及用法详解--linux加载模块命令
  16. Activiti7.0 EL NullPoint问题
  17. 阿里靠增发股份用钱或难挡离职潮!
  18. 贪心算法之prim算法
  19. OPTICS聚类算法详解
  20. 我的CSDN 2007 MVB 最有价值BLOG 奖杯碎了,心疼

热门文章

  1. python字符串转list(python字符串转数字)
  2. shell 打印九九乘法表
  3. Android高级工程师技能知识储备,android实战项目源码
  4. 配置NetBackup 7 for oracle 10g rac
  5. 查看java web日志_java web 日志详细
  6. python随机生成生日测试生日悖论
  7. Uber Go 语言编程规范:避免语义不明确的参数(Naked Parameters)
  8. 如何使用STM32和BLE收集SHT85传感器数据?
  9. 阿里云Code设置ssh公钥
  10. LocalDate 计算两个日期相差天数