历史上的今天
返回首页

历史上的今天

今天是:2024年09月26日(星期四)

正在发生

2021年09月26日 | STM8配置GPIO输入输出功能

2021-09-26 来源:eefocus

1.GPIO工作模式

    输入:

        浮空输入

        上拉输入

    输出:

        推挽输出

        开漏输出

(1).浮空输入:浮空输入,可以做KEY识别,RX1

(2).带上拉输入:IO内部上拉电阻输入

(3).开漏输出:IO输出0接GND,IO输出1,悬空,需要外接上拉电阻,才能实现输出高电平。当输出为1时,IO口的状态由上拉电阻拉高电平,但由于是开漏输出模式,这样IO口也就可以由外部电路改变为低电平或不变。

(4).推挽输出:IO输出0-接GND,IO输出1 -接VCC,读输入值是未知的


2.软件配置

    参考:STM8S中文书据手册、原理图、google

    初始化流程:

        cpu时钟初始化

        IO输入输出选择

        IO模式选择

        IO输出/输入电平


    (1).CPU时钟初始化(所有STM8工程,都需要先设置时钟)

        内部时钟寄存器(CLK_ICKR):

            高速内部RC振荡器使能

            高速内部振荡器准备就绪

                CLK_ICKR = 0x03;

            时钟分频寄存器(CLK_CKDIVR):

                CLK_CKDIVR = 0x01; //cpu work on  16/2=8MHz


    (2).IO寄存器配置

        a.IO输入输出选择:

        端口x数据方向 (Px_DDR): x可以是A/B/C/D, 分别代表端口A/B/C/D

        输入模式:

            Px_DDR = 0x00; //端口x全部设置为输入模式

        输出模式:

            Px_DDR = 0x00; //端口x全部设置为输出模式


        b.IO模式选择:

        端口x控制寄存器1 (Px_CR1):

        输入模式:

             浮空输入:Px_CR1 = 0x00; //端口x全部设置为浮空输入

             带上拉电阻输入:Px_CR1 = 0xFF; //端口x全部设置为带上拉电阻

        输出模式:

             模拟开漏输出:Px_CR1 = 0x00; //端口x全部设置为模拟开漏输出

             推挽输出:Px_CR1 = 0xFF; //端口x全部设置为推挽输出


        c.IO输入/输出电平:

        端口x输入寄存器 (Px_IDR):

              Input = Px_IDR & 1; //当Input 为0时,端口Px的第0位输入低电平

                                               //当Input 为1时,端口Px的第0位输入高电平

         端口x输出数据寄存器(Px_ODR):

             Px_ODR |= 0xFF; //端口x全部输出高电平

             Px_ODR &= 0xFF; //端口x全部输出低电平


3.附上源码


    1.main.c

 


/* MAIN.C file

 * 

 * Copyright (c) 2002-2005 STMicroelectronics

 */

 

#include

#include "stm8s_type.h"

#include "stm8s103f.h"

#include "stm8s.h"

 

#include "gpio.h"

 

 

//test gpio

void test_gpio(void)

{

TGpioProperty Portx;

 

//PD3 上拉输出 低电平设置 

Portx.port = PORTD; //选中端口

Portx.dir = 1; //输入、输出选择

Portx.mode = 1; //模式选择

Portx.index = 3; //端口那个

Portx.outlevel = 0; //输出时电平选择,输入模式无效

 

init_Pxx_as_gpio(Portx);

 

Portx.outlevel = 1;

set_Pxx_level(Portx);

}

 

 

int main(void)

{

 

bool PD3_level = 0;

TGpioProperty Portx;

 

CLK_ICKR = 0x03; /// open interval RTC and wakeup

/// set cpu freq.

CLK_CKDIVR = 0x00; //cpu work on  16MHz

 

delay_us(5000);

 

 

 

//test gpio

test_gpio();

 

 

Portx.port = PORTD;

Portx.dir = 0;

Portx.mode = 1;

Portx.index = 3;

Portx.outlevel = 0;

 

init_Pxx_as_gpio(Portx);

 

while (1)

{

PD3_level = get_Pxx_level(Portx);

 

if(PD3_level)

{

}

else

{

}

delay_us(1000000);

}

}


    2.gpio.c


/*

 * gpio.c

 *

 *  Created on: Oct 25, 2019

 *      Author: 

 * Email : 

 */

 

#include "stm8s.h"

#include "stm8s103f.h"

#include "gpio.h"

 

 

//GPIO输入输出

#define PADIR(dir, index) {dir == 0? (PA_DDR &= ~(1<#define PBDIR(dir, index) {dir == 0? (PB_DDR &= ~(1<#define PCDIR(dir, index) {dir == 0? (PC_DDR &= ~(1<#define PDDIR(dir, index) {dir == 0? (PD_DDR &= ~(1< 

