STM32中GPIO的使用

来源:互联网 发布:cmm软件质量管理体系 编辑:程序博客网 时间:2024/04/26 21:35

楼主一直是一个实用主义者(虽然还是菜鸟一个),所以我们就不啰嗦了,直接从使用开始,具体的GPIO的各种属性,输入输出的配置等请自行查看相关资料。

我们打开一个ST官方库文件中的GPIO例子,(打开方法参考我的博客中的《如何使用ST官方库文件中的例子程序》一文)

如何使用ST官方库文件中的例子程序》连接地址

http://blog.csdn.net/thebestleo/article/details/44155611

我们剪辑出其中的重要程序部分,为了清晰,我删除了其中的一些英文注释,下面还会增加一下中文的注释

#include "stm32f10x.h"GPIO_InitTypeDef GPIO_InitStructure;int main(void){    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_2;  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  GPIO_Init(GPIOD, &GPIO_InitStructure);    while (1)  {    /* Set PD0 and PD2 */    GPIOD->BSRR = 0x00000005;    /* Reset PD0 and PD2 */    GPIOD->BRR  = 0x00000005;    /* Set PD0 and PD2 */    GPIOD->BSRR = 0x00000005;    /* Reset PD0 and PD2 */    GPIOD->BRR  = 0x00000005;    /* Set PD0 and PD2 */    GPIOD->BSRR = 0x00000005;    /* Reset PD0 and PD2 */    GPIOD->BRR  = 0x00000005;    /* Set PD0 and PD2 */    GPIOD->BSRR = 0x00000005;    /* Reset PD0 and PD2 */    GPIOD->BRR  = 0x00000005;    /* Set PD0 and PD2 */    GPIOD->BSRR = 0x00000005;    /* Reset PD0 and PD2 */    GPIOD->BRR  = 0x00000005;    /* Set PD0 and PD2 */    GPIOD->BSRR = 0x00000005;    /* Reset PD0 and PD2 */    GPIOD->BRR  = 0x00000005;    /* Set PD0 and PD2 */    GPIOD->BSRR = 0x00000005;    /* Reset PD0 and PD2 */    GPIOD->BRR  = 0x00000005;    /* Set PD0 and PD2 */    GPIOD->BSRR = 0x00000005;    /* Reset PD0 and PD2 */    GPIOD->BRR  = 0x00000005;    /* Set PD0 and PD2 */    GPIOD->BSRR = 0x00000005;    /* Reset PD0 and PD2 */    GPIOD->BRR  = 0x00000005;    /* Set PD0 and PD2 */    GPIOD->BSRR = 0x00000005;    /* Reset PD0 and PD2 */    GPIOD->BRR  = 0x00000005;  }}

程序中while循环里使用了寄存器的方式来完成GPIO的操作,这里我们来改一下,全部用库文件的方式来完成,这里我们不考虑外围设备的状态(如LED灯的状态取决于硬件电路与STM32之间的连接,才能知道STM32输出高低电平后LED的亮灭),只考虑GPIO管脚的输出状态(0或者1)

此程序应该是一个双灯闪烁实验,在实际应用中应该加上一个延时程序,这里我们只介绍一下用法,所以不必过分纠结,此处我们只留一组寄存器操作代码作为对比

注解:程序中我习惯用//来注释一句程序,用/* */来注释下面的一段程序

#include "stm32f10x.h"GPIO_InitTypeDef GPIO_InitStructure;   //定义一个GPIO_InitTypeDef类型的结构体int main(void){    /* 1、初始化GPIO */  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);         // 使能GPIOD的时钟  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_2;         // 配置所用到的管脚  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 配置所用到的管脚的输入输出模式  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 配置所用到的管脚的速度  // 将GPIOD和GPIO_InitStructure结构体的首地址作为参数传递给GPIO初始化函数GPIO_Init  GPIO_Init(GPIOD, &GPIO_InitStructure);     /* 2、操作GPIO */  while (1)  {        GPIO_SetBits(GPIOD,GPIO_Pin_0);  // D端口,0管脚置1    GPIO_SetBits(GPIOD,GPIO_Pin_2);  // D端口,2管脚置1        GPIO_ResetBits(GPIOD,GPIO_Pin_0);     // D端口,0管脚置0    GPIO_ResetBits(GPIOD,GPIO_Pin_2);     // D端口,0管脚置0    /* Set PD0 and PD2 */    GPIOD->BSRR = 0x00000005;    /* Reset PD0 and PD2 */    GPIOD->BRR  = 0x00000005;  }}

分析上面的程序我们可以得出如下结论:GPIO的操作一共分为2步

1、对所用的GPIO进行初始化设置,初始化又分为3个步骤,

      1)、使能GPIOD的时钟

      2)、填充GPIO的属性结构体

      3)、传递参数至初始化函数

2、对GPIO进行操作



0 0
原创粉丝点击