STM32根本GPIO控制

打印 上一主题 下一主题

主题 954|帖子 954|积分 2862

目次

1.GPIO基础知识
1.1体系架构
2. IO八种工作模式
2.1STM32 IO工作模式
2.2GPIO的输出速率
3.固件库实现LED点灯
3.1LED灯
LED灯,是一种能够将电能转化为可见光的半导体期间
3.2.控制LED灯
4.STM32控制蜂鸣器
1.蜂鸣器的种类
2.蜂鸣器的控制方式
3.软件设计流程
5 按键基础知识
5.1.深入理解GPIO输入
5.2按键控制LED灯
6 继电器
6.1.继电器的工作原理
6.2.继电器的引脚阐明
6.3.单片机控制继电器软件开发流程
7.震动传感器
7.1.震动传感器工作原理
7.2.震动传感器硬件引脚接线
7.3.震动传感器控制灯
8.433无线模块
1.433M无线模块工作原理
2.引脚接线
3.433M控制灯软件开发流程


1.GPIO基础知识

   GPIO(General-Purpose input/output,通用输入/输出接口)     用于感知外部信号(输入模式)和控制外部设备(输出模式)     简单模块:  LED,  按键,蜂鸣器,温度传感器,使用一个  GPIO  就可以完成数据的传输  / 控制     复杂一点的模块  OLED  ,  FLASH,  六轴传感器需要多个引脚组成  “  协议  ”  传输数据,USART,IIC,SPI等协议     MCU  单片机多数采用引脚复用模式也就是一个  GPIO  ,可以直接控制它输出高低电平,也可以设置为某个协议的引脚之一。此外,一些MCU  的引脚,还能设置为  ADC  模式读取模拟信号,大概设置为DAC  模式输出模拟信号。   1.1体系架构


