原创 GPIO端口篇——摘自hwarm's Blog

2010-1-19 18:01 3255 14 16 分类: MCU/ 嵌入式


 



STM32学习笔记 — 之GPIO端口篇




STM32学习笔记 GPIO端口篇


 


<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

最近刚开始学习STM32,所以从最基本的GPIO开始学起;首先看看STM32datasheet上对GPIO口的简单介绍:


每个GPI/O 端口有两个32 位配置寄存器(GPIOx_CRLGPIOx_CRH),两个32位数据寄存器(GPIOx_IDRGPIOx_ODR),一个32 位置位/复位寄存器(GPIOx_BSRR),一个16 位复位寄存器(GPIOx_BRR)和一个32 位锁定寄存器(GPIOx_LCKR)


   GPIO 端口的每个位可以由软件分别配置成多种模式。每个I/O 端口位可以自由编程,然而I/0 端口寄存器必须按32 位字被访问(允许半字或字节访问)GPIOx_BSRR GPIOx_BRR 寄存器允许对任何GPIO 寄存器的读/改的独访问;这样,在读和改访问之间产生IRQ 会发生危险。


    端口位配置 CNFx[1:0]=xxbMODEx[1:0]=xxb


再看GPIO功能很强大:


1.通用I/O(GPIO):最最基本的功能,可以驱动LED、可以产生PWM、可以驱动蜂鸣器等等;


2.单独的位设置或位清除:方便软体作业,程序简单。端口配置好以后只需GPIO_SetBits(GPIOx, GPIO_Pin_x)就可以实现对GPIOxpinx位为高电平;


3.外部中断/唤醒线:端口必须配置成输入模式时,所有端口都有外部中断能力;


4.复用功能(AF):复用功能的端口兼有IO功能等。复位期间和刚复位后,复用功能未开启,I/O 端口被配置成浮空输入模式(CNFx[1:0]=01bMODEx[1:0]=00b)


5.软件重新映射I/O复用功能:为了使不同器件封装的外设I/O 功能的数量达到最优,可以把一些复用功能重新映射到其他一些脚上。这可以通过软件配置相应的寄存器来完成。这时,复用功能就不再映射到它们的原始引脚上了;


6.GPIO锁定机制:主要针对复位设定的,当某端口位lock后,复位后将不改变的此端口的位配置。


 


GPIO基本设置


GPIOMode_TypeDef GPIO mode定义及偏移地址


GPIO_Mode_AIN = 0x0,     //模拟输入


  GPIO_Mode_IN_FLOATING = 0x04, //悬空输入


  GPIO_Mode_IPD = 0x28,    //下拉输入


  GPIO_Mode_IPU = 0x48,    //上拉输入


  GPIO_Mode_Out_OD = 0x14, //开漏输出


  GPIO_Mode_Out_PP = 0x10,  //推挽输出


  GPIO_Mode_AF_OD = 0x<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />1C,   //开漏复用


  GPIO_Mode_AF_PP = 0x18    //推挽复用


 GPIO输入输出速度选择:


typedef enum


{


  GPIO_Speed_10MHz = 1,


  GPIO_Speed_2MHz,


  GPIO_Speed_50MHz


}


GPIOSpeed_TypeDef;


 


#define IS_GPIO_SPEED(SPEED) ((SPEED == GPIO_Speed_10MHz) || (SPEED == GPIO_Speed_2MHz) ||  (SPEED == GPIO_Speed_50MHz))


做一个GPIO输出的试验


I/O 端口被配置为推挽模式输出时:输出寄存器上的0 激活N-MOS,而输出寄存器上的1 将激活P-MOS


用这段程序实现:GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;


int main(void)


{


#ifdef DEBUG


  debug();


#endif


 


  /* 设置系统时钟 */


  RCC_Configuration();


   


  /* 嵌套中断设置*/


  NVIC_Configuration();


 


  /* 激活GPIOC clock */


  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);


 


  /* Configure PC.04, PC.05, PC.06 and PC.07 as Output push-pull */


  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;


  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;


  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;


  GPIO_Init(GPIOC, &GPIO_InitStructure);


 


  while (1)


  {


    /*本试验仅能实现LED1亮、熄功能*/


    GPIO_SetBits(GPIOC, GPIO_Pin_4); //设置PC.04 pin为高电平,点亮LED1


    Delay();


    GPIO_ResetBits(GPIOC, GPIO_Pin_4); //设置PC.04 pin为低电平,熄灭LED1


    Delay();


  }


}


