基于STM32F0的SPI通信的FLASH程序分析

发布者:science56最新更新时间:2023-09-26 来源: elecfans关键字:STM32F0  SPI通信  FLASH 手机看文章 扫描二维码
随时随地手机看文章

一、GPIO的综合描述

stm32每一个GPIO端口拥有2个32bits的configuration寄存器(GPIOx_CRL,GPIOx_CRH),2个32bits的数据寄存器(GPIOx_IDR,GPIOx_ODR),1个32bits的set/reset寄存器(GPIOx_BSRR),1个16bits的reset寄存器(GPIOx_BRR)和1个32bits的Lock寄存器(GPIOx_LCKR)。


(一)每一个IO引脚都可以使用软件配置为以下几种模式:

1. 浮空输入

2. 带上拉输入

3. 带下拉输入

4. 模拟输入

5. 开漏输出——(此模式可实现hotpower说的真双向IO)

6. 推挽输出

7. 复用功能的推挽输出

8. 复用功能的开漏输出

模式7和模式8需根据具体的复用功能决定。

每一个IO引脚都可以单独编程,但是每一个IO寄存器只能32bits访问(半字或者字节访问都被禁止)。

(二)专门的寄存器(GPIOx_BSRR和GPIOx_BRR)实现对GPIO口的原子操作,即回避了设置或清除I/O端口时的“读-修改-写”操作,使得设置或清除I/O端口的操作不会被中断处理打断而造成误动作。

(三)每个GPIO口都可以作为外部中断的输入,便于系统灵活设计。

(四)I/O口的输出模式下,有3种输出速度可选(2MHz、10MHz和50MHz),这有利于噪声控制。

(五)所有I/O口兼容CMOS和TTL,多数I/O口兼容5V电平。

(六)大电流驱动能力:GPIO口在高低电平分别为0.4V和VDD-0.4V时,可以提供或吸收8mA电流;如果把输入输出电平分别放宽到1.3V和VDD-1.3V时,可以提供或吸收20mA电流。

(七)具有独立的唤醒I/O口。

(八)很多I/O口的复用功能可以重新映射。

(九)GPIO口的配置具有上锁功能,当配置好GPIO口后,可以通过程序锁住配置组合,直到下次芯片复位才能解锁。此功能非常有利于在程序跑飞的情况下保护系统中其他的设备,不会因为某些I/O口的配置被改变而损坏——如一个输入口变成输出口并输出电流。

二、GPIO的配置

(一) GPIO模式选择和速度匹配

(1) 浮空输入_IN_FLOATING ——浮空输入,可以做KEY识别,RX1。

(2)带上拉输入_IPU——IO内部上拉电阻输入。

(3)带下拉输入_IPD—— IO内部下拉电阻输入。

(4) 模拟输入_AIN ——应用ADC模拟输入,或者低功耗下省电。

(5)开漏输出_OUT_OD ——IO输出0接GND,IO输出1,悬空,需要外接上拉电阻,才能实现输出高电平。当输出为1时,IO口的状态由上拉电阻拉高电平,但由于是开漏输出模式,这样IO口也就可以由外部电路改变为低电平或不变。可以读IO输入电平变化,实现C51的IO双向功能。

(6)推挽输出_OUT_PP ——IO输出0-接GND, IO输出1 -接VCC,读输入值是未知的。

(7)复用功能的推挽输出_AF_PP ——片内外设功能(I 2C的SCL,SDA)

(8)复用功能的开漏输出_AF_OD——片内外设功能(TX1,MOSI,MISO.SCK)

GPIO输出的速度匹配:

GPIO_Speed_10MHz 最高输出速率10MHz

GPIO_Speed_2MHz 最高输出速率2MHz

GPIO_Speed_50MHz 最高输出速率50MHz