2. IO八种工作模式

   GPIO结构图   
    2.1STM32 IO工作模式

     输出模式有四种:推挽输出,开漏输出,复用开漏,复用推挽          输入模式有四种   :   上拉输入,下拉输入,浮空输入,模拟输入          输出模式:        1.   推挽输出(   Push-Pull,pp   )           让输出控制变成了VDD/VSS输出,使得输出电流增大              进步了输出引脚的驱动本领,进步了电路的负载本领和开关的动作速率              2.开漏输出(Open-Drain,OD)           推挽输出模式可以直接输出高电平,开漏输出需要外接上拉电阻才气输出高电平           开漏输出的特性:          利用外部电路驱动本领           实现电平转换           方便实现“逻辑与” 功能              3.复用推挽/开漏输出(Alternate Funtion,AF)           GPIO除了作为通用输入输出引脚使用以外,还可以作为片上外设(USART,IIC,SPI) 专用引脚,即一个引脚可以有多种用途,但是同一时候一个引脚只能使用复用功能中的一个           当引脚设置为复用功能的时候,可选择推挽复用模式大概复用开漏模式,在设置为复用开漏模式时,需要外接上拉电阻。              输入模式:                  1.     上拉输入     (Input Pull-up)              VDD     经过开关、上拉电阻,毗连外部     I/O     引脚。当开关闭合时,外部     I/O     输入信号时,默认              输入高电平。            
                           2.      下拉输入      (Input Pull-down)                 VSS经过开关,下拉电阻,毗连外部I/O引脚,当开关闭合时,外部I/O无输入信号时,默认输入低电平                            3.       浮空输入       (Floating Input)                    两个上下拉电阻开关均断开,没有上拉也没有下拉,I/O引脚直接毗连TTL肖特基触发器,此时,I/O引脚浮空,读取的电平是不确定的,外部信号是什么电平,MCU引脚就输入什么电平 ,MCU复位上电后,默以为浮空输入模式                          4.模拟输入(Analoge mode)                    两个上下拉电阻开关均断开,同事TTL肖特基触发器也断开,引脚信号直接毗连模拟输入,实现对外部信号的采集。                                 2.2GPIO的输出速率

                 STM32         的         I/O         引脚工作再输出模式下时,需要配置         I/O         引脚的输出速率,该输出速率不是输出信号的速率,而是I/O         口驱动电路的相应速率。                                  STM32         提供了三个速率,         2MHZ,10MHZ,50MHZ                          现实开发过程中需要联合现实情况选择合适的相应速率,以兼顾信号的稳定性和低功耗                          当设备为高速时,功耗大,噪声大,电磁干扰强                          当设备为低速时,功耗低,噪声小,电磁干扰弱                                  简单外设,好比         LED         灯,蜂鸣器发起使用         2MHZ         的输出速率。                         而复用为         IIC         ,         SPI         等通讯信号时,发起使用         10MHZ         或         50MHZ         以进步相应速率。                        3.固件库实现LED点灯

        3.1LED灯

        LED灯,是一种能够将电能转化为可见光的半导体期间

                 原理:当给P极施加正向电压时,空穴和自由电子在P-N结复合,辐射出光子而发光。                        3.2.控制LED

                           LED          灯的正极接到了          3.3V          ,          LED          灯的负极接到了          PA1          ,也就是          GPIOA1          引脚,只需要控制PA1          为相对应的低电平,即可点亮对饮的          LED          灯,输出高电平则熄灭对应的          LED灯。                                                     软件设计流程:                            1.初始化体系:                                    初始化GPIO          外设时钟                                     初始化LED          引脚                             2.输出电平                            实当代码:                            led.c文件                           
  1. #include "led.h"
  2. #include "stm32f10x.h"
  3. void LED_Init()
  4. {
  5.         //³õʼ»¯LEDÒý½ÅGPIO
  6.         GPIO_InitTypeDef led_initstruct;
  7.         //³õʼ»¯Ê±ÖÓ
  8.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE );
  9.        
  10.     led_initstruct.GPIO_Pin=GPIO_Pin_1;            
  11.     led_initstruct.GPIO_Speed=GPIO_Speed_50MHz;  
  12.         led_initstruct.GPIO_Mode=GPIO_Mode_Out_PP;  
  13.        
  14.         GPIO_Init(GPIOA, &led_initstruct);
  15. }
复制代码
                        main.c文件
      
  1. #include "stm32f10x.h"
  2. #include "main.h"
  3. #include "led.h"
  4. int  main()
  5. {
  6. //初始化等的引脚GPIO
  7.                                 LED_Init();
  8.                                
  9.    while(1)
  10.          {
  11. //让GPIO1输出低电平 灯就亮了
  12.                 GPIO_ResetBits(GPIOA,GPIO_Pin_1);
  13.          }
  14.                  
  15.    
  16. }
复制代码
       如果要让灯实现一秒闪烁:
        main.c文件:
      
  1. #include "stm32f10x.h"
  2. #include "main.h"
  3. #include "led.h"
  4. void delay(uint16_t time)
  5. {
  6.                 uint16_t i=0;
  7.                 while(time--)
  8.                 {
  9.                         i=12000;
  10.                         while(i--);
  11.                 }
  12. }
  13. int  main()
  14. {
  15. //初始化等的引脚GPIO
  16.                                 LED_Init();
  17.                                
  18.    while(1)
  19.          {
  20.                                 GPIO_ResetBits(GPIOA,GPIO_Pin_1);//GPIO1输出低电平灯亮
  21.                                 delay(1000);
  22.                                 GPIO_SetBits(GPIOA,GPIO_Pin_1);//GPIO1输出高电平灯灭
  23.                                 delay(1000);
  24.          }
  25.                  
  26.    
  27. }
