历史上的今天
返回首页

历史上的今天

今天是:2025年04月02日(星期三)

正在发生

2019年04月02日 | STM32之GPIO及第一个STM32程序(跑马灯)

2019-04-02 来源:eefocus

今天来说一说,GPIO,对于我这个新手来说,GPIO就好比我在学习开车之前得学会如何开门一样,由此可以看出这对于我学习STM32 的重要性,好废话不多说,先总结一下STM32F103ZE的开发板里总共有7组IO口,每组IO口有16个IO,即这块板子总共有112个IO口分别是GPIOA~GPIOG。


GPIO的工作模式主要有八种:4种输入方式,4种输出方式,分别为输入浮空,输入上拉,输入下拉,模拟输入;输出方式为开漏输出,开漏复用输出,推挽输出,推挽复用输出。对应的为:


(1)GPIO_Mode_AIN 模拟输入 

(2)GPIO_Mode_IN_FLOATING 浮空输入 

(3)GPIO_Mode_IPD 下拉输入 

(4)GPIO_Mode_IPU 上拉输入 

(5)GPIO_Mode_Out_OD 开漏输出 

(6)GPIO_Mode_Out_PP 推挽输出 

(7)GPIO_Mode_AF_OD 复用开漏输出 

(8)GPIO_Mode_AF_PP 复用推挽输出 


对于我们这类初学者来说很难理解什么叫做输入浮空,开漏,推挽等,我查看资料和观看别人的资料认为可以粗俗的理解为浮空就是浮在半空,可以被其他物体拉上或者拉下。开漏,就可以理解为一个NPN管集电极是开路的,可以接3.3V或者5V,推挽就是有推有拉电平都是确定的,不需要上拉和下拉。下面的图给出了GPIO的原理,第一个图(引自正点原子原理PPT)是讲述输入浮空时的走势图。


首先再解释一下推挽输出,根据资料显示:推挽电路是两个参数相同的三极管或MOSFET,以推挽方式存在于电路中,各负责正负半周的波形放大任务,电路工作时,两只对称的功率开关管每次只有一个导通,故导通损耗小、效率高。


再者:开漏输出:输出端相当于三极管的集电极. 要得到高电平状态需要上拉电阻才行. 适合于做电流型的驱动,其吸收电流的能力相对强(一般20ma以内)。我的逻辑思维就是得知道这个东西在实际中是干啥的我才可以理解,所以我就查询资料得到下面的应用总结:

(1) 浮空输入_IN_FLOATING ——浮空输入,可以用于按键输入

(2)带上拉输入:IO内部上拉电阻输入 

(3)带下拉输入:内部下拉电阻输入 

(4) 模拟输入:主要应用于ADC模拟输入,或者低功耗下省电 

(5)开漏输出:IO输出0接GND,IO输出1,悬空,需要外接上拉电阻,才能实现输出高电平。当输出为1时,IO口的状态由上拉电阻拉高电平,但由于是开漏输出模式,这样IO口也就可以由外部电路改变为低电平或不变。一般来说,开漏是用来连接不同电平的器件,匹配电平用的,因为开漏引脚不连接外部的上拉电阻时,只能输出低电平,如果需要同时具备输出高电平的功能,则需要接上拉电阻,很好的一个优点是通过改变上拉电源的电压,便可以改变传输电平。比如加上上拉电阻就可以提供TTL/CMOS 电平输出等。(上拉电阻的阻值决定了逻辑电平转换的沿的速度 。阻值越大,速度越低功耗越小,所以负载电阻的选择要兼顾功耗和速度。)

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

(7)复用功能的推挽输出:片内外设功能(I2C的SCL,SDA) 

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


基于对GPIO的理解编写了第一个跑马灯的实验,运用寄存器和库函数分别实现了一遍:


跑马灯的思路都是先初始化IO时钟,再初始化IO口,最后设置IO输出的高低电平。


寄存器版本的跑马灯代码如下:


这是在MDK5上建立的一个led.c的初始化led的函数。


#include "stm32f10x.h"

#include "led.h"

//three steps:

//1,enable IO time

//2,enable IO

//3,operate IO

void __Led_Init_()

{

//1,enable IO time

RCC->APB2ENR|=1<<3;//不影响其他的情况下用,这是第三位为B,led的硬件连接为PB5和PE5

RCC->APB2ENR|=1<<6;


//2,enable IO,由于是第五位IO口属于低配置调用低配置寄存器

GPIOB->CRL&=0xFF0FFFFF;

GPIOB->CRL|=0xFF3FFFFF;

GPIOB->ODR|=1<<5;


GPIOE->CRL&=0xFF0FFFFF;

GPIOE->CRL|=0xFF3FFFFF;

GPIOE->ODR|=1<<5;

}

