zoukankan      html  css  js  c++  java
  • 三、STM8的学习笔记-----GPIO操作

    三、STM8的学习笔记-----GPIO操作

    3.1.前言

    3.2.对STM8的GPIO介绍

    3.3.简单操作单个IO口

    3.4.模式介绍

    3.5.例程

    3.6.结尾

    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系列的单片机每一个端口都有一个输出数据寄存器(ODR),一个引脚输入寄存器(IDR),一个数据方向寄存器(DDR)。任何一个I/O引脚可以通过对DDR,ODR,CR1,CR2寄存器的相应位进行编程来配置。一个I/O口在工作是输入还是输出取决于该口数据方向寄存器的状态,对常用的几个寄存器介绍如下:

    1、端口x数据方向寄存器(Px_DDR)

    地址偏移值:0x20

    复位值:0x00

     Px_DDR寄存器用于配置I/O口的输入输出模式,如果要点亮led灯,则需把与led灯相连的口配置成输出模式,如把PD4口的DDR寄存器置1,寄存器的配置如上图所示,即 PD_DDR|=0x01;就是DDR与十六进制10(00010000)相或。任何数与0相或都不变,与1相或则为1,所以相或有置位的效果,从右边低位0开始算起,第五个口刚好是PD4口,所以就是将PD4设置为输出模式。

    2、端口x输出数据寄存器(Px_ODR) 

    地址偏移量:0x00

    复位值:0x00

     该寄存器通常只在IO口配置成输出时起作用,ODR寄存器里的值,表示输出模式下,IO口引脚上的值。所以,要想把IO口里某个或多个引脚置高或置低,只需操作ODR即可,寄存器如上图所示。

    3、端口x输入寄存器(Px_IDR)

    地址偏移值:0x03

    复位值:0x00

     当IO口配置为输入时,可从此寄存器中读取当前IO口的状态值。

    4、端口x控制寄存器1(Px_CR1)

    地址偏移值:0x03

    复位值:0x00

       通常,模拟开漏输出需要外接上拉电阻,驱动能力较强,推挽输出不需要外接电阻,驱动能力较弱,对于led灯的点亮,推挽输出模式足以,所以 通常将IO口设置为推挽输出模式,当然设置为开漏输出模式的时候,在学习的过程中可能会遇到。

    5、端口x控制寄存器2(Px_CR2)

    地址偏移值:0x04

    复位值:0x00

     CR2控制寄存器多用来在输入模式下控制外部中断,在输出模式下作用不大。至此,我们已经把所有的GPIO口的寄存器都了解完了。

    6、硬件连接原理

    操作单个IO口,以点亮LED灯为例子,只需要配置PD4口就好

    将下列代码放置在主函数中

    PD_DDR |=0x10;     //将PD.4设置为输出模式
    PD_CR1|=0x10;;     //将PD.4设置为推挽输出模式
    PD_CR2 &= ~0x10; //设置PD.4输出速率最大为2MHZ
    PD_ODR |=0x10;    //即PD.4=1
    while(1)

     操作单个IO口就简单讲到这里

    下面就来了解STM8的12种I/O模式,在官方官方IAR例程中的库文件stm8s_gpio.h文件中可以找到,STM8全部的IO模式。

    typedef enum
    {
      GPIO_MODE_IN_FL_NO_IT      = (uint8_t)0x00,  /*!< Input floating, no external interrupt */
      GPIO_MODE_IN_PU_NO_IT      = (uint8_t)0x40,  /*!< Input pull-up, no external interrupt */
      GPIO_MODE_IN_FL_IT         = (uint8_t)0x20,  /*!< Input floating, external interrupt */
      GPIO_MODE_IN_PU_IT         = (uint8_t)0x60,  /*!< Input pull-up, external interrupt */
      GPIO_MODE_OUT_OD_LOW_FAST  = (uint8_t)0xA0,  /*!< Output open-drain, low level, 10MHz */
      GPIO_MODE_OUT_PP_LOW_FAST  = (uint8_t)0xE0,  /*!< Output push-pull, low level, 10MHz */
      GPIO_MODE_OUT_OD_LOW_SLOW  = (uint8_t)0x80,  /*!< Output open-drain, low level, 2MHz */
      GPIO_MODE_OUT_PP_LOW_SLOW  = (uint8_t)0xC0,  /*!< Output push-pull, low level, 2MHz */
      GPIO_MODE_OUT_OD_HIZ_FAST  = (uint8_t)0xB0,  /*!< Output open-drain, high-impedance level,10MHz */
      GPIO_MODE_OUT_PP_HIGH_FAST = (uint8_t)0xF0,  /*!< Output push-pull, high level, 10MHz */
      GPIO_MODE_OUT_OD_HIZ_SLOW  = (uint8_t)0x90,  /*!< Output open-drain, high-impedance level, 2MHz */
      GPIO_MODE_OUT_PP_HIGH_SLOW = (uint8_t)0xD0   /*!< Output push-pull, high level, 2MHz */
    }GPIO_Mode_TypeDef;

    3.4.模式介绍

    1.浮空输入(Input Floating)

          浮空输入在 IO 模式中带有 IN_FL 字眼,如:GPIO_MODE_IN_FL_NO_IT 、GPIO_MODE_IN_FL_IT。

      浮空输入也叫悬浮输入,一般把浮空输入和上拉输入做类比学习。浮空输入的电平不确定的,即使外部的一个很小的输入信号都会使其发生改变。如果引脚设置为悬空的情况下,读取该端口的电平是不确定的。

    2.上拉输入(Input pull-up)

           上拉输入在 IO 模式中带有 IN_PU 字眼,如:GPIO_MODE_IN_PU_NO_IT 、GPIO_MODE_IN_PU_IT。

      上拉输入的时候,引脚内部有一个上拉电阻通过开关连接到电源VDD, 当引脚没有和外部电路连接时,设置上拉输入方式的I/O引脚电平是确定的高电平。

    3.开漏输出(Output open-drain)

          开漏输入在 IO 模式中带有 OUT_OD 字眼,如:GPIO_MODE_OUT_OD_LOW_FAST 、GPIO_MODE_OUT_OD_LOW_SLOW 、 GPIO_MODE_OUT_OD_HIZ_FAST 、 GPIO_MODE_OUT_OD_HIZ_SLOW。        

    开漏输出就是不输出电压,低电平时接地,高电平时不接地。如果外接上拉电阻,则在输出高电平时电压会拉到上拉电阻的电源电压。这种方式适合在连接的外设电压比单片机电压低的时候。输出端出跟集电极开路十分相似,工作原理也是一样的。不同的是,开漏输出使用的场效应管,使用时要加上拉电阻。

    4. 推挽输出(Output push-pull)

           推挽输入在 IO 模式中带有 Output push-pull 字眼,如:GPIO_MODE_OUT_PP_LOW_FAST 、 GPIO_MODE_OUT_PP_LOW_SLOW 、 GPIO_MODE_OUT_PP_HIGH_FAST 、GPIO_MODE_OUT_PP_HIGH_SLOW。

      推挽输出可以输出高,低电平,连接数字器件; 推挽结构一般是指两个三极管分别受两互补信号的控制,总是在一个三极管导通的时候另一个截止。高低电平由IC的电源低定。

    5.中断和输出速度

    中断在 IO 模式中带有 IT 字眼。中断只存在 IO 输入中,因为在输出中设置中断也没有任何意义。中断的意思就是中止当前的工作,然后去执行另外的任务,执行完之后再回来执行原来的任务。

      输出速度也只存在 IO 输出中,可以调整 IO 的输出速度来将它们进行等级划分,如:low level,10MHz、low level,2MHz、high-impedance level,10MHz、high level,10MHz、high-impedance level, 2MHz、high level, 2MHz。

    6.初始电平

    我们初始化GPIO时候,会有一个初始电平的操作,例如GPIO_MODE_OUT_OD_LOW_FAST,GPIO_MODE_OUT_OD_HIZ_FAST,GPIO_MODE_OUT_PP_HIGH_FAST中,含有LOW、HIZ、HIGH,分别为低电平、高阻抗电平、高电平三种状态。

    3.5.例程

    1.编译环境

    我的编译环境是IAR,这款软件是现在STM8的主流平台,比较推荐。

    2.主芯片

    本次学习我采用的STM8S103这块芯片其中STM8S的003、005、和103、105,配置一样(外设和CPU频率,FLASH),在代码相同的情况下均可进行烧写。

    5.3 代码

    GPIO.H

     #define Led_Opt_Pin GPIO_PIN_5
     #define Led_Opt_GPIO_Port GPIOB

     GPIO.C

    /*******************************************************************************
    * Function Name  : MX_GPIO_Init
    * Description    : GPIO_Init
    * Input          : None
    * Output         : None
    * Return         : None
    ********************************************************************************/
    void MX_GPIO_Init(void)
    {
      //LED                                    模式为推挽高速输出
      GPIO_Init(Led_Opt_GPIO_Port,Led_Opt_Pin, GPIO_MODE_OUT_PP_HIGH_FAST);
     
    }

    /*******************************************************************************
    * Function Name  : GPIO_TogglePin
    * Description    : None
    * Input          : None
    * Output         : None
    * Return         : None
    ********************************************************************************/
    void GPIO_TogglePin(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef GPIO_Pin)
    {
     
      GPIOx->ODR ^= GPIO_Pin;
     
    }
    最后在主函数里调用一下就可以了。

     LED灯灭

    LED灯亮

    3.6.结尾

    以上的代码是使用库函数开发的,控制LED灯。

    对STM8的GPIO的说明和引用到这里结束,感谢各位看官的点击。

    如果觉得有所收获请点下推荐,若认为该博客中存在错误的说明或者对博客中某方面有疑问请留言。

     本博客转载了一部分浩宇99的博文,大家如果有兴趣也可以前往下方链接去查看浩宇99的博客。

    作 者:浩宇99✌
    出 处:https://www.cnblogs.com/zhenghaoyu/p/10676192.html
    版权声明:本文原创发表于 博客园,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则视为侵权。

  • 相关阅读:
    Linux命令之乐--nmap
    shell脚本学习总结09--分支与循环结构
    shell脚本学习总结08--比较与测试
    Linux命令之乐--test
    Linux命令之乐--read
    shell脚本学习总结06--数学计算
    Linux命令之乐--time
    Linux命令之乐--expr
    Linux命令之乐--seq
    Linux命令之乐--rename
  • 原文地址:https://www.cnblogs.com/linyuchao/p/11663498.html
Copyright © 2011-2022 走看看