复制代码
      
        4.STM32控制蜂鸣器

        1.蜂鸣器的种类

                 蜂鸣器是一种常用的电子发声元器件,采用直流电压供电。广泛应用于计算机,打印                          机,报警器,电子玩具,汽车电子设备灯等产物中常见的蜂鸣器可分为有源蜂鸣器和                          无源蜂鸣器。                         2.蜂鸣器的控制方式

                 有源蜂鸣器:内部有震荡源,只要通电即可主动发出固定频率的声音。(频率固定无                          法控制音色)                          无源蜂鸣器:内部无震荡源,需要外部脉冲信号驱动发声,声音频率可变。(可改变                          频率来改变音色)                                 3.软件设计流程

                   初始化体系                                     初始化GPIO外设时钟                                     初始化蜂鸣器的引脚                             输出电平控制蜂鸣器                                     bear.c文件                           
  1. #include "bear.h"
  2. #include "stm32f10x.h"
  3. void Bear_Init(void)
  4. {
  5.                 //1.初始化蜂鸣器引脚
  6.         GPIO_InitTypeDef bear_initstruct;
  7.         //2.初始化时钟
  8.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  9.        
  10.        
  11.         bear_initstruct.GPIO_Pin=GPIO_Pin_3;
  12.         bear_initstruct.GPIO_Speed=GPIO_Speed_10MHz;
  13.         bear_initstruct.GPIO_Mode=GPIO_Mode_Out_PP;
  14.        
  15.         GPIO_Init(GPIOA,&bear_initstruct);
  16. }
复制代码
         main.c文件
         
  1. #include "stm32f10x.h"
  2. #include "main.h"
  3. #include "led.h"
  4. #include "bear.h"
  5. int  main()
  6. {
  7.         //初始化蜂鸣器的引脚CPIOA3
  8.                         Bear_Init();
  9.     //GPIO3输出低电平 蜂鸣器响
  10.                    GPIO_ResetBits(GPIOA,GPIO_Pin_3);
  11.    while(1)
  12.          {
  13.          }
  14.                  
  15.    
  16. }
复制代码
         5 按键基础知识

          5.1.深入理解GPIO输入

                     GPIO           的特点:                                具有内部上拉或下拉的功能                                可以使用外部下拉或上拉                              

           
                       按键毗连表示图            :                                 

            
                        5.2按键控制LED灯

                         初始化体系                                      初始化             GPIO             外设时钟                                      初始化按键和             LED             的引脚                                      检测按键输入电平来控制             LED             灯                                                 key.c                                    
  1. #include "key.h"
  2. #include "stm32f10x.h"
  3. void Key_Init(void)
  4. {
  5.                 //³õʼ»¯°´¼üÍâÉè
  6.                 GPIO_InitTypeDef key_initstruct;
  7.        
  8.                 //³õʼ»¯Ê±Ö
  9.                 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC, ENABLE);
  10.        
  11.                 key_initstruct.GPIO_Pin=GPIO_Pin_0;
  12.                 key_initstruct.GPIO_Mode=GPIO_Mode_IPU;
  13.                
  14.                 GPIO_Init(GPIOA, &key_initstruct);
  15.        
  16.        
  17.                 key_initstruct.GPIO_Pin=GPIO_Pin_13;
  18.                 key_initstruct.GPIO_Mode=GPIO_Mode_IPU;
  19.                
  20.                 GPIO_Init(GPIOC, &key_initstruct);
  21. }
复制代码
            main.c
            
  1. #include "stm32f10x.h"
  2. #include "main.h"
  3. #include "led.h"
  4. #include "bear.h"
  5. #include "key.h"
  6. int  main()
  7. {
  8.                         LED_Init();
  9.                     Key_Init();
  10.                        
  11.             GPIO_SetBits(GPIOA,GPIO_Pin_1);
  12.    while(1)
  13.          {
  14.                  
  15.          
  16.     if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==1)
  17.                         {                                       
  18.                                         GPIO_ResetBits(GPIOA,GPIO_Pin_1);
  19.                         }
  20.     if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_13)==1)
  21.                         {                                       
  22.                                         GPIO_ResetBits(GPIOA,GPIO_Pin_1);
  23.                         }
  24.                  
  25.          }
  26.                  
  27.    
  28. }