I/O口的输出模式下,有3种输出速度可选(2MHz、10MHz和50MHz),这个速度是指I/O口驱动电路的响应速度而不是输出信号的速度,输出信号的速度与程序有关(芯片内部在I/O口的输出部分安排了多个不同响应速度的输出驱动电路,用户可以根据自己的需要选择合适的驱动电路)。通过选择速度来选择不同的输出驱动模块,达到最佳的噪声控制和降低功耗的目的。高频的驱动电路,噪声也高,当不需要高的输出频率时,请选用低频驱动电路,这样非常有利于提高系统的EMI性能。当然如果要输出较高频率的信号,但却选用了较低频率的驱动模块,很可能会得到失真的输出信号。

有一点是关键,即GPIO的引脚速度跟应用匹配(推荐10倍以上)。比如:

1) 对于串口,假如最大波特率只需115.2k,那么用2M的GPIO的引脚速度就够了,既省电也噪声小。

2 )对于I2C接口,假如使用400k波特率,若想把余量留大些,那么用2M的GPIO的引脚速度或许不够,这时可以选用10M的GPIO引脚速度。

3 )对于SPI接口,假如使用18M或9M波特率,用10M的GPIO的引脚速度显然不够了,需要选用50M的GPIO的引脚速度。

(二) 在STM32中如何配置片内外设使用的IO端口

①配置输入的时钟;②初始化后即被激活(开启);③如果使用该外设的输入输出管脚,则需要配置相应的GPIO端口(否则该外设对应的输入输出管脚可以做普通GPIO管脚使用);④再对外设进行详细配置。

对应到外设的输入输出功能有下述三种情况:

①外设对应的管脚为输出:需要根据外围电路的配置选择对应的管脚为复用功能的推挽输出或复用功能的开漏输出。

②外设对应的管脚为输入:则根据外围电路的配置可以选择浮空输入、带上拉输入或带下拉输入。

③ADC对应的管脚:配置管脚为模拟输入。

如果把端口配置成复用输出功能,则引脚和输出寄存器断开,并和片上外设的输出信号连接。将管脚配置成复用输出功能后,如果外设没有被激活,那么它的输出将不确定。

(三) 通用IO端口(GPIO)初始化:

1、 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | B | C, ENABLE):使能APB2总线外设时钟;

2 、RCC_ APB2PeriphResetCmd (RCC_APB2Periph_GPIOA | B | C, DISABLE):释放GPIO复位;

3、配置各个PIN端口(模拟输入_AIN、输入浮空_IN_FLOATING、输入上拉_IPU、输入下拉_IPD、开漏输出_OUT_OD、推挽式输出_OUT_PP、推挽式复用输出_AF_PP、开漏复用输出_AF_OD)和匹配速度。

4 、GPIO初始化完成

附注1:PLL(Phase Locked Loop): 为锁相回路或锁相环,用来统一整合时脉讯号,使内存能正确的存取资料。PLL用于振荡器中的反馈技术。许多电子设备要正常工作,通常需要外部的输入信号与内部的振荡信号同步,利用锁相环路就可以实现这个目的。

附注2:STM32的GPIO口的输出:开漏输出和推挽输出

1、推挽输出与开漏输出的区别:

》》推挽输出:可以输出高,低电平,连接数字器件

》》开漏输出:输出端相当于三极管的集电极。 要得到高电平状态需要上拉电阻才行。 适合于做电流型的驱动,其吸收电流的能力相对强(一般20ma以内)。

推挽结构一般是指两个三极管分别受两互补信号的控制,总是在一个三极管导通的时候另一个截止。

要实现 线与 需要用OC(open collector)门电路。是两个参数相同的三极管或MOSFET,以推挽方式存在于电路中,各负责正负半周的波形放大任务,电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小,效率高。输出既可以向负载灌电流,也可以从负载抽取电流。

当端口配置为输出时:

开漏模式:输出 0 时,N-MOS 导通,P-MOS 不被激活,输出0。

输出 1 时,N-MOS 高阻, P-MOS 不被激活,输出1(需要外部上拉电路),也就是说此模式下只有 N-MOS对输出起作用;此模式可以把端口作为双向IO使用。

推挽模式:输出 0 时,N-MOS 导通,P-MOS 高阻,输出0。

输出 1 时,N-MOS 高阻,P-MOS 导通,输出1(不需要外部上拉电路)。

简单来说,开漏是0的时候接GND ,1的时候浮空;推挽是0的时候接GND ,1的时候接VCC。

