历史上的今天
返回首页

历史上的今天

今天是:2024年11月26日(星期二)

正在发生

2019年11月26日 | STM8S IO口基本输入输出

2019-11-26 来源:eefocus

GPIO主要功能 

● 端口的各个位可以被单独配置 

● 可选择的输入模式:浮动输入和带上拉输入 

● 可选择的输出模式:推挽式输出和开漏输出 

● 数据输入和输出采用独立的寄存器 

● 外部中断可以单独使能和关闭 

● 输出摆率控制用以减少EMC噪声 

● 片上外设的I/O功能复用 

● 当作为模拟输入时可以关闭输入施密特触发器来降低功耗 

● 在数据输出锁存时支持读-修改-写 

● 输入兼容 5V电压 

● I/O口工作电压范围为1.6 V 到VDDIOmax


STM8S的IO口相关的寄存器 

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

Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 

Px_ODR ODR7 ODR6 ODR5 ODR4 ODR3 ODR2 ODR1 ODR0 

读/写 R/w R/w R/w R/w R/w R/w R/w R/w 

复位 0 0 0 0 0 0 0 0 

Px_ODR中的x代表A、B、C、D、E等端口(下同),这个寄存器所有的位都是一样的,要输出数据的时候把数据往这个寄存器里面放就得了。


一、端口 x 输入寄存器 (Px_IDR) 

Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 

Px_IDR IDR7 IDR6 IDR5 IDR4 IDR3 IDR2 IDR1 IDR0 

读/写 R R R R R R R R 

复位 —— —— —— —— —— —— —— —— 

无论是输入还是输出模式,都可以通过这个寄存器读取IO电平, 

0=低电平; 

1=高电平;


二、端口 x 数据方向 (Px_DDR) 

Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 

Px_DDR DDR7 DDR6 DDR5 DDR4 DDR3 DDR2 DDR1 DDR0 

读/写 R/W R/W R/W R/W R/W R/W R/W R/W 

复位 0 0 0 0 0 0 0 0 

IO口方向操作 

0=输入模式; 

1=输出模式;


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

注意: 初始复位时,所有引脚设置为浮空输入。 

Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 

Px_CR1 C17 C16 C15 C14 C13 C12 C11 C10 

读/写 R/W R/W R/W R/W R/W R/W R/W R/W 

复位 0 0 0 0 0 0 0 0 

这个寄存器在输入输出不同模式下有不同的功能 

在 输入模式时(DDR=0): 

0:浮空输入 

1::带上拉电阻输入 

在 输出模式时(DDR=1): 

0:模拟开漏输出(不是真正的开漏输出) 

1: 推挽输出, 由CR2相应的位做输出摆率控制


四、端口 x 控制寄存器 2 (Px_CR2)


Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 

PxCR2 C27 C26 C25 C24 C23 C22 C21 C20 

读/写 R/W R/W R/W R/W R/W R/W R/W R/W 

复位 —— —— —— —— —— —— —— ——

这个寄存器在输入输出不同模式下有不同的功能 

在 输入模式时(DDR=0): 

0: 禁止外部中断 

1: 使能外部中断 

在 输出模式时(DDR=1): 

0:输出速度最大为2MHZ. 

