历史上的今天
返回首页

历史上的今天

今天是:2024年12月22日(星期日)

2021年12月22日 | 三、STM8的学习笔记-----GPIO操作

2021-12-22 来源:eefocus

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灯。


推荐阅读

史海拾趣

芯邦(Chipsbank)公司的发展小趣事

在全球半导体市场竞争日益激烈的背景下,芯邦科技面临着来自国际巨头的挑战。然而,公司凭借在半导体设计领域的深厚积累和不断创新的精神,逐步形成了自己的核心竞争力。同时,芯邦也积极寻求与国际合作伙伴的合作机会,共同推动半导体产业的发展。

以上五个故事简要概述了芯邦科技在电子行业中的发展起来的关键节点和里程碑事件。这些故事不仅展现了芯邦科技在技术创新、产品线拓展、资本运作、市场表现和国际竞争等方面的努力和成就,也预示着公司未来发展的广阔前景和无限可能。

E-tec Interconnect Ltd公司的发展小趣事

在电子行业快速发展的背景下,E-tec始终保持对技术创新的关注。他们投入大量资金进行研发,不断推出新产品和新技术。例如,他们成功开发了一种新型的微型连接器,该连接器具有体积小、传输速度快、抗干扰能力强等优点,受到了市场的热烈欢迎。此外,E-tec还注重产品升级和换代,确保产品始终保持在行业前列。

Cygnal Integrated Products Inc公司的发展小趣事

随着市场的不断发展和竞争的加剧,Cygnal意识到需要通过收购来加速其技术和市场的布局。经过一系列谈判和协商,Cygnal成功收购了另一家专注于嵌入式系统技术的公司。这次收购不仅为Cygnal带来了更多的技术和市场资源,还使其能够更好地满足客户的需求并提供更全面的解决方案。收购后,Cygnal通过内部整合和优化,将两家公司的优势融合在一起,形成了更强大的市场竞争力。

Block USA Inc.公司的发展小趣事

在成功推出线下支付业务后,Block USA Inc.进一步拓展至线上支付领域,并推出了集成了多种功能的手机软件Cash App。这款应用不仅提供了便捷的支付功能,还整合了robinhood、paypal和venmo等金融服务的特色,为用户提供了更加丰富的金融体验。Cash App的成功推出,使得Block在支付与金融服务领域的影响力进一步增强。

Forge Europa Ltd公司的发展小趣事

在快速发展的过程中,Forge Europa Ltd公司始终注重品牌与文化的塑造。公司秉承“创新、品质、服务”的企业精神,致力于为客户提供优质的产品和服务。同时,公司还注重员工的培养和发展,建立了完善的培训体系和激励机制,激发了员工的创造力和工作热情。通过这些努力,Forge Europa不仅塑造了一个具有行业影响力的品牌形象,还形成了独特的企业文化,为企业的长远发展奠定了坚实的基础。

佰宏(BHFUSE)公司的发展小趣事

BHFUSE佰宏实业成立于2013年,创立之初,公司便确立了专注于大电流、高电压、低内阻的PPTC自恢复保险丝的研发与生产。面对激烈的市场竞争,佰宏团队凭借对技术的深刻理解和对市场的敏锐洞察,逐步赢得了客户的认可。在创立初期,佰宏便与多家知名代工厂建立了合作关系,为其提供优质的保护器件,逐步在行业中树立了良好的口碑。

问答坊 | AI 解惑

汽车防盗器

.遇盗报警,反应迅速:仅需几秒 可在全球范围内短信通知车主警情,车主可在全球范围内查询车辆状态,  进行远程控制断油断电等操作; 2.  可选兼容原车防盗器或独立设防方式; 3.  移动MGPS定位,随时掌握车辆方位; 4. ...…

查看全部问答>

高频功率管驱动问题

E型的高频功率放大电路中,高频管gate极驱动用同频率的正弦信号与方波信号驱动对匹配电路谐振有影响吗? 丙类放大是功率管工作在强饱和非线性状态,也就是说在开关状态吧…

查看全部问答>

华为Quartus 指南

好资料,无条件为坛友共享!…

查看全部问答>

关于wince数据库打不开的原因?

昨天尝试着在一个应用程序里用wince数据库,结果数据库创建成功了,却打不开数据库,郁闷之极。代码如下: //1、挂载数据库卷,如果存在则打开,不存在,就新建一个         if (!CeMountDBVol(&m_ceGuid,DBFILENAME,OPEN_ALWA ...…

查看全部问答>

几个概念:SD、SDHC、SDXC、SDIO、MMC

SD是早先的版本的,据说是由MMC演变而来的。最大支持2GB大小容量 SDHC是大容量SD卡,也就是SD High Capacity,支持最大32GB大小容量 SDXC(SD eXtended Capacity)是去年09年才发布的新标准,支持最大2TB的大小容量 SDIO看了一段网上的英文原文 ...…

查看全部问答>

想进入嵌入式开发行业!

我大三了,基本上算不上有什么定位,我想去参加培训,嵌入式培训!它要一些什么样的基础啊!我是学计算机科学与技术专业的,去年刚退伍,啥都忘了!但我想只要想做的事就不会做不到的(当然排除坏事了).有没有前辈指教一下!…

查看全部问答>

PFC中的磁性元件的设计

通过上篇文章对比分析,适合Boost储能电感的磁心材料有MnZn铁氧体材料、非晶材料、金属磁粉心材料。MnZn铁 氧体材料具有高频损耗小、价格低的优势,但是饱和磁通密度 Bs低,易饱和,非晶材料虽然 Bs高,磁导率高,但 是价格较高,同时两者需要开 ...…

查看全部问答>

CC2500应用技巧注意事项

SPI 接口时序注意事项:     CC2500通过4线SPI兼容接口(SI,SO,SCLK和CSn)配置。这个接口同时用作写和读缓存数据。SPI接口上所有的地址和数据转换被最先在重要的位上处理。    SPI接口上所有的处理都同一个包 ...…

查看全部问答>

机房监控系统

深圳市佳创达科技有限公司长沙分公司是国内同行业中的“机房维护大师”,致力于机房动力设备及 环境 ,图像集中监控管理系统,和各类空调机监控产品的开发,生产,销售为一体的科技型企业.主营机房动 力环境集中监控系统. 公司拥有了一支高素质 ...…

查看全部问答>

菜鸟求助啦!

朋友们!这段Code有问题吗? 板子F5438 想让LED1闪呀闪呀闪! #include void main(void) {   unsigned char i;   WDTCTL = WDTPW + WDTHOLD;                 ...…

查看全部问答>