• 基于STM8的GPIO操作---STM8-第一章


    1. 综诉

    也许单片机在你看来是一件不太容易的事,但据我所知,单片机,无非就是控制它的GPIO口,所以可以看出,学会如何操作控制GPIO口对使用单片机来说是很重要的一件事。

    在装载STM8的单片机中,I/O共有12种工作模式。实际上这里的概念也是和STM32等其他单片机,理解了这12种状态,也就基本上理解了大部分I/O口。

    2. STM8S103的GPIO介绍

    GPIO(英文:General-purpose input/output),通用型之输入输出的简称,其引角可以供使用者由程控自由使用,PIN脚依现实参考量可作为通用输入(GPI)或者输出(GPO)或通用输入输出(GPIO)。

    打开官方IAR例程中的库文件stm8s_gpio.h文件中可以找到,STM8全部的IO模式

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

    在芯片资料中我们可以看到,I/O口的基本结构如下:

     

    由于我们使用库函数开发,因此本文就不再解释具体的寄存器操作了,如想了解请察看STM8芯片的手册。

     

    3. 模式介绍

    3.1 浮空输入(Input Floating)

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

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

     

    3.2 上拉输入(Input pull-up)

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

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

     

    3.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。        

      开漏输出就是不输出电压,低电平时接地,高电平时不接地。如果外接上拉电阻,则在输出高电平时电压会拉到上拉电阻的电源电压。这种方式适合在连接的外设电压比单片机电压低的时候。输出端出跟集电极开路十

    分相似,工作原理也是一样的。不同的是,开漏输出使用的场效应管,使用时要加上拉电阻。

     

    3.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的电源低定。

     

    3.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。

     3.6 初始电平

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

      

    4. 例程

    4.1 编译环境:

      我的编译环境是IAR,这款软件是现在STM8的主流平台,比较推荐。不过我打算等到STCubeMX更新出比较方便的版本后再去使用Keil5,因为我在用STM32的时候就是利用Keil5,的确很方便,你们也可以学着用一下。

    4.2 主芯片:

      我的主芯片是STM8S系列中的103,其中STM8S的003、005、和103、105,配置一样(外设和CPU频率,FLASH),在代码相同的情况下均可进行烧写。

    4.3 代码

      先在头文件里定义相对应的LED引角参数。

    1 /* Define --------------------------------------------------------------------*/
    2 
    3 /*LED*/ 
    4 #define Led_Opt_Pin GPIO_PIN_5
    5 #define Led_Opt_GPIO_Port GPIOB

      在主函数调用MX_GPIO_Init()函数初始 IO 的引角,再调用GPIO_TogglePin()函数对 IO 进行一个翻转,直接将一个LED灯进行翻转的话则可以看到明显的变化。

     1 /*******************************************************************************
     2 * Function Name  : MX_GPIO_Init
     3 * Description    : GPIO_Init
     4 * Input          : None
     5 * Output         : None
     6 * Return         : None
     7 ********************************************************************************/
     8 void MX_GPIO_Init(void)
     9 {
    10   //LED                                    模式为推挽高速输出
    11   GPIO_Init(Led_Opt_GPIO_Port,Led_Opt_Pin, GPIO_MODE_OUT_PP_HIGH_FAST);
    12   
    13 }
    14 
    15 
    16 /*******************************************************************************
    17 * Function Name  : GPIO_TogglePin
    18 * Description    : None
    19 * Input          : None
    20 * Output         : None
    21 * Return         : None
    22 ********************************************************************************/
    23 void GPIO_TogglePin(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef GPIO_Pin)
    24 {
    25   
    26   GPIOx->ODR ^= GPIO_Pin;
    27   
    28 }

            

                 LED灭                                              LED亮

    5. 结尾

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

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

    作 者:浩宇99✌
    出 处:https://www.cnblogs.com/zhenghaoyu/p/10676192.html
    版权声明:本文原创发表于 博客园,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则视为侵权。
  • 相关阅读:
    Java Collection工具类
    WebKit中WTFMove实现
    宏参数(Arguments)的扩展
    Block对变量的引用
    宏定义里面为什么要加括号?
    WebKit Inside: DOM树的构建
    宏定义中的重复副作用
    @weakify 与 @strongify 实现原理
    可变参数宏
    【问题解决】VSCode使用ssh远程连接出错Bad owner or permissions on C:\\Users\\wydxr/.ssh/config
  • 原文地址:https://www.cnblogs.com/zhenghaoyu/p/10676192.html
Copyright © 2020-2023  润新知