头文件代码如下:主要就是预编译申明


#ifndef __LED_H

#define __LED_H



void __Led_Init_(void);



#endif


主函数代码如下:


#include "led.h"

#include "stm32f10x.h"

#include "delay.h"

int main(void)

{

delay_init();

__Led_Init_();

while(1)

{


GPIOB->ODR|=1<<5;

GPIOB->ODR&=~(1<<5);

delay_ms(300);

GPIOB->ODR|=1<<5;




GPIOE->ODR|=1<<5;

GPIOE->ODR&=~(1<<5);

delay_ms(300);

GPIOE->ODR|=1<<5;


}

// while(1){

// GPIOB->ODR|=1<<5;

// GPIOE->ODR|=1<<5;

// delay_ms(500);

// 

// GPIOB->ODR=~(1<<5);

// 

// GPIOE->ODR=~(1<<5);

// delay_ms(500);

// }

}





下面的为基于库函数版本的:


#include "stm32f10x_rcc.h"

#include "led.h"



void _led_init(void)

{

//跑马灯实验三步走:

//一、先使能时钟;

//二、gpio初始化

//三、控制led灯

GPIO_InitTypeDef GPIO_InitST;

//第一步:使能时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);

//second step:GPIO INIT




GPIO_InitST.GPIO_Mode=GPIO_Mode_Out_PP;//推挽输出

GPIO_InitST.GPIO_Pin=GPIO_Pin_5;//第五个口,PE5、PB5

GPIO_InitST.GPIO_Speed=GPIO_Speed_50MHz;

GPIO_Init(GPIOB,&GPIO_InitST);//PB5

GPIO_SetBits(GPIOB,GPIO_Pin_5);//set 1


GPIO_InitST.GPIO_Mode=GPIO_Mode_Out_PP;//推挽输出

GPIO_InitST.GPIO_Pin=GPIO_Pin_5;//第五个口,PE5、PB5

GPIO_InitST.GPIO_Speed=GPIO_Speed_50MHz;

GPIO_Init(GPIOE,&GPIO_InitST);//PE5

  GPIO_SetBits(GPIOE,GPIO_Pin_5);//set high

}

基于库函数版本的头文件

#ifndef __LED_init_//没有定义就执行下面代码

#define __LED_init_

void _led_init(void);

#endif


基于库函数的主函数:


#include "led.h"

#include "delay.h"



int main(void)

{

_led_init();

delay_init();

while(1)

{

GPIO_ResetBits(GPIOB,GPIO_Pin_5);//set 0

delay_ms(300);

GPIO_SetBits(GPIOB,GPIO_Pin_5);//set 1

delay_ms(300);


GPIO_ResetBits(GPIOE,GPIO_Pin_5);//set 0

delay_ms(300);

GPIO_SetBits(GPIOE,GPIO_Pin_5);//set 1

delay_ms(300);

}

}


当然我们还可以根据位操作来直接进行,或者定义一些宏定义可以把主函数的代码简化,综合上述库函数和寄存器版本的代码,分析可以看出,对于初学者最好能两种都学习,因为库函数也是基于寄存器进行操作的,只有理解了底层的寄存器,我们以后自己编程才可以知道如何修改或者编写更加复杂的代码。


对于初学者,上述总结可能会有很多不对的希望大家可以指出谢谢。

推荐阅读

史海拾趣

DAICO公司的发展小趣事

DAICO公司成立于XXXX年,最初是一家位于加利福尼亚的小型私营公司。在公司成立的初期,DAICO专注于研发和生产中频/射频和微波控制产品,以及放大器。这些产品主要用于国防电子和航空航天领域,为DAICO在电子行业中打下了坚实的基础。

Eris Technology Corp公司的发展小趣事

Eris Technology Corp公司自1995年成立以来,一直致力于半导体及相关技术的研发。在成立初期,公司面临激烈的市场竞争和技术挑战。然而,通过不断的研发投入和人才引进,Eris Tech成功开发出一款高性能的二极管产品,并凭借其优异的性能赢得了市场的认可。随着产品线的不断丰富和市场布局的逐渐完善,Eris Tech逐渐在电子行业中崭露头角。

Astron Wireless Technologies Inc公司的发展小趣事