//GPIO模式选择

#define PAMODE(mode, index) {mode == 0? (PA_CR1 &= ~(1<#define PBMODE(mode, index) {mode == 0? (PB_CR1 &= ~(1<#define PCMODE(mode, index) {mode == 0? (PC_CR1 &= ~(1<#define PDMODE(mode, index) {mode == 0? (PD_CR1 &= ~(1< 

//输出电平设置

#define PA_OLEVEL(dir, index, level) {dir == 1? (level == 0? (PA_ODR &= ~(1<#define PB_OLEVEL(dir, index, level) {dir == 1? (level == 0? (PB_ODR &= ~(1<#define PC_OLEVEL(dir, index, level) {dir == 1? (level == 0? (PC_ODR &= ~(1<#define PD_OLEVEL(dir, index, level) {dir == 1? (level == 0? (PD_ODR &= ~(1< 

//输入电平设置

#define PA_ILEVEL(index) (PA_IDR & (1<#define PB_ILEVEL(index) (PB_IDR & (1<#define PC_ILEVEL(index) (PC_IDR & (1<#define PD_ILEVEL(index) (PD_IDR & (1< 

void init_Pxx_as_gpio(TGpioProperty Portx)

{

switch(Portx.port)

{

case PORTA:

PADIR(Portx.dir, Portx.index);

PAMODE(Portx.mode, Portx.index);

PA_OLEVEL(Portx.dir, Portx.index, Portx.outlevel);

break;

case PORTB:

PBDIR(Portx.dir, Portx.index);

PBMODE(Portx.mode, Portx.index);

PB_OLEVEL(Portx.dir, Portx.index, Portx.outlevel);

break;

case PORTC:

PCDIR(Portx.dir, Portx.index);

PCMODE(Portx.mode, Portx.index);

PC_OLEVEL(Portx.dir, Portx.index, Portx.outlevel);

break;

case PORTD:

PDDIR(Portx.dir, Portx.index);

PDMODE(Portx.mode, Portx.index);

PD_OLEVEL(Portx.dir, Portx.index, Portx.outlevel);

break;

default:

break;

}

}

 

void set_Pxx_level(TGpioProperty Portx)

{

switch(Portx.port)

{

case PORTA:

PA_OLEVEL(Portx.dir, Portx.index, Portx.outlevel);

break;

case PORTB:

PB_OLEVEL(Portx.dir, Portx.index, Portx.outlevel);

break;

case PORTC:

PC_OLEVEL(Portx.dir, Portx.index, Portx.outlevel);

break;

case PORTD:

PD_OLEVEL(Portx.dir, Portx.index, Portx.outlevel);

break;

default:

break;

}

}

 

bool get_Pxx_level(TGpioProperty Portx)

{

bool level = 0;;

 

switch(Portx.port)

{

case PORTA:

level = PA_ILEVEL(Portx.index);

break;

case PORTB:

level = PB_ILEVEL(Portx.index);

break;

case PORTC:

level = PC_ILEVEL(Portx.index);

break;

case PORTD:

level = PD_ILEVEL(Portx.index);

break;

default:

break;

}

 

return level;

}

    3.gpio.h


/*

 * gpio.h

 *

 *  Created on: Oct 25, 2019

 *      Author: 

 * Email : 

 */

 

#ifndef DEVICE_GPIO_GPIO_H_

#define DEVICE_GPIO_GPIO_H_

 

#include

 

#define INPUT 0

#define OUTPUT 1

 

#define LOW_LEVEL 0

#define HIGHT_LEVEL 1

 

#define PushPullOutput 1

#define OpenDrainOutput 0

#define PullUpInput 1

#define FloatingiInput 0

 

typedef enum {

PORTA = 0,

PORTB = 1,

PORTC = 2,

PORTD = 3

}PORTx;

 

 

typedef struct _gpio_property

{

PORTx port; //A~D

bool dir; //INPUT 0, OUTPUT 1

unsigned char mode; //输入:上拉输入1   浮空输入 0;  输入:开漏输出0   推挽输出1

unsigned char index; //端口下标

unsigned char outlevel; //输出时电平选择,输入模式无效

}TGpioProperty, *PGpioProperty;

 

 

void init_Pxx_as_gpio(TGpioProperty Portx);

void set_Pxx_level(TGpioProperty Portx);

bool get_Pxx_level(TGpioProperty Portx);

 

#endif /* DEVICE_GPIO_GPIO_H_ */

推荐阅读

史海拾趣

Cotco公司的发展小趣事

为了提升竞争力,Cotco公司高度重视技术创新和产品研发。公司投入大量资金建立了先进的研发中心,吸引了一批顶尖的电子工程师和研发人员。通过不断的技术攻关和市场调研,Cotco成功开发出一系列具有自主知识产权的电子产品,包括高性能的电源适配器、稳定可靠的数据线等。这些产品凭借卓越的性能和合理的价格,迅速在市场上占据了一席之地。

