STM32 入门之 GPIO

发布者:JoyfulHarmony最新更新时间:2015-10-14 来源: eefocus关键字:STM32入门  GPIO 手机看文章 扫描二维码
随时随地手机看文章
    入手STM32有一段时间了,感觉刚入门时很难,无处下手,现在学到了点皮毛,写出来和大家分享一下。

    首先,什么叫GPIO?这个问题,答案是我也不知道!至少目前我没有必要知道,我只要知道他其实就是51单片机的那种IO口而已,不同的是,51单片机的IO口是不需要配置模式的,而STM32的IO口(哦,不,应该说是GPIO口,╮(╯▽╰)╭,真绕舌头)是需要配置模式和时钟的(好吧,又冒出一个时钟来,够麻烦的),在这里要说明一下,STM32的GPIO,如果你要用它,就要做两步工作,第一是配置模式、速度,第二是配置其时钟并使能(貌似说两步有点牵强)。估计现在大家已经糊涂了,好吧,别急,我一点一点给大家解释解释;

    我们第一步要知道GPIO的那八种模式是什么,怎么用。GPIO的八种模式如下:

    (1)浮空输入:In_Floating

    (2)带上拉输入:IPU(In Push_Up)

    (3)带下拉输入:IPD(In Push_Down)

    (4)模拟输入:AIN(Anolog In)

    (5)开漏输出:OUT_PD(OD 代表开漏,既Open Drain,OC代表开集,Open Collect)

    (6)推挽输出:OUT_PP(PP代表推挽式,Push_Pull)

    (7)复用功能推挽输出:AF_PP(AF代表复用功能,Alternate-Fuction)

    (8)复用功能开漏输出:AF_OD

    好吧,就这八种模式,打字打得我手都酸了、、、、、、

    这八种模式什么时候用哪种,这个问题值得研究,不过也不用现在就玩命地研究,以后在使用过程中慢慢就体会到了,所以在这里我就不多说了。

    再就是配置GPIO的翻转速度了,有10M、2M和50M,具体配置方式等最后我们贴个完整的代码就明白了。

    GPIO配置说完了,再说说时钟配置,时钟配置其实就是一堆让初学者看不懂的代码,不过看多了慢慢体会,你就明白他到底是在说什么了,在写程序的时候可以直接从他给的工程中移植过来,然后修改一下相关的配制就行了,先贴个代码,然后再解释。

STM32学习笔记之GPIO
上图是配置时钟的代码,我挨着行解释一下:

SystemInit();看名字就知道这个是系统初始化,到底初始化了些什么,我的意思是不知道,目前也不用知道,你就写这么一句就行了;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA

                       |RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC

                       |RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE

                                            |RCC_APB2Periph_ADC1 | RCC_APB2Periph_AFIO

                       |RCC_APB2Periph_SPI1, ENABLE );

这几句有点长,看着就头晕,但是我们不怕,一句一句看,RCC_APB2PeriphClockCmd()这个函数名字有点怪,它叫做使能或失能APB2外设时钟(这名字够绕嘴的),不用管它,直接复制过来就行,再看括号里面的,RCC_APB2Periph_USART1,这个代表的是USART1的时钟是和APB2的一样,下面的几个都是这么个意思,用或符号连接在一起,然后再加上个ENABLE,这就算使能了你想要用的管脚,大家要注意啊,上面的代码是我随便找的,在实际使用过程中,具体是能什么,要看你用到什么,就使能什么,不用最好别使能,免得造成不必要的干扰和麻烦。

    好了,我们一开始说的两个问题说完了,下面说一下如何让GPIO输出高低电平吧。其实吧这个问题很简单,很多的资料一提到这个问题,就开始讲寄存器,一讲寄存器,就涉及到内部原理,好吧,终于,初学者不淡定了,脑子成了一堆浆糊,然后信心受挫,然后就降低了学习效率,其实我个人认为大不必,既然有库函数,那我们就先用库函数,等库函数用熟了,再自己慢慢领悟库函数里面的寄存器操作。看下面两条语句:

GPIO_SetBits(GPIOD, GPIO_Pin_9);

