STM32的GPIO口的复用功能
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STM32的GPIO口的复用功能相关的知识,希望对你有一定的参考价值。
使用默认的复用功能前必须对端口寄存器配置寄存器编程。
1.对于复用的输入功能,端口可以配置成
a--输入模式:上拉,下拉或者浮空;为什么不能是模拟?
b--复用功能输出模式:输入驱动器被配置成浮空输入模式;这句话是什么意思?
编程参考手册---第八章是讲复用功能的,但是我觉得你好像问的是重映射功能吧。都在编程参考手册里面
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的库文件对应学习。
以上是关于STM32的GPIO口的复用功能的主要内容,如果未能解决你的问题,请参考以下文章
STM32的GPIO口的几种输入输出模式的区别和适用场合,有详细的解说吗
stm32函数GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;这句话说是复用功能啥意思?一定采纳