STM32之GPIO及第一个STM32程序(跑马灯)

发布者:WanderlustGlow最新更新时间:2019-04-02 来源: eefocus关键字:STM32  GPIO  跑马灯 手机看文章 扫描二维码
随时随地手机看文章

今天来说一说,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);

}

}


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


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

关键字:STM32  GPIO  跑马灯 引用地址:STM32之GPIO及第一个STM32程序(跑马灯)

上一篇:stm32F103模拟I2C读写24c02
下一篇:STM32 I2C Slave(SMBUS)模式软件参考设计

推荐阅读最新更新时间:2024-03-16 16:26

STM32配置PC13-PC15
在STM32的数据手册的管脚分配图中可以看到:PC14与OSC32_IN公用一个引脚,PC15与OSC32_OUT公用一个引脚,它们的使用方法如下: 当LSE(低速外部时钟信号)开启时,这两个公用管脚的功能是OSC32_IN和OSC32_OUT。 当LSE(低速外部时钟信号)关闭时这两个公用管脚的功能是PC14和PC15。 备用区域控制寄存器(RCC_BDCR)的LSEON用于控制LSE的开启或关闭。关于这个寄存器的用法请参看《STM3210x技术参考手册》。 文档下面有一段话: PC13,PC14和PC15引脚通过电源开关进行供电,因此这三个引脚作为输出引脚时有以下限制: 作为输出脚时只能工作在2
[单片机]
<font color='red'>STM32</font>配置PC13-PC15
STM32学习笔记----keil工程的建立
1、keil编译的三个按键的功能 A、第一个按钮:Translate 就是翻译当下修改过的文件,说明白点就是检查下有没有语法错误,并不会去链接库文件,也不会生成可执行文件。 B、第二个按钮:Build 就是编译当下修改过的文件,它包含了语法检查,链 接动态库文件,生成可执行文件。 C、第三个按钮:Rebuild 重新编译整个工程,跟 Build 这个按钮实现的功能 是一样的,但有所不同的是它编译的是整个工程的所有文件,耗时巨大。 综上:当我们编辑好我们的程序之后,只需要用第二个 Build 按钮就可以, 即方便又省时。第一个跟第三个按钮用的比较少 2 、core_cm3.c 跟启动文件一样都是底层文件,都是由 ARM 公司提供的,
[单片机]
STM32定时器控制led灯亮灭
SysTick—系统定时器是属于 CM3 内核中的一个外设,内嵌在 NVIC 中。系统定时器是一个 24bit 的向下递减的计数器,计数器每计数一次的时间为 1/SYSCLK,一般我们设置 系统时钟 SYSCLK 等于 72M。当重装载数值寄存器的值递减到 0 的时候,系统定时器就产 生一次中断,以此循环往复。 在使用时,只需要配置前三个寄存器,最后一个校准寄存器不需要使用。 接下来,利用 SysTick 产生 1s 的时基,LED 以 1s 的频率闪烁。 1、设置重装载寄存器的值 2、清除当前数值寄存器的值 3、配置控制与状态寄存器 配置头文件: void PendSV_Handler(void) { }
[单片机]
34.内存管理
一。内存管理简介 1. 为什么要用内存管理 例如如何在LCD上实现SD卡文件浏览 如果有内存管理可以用的内存的时候去申请内存,用完之后释放掉给别的地方用。不必事先定义一个很大的数组占用很多内存。 2. 什么是内存管理 3. 内存管理简介 二。硬件连接 三。源码讲解和例程测试
[单片机]
34.内存管理
STM32入门编程总结4 (中断+串口)
系统异常中断与外部中断统称为中断,复位中断的优先级最高, NVIC(NestedVectored Interrupt Controller)嵌套向量中断控制器,调整各个中断的优先级,中断优先级 =抢占优先级(1-4bit)+子优先级(0、1)如果两个中断的抢占优先级与子优先级参数一致,则按照中断向量表里的顺序区分优先级。GPIO的中断,EXTI(External interrupt/event controller)外部中断/事件(event)控制器,外部中断为用户自定义中断内容(用户编写程序发生中断后要干啥事儿),外部事件为具体对应外设自动执行,EXTI 0-15总共16个,GPIO A-G当中的pin尾数与EXTI尾数对应
[单片机]
<font color='red'>STM32</font>入门编程总结4 (中断+串口)
STM32单片机的启动文件及FLASH分配
STM32的启动文件 STM32作为一款单片机,它的启动方式很简单,即当Boot配置了从内部Flash启动模式之后,一上电程序就会从0x8000000地址处开始执行文件,因此我们在使用Keil设置程序起始地址的时候,需要将这个Flash地址设置成0x8000000,只有将这个地址设置成0x8000000,生成的hex文件才可以被正常烧录到此地址,单片机上电之后才可以正常启动。而如果使用J-Flash工具烧写Hex文件时,这个地址会自动根据Hex文件解析出来。然而如果当你烧写二进制Bin文件时,还需要手动将单片机的起始地址制定出来,关于Hex文件和Bin文件的异同点,这个又是可以长篇大论一番了,我们下次特别写文章来讲。
[单片机]
<font color='red'>STM32</font>单片机的启动文件及FLASH分配
GPIO输入输出实验
5.1 STM32单片机GPIO概述 STM32中每个IO口都有很多个作用,比如这次我们使用的STM32F103ZET6的PA0口,既可以作为IO口使用,还可以作为待机唤醒(WAKEUP),模拟输入(ADC功能)等。根据数据手册中列出的每个I/O端口的特定硬件特征,GPIO端口的每个位可以由软件分别配置成多种模式。 (1)输入浮空 (2)输入上拉 (3)输入下拉 (4)模拟输入 (5)开漏输出 (6)推挽式输出 (7)推挽式复用功能 (8)开漏复用功能 每个I/O端口位可以自由编程,然而I/O端口寄存器必须按32位字被访问(不允许半字或字节访问)。GPIOx_BSRR和GPIOx_BRR寄存器允许
[单片机]
<font color='red'>GPIO</font>输入输出实验
怎么使用C语言控制硬件
C语言的应用编程在单片机的领域占了很大一部分,使用的比较多的51单片机和STM32单片机都可以使用MDK软件编写固件。 单片机烧写了固件后可以点亮LED灯,可以驱动ADC检测电压,也可以驱动蜂鸣器发声,这就是简单地控制硬件。稍微复杂一点的,可以驱动NRF2401进行无线的连接,也可以使用ESP8266这类wifi芯片连接网络。 接下来,简单地讲讲如何使用C语言控制硬件。 1、电路连接 简单的模块可以直接使用高低电平来控制,比如红外线发射模块,当你在驱动引脚上的电压达到3.3v,就能发出红外线;然后将电平设置为0v,红外线发射就停止了。 一般而言,单片机的引脚输出电压能够达到3.3v,也是可以点亮红外线LED,但是可能会导致
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

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

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