GPIO_ResetBits(GPIOD, GPIO_Pin_9);

第一句的意思是将GPIOD9口置位(我们假定这个口的模式是输出模式),第二句的意思是将GPIOD9口清零(同样的假定)。哈哈,怎么样,简单吧,这就是基本的IO口操作,这样,你就能成功点亮或者熄灭指定的LED了,下面附上一段例程,大家自己慢慢研究。

#include "stm32f10x.h"

 

//-------------------------------------------GPIO初始化-----------------------------------------//

void GPIO_Configuration(void)

{

       GPIO_InitTypeDef GPIO_InitStructure;

      

        

       GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11;

      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

      GPIO_Init(GPIOD, &GPIO_InitStructure);

 

 

      

       GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;

      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

      GPIO_Init(GPIOB, &GPIO_InitStructure);

 

}

 

//--------------------------------------配置系统时钟,使能各外设时钟---------------------------------//

void RCC_Configuration(void)

{

       SystemInit(); 

       RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB

                           | RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD

                           | RCC_APB2Periph_GPIOE, ENABLE );

}

 

 

//-----------------------------------配置所有外设------------------------------//

void Init_All_Periph(void)

{

       RCC_Configuration();  

       GPIO_Configuration();

}

//----------------------------------------延时函数--------------------------------------------//

void Delay(vu32 nCount)

{

  for(; nCount != 0; nCount--);

}

 

//------------------------------------------主函数--------------------------------------------//

int main(void)

       Init_All_Periph();

      while(1)

      {

          

           GPIO_SetBits(GPIOD, GPIO_Pin_8);

          

           GPIO_ResetBits(GPIOD, GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11);

          

           Delay(0xEFFFF);

 

          

           GPIO_SetBits(GPIOD, GPIO_Pin_9);

          

           GPIO_ResetBits(GPIOD, GPIO_Pin_8 | GPIO_Pin_10 | GPIO_Pin_11);

          

           Delay(0xEFFFF);

 

          

           GPIO_SetBits(GPIOD, GPIO_Pin_10);

          

           GPIO_ResetBits(GPIOD, GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_11);

          

           Delay(0xEFFFF);

 

          

           GPIO_SetBits(GPIOD, GPIO_Pin_11);

          

           GPIO_ResetBits(GPIOD, GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10);

          

           Delay(0xEFFFF);

           GPIO_ResetBits(GPIOD, GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10);

      }

}

关键字:STM32入门  GPIO 引用地址:STM32 入门之 GPIO

上一篇:stm32 IAR环境printf函数调用
下一篇:GNU ARM汇编--(一)开篇

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

