STM8单片机GPIO口的驱动深度解析

Posted 无际单片机编程

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STM8单片机GPIO口的驱动深度解析相关的知识,希望对你有一定的参考价值。

上一节给大家介绍了STM8标准库的移植,本节课开始学习我们单片机的外设的驱动,单片机基本的外设资料包括GPIO、外部中断、定时器、串口等,本节先给大家介绍一下STM8单片机的GPIO口。

我们先不介绍STM8单片机GPIO口的内部资源,我们先从程序代码着手,再根据代码进一步分析GPIO对应的寄存器,这样才能更容易去理解GPIO的驱动原理。

这篇内容是无际单片机编程lora模块项目其中一节课内容,会配套有视频教程。

1.STM8单片机的标准库中,不仅包括了我们单片机库文件,还提供了外设的例程代码,供单片机软件程序开发参考.

如上图所示,标准库中包括了STM8单片机所有的外设历程,我们今天要学习的GPIO的驱动,所以我们打开GPIO文件夹。

2.我们先将\\GPIO\\GPIO_IOToggle文件下的四个文件复制并代替     \\Project\\STM8L10x_StdPeriph_Templates 文件下的四个文件,如下图所示。

①\\Project\\STM8L10x_StdPeriph_Templates 是STM8单片机的一个工程,开发环境是IAR,方便我们移植并打开我们需要的例程文件。

②\\Project\\STM8L10x_StdPeriph_Templates目录是标准库中的空例程下的四个文件,上图外设例程中只包含了程序文件,并没有工程。 所以我们需要讲例程中的四个文件复制并代替\\Project\\STM8L10x_StdPeriph_Templates 目录下的四个文件,如上图。

③对应四个文件简单说明:

main.c :  main函数文件

stm8l10x_conf.h:  STM8单片机外设配置文件,可以删除或者增加单片机的外设资源,STM8单片机标准库移植必须包含的.h文件

Stm8l10x_it.c:  STM8中断服务处理入口

Stm8l10x_it.h:  对应.C文件的声明。

3.进入\\Project\\STM8L10x_StdPeriph_Templates\\EWSTM8,打开工程

工程打开如下: 工程第第一句是:#include “stm8l10x.h”,

单片机内部的所有的外设资源,我们都是通过“STM8L10X.H”来调用。

4.我们接着往下看,如下图所示:

①第一步,我们先找一下main函数。

②第二步,GPIO口的初始化操作。

GPIO口的初始化只用到了一个函数。GPIO_Init,如下图

③第三步,参看GPIO口的操作:

通过GPIO_ToggleBits函数来完成单片机的反转。

我们先透析一下GPIO_Init函数。GPIO_Init函数原型如下:

void GPIO_Init(GPIO_TypeDef* GPIOx,uint8_t GPIO_Pin,GPIO_Mode_TypeDef GPIO_Mode)

共包括3个参数:

①GPIO_TypeDef* GPIOx :  单片机IO的端口,PA,PB,PC,PD 四个选项

#define GPIOA ((GPIO_TypeDef *) GPIOA_BaseAddress)

#define GPIOB ((GPIO_TypeDef *) GPIOB_BaseAddress)

#define GPIOC ((GPIO_TypeDef *) GPIOC_BaseAddress)

#define GPIOD ((GPIO_TypeDef *) GPIOD_BaseAddress)

②uint8_t GPIO_Pin: GPIO端口对应的脚位: 如下图所示。

typedef enum

{

  GPIO_Pin_0    = ((uint8_t)0x01),  /*!< Pin 0 selected */

  GPIO_Pin_1    = ((uint8_t)0x02),  /*!< Pin 1 selected */

  GPIO_Pin_2    = ((uint8_t)0x04),  /*!< Pin 2 selected */

  GPIO_Pin_3    = ((uint8_t)0x08),   /*!< Pin 3 selected */

  GPIO_Pin_4    = ((uint8_t)0x10),  /*!< Pin 4 selected */

  GPIO_Pin_5    = ((uint8_t)0x20),  /*!< Pin 5 selected */

  GPIO_Pin_6    = ((uint8_t)0x40),  /*!< Pin 6 selected */

  GPIO_Pin_7    = ((uint8_t)0x80),  /*!< Pin 7 selected */

  GPIO_Pin_LNib = ((uint8_t)0x0F),  /*!< Low nibble pins selected */

  GPIO_Pin_HNib = ((uint8_t)0xF0),  /*!< High nibble pins selected */

  GPIO_Pin_All  = ((uint8_t)0xFF)   /*!< All pins selected */

}GPIO_Pin_TypeDef;

