历史上的今天
返回首页

历史上的今天

今天是:2025年08月06日(星期三)

正在发生

2020年08月06日 | 如何在STM8微控制器上使用GPIO

2020-08-06 来源:elecfans

原理图

如何在STM8微控制器上使用GPIO

通用设计

使用PIC和AVR器件时,您通常需要获取该特定器件的数据表,并了解如何使用外设。有时,一个PIC上的外设可能与另一个PIC上的外设不同,因此不能简单地将代码从一个PIC复制并粘贴到另一个PIC。但是,STM8完全不同,因为所有STM8设备都使用通用布局而不是具有唯一配置。这意味着为一个STM8设计的代码可以直接复制并粘贴到不同的控制器,它仍然可以工作(假设新设备具有所需的外设)。


一个典型的例子是UART外设。 STM8器件最多可以有三个UART端口(1,2和3),一个STM8器件上的UART1与另一个STM8器件上的UART1相同。但是,各个STM8器件的数据表中没有太多关于如何使用外设的信息,因此在使用任何STM8器件时,您需要使用数据表;包含引脚分布的器件专用数据表,以及包含器件系列细节的另一个数据表。


对于我们的STM8项目,我们将利用这两个数据表中的信息:

STM8S103F3器件数据表(PDF) - 包含基本细节和引脚信息

STM8系列器件概述(PDF) - 包含详细的外设和CPU信息

如果您想知道设备上的引脚位置,请使用设备数据表,如果您想了解如何使用外围设备,请使用系列设备概述表。


GPIO

虽然开发板允许我们对STM8进行编程微控制器和CPU功能,除非我们可以将微型连接到其他设备和外部电路,否则它是毫无意义的。为了能够执行此类任务,使用通用输入输出或GPIO。 GPIO是器件上的引脚,可以电连接到外部电路,以控制它们或从中读取信息。虽然可以读取模拟数据,但本教程仅关注数字值(打开或关闭的数字值)。


说到GPIO,有四个主要寄存器:

DDR - 数据方向寄存器

ODR - 输出数据寄存器

IDR - 输入数据寄存器

CR1和CR2 - 控制寄存器

图片由RM0016参考手册提供。

访问寄存器和位

访问STM8上的GPIO有点类似于AVR ,除了STM8S.h使用结构。例如,STM8S上的PORT B有自己的结构,称为GPIOB,内部是控制它的所有寄存器(如DDR,ODR,IDR等)。访问这些寄存器可以如下所示:

GPIOB→xxx其中xxx是有问题的寄存器

数据方向寄存器(DDR)


将引脚配置为输入时,需要清零相应的DDR位(0),对于输出,需要设置该位(1)。因此,比方说,我们只想将B0和B1配置为输入,同时将其余部分保持为输出。我们可以执行以下操作:

GPIOB→DDR = 0xFC;

GPIOB→DDR = 0b11111100;

控制寄存器CR1和CR2

CR1和CR2是控制寄存器,可配置为提供不同的I/O功能。例如,它们可以配置为允许在各个引脚上产生中断,并可用于创建具有推/拉功能的输出驱动器。与其他寄存器一样,CR1和CR2寄存器中的每个位对应一个特定的引脚。因此,例如,CR1和CR2中的位0用于端口的引脚0。下表(摘自数据表)演示了CR1和CR2寄存器的用途。

输出数据寄存器( ODR)

输出数据寄存器用于输出数字值(1和0)到一个端口。可以写入各个位(使用位掩码),也可以更改整个寄存器。将1位写入ODR位将使相应的引脚导通,写入0将使相应的引脚关闭。下面的第一个示例用于打开端口上的所有引脚,第二个示例关闭所有引脚。


GPIOB→ODR = 0xFF;或GPIOB→ODR = 0b11111111;//打开所有引脚

GPIOB→ODR = 0x00;或GPIOB→ODR = 0b00000000;//关闭所有引脚

输入数据寄存器(IDR)

IDR寄存器可用于读取端口引脚上的数字值。这些值可以是(1)或关闭(0),IDR寄存器的第0位对应引脚0,而第7位对应引脚7.


pinRead = GPIOB→IDR;

有用的位操作