STM32F1笔记(一)GPIO输出
GPIO:General Purpose Input Output (通用输入/输出)。 GPIO最经典应用:LED灯。 先看电路。声明:参考正点原子战舰开发板。 与LED串联的电阻称为限流电阻。 限流电阻计算公式:R=(U-LED压降)/20ma。 U为LED工作电压,LED一般最大电流为20ma。 在此R=(3.3-0.7)/0.02=130Ω。 因此本次示例中限流电阻阻值大于130Ω,才不会烧坏LED。 再看代码。 GPIO初始化。 void LED_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_A
[单片机]
STM32F1笔记(一)<font color='red'>GPIO</font>输出
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><font color='red'>入门</font>编程总结4 (中断+串口)
ARM-Linux GPIO操作事宜
1.在嵌入式Linux GPIO表示为 S3C2410_GPx(n) ,其中x的取值为 A,B,C,D,E,F,G,H..... ,表示那个GPIO口,n的取值为 1,2,3,..... 表示第几个管脚。 例如 B口的第六管教:S3C2410_GPB(6) D口的第12管教:S3C2410_GPD(12) ..... 注 这些宏定义在arch/arm/mach-s3c2410/include/mach/gpio-nrs.h,使用#include mach/gpio-nrs.h 以下包含#include mach/hardware.h linux/gpio.h mach/regs-gpio.h 2.设置gpio的工作模
[单片机]
三、STM8的学习笔记-----GPIO操作
3.1.前言 STM8系列是意法半导体公司生产的8位的单片机。该型号单片机分为STM8A、STM8S、STM8L三个系列。本次学习我采用的STM8S103这块板; 在我的学习过程中,学习单片机,首先得知道如何控制它的GPIO口。关于GPIO共有12种工作模式,如果理解了这12种工作模式,那么在GPIO的学习过程中也会事半功倍。 3.2.对STM8的GPIO介绍 GPIO(英文:General-purpose input/output),通用型之输入输出的简称。其引角可以供使用者由程序控制并自由使用,通过对PIN脚的初始化可以实现通用输入(GPI)或者输出(GPO)或通用输入输出(GPIO)。 3.3.简单操作单个I/O
[单片机]
三、STM8的学习笔记-----<font color='red'>GPIO</font>操作
教你如何用一个GPIO数字接口也能测量温度的简单方式
在关注机器健康和其他物联网(IoT)解决方案的现代应用中,随着检测功能的日趋普及,对更简单的接口以及更少的I/O和更小的器件尺寸的需求也随之增长。连接到单个微处理器或FPGA的器件密度不断增加,而应用空间(以及由此导致的I/O引脚数量)却受到限制。在理想情况下,所有应用都需要一个ASIC来提供小巧的集成式解决方案。 Q:如果系统中的FPGA/微处理器上只剩下一个GPIO,该如何进行模拟测量? A:可以使用电压-频率 转换器 代替模数转换器。 在关注机器健康和其他物联网(IoT)解决方案的现代应用中,随着检测功能的日趋普及,对更简单的接口以及更少的I/O和更小的器件尺寸的需求也随之增长。连接到单个微处理器或FPGA的器件
[测试测量]
教你如何用一个<font color='red'>GPIO</font>数字接口也能测量温度的简单方式
PWM功能在关闭时GPIO电平不确定的情况
  刚开始接触STM32,遇到一个项目中出现在产品调试中出现在关闭PWM输出时,GPIO电平有不确定的情况。在网上查阅资料发现大神们是这样解释的:PWM在一个脉冲没有结束时关闭输出,会导致GPIO电平不确定。   解决方法:1、在关闭PWM输出时随即将相应GPIO强制为低(这个高/低看各人的需要)   tiM_Cmd(TIM3 ,DISABLE);//关闭PWM输出   TIM_ForcedOC1Config(TIM3, TIM_ForcedAction_InActive);//将PWM输出强制为低   2、在下次打开PWM时使用下面的函数   /*因前面使用PWM强制输出为低,此处需要重新打开PWM输出*/   TIM_Se
[单片机]
按键输入-GPIO输入
一,硬件连接    如图,有4个按键,分两组  第一组:WK_UP连接VCC  第二组:KEY0,KEY1,KEY2连接GND 确定IO口工作模式:  当IO口按下时我们需要捕捉到IO口的电平变化  所以WK_UP按下后为高地平,需设置按下前为低电平,应设置为下拉输入  同理KEY0,KEY1,KEY2按下后为低电平,应设置为上拉输入 二,读取IO输入的相关函数: 1,库函数 uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); 2,寄存器 GPIO端口输入寄存器:GPIOx_IDR 3,位操作 PE
[单片机]
按键输入-<font color='red'>GPIO</font>输入
[ARM笔记]GPIO硬件介绍
GPIO(General Purpose I/O Ports)意思为通用输入/输出端口,通俗地说,就是一些引脚,可以通过它们输出高低电平或者通过它们读入引脚的状态-是高电平或是低电平。 S3C2410共有117个I/O端口,共分为A~H共8组:GPA、GPB、...、GPH。S3C2440共有130个I/O端口,分为A~J共9组:GPA、GPB、...、GPJ。可以通过设置寄存器来确定某个引脚用于输入、输出还是其他特殊功能。 1.1 通过寄存器来操作GPIO引脚 GPxCON用于选择引脚功能,GPxDAT用于读/写引脚数据;另外,GPxUP用于确定是否使用内部上拉电阻。x为B、...、 H/J,没有GPA
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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