做一个GPIO输入的试验:以EK-STM32FLCDdemo做例子


  这个试验中把GPIOPD.04做为按键输入,当下降沿来临时触发。


LCDdemo中的例程如下:首先配置按键PD.03, PD.04为按键输入接口。


void Button_Config(void)


{


  GPIO_InitTypeDef GPIO_InitStructure;


 


  /* Enable GPIOD clock */


  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);


 


  /* Configure PD.03, PD.04 as output push-pull */


  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_3 | GPIO_Pin_4 ;


  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;


  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;


  GPIO_Init(GPIOD, &GPIO_InitStructure);


}


下面为按键作用是启动外部中断


GPIO_EXTILineConfig(GPIO_PortSourceGPIOD, GPIO_PinSource3);


 


  EXTI_InitStructure.EXTI_Line = EXTI_Line3;            //设定外部中断3


  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;  //设定中断模式


  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //设定下降沿触发模式


  EXTI_InitStructure.EXTI_LineCmd = ENABLE;


  EXTI_Init(&EXTI_InitStructure);


 
PARTNER CONTENT

文章评论2条评论)

登录后参与讨论

用户270825 2010-2-2 11:02

请问那个GPIO输出速率设置有什么用啊,都设为最快不好么,那些低速的有什么用呢

用户89529 2010-1-20 09:58

RCC_APB2PeriphClockCmd()此寄存器很重要,也就是即使你在GPIO部分设置好了,一定要在此寄存器中要把相应的端口以及AFIO clock(RCC_APB2Periph_AFIO)打开,所对应的IO口才能用。

用户1358589 2009-7-29 13:51

深圳卓尔科技有限公司提供高质量的GPRS模块,是美国ENFORA的方案,采用TI的芯片,如果用于工业的数据采集和传输更加容易实现,开发周期短,我们的模块具有以下特点:支持串口,尺寸小,性能稳定,无距离限制,超低功耗;有需求的请电:0755-33631360,马先生:13715105953 QQ:154025052 邮箱:machangyun@advan-elec.com,地址:深圳市南山区高新区北区华瀚创新园A座203室

用户1294022 2009-5-6 18:35

用的是什么模块啊?

用户56976 2008-12-26 10:13

您好我在做GPRS GSM GPS方面的项目 希望交流, QQ:52849974

用户56976 2008-12-26 10:13

您好我在做GPRS GSM GPS方面的项目 希望交流, QQ:52849974

用户452671 2007-8-21 16:20

自己做的?还是买的GPS模块?
相关推荐阅读
用户89529 2010-09-25 17:03
stm32 malloc:动态分配内存函数
函数原型:void *malloc(unsigned size)头文件:#include<stdlib.h>是否是标准函数:是函数功能:动态分配一块内存空间,size为指定的分配空间的大小...
用户89529 2010-08-09 14:13
SD卡的读写和FatFS文件系统
因为要用,学习了一下SPI操作SD卡,同时移植了一个免费开源的FAT文件系统:FatFS。感觉挺好,在单片机上实现了读写文件的操作,接下来就可以解释我的G代码咯!  我的SD卡底层操作参考了网上几种常...
用户89529 2010-08-09 14:11
转一篇比较详细介绍FatFs文件系统移植的文章
FatFs文件系统的移植    因为需要,又不想自己写,所以就移植了一个文件系统。    说下我的硬件和开发工具:接成 TRUE IDE 模式下的CF卡(也就是相当于一块硬盘了),三星S3C2440的...
用户89529 2010-08-05 11:53
关于STM32的systick定时器的详细说明
我不得不说意法半导体确实有点风骚!甚至有点变态。我对ST文档 STM32F10XXX参考手册的编辑水平真是不敢恭维。手册中好多说明都是含糊不清,甚至将好多对初学者来说很重要的地方都一笔带过,让人着实摸...
用户89529 2010-05-11 19:40
stm32 fsmc数据地址线的关系
      stm32的fsmc接口设置的资料很少,所以现在对各个寄存器的具体应用还不是很明白,最近写了一个程序是把以前8位数据线读写sram的程序,改为16位数据线。有了一个小小的发现,现在把它写出...
用户89529 2010-05-07 11:59
stm32关于BOOT0和BOOT1
BOOT0和BOOT1STM32三种启动模式对应的存储介质均是芯片内置的,它们是:1)用户闪存 = 芯片内置的Flash。2)SRAM = 芯片内置的RAM区,就是内存啦。3)系统存储器 = 芯片内部...
EE直播间
更多
我要评论
2
14
关闭 站长推荐上一条 /3 下一条