③GPIO_Mode_TypeDef GPIO_Mode:配置单片机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;

举例来说明GPIO端口的初始化操作,如历程所示,初始化STM8单片机的GPIO口的PD4,PD5,PD6为输出高速上拉模式。

初始化的端口是GPIOD

对应的GPIO口脚位是PIN4,PIN5,PIN6

模式是:GPIO_Mode_Out_PP_Low_Fast。

4.接下来我们在进一步了解GPIO口的其他的库函数。我们打开stm8l10x_gpio.h文件,如下图所示:

对于我们单片机开发应用来说,讲到这里基本上就可以操作应用了,没有必要进一步再去深挖。我们现在根据我们的开发板先简单的举个例子来练习一下GPIO的简单的使用和开发。

5.我们先打开Lora模块的原理图,如下图所示:

实验一:我们要讲PA3的端口配置成 输出高电平。

我们打开上节可搭建的工程,编辑程序,程序代码如下:

我们编译一下,发送有错误,如下:

如何处理错误,我们需要屏蔽掉conf.h 文件中的#define USE_FULL_ASSERT    1  语言,如下图,再编译通过。

接下来,我们链接目标板,烧录程序验证测试结果。因PA3外部悬空,我们通过示波器来测试PA3端口的高低电平。

接下来我们做其他实验

实验2: PA3端口输出低电平

实验3: 配置PA3端口为输入模式,检测PA3端口的高低电平。

再这里就给大家不一一介绍了。

6.接下来,我们再深入的探讨一下GPIO口。因为单片机的库函数最终是对单片机的内部寄存器的操作,所以再这里给大家简单的介绍一下GPIO的寄存器。

我们打开STM8单片机的数据手册,根据目录跳到GPIO口部分,来产看GPIO的寄存器说明:

STM8单片机共有5个寄存器来配置GPIO口。

第一个: Px_ODR  输出配置寄存器。

输出配置寄存器,配置为1输出高电平,0,输出低电平。

第二个寄存器: PX_IDR  输入状态寄存器

读取本寄存器,获取GPIO的输入状态, 1为高电平 0为低电平

第三个寄存器: Px_CR1 配置端口的输入输出模式。

配置为1 表示端口为输出模式,0表示为输入模式

第四个寄存器: PX_CR1输入输出模式寄存器1:

本寄存器配置和和第三个寄存器相关:

端口模式为输入模式:

配置为1,表示端口是上拉输入模式

配置为0,表示端口是悬空输入模式

端口模式为输出模式:

配置为1,上拉输出

配置为0,开漏输出

第五个寄存器: PX_CR2输入输出模式寄存器2: 

本寄存器配置和第三个寄存器配置相关:

端口模式为输入模式:

配置为1,端口外部终端使能

配置为0,端口外部终端不使能

端口模式为输出模式:

配置为1,输出的速率是10MHZ

配置为0,输出的速率是2MHZ

综上就是STM8单片机GPIO的介绍,关于内部寄存器,大家可以通过GPIO的库文件对应学习。

以上是关于STM8单片机GPIO口的驱动深度解析的主要内容,如果未能解决你的问题,请参考以下文章

STM8单片机串口驱动的深度解析

最近在看STM8S单片机,头都大了,想请问下在STM8S中,

stm32中GPIO口的最大输出速度如何理解?

像STM8一样编程STM32(寄存器级GPIO)

STM32的GPIO口的几种输入输出模式的区别和适用场合,有详细的解说吗

stm32如何判读输入IO口的高低电平