因为我/O端口由各个引脚组成,与整个寄存器相比,访问个别位更有帮助。但是,个别位不可用(类似于AVR设备),因此我们需要使用一些位操作。由于这已经在AVR系列中进行了解释,我们只会看一些非常有用的宏。


这些非常有用的宏有助于摆脱不可读的位掩码:

#define setBit(reg,bit)(reg = reg |(1 《

#define clearBit(reg,bit)(reg = reg&〜(1 《

#define toggleBit(reg,bit)(reg = reg ^(1 《

将此代码复制并粘贴到代码顶部,然后,您可以像函数一样使用它们,而不必编写位操作代码。那么让我们看一些如何在代码中使用它们的示例!

setBit(GPIOB→DDR,3);//将端口B上的第3位设置为输出

clearBit(GPIOA→ODR,4);//关闭端口a上的输出位4

toggleBit(GPIOC→ODR) ,5);//在端口c上切换第5位

然而,读取引脚使用一个简单的位操作,包括使用AND来屏蔽我们不需要的所有位,然后测试查看结果是否为0。


if( (GPIOB→IDR & 0b00000001) )

{

// Code here executes IF bit 0 is on

}

if( !(GPIOB→IDR & 0b00000001) )

{

// Code here executes IF bit 0 is off

}

基本配置示例

在本例中,我们将引脚A1配置为输入,B5配置为输出,每当按下开关(连接到A1)时,LED连接到B5将切换。这里我们也利用内部上拉,因此我们的按钮不需要上拉电阻工作(通过设置CR1中的位来完成)。


/* MAIN.C file

*

* Copyright (c) 2002-2005 STMicroelectronics

*/

#include “stm8s.h”

#define setBit(reg, bit) (reg = reg | (1 《《 bit))

#define clearBit(reg, bit) (reg = reg & ~(1 《《 bit))

#define toggleBit(reg, bit) (reg = reg ^ (1 《《 bit))

void simpleDelay(void);

main()

{

GPIOA-》DDR = 0x00; // Make all pins on PORT A inputs

GPIOA-》CR1 = 0xFF; // Ensure that internal pull up is on

GPIOA-》CR2 = 0x00; // Ensure that interrupts are turned off

GPIOB-》DDR = 0xFF;

while (1)

{

// Testing bit 1 (bit 0 would be 1)

if( !(GPIOA-》IDR & 0x02) )

{

toggleBit(GPIOB-》ODR, 5);

simpleDelay();

}

}

}

// Simple delay used for debouncing

void simpleDelay(void)

{

unsigned int i, j;

for(i = 0; i 《 1000; i ++)

{

for(j=0; j 《 10; j ++)

{

}

}

}

推荐阅读

史海拾趣

DESIGNERSYSTEMS公司的发展小趣事

DESIGNERSYSTEMS公司深知,优质的服务是企业赢得客户的关键。他们始终坚持客户至上的原则,为客户提供从咨询、设计到生产、售后的一站式服务。无论客户遇到什么问题,DESIGNERSYSTEMS都能够迅速响应并提供有效的解决方案。这种优质的服务赢得了客户的广泛赞誉和口碑传播,为DESIGNERSYSTEMS在电子行业中树立了良好的形象。

3L Electronic Corporation公司的发展小趣事

作为一家有社会责任感的企业,3L Electronic Corporation始终关注环境保护和可持续发展。公司积极采用环保材料和生产工艺,减少对环境的影响。同时,公司还参与社会公益事业,回馈社会。这些举措不仅提升了公司的社会形象,也为公司的长期发展创造了良好的社会环境。

请注意,上述故事是基于公开信息和行业常识的概括描述,并不代表3L Electronic Corporation公司的真实发展历程。如需了解更多关于该公司的详细信息,建议查阅其官方网站或相关新闻报道。

协顺电子(Finecables)公司的发展小趣事

在品质和创新的支撑下,协顺电子开始积极拓展市场。公司通过参加各类展会、举办技术交流会等方式加强与客户的沟通和交流,同时也不断完善自己的销售网络和售后服务体系。此外,协顺电子还注重品牌建设,通过广告宣传、公关活动等方式提升品牌知名度和美誉度。这些努力使得公司的市场份额不断扩大,品牌影响力也逐渐增强。

Burr-Brown公司的发展小趣事