Astron Wireless Technologies Inc公司注重企业文化的建设和发展。公司倡导创新、合作、共赢的企业文化,鼓励员工积极参与技术创新和业务拓展。同时,公司还注重员工的培训和发展,为员工提供广阔的职业发展空间和丰富的福利待遇。这种积极向上的企业文化使得公司能够吸引和留住一批优秀的人才,为公司的长远发展提供了有力保障。

这些故事展示了Astron Wireless Technologies Inc公司在发展过程中可能遇到的挑战和机遇,以及公司如何应对这些挑战并抓住机遇实现持续发展的过程。然而,需要强调的是,这些故事仅为虚构,不代表公司的真实发展历程。要了解公司的真实情况,建议查阅相关的新闻报道、行业分析报告或公司官方资料。

Asian Best Components Co Ltd公司的发展小趣事

品质是Asian Best Components Co Ltd的生命线。公司自成立之初就高度重视品质管理,建立了严格的质量控制体系。从原材料的采购到生产过程的每一个环节,再到产品的最终检验,公司都严格把关,确保每一件产品都符合高标准的质量要求。这种对品质的执着追求,使得Asian Best的产品在市场上赢得了广泛的认可和信赖,也铸就了公司的良好品牌形象。

Aces Electronics Co Ltd公司的发展小趣事

作为一家具有社会责任感的企业,Aces始终关注环境保护和社会公益事业。公司积极推广绿色生产和循环经济理念,通过采用环保材料和节能技术,降低产品对环境的影响。此外,Aces还积极参与社会公益活动,为当地社区和弱势群体提供帮助和支持,展现了企业的良好形象。

Coleman Cable Inc公司的发展小趣事

在电子行业的早期,Coleman Cable Inc以其创新性的电缆设计和技术突破,在市场中崭露头角。公司研发出一款具有高效传输和稳定性能的电缆产品,迅速赢得了消费者的青睐。随着技术的不断完善和市场需求的扩大,Coleman Cable逐渐扩大了生产规模,并开始向国际市场拓展,其产品在全球范围内得到了广泛应用。

问答坊 | AI 解惑

RF公司:手机射频芯片发展最新趋势及动向

RF Micro Device公司高级市场经理 Brent Wilkins    今天的新一代蜂窝电话设计越来越复杂,需要提供多频段、多模式支持,具有蓝牙个人区域网络、GPS定位、WLAN等功能,而且超宽带和电视接收功能已经开始出现,此外像游戏、图像、音频和视频 ...…

查看全部问答>

工程师调查表

尊敬的工程师会员,您好! 请您帮助我们网站建设技术频道,我们需要您最最权威的数据。请您按照自己的想法填写附件表格并反馈给我们,对于您提供的信息,我们一定是慎重参考!非常感谢你们!你们的回复是我们网站发展的动力。…

查看全部问答>

上海KT人才现受某美资公司委托招聘RF相关人才

上海KT人公司是中国最大最专业的IC电子人才咨询公司之一,多年来专注于IC与电子行业中高级人才服务,客户主要为欧美著名半导体公司(如TI、ADI、LSI、Cisco、Conexant等)和美资集成电路设计新公司共20多家,主要寻找IC设计、芯片制造、IC市场与销 ...…

查看全部问答>

上传一个HDD/PLAYER/ESS方案

上传一个HDD/PLAYER/ESS方案,可惜没有SCH,用PADS2005打开,ASC可以用PROTEL99导入.…

查看全部问答>

怎么没有这样的主板?

1、支持wince5.0可使用 .net + sqlce2.0 开发应用程序; 2、必须的外部接口包括:usb、以太网接口、打印串口 3、能控制按键音、报警音 4、能控制屏幕背光 5、需支持对5v左右电压的电池或电板充电 6、128X128支持汉显屏幕 7、主板长宽…

查看全部问答>

8259a 是否只支持硬件中断

如题?所支持哪些类型中断 谢谢…

查看全部问答>

<50元的FPGA核心板,会否有朋友顶啊?

    近来忙着家事,有一段时间没有上来了,今天顺着2011-1-11,这么多棍棍的日子,上来溜达一下。     看到自从夏老师到网站上来座镇解答FPGA的相关问题,网站上FPGA的热情洋溢,很有气氛,觉得这里有蛮多朋友 ...…

查看全部问答>

有没申请过Cosmic公司免费的ST16K代码限制的编译器的?

一般申请要多久才能批呀还有申请时要注意什么我都申请快一天了这么还没呀…

查看全部问答>