复制代码
            6 继电器

             6.1.继电器的工作原理

            
继电器是一个电控开关,工作原理基于电磁感应,继电器包罗一个电磁线圈和一组触点。常用于控制高电流或高电压的电路,比方主动控制原理,电力体系和主动化设备中,由于可靠性和电气隔离的特性可以实现小电流实现大电流,继电器在各种应用中都有广泛的用途。
            

             6.2.继电器的引脚阐明

            
1.VCC(+):供电正极,毗连此引脚到电源,以提供继电器所需的电流
2.GND(-):地,毗连此引脚到电源的负极大概地。
3.IN:控制输入信号,通常用于毗连控制信号,当该信号变化,继电器切换状态。
4.COM(common):公共端,通常是中间的触点,与常开或常闭触点相连。
5.NO(Normally Open):常开接口,继电器吸合前悬空,吸合后于COM毗连.6.NC(Normally Closed):常闭接口,继电器吸合前与COM毗连,吸合后悬空
 
             6.3.单片机控制继电器软件开发流程

             初始化体系
        初始化继电器IN引脚对应的GPIO外设时钟
        初始化继电器IN的引脚
             输出电平控制继电器开和关
             relay.c文件
            
  1. #include "stm32f10x.h"
  2. #include "relay.h"
  3. void Relay_Init(void)
  4. {
  5.                 GPIO_InitTypeDef GPIO_Initstruct;
  6.                
  7.                 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  8.                
  9.                 GPIO_Initstruct.GPIO_Pin=GPIO_Pin_0;
  10.                 GPIO_Initstruct.GPIO_Speed=GPIO_Speed_10MHz;
  11.                 GPIO_Initstruct.GPIO_Mode=GPIO_Mode_Out_PP;
  12.        
  13.                 GPIO_Init(GPIOA,&GPIO_Initstruct);
  14.                
  15. }
复制代码
            main.c文件
            
  1. #include "stm32f10x.h"
  2. #include "main.h"
  3. #include "led.h"
  4. #include "bear.h"
  5. #include "key.h"
  6. #include "relay.h"
  7. void delay(uint16_t time)
  8. {
  9.                 uint16_t i=0;
  10.                 while(time--)
  11.                 {
  12.                         i=12000;
  13.                         while(i--);
  14.                 }
  15. }
  16. int  main()
  17. {
  18.                             Relay_Init();
  19.                                 GPIO_SetBits(GPIOA,GPIO_Pin_0);
  20.    while(1)
  21.          {
  22.                  
  23.                         delay(1000);
  24.                     GPIO_ResetBits(GPIOA,GPIO_Pin_0);
  25.                         delay(1000);
  26.                     GPIO_SetBits(GPIOA,GPIO_Pin_0);                 
  27.          }
  28.                  
  29.    
  30. }
复制代码
            7.震动传感器

             7.1.震动传感器工作原理

             震动传感器黑色震动检测传感器,工作时电源LED灯常量,震动信号检测LED灯发生震动的时候会保持亮的过程。正常工作模块DO口输出高电平震动刹时D0口输出低电平,用于各种震动触发作用,防盗报警,智能小车,电子积木灯等。
            
             7.2.震动传感器硬件引脚接线

            
1.VCC:接到板子电源的5V大概3.3V。
2.GND:地,毗连到板子电源的负极大概GND。
3.DO: 数字信号输出口,可以与单片机相连检测环境是否发生震动。
            
             7.3.震动传感器控制灯

            
初始化体系
        初始化震动传感器D0相连的单片机引脚时钟。
                     初始化震动传感器DO相连的单片机引脚输入
             配置检测震动控制LED灯
             shake.c文件
            
  1. #include "shake.h"
  2. #include "stm32f10x.h"
  3. void Shake_Init(void)
  4. {
  5.                 GPIO_InitTypeDef Shake_Initstruct;
  6.                 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,  ENABLE);
  7.        
  8.                
  9.                 Shake_Initstruct.GPIO_Pin=GPIO_Pin_0;
  10.        
  11.                 Shake_Initstruct.GPIO_Mode=GPIO_Mode_IPD;
  12.                
  13.                 GPIO_Init(GPIOA,&Shake_Initstruct);
  14. }