1:输出速度最大为10MHZ


 ```

例;

IO输出,PE5输出高低电平

/*这个工程模板是别人的,并不是按照官方的标准模板,

这个头文件型号不影响编程*/

#include  


#define LED_On      PE_ODR |=  1<<5      //PE5输出1,低电平有效

#define LED_Off     PE_ODR &= ~(1<<5)    //PE5输出0


void delay(unsigned int ms);

void InitLED(void);


//********************************

int main(void)

{


  CLK_CKDIVR = 0x00;      /*内部时钟为1分频 = 16Mhz,

                          每个工程都要初始化时钟*/

  InitLED();              //调用LED初始化函数

  while(1)

  {

     LED_On;

     delay(100);         //空跑大概延时


     LED_Off;

     delay(100);          //空跑大概延时

  }

}


//***********************************

//这只是概大延时,时间并不精准

void delay(unsigned int ms)

{

  unsigned int x , y;

  for(x = ms; x > 0; x--)    

    for(y = 3000 ; y > 0 ; y--);

}


void InitLED()

{

    PE_DDR |= 1<<5;//PE5方向为输出

    PE_CR1 |= 1<<5;//PE5为推挽输出

    PE_CR2 |= 1<<5;//最大输出速度为10M

    PE_ODR |= 1<<5;//PE5输出1

}



----------



例;PE5的LED状态翻转

/*这个工程模板是别人的,并不是按照官方的标准模板,

这个头文件型号不影响编程*/

#include  


#define LED_Reverse      PE_ODR ^=1 <<5     //PE5输出状态翻转


void delay(unsigned int ms);

void InitLED(void);


//********************************

int main(void)

{

  CLK_CKDIVR = 0x00;      /*内部时钟为1分频 = 16Mhz,

                          每个工程都要初始化时钟*/

  InitLED();              //调用LED初始化函数

  while(1)

  {

     LED_Reverse;

     delay(100);         //空跑大概延时

  }

}


//***********************************

//这只是概大延时,时间并不精准

void delay(unsigned int ms)

{

  unsigned int x , y;

  for(x = ms; x > 0; x--)    

    for(y = 3000 ; y > 0 ; y--);

}


void InitLED()

{

    PE_DDR |= 1<<5;//PE5方向为输出

    PE_CR1 |= 1<<5;//PE5为推挽输出

    PE_CR2 |= 1<<5;//最大输出速度为10M

    PE_ODR |= 1<<5;//PE5输出1

}



----------

例;PC1按键输入,触发PE5的LED状态翻转

/*这个工程模板是别人的,并不是按照官方的标准模板

这个头文件型号不影响编程*/

#include  


#define LED_Reverse   PE_ODR ^=1 <<5  //PE5输出状态翻转


void InitLED(void);

void InitKey(void);


//********************************

int main(void)

{

  CLK_CKDIVR = 0x00; //内部时钟为1分频 = 16Mhz,每个工程都要初始化时钟

  InitLED();             //调用LED初始化函数

  InitKey();             //初始化按键输入

  while(1)

  {

    if((PC_IDR&0x02)==0)//PC1是上拉输入,当把PC1短接到gnd后

                        //LED状态会翻转,这里并没有消抖

       LED_Reverse;

  }

}

//********************************************************

//子函数

void InitLED()

{

    PE_DDR |= 1<<5;//PE5方向为输出

    PE_CR1 |= 1<<5;//PE5为推挽输出

    PE_CR2 |= 1<<5;//最大输出速度为10M

    PE_ODR |= 1<<5;//PE5输出1

}

void InitKey(void)

{

  PC_DDR &= ~(1<<1);//PC1方向为输入

  PC_CR1 |= 1<<1;   //PC1上拉输入

  PC_CR2 &= ~(1<<1);//PC1不使能中断

}

推荐阅读

史海拾趣

Apex [Apex Microtechnology]公司的发展小趣事

Apex Microtechnology成立于1980年,自创立之初,公司便专注于功率模拟技术的研发,为工业、国防和航空航天等领域提供高精确控制电流、电压和速度的解决方案。凭借其在功率驱动器和放大器领域的专业知识,Apex Microtechnology逐渐在电子行业中崭露头角,吸引了众多客户的关注。

BITECH公司的发展小趣事

Apex Microtechnology一直致力于开发在性能、质量和可靠性方面引领行业的产品。通过不断创新和研发,公司成功推出了多款具有竞争力的功率模拟产品,为全球客户提供高效的解决方案。同时,Apex Microtechnology也积极拓展全球市场,与众多知名企业建立了合作关系,进一步提升了其在电子行业的影响力。

Cressall Power Resistors公司的发展小趣事

Cressall一直注重企业文化建设和团队建设。公司倡导“创新、协作、诚信、责任”的核心价值观,鼓励员工勇于创新、敢于担当。同时,公司还加强了对员工的培训和激励,为员工提供了良好的职业发展平台。这些措施有效提升了员工的凝聚力和归属感,为公司的持续发展提供了有力的人才保障。

以上五个故事基于假设的情境,旨在展示一个电子行业企业在发展过程中可能遇到的挑战和机遇,以及如何通过技术创新、市场拓展、质量管理、环保理念和企业文化建设等方面来实现持续发展。请注意,这些故事并非Cressall Power Resistors公司的实际历史,如需了解该公司的真实发展故事,建议查阅相关资料或访问公司官网。

Electrocube Inc公司的发展小趣事

随着科技的不断进步,Electrocube Inc公司始终将技术创新作为发展的核心动力。公司投入大量研发资金,积极引进高端人才,不断推出具有领先水平的电子产品。其中,一款具有自主知识产权的高温电容器,以其卓越的性能和稳定性,在航空航天、汽车电子等高端领域得到了广泛应用,进一步提升了公司的市场竞争力。

Herotek Inc公司的发展小趣事

在消费电子领域,Henkel的粘合剂技术同样发挥着重要作用。随着智能手机、平板电脑等终端设备的不断迭代升级,对结构粘接、散热等方面的要求也越来越高。Henkel针对这些需求,提供了定制化的粘合剂解决方案。例如,其导热凝胶和导热垫片产品能够有效提升设备的散热性能,确保设备在高强度使用下依然保持稳定的性能。此外,Henkel还针对全面屏、折叠屏等新型屏幕技术,推出了专门的聚氨酯热熔胶解决方案,帮助手机厂商提高屏占比和用户体验。

Cypress Industries公司的发展小趣事

Cypress在半导体制造领域一直处于技术革新的前沿。公司不断引入新的工艺技术,从早期的0.8微米CMOS技术到后来的0.21微米工艺,不断推动产品性能的提升。这种对技术的持续投入和追求,使Cypress在行业内树立了良好的技术形象,并赢得了客户的广泛认可。

问答坊 | AI 解惑

能否有办法查出本线程在运行过程中有没有被其它线程抢占时间片?

假设某一线程就绪后开始运行,需要比较长的时间,大概500ms,如果这个过程被其它线程抢占,则必须想办法让这个线程知道自己被抢占过。 仅靠CE的API函数,而不动用硬件定时器,能办到吗? …

查看全部问答>

DLL导出函数名与调用函数名不一致

  今天调用一个dll,生成时提示这样的错误error LNK2019: 无法解析的外部符号 \"__declspec(dllimport) public: static int __cdecl CAudioAdapter::PlayMedia(unsigned short const *,long)\" (__imp_?PlayMedia@CAudioAdapter@@SAHPBGJ ...…

查看全部问答>

系统启动是自动加载 USB摄像头

我在wince 5.0的注册表配置文件platform.reg下,加了[HKEY_LOCAL_MACHINE\\Drivers\\BuiltIn\\USB\\camera]USB 的摄像头表值如下:          \"DLL\" = \"zc030x.dll\"         \"Prefix\" = ...…

查看全部问答>

EVC连接SQLCE出问题:recordset 的open方法总是提示:first—chance exception in XX.exe:0X0

EVC连接SQLCE出问题:recordset   的open方法总是提示:first—chance   exception   in   XX.exe:0X00000f0:stack   overflow。 程序如下            ...…

查看全部问答>

请教关于SetFilePointer和IRP_MJ_SET_INFORMATION的问题

我在文件过滤驱动中拦截了IRP_MJ_SET_INFORMATION,为什么在用户层调用SetFilePointer后,我的文件过滤驱动中拦截不到IRP_MJ_SET_INFORMATION呢? 我用了FileSpy和Irptracker发现就没有IRP_MJ_SET_INFORMATION产生,这是为什么呢?…

查看全部问答>

求助

                                 我用的是69p55,《中颖单片机入门与实战》一书中说SBCM  Mx  ,bbb是Mx-A+CY 当Mx>=A时 CY被 ...…

查看全部问答>

怎么保护程序不被非法读取?

怎么定义中断存储器中的内容,禁止bootstrap非法读取代码和数据?…

查看全部问答>

全国大学生电子设计竞赛

本帖最后由 paulhyde 于 2014-9-15 03:59 编辑 全国大学生电子设计竞赛资料  …

查看全部问答>

BeagleBone GPMC接口读写FPGA双口RAM 高速数据采集 DDS波形发生器

前面完成BeagleBone从Nand Flash的启动,之后花了一段时间试验BeagleBone GPMC读写外部存储器,针对BeagleBone的GPMC接口扩展一块FPGA板子,基本功能就是在FPGA里做一个双口RAM,BeagleBone GPMC实现对双口RAM的读写操作。当然,FPGA外挂高速AD及DA ...…

查看全部问答>

以太网数据通信模拟需要哪些软件

小弟弟我最近在搞以太网的通信试验 但是我没有开发板 所以ARM7的,cm3的都无所谓 但是不知道如果可以的话需要哪些模拟软件,编译器用KEIL 目前只需要实现通过RJ45网口的数据传输功能即可 谢谢各位了…

查看全部问答>