Burr-Brown在音频领域取得了显著的成就。1957年,公司推出的Model 130成为世界上第一个固态运算放大器(op amp),这一技术在现代高级音频系统中仍占据核心地位。1982年,公司发布的16位单片数模转换器(DAC)更是彻底改变了音乐的播放和发行方式,使得音乐可以以高保真度进行复制,并方便地随身携带。Burr-Brown的技术成为优质音频的代名词,赢得了广泛的行业认可。

Greenwich Instruments Ltd公司的发展小趣事

面对日益激烈的市场竞争和不断变化的客户需求,Greenconn Corp积极推动智能制造转型。公司引进先进的生产设备和技术,优化生产流程和管理模式,提高生产效率和产品质量。同时,公司还加强与高校、科研机构的合作,共同研发智能制造关键技术,推动智能制造技术在连接器生产领域的应用。这些努力不仅提升了Greenconn Corp的竞争力,还为公司的可持续发展奠定了坚实基础。

CANDD公司的发展小趣事

随着市场竞争的加剧,CANDD公司意识到单打独斗已经无法满足市场的需求。于是,公司开始积极寻求与其他企业的合作机会。通过与知名电子品牌商的合作,CANDD公司成功将其技术应用于更广泛的产品领域,进一步扩大了市场份额。同时,公司还与其他技术提供商建立了战略联盟,共同研发新技术,实现了互利共赢。

问答坊 | AI 解惑

EDA工具简介

Synopsys工具简介〓 LEDA   LEDA?是可编程的语法和设计规范检查工具,它能够对全芯片的VHDL和Verilog描述、或者两者混合描述进行检查,加速SoC的设计流程。 LEDA预先将IEEE可综合规范、可仿真规范、可测性规范和设计服用规范集成,提高设计者分析 ...…

查看全部问答>

影响平行缝焊成品率的因素

影响平行缝焊成品率的因素 【来源:SMT信息网】【作者:toptouch】【时间: 2004-12-30 14:31:47】【点击: 4490】 摘要:对于一些在特殊环境下使用的光电器件,需要进行密封,以防止器件中的电路模块因潮气、大气中的离子、腐蚀气 ...…

查看全部问答>

通信——现代社会的神经中枢

通信是信息的交流与传递,而通信技术是信息交换与传递的手段。远古时代的人们利用表情或手势的形式进行思想交流;后来人类发明了语言,可以用来表达更丰富的思想和信息,但语言的交流只能面对面地进行;文字的创造、印刷术的发明,使信息能够超越时 ...…

查看全部问答>

AD/DA??????????

各位能否推荐一8位模数芯片,AD/DA集成到一个片子上的,最好是I2C接口,或spi接口的,我知道一款,但不好买,各位仁兄还知道有没有其他的吗?小弟在此先谢了啊…

查看全部问答>

关于cpu温度的读取,请高手指点

我想用WinIO.sys获取cpu的当前温度,为什么程序老是失败,temp_dwPortVal=0xffffffff 在头文件中导入: #include \"WinIO.h\" #pragma comment(lib,\"WinIo.lib\") 在实现中:         DWORD temp_dwPortVal=0;    ...…

查看全部问答>

请较一个STM32F103V8读保护的问题。

请较一个STM32F103V8读保护的问题。 我现在的PCB没有做SRAM的启动方式(我将BOOT1接GND了,BOOT0有选择高低),外部接口就只留了一个SWD的调试方式,请问一下,如果我在程序中将读保护置为有效后,再用SWD能搽出吗并更新程序吗? 还是说必须 ...…

查看全部问答>

STM32AD采样信号超过3.3V会怎么样

                                 如题,这样会不会造成AD损坏?…

查看全部问答>

哪位老大有申请的芯片转给我一块啊

申请了好多次UC3906电池充电芯片就是没给我,NND,哪位有或是能申请到的帮忙一下!…

查看全部问答>

求一个AD口暴多的mcu,推荐一下

求一个AD口暴多的mcu,推荐一下…

查看全部问答>

关于8、16、32位单片机的区别

自学开始学习单片机,差不多学会了几种,包括8位的51系列和16位的msp430系列,以及32位的arm系列。 听一些人说一般要学会8位的51单片机后学习16位和32位才会比较容易,但是我实在对于他们的区别没有明显的感觉。特别是8位和16位单片机的区别,使用 ...…

查看全部问答>