聚洵(Gainsil)公司的发展小趣事

在电子行业竞争日趋激烈的背景下,Cotco公司深知供应链管理和成本控制的重要性。公司与主要供应商建立了长期稳定的合作关系,确保原材料的稳定供应和成本控制。同时,Cotco不断优化生产流程和物流管理,降低生产成本和运营成本。这些举措使得Cotco的产品在价格上具有更强的竞争力,进一步巩固了其在市场上的地位。

Holtek(合泰)公司的发展小趣事

面对电子行业日新月异的变化和不断涌现的新挑战,Cotco公司始终保持敏锐的市场触觉和应变能力。公司及时调整战略方向,加大在新兴领域如物联网、智能家居等的投入和研发力度。同时,Cotco也积极拓展国际市场,与全球多个国家和地区的合作伙伴建立合作关系,推动产品的全球化销售和服务。展望未来,Cotco将继续秉承创新、质量和服务的理念,致力于成为全球电子行业的佼佼者。

DBS Microwave Inc公司的发展小趣事

作为一家有社会责任感的企业,DBS Microwave始终关注环境保护和可持续发展。公司积极采用环保材料和生产工艺,减少生产过程中的污染排放。同时,公司还积极参与社会公益活动,为当地社区的发展做出了积极贡献。这些举措不仅提升了公司的社会形象,也为公司的长期发展奠定了坚实的基础。

诚润电子(CHEVRON)公司的发展小趣事

随着公司业务的不断发展,诚润电子开始积极拓展海外市场。他们通过参加国际展会、与海外客户建立合作关系等方式,逐渐将产品推向全球。在这个过程中,诚润电子不仅提升了自身的品牌知名度,还积累了丰富的国际市场经验。如今,诚润电子的产品已经出口到多个国家和地区,成为了全球电子保护元件领域的重要供应商之一。

Elytone Electronics Co Ltd公司的发展小趣事

在技术创新取得突破后,Elytone公司开始积极拓展国内外市场。他们通过参加国际电子展、建立海外销售网络等方式,不断扩大产品的影响力。同时,公司还加强了与国内外知名企业的合作,共同研发新产品,进一步提升了市场竞争力。

问答坊 | AI 解惑

中国程序员技术偏低的原因

首先来说一个高级程序员并非靠自己读几本书写几万行代码就能练就的,我更关注于低层的环境,也就是程序员实实在在的工作环境。因为程序员的高低还得从实际的工作来衡量,而非其它。所以我想说的是,中国的软件公司的性质直接导致程序员的水平的高低 ...…

查看全部问答>

LM3S8962通过网页控制硬件运行(我也说)

看了jiao430发的《LM3S8962通过网页控制硬件运行》 我认为大多数人还不知道为什么会这样,jiao430为大家发了他的软件包, 其实在TI的软件基础上只需要改一句话而已。 就是把原来的动态IP改成静态,IP地址自己设置就好了, lwIPInit(pucMACArray ...…

查看全部问答>

嵌入式指纹采集与对比系统开发

大四毕业设计求解答 目前有ARM9 2440板子,想找到与之配套的指纹采集仪器,不知道什么样的能用,不知道大家有没有懂得的 希望大家帮忙解答…

查看全部问答>

ibm X3550 M2(7946)可以使用别的硬盘吗

公司现在有一台ibm X3550 M2(7946)服务器 不过硬盘只有一块,SAS 146G的 想再加一块硬盘,想问下可不可以使用别的硬盘啊 不使用IBM的,这个太贵了。…

查看全部问答>

求助,关于isd1790语音芯片的问题

我的isd1790按照说明电路连接却无法正常工作,led也闪烁,为什么,请高手解答一下呀…

查看全部问答>

寻找PDA平台作二次开发!

有量! jwxubj@163.com 13717535861 北京 同时寻求兼职EVC开发!…

查看全部问答>

请教语音方面的问题

想做一个通过语音芯片将语音采集,并通过无线传输,传输到PC机上实现语音识别功能,请问各位高手,用什么语音芯片比较好,由相关的技术资料吗? 先谢谢了 各位给点帮助。。。。。。…

查看全部问答>

扩频通信仿真,用TMS320C6474实现,大侠现身相救啦

我用simulink做的扩频通信仿真,直扩和跳频的都做了。老师希望用TI的DSP板子(型号TMS320C6474)实现其中的一种。小弟之前从未接触过TI的板子,也没有相关的编程经验,希望哪位大哥可以回答以下几个问题,给一些启发:1,据说simulink可以直接生成D ...…

查看全部问答>