zoukankan      html  css  js  c++  java
  • STM32 GPIO 的配置与使用

    最近正在学习STM32,之前一直在用51和AVR单片机,都是八位机,第一次接触32位机,虽然是第一次接触但是根据经验无外乎就是那些东西,配置寄存器,驱动单片机工作。STM32的寄存器相比于51和avr来说可以说不是一个数量级上,由于太多,所以刚开始接触的时候对它的配置并不能得心应手,但是ST公司想到的了这点,他们自己做了一个库,在这个库中把各个寄存器都配置好了,并且做好了各种API函数,用户调用库中的函数,并且配置到相应的各个参数就可以快速的完成对STM32的配置,这样不仅降低了STM32的学习门槛还降低了它的开发成本。

    学习一款单片机首先要从点灯开始:

    STM32的GPIO(输入输出I/O)有八种配置模式对应定义在头文件中:

    GPIO_Mode_AIN 模拟输入

    GPIO_Mode_IN_FLOATING 浮空输入

    GPIO_Mode_IPD 下拉输入

    GPIO_Mode_IPU上拉输入

    GPIO_Mode_Out_OD 开漏输出

    GPIO_Mode_Out_PP 推挽输出

    GPIO_Mode_AF_OD 复用开漏输出

    GPIO_Mode_AF_PP 复用推挽输出

    对GPIO 的配置主要分成以下几个步骤:

    ①配置GPIO的始终使能

    ②配置GPIO的输入输出模式

    ③选择引脚

    ④配置GPIO的翻转速率(输出时考虑,输入不用考虑)

    ⑤初始化以上四步 GPIO_Init()

    其中ST已经讲②③④封装在 GPIO_InitTypeDef 结构体中了,在使用时我们只需要调用这个结构体就行了

    View Code
      1 /*
      2 *copyright(c) 2013.01.17
      3 *All rights reserved
      4 *
      5 *文件名称:STM32_LED 
      6 *当前版本:1.0
      7 *作者: 郑春雨
      8 *邮箱地址:zhengchunyu_1989@sina.com
      9 *完成日期:2013/01/17
     10 */
     11 #include "stm32f10x.h"
     12 
     13 #define RCC_KEY1 RCC_APB2Periph_GPIOA
     14 #define KEY1     GPIO_Pin_0
     15 #define RCC_KEY2 RCC_APB2Periph_GPIOC
     16 #define KEY2     GPIO_Pin_13
     17 #define RCC_KEY3 RCC_APB2Periph_GPIOA
     18 #define KEY3     GPIO_Pin_8
     19 #define RCC_KEY4 RCC_APB2Periph_GPIOD
     20 #define KEY4     GPIO_Pin_3
     21 
     22 GPIO_InitTypeDef  GPIO_InitStructure;//定义结构体,GPIO的配置信息
     23 void delay(void)
     24 {
     25     u16 count,t;
     26     for(count=0;count<10000;count++)
     27     {
     28         for(t=0;t<1000;t++);
     29     }
     30 }
     31 void init_Periph_Config(void)
     32 {
     33     
     34     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF,ENABLE);//使能GPIO时钟
     35         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//配置端口输出模式输出推挽
     36         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;//选择引脚
     37         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;//配置速率
     38         GPIO_Init(GPIOF,&GPIO_InitStructure);//初始化GPIO
     39     
     40        /*KEY1*/
     41         RCC_APB2PeriphClockCmd(RCC_KEY1,ENABLE);//使能KEY1时钟
     42         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;//配置端口输入上拉
     43         GPIO_InitStructure.GPIO_Pin = KEY1;//选择引脚
     44         //GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;//配置速率
     45         GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化GPIO
     46     
     47         
     48         /*KEY2*/
     49             RCC_APB2PeriphClockCmd(RCC_KEY2,ENABLE);//使能GPIO时钟
     50             GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;//配置端口输入上拉
     51             GPIO_InitStructure.GPIO_Pin = KEY2;//选择引脚
     52             //GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;//配置速率
     53             GPIO_Init(GPIOC,&GPIO_InitStructure);//初始化GPIO
     54     
     55         /*KEY3*/
     56             RCC_APB2PeriphClockCmd(RCC_KEY3,ENABLE);//使能GPIO时钟
     57             GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;//配置端口输入上拉
     58             GPIO_InitStructure.GPIO_Pin = KEY3;//选择引脚
     59             //GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;//配置速率
     60             GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化GPIO
     61     
     62         /*KEY4*/
     63             RCC_APB2PeriphClockCmd(RCC_KEY4,ENABLE);//使能GPIO时钟
     64             GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;//配置端口输入上拉
     65             GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;//选择引脚
     66             //GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;//配置速率
     67             GPIO_Init(GPIOD,&GPIO_InitStructure);//初始化GPIO
     68 }
     69 
     70 
     71 int main(void)
     72 {
     73     
     74     init_Periph_Config();
     75     GPIO_ResetBits(GPIOF,GPIO_Pin_All);//点亮4个LED
     76       while(1)
     77       {    
     78         if(!GPIO_ReadInputDataBit(GPIOA,KEY1))    //按键1按下
     79             {
     80                 
     81                 GPIO_SetBits(GPIOF,GPIO_Pin_6);//LED1灭                
     82             }
     83         else GPIO_ResetBits(GPIOF,GPIO_Pin_6);//LED1亮
     84             
     85         
     86         if(!GPIO_ReadInputDataBit(GPIOC,KEY2))    //按键2按下
     87             {
     88                 GPIO_SetBits(GPIOF,GPIO_Pin_7);    //LED2灭                
     89             }
     90         else GPIO_ResetBits(GPIOF,GPIO_Pin_7);//LED2亮
     91         
     92         if(!GPIO_ReadInputDataBit(GPIOA,KEY3))    //按键3按下
     93             {
     94                 GPIO_SetBits(GPIOF,GPIO_Pin_8);    //LED3灭                
     95             }
     96         else GPIO_ResetBits(GPIOF,GPIO_Pin_8);//LED3亮
     97         if(!GPIO_ReadInputDataBit(GPIOD,KEY4))    //按键4按下
     98             {
     99                 GPIO_SetBits(GPIOF,GPIO_Pin_9);        //    LED4灭        
    100             }
    101         else GPIO_ResetBits(GPIOF,GPIO_Pin_9);// LED4亮
    102     }
    103   
    104 }
  • 相关阅读:
    Nginx进阶使用-负载均衡原理及配置实例
    代理服务技术-正向代理、方向代理、透明代理简析
    Docker入门教程-Linux环境安装Nginx及入门使用
    Mybatis进阶使用-一级缓存与二级缓存
    结对第2次作业——WordCount进阶需求
    团队展示
    原型设计(顶会热词统计)
    C++读取文件统计单词个数及频率
    软工实践第一次作业
    课程作业八
  • 原文地址:https://www.cnblogs.com/tianchiyuyin/p/2873164.html
Copyright © 2011-2022 走看看