复制代码
            main.c文件
            
  1. #include "stm32f10x.h"
  2. #include "main.h"
  3. #include "led.h"
  4. #include "bear.h"
  5. #include "key.h"
  6. #include "relay.h"
  7. #include "shake.h"
  8. void delay(uint16_t time)
  9. {
  10.                 uint16_t i=0;
  11.                 while(time--)
  12.                 {
  13.                         i=12000;
  14.                         while(i--);
  15.                 }
  16. }
  17. int  main()
  18. {
  19.             Led_Init();
  20.                         Shake_Init();
  21.             GPIO_SetBits(GPIOA,GPIO_Pin_0);
  22.    while(1)
  23.          {         
  24.         if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==0)
  25.                         {                                       
  26.                                         GPIO_ResetBits(GPIOA,GPIO_Pin_1);
  27.                                         delay(1000);
  28.                                         GPIO_SetBits(GPIOA,GPIO_Pin_1);
  29.                                         delay(1000);
  30.                         }
  31.                 else
  32.                     {
  33.                                         GPIO_SetBits(GPIOA,GPIO_Pin_1);
  34.                
  35.                     }
  36.                  
  37.          }
  38.                  
  39.    
  40. }
复制代码
            Led_Init同上.
            
            
             8.433无线模块

             1.433M无线模块工作原理

            
数据发射模块的工作频率为315M,采用声表谐振器SAW稳频,频率稳定度极高,当环境温度在-25~+85度之间变化时,频飘仅为3ppm。接收到信号,接收模块对应针脚输出高电平,有D0 D1D2 D3,可能对应遥控器的A/B/C/D。
             2.引脚接线

            
1.供电正极,毗连此引脚到电源,以提供433M无线模块所需的电流                        2.GND(-):地,毗连此引脚到电源的负极大概地。
3. D0-D4:毗连控制输入信号通常用于毗连控制信号,当按键变更控制外设信号
            
3.433M控制灯软件开发流程


            
初始化体系
        初始化433M D0-D4引脚对应的GPIO外设时钟
        初始化433M DO-D4引脚配置
433M按键控制外设
             yao.c文件
            
  1. #include "yao.h"
  2. #include "stm32f10x.h"
  3. void Yao_Init(void)
  4. {
  5.                 GPIO_InitTypeDef Yao_initstruct;
  6.                 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  7.        
  8.                 Yao_initstruct.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_2;
  9.                 Yao_initstruct.GPIO_Mode=GPIO_Mode_IPU;
  10.        
  11.                 GPIO_Init(GPIOA,&Yao_initstruct);
  12. }
复制代码
            main.c文件
            
  1. #include "stm32f10x.h"
  2. #include "main.h"
  3. #include "led.h"
  4. #include "bear.h"
  5. #include "key.h"
  6. #include "relay.h"
  7. #include "yao.h"
  8. #include "Exit.h"
  9. int  main()
  10. {
  11.                                 LED_Init();
  12.                                 Yao_Init();
  13.                                
  14.                         GPIO_SetBits(GPIOA,GPIO_Pin_1);
  15.                 //GPIO_ResetBits(GPIOA,GPIO_Pin_3);
  16.    while(1)
  17.          {
  18.                                   
  19.     if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==1)
  20.                         {                                       
  21.                                         GPIO_ResetBits(GPIOA,GPIO_Pin_1);
  22.                         }
  23.                 else if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_2)==1)
  24.                     {
  25.                                         GPIO_SetBits(GPIOA,GPIO_Pin_1);
  26.                
  27.                     }
  28.    
  29.                  
  30.          }
  31.                  
  32.    
  33. }
复制代码
            

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

温锦文欧普厨电及净水器总代理

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表