2、开漏电路特点及应用

在电路设计时我们常常遇到开漏(open drain)和开集(open collector)的概念。所谓开漏电路概念中提到的“漏”就是指MOSFET的漏极。同理,开集电路中的“集”就是指三极管的集电极。开漏电路就是指以MOSFET的漏极为输出的电路。一般的用法是会在漏极外部的电路添加上拉电阻。完整的开漏电路应该由开漏器件和开漏上拉电阻组成。

组成开漏形式的电路有以下几个特点:

1) 利用 外部电路的驱动能力,减少IC内部的驱动。当IC内部MOSFET导通时,驱动电流是从外部的VCC流经R pull-up ,MOSFET到GND。IC内部仅需很下的栅极驱动电流。

2) 可以将多个开漏输出的Pin,连接到一条线上。形成 “与逻辑” 关系。当PIN_A、PIN_B、PIN_C任意一个变低后,开漏线上的逻辑就为0了。这也是I2C,SMBus等总线判断总线占用状态的原理。

3)可以利用改变上拉电源的电压,改变传输电平。IC的逻辑电平由电源Vcc1决定,而输出高电平则由Vcc2决定。这样我们就可以用低电平逻辑控制输出高电平逻辑了。

4)开漏Pin不连接外部的上拉电阻,则只能输出低电平(因此对于经典的51单片机的P0口而言,要想做输入输出功能必须加外部上拉电阻,否则无法输出高电平逻辑)。

5)标准的开漏脚一般只有输出的能力。添加其它的判断电路,才能具备双向输入、输出的能力。

应用中需注意:

1) 开漏和开集的原理类似,在许多应用中我们利用开集电路代替开漏电路。例如,某输入Pin要求由开漏电路驱动。则我们常见的驱动方式是利用一个三极管组成开集电路来驱动它,即方便又节省成本。

2)上拉电阻R pull-up的 阻值 决定了 逻辑电平转换的沿的速度 。阻值越大,速度越低功耗越小。反之亦然。


关键字:STM32F0  SPI通信  FLASH 引用地址:基于STM32F0的SPI通信的FLASH程序分析

上一篇:stm32单片机GPIO端口的特点及应用解析
下一篇:STM32单片机ADC库函数的定义和使用方法

推荐阅读最新更新时间:2024-11-12 15:47

877A软件模拟SPI通信读写93C46
;功能说明: ;1.做一个灯的左移,将左移的8个码建于TABLE中. ;2.从TABLE中取出数据并以16位的方式存入93C46中,地址00H-03H. ;3.将93C46的00H-03H地址中的数据码取出并存入877A的RAM(30H)-(37H),并输出至877A的RC口. ;当断电再复电,数据码不会消失. ;4.本 电路 所使用93C46为ATMEL或M IC RO Chip 的,或不是该厂的,则烧写时间会有差异 ;必须调整本程序的DELAY时间 ;本实战的目的是让大家进上步熟悉SPI通信的时序,熟悉93C46的读写,会用软件模拟SPI通信 ;硬件接法: ;1.93C46的CS接877A的RB1口;CLK接877A的RB2
[单片机]
更小、更薄、更轻!兆易创新业界超小尺寸FO-USON8封装128Mb SPI NOR Flash面世!
更小、更薄、更轻!兆易创新业界超小尺寸3mm×3mm×0.4mm FO-USON8封装128Mb SPI NOR Flash面世! 中国北京(2023年5月16日) —— 业界领先的半导体器件供应商兆易创新GigaDevice(股票代码 603986)今日宣布,率先推出采用3mm×3mm×0.4mm FO-USON8封装的SPI NOR Flash——GD25LE128EXH ,其最大厚度仅为0.4mm,容量高达128Mb,是目前业界在此容量上能实现的最小塑封封装产品,可在应对大容量代码存储需求的同时,提供极大限度的紧凑型设计自由。 近年来,随着物联网、可穿戴、健康监护、网通等应用的快速发展,市场需求变化多样,不仅要
[嵌入式]
更小、更薄、更轻!兆易创新业界超小尺寸FO-USON8封装128Mb <font color='red'>SPI</font> NOR <font color='red'>Flash</font>面世!
盛群推出新型高阶32-bit Flash MCU
盛群半导体(Holtek)继HT32F125x及HT32F1755/1765与HT32F2755系列后,再度盛大推出以ARM Cortex-M3为核心的新系列高阶微控制器产品HT32F1655/1656。 全新的32-bit Flash微控制器系列,最高运行速度仍然高达72MHz(90 DMIPS),操作电压为2.7V~3.6V单一电源,并符合-40°C~85°C工业温度范围,搭配Holtek ISP(In-System Programming)及IAP(In-Application Programming)技术方案,可轻易升级韧体,提高生产效能与产品弹性。 HT32F1655/1656系列的Flash容量各别为128/2
[单片机]
OK6410裸机简单的NAND FLASH驱动
OK6410裸机简单的NAND FLASH驱动,只写了个简单的函数,读取一页 img src= http://my.csdn.net/uploads/201207/20/1342795831_9865.JPG alt= /************************************************************************************************************* * 文件名: NandFlash.c * 功能: S3C6410 NandFlash底层驱动函数 * 作者: 陈鹏 * 创建时间: 2012年3
[单片机]
[单片机框架][bsp层][cx32l003][bsp_flash] FLASH配置和使用
本芯片包含 1 颗 64K / 32K Byte 容量的嵌入式 Flash 存储器,包括一个 128 / 64 sector 的 Main Array区域,一个 8 sector 的 NVR 区域。每个 sector 的容量为 512 Byte。Flash 的 Main Array 区域是给用户使用的, 可以存放用户开发的程序和数据。 NVR 区域中, 一个 sector 用于存放系统配置, 一个 sector用于存放选项字节,其余的 6 个 sector 用于存放系统的 ISP 程序。本模块支持对 Flash 存储器的擦除、编程以及读取操作。此外,本模块支持对 Flash 存储器擦写的保护,以及控制寄存器的写保护。 Main
[单片机]
[单片机框架][bsp层][cx32l003][bsp_<font color='red'>flash</font>] <font color='red'>FLASH</font>配置和使用
STM32CubeMX系列教程20:Nand Flash
一、Nand Flash 简介 Flash 中文名字叫闪存,是一种长寿命的非易失性(断电数据不丢失)的存储器。可以对称为块的存储器单元块进行擦写和再编程,在进行写入操作之前必须先执行擦除。功能性分为两种: NOR Flash:允许随机存取存储器上的任何区域,以编码应用为主,其功能多与运算相关 Nand Flash:主要功能是存储资料,适合储存卡之类的大量数据的存储。 本章以K9F1G08U0E芯片为例讲解Nand Flash。 二、Nand Flash存储结构 一个Nand Flash由多个块(Block)组成,每个块里面又包含很多页(page)。每个页对应一个空闲区域/冗余区域(spare area),这个区
[单片机]
STM32CubeMX系列教程20:Nand <font color='red'>Flash</font>
用IAP方式写入擦除flash存储器的程序
  注释:   (1)TempStoragel是AD中断服务程序存放AD采到数据(512字节)的变量。   (2)voidPage_Erase(BYTE*Page—Address)small//flash擦函数模块;在主程序main中为“page_erase(2000h)”,在 LED l=0之前;      (3)voidPage_Write(BYTE*PageAddress)small//写函数flash模块;在主程序:main中为“page_write(2000h)”,在LEDl=0之前;      (4)xdateuintfull=0;定义full(AD的数据采集变量为数据xdate:   (5)在主程序前定义的:
[单片机]
用IAP方式写入擦除<font color='red'>flash</font>存储器的程序
msp430 FLASH 字节读写程序
/***** 430 FLASH 字节读写程序 *************************/ 430的数据RAM 与FLASH的读写 #define FLASH_ADDRESS 0x1000 //定义FLASH信息区地址B段 void flash_erase(unsigned char*); void read_flash(unsigned char *pc_byte, unsigned char *array,unsigned char amount); void write_flash(unsigned char *pc_byte,unsigned char *array,unsign
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved