STM8s在利用库配置端口的小问题

发布者:温馨阳光最新更新时间:2020-09-23 来源: eefocus关键字:STM8s  配置端口 手机看文章 扫描二维码
随时随地手机看文章

  在应用的时候PA2口需要设置成推挽输出,控制一个外部电源开关,端口初始化程序如下:

    GPIO_DeInit(GPIOA);

    GPIO_Init(GPIOA,GPIO_PIN_2,GPIO_MODE_OUT_PP_HIGH_SLOW);

  在设置完后,端口会马上输出高电平,于是又加了一句:

    GPIO_WriteLow(GPIOA,GPIO_PIN_2);

  完成之后,发现被供电的器件在第一次上电的时候会被触发,而程序并没有在PA2输出高电平。这个被供电器件配有供电电池如果检测到端口有高电平就会启动,

用示波器观察PA2口,发现在上电瞬间会有一个短脉冲,看来就是这个问题。查看了一下库函数的源代码:

void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef GPIO_Pin, GPIO_Mode_TypeDef GPIO_Mode)
{

  assert_param(IS_GPIO_MODE_OK(GPIO_Mode));
  assert_param(IS_GPIO_PIN_OK(GPIO_Pin));

  /* Reset corresponding bit to GPIO_Pin in CR2 register */
  GPIOx->CR2 &= (uint8_t)(~(GPIO_Pin));

  /*-----------------------------*/
  /* Input/Output mode selection */
  *-----------------------------*/

  if ((((uint8_t)(GPIO_Mode)) & (uint8_t)0x80) != (uint8_t)0x00) /* Output mode */
  {
    if ((((uint8_t)(GPIO_Mode)) & (uint8_t)0x10) != (uint8_t)0x00) /* High level */
  {
    GPIOx->ODR |= (uint8_t)GPIO_Pin;
  }
  else /* Low level */
  {
    GPIOx->ODR &= (uint8_t)(~(GPIO_Pin));
  }
  /* Set Output mode */
    GPIOx->DDR |= (uint8_t)GPIO_Pin;
  }
  else /* Input mode */
  {
    /* Set Input mode */
    GPIOx->DDR &= (uint8_t)(~(GPIO_Pin));
  }

/*------------------------------------------------------------------------*/
/* Pull-Up/Float (Input) or Push-Pull/Open-Drain (Output) modes selection */
/*------------------------------------------------------------------------*/

  if ((((uint8_t)(GPIO_Mode)) & (uint8_t)0x40) != (uint8_t)0x00) /* Pull-Up or Push-Pull */
  {
    GPIOx->CR1 |= (uint8_t)GPIO_Pin;
  }
  else /* Float or Open-Drain */
  {
    GPIOx->CR1 &= (uint8_t)(~(GPIO_Pin));
  }

  /*-----------------------------------------------------*/
  /* Interrupt (Input) or Slope (Output) modes selection */
  /*-----------------------------------------------------*/

  if ((((uint8_t)(GPIO_Mode)) & (uint8_t)0x20) != (uint8_t)0x00) /* Interrupt or Slow slope */
  {
    GPIOx->CR2 |= (uint8_t)GPIO_Pin;
  }
  else /* No external interrupt or No slope control */
  {
    GPIOx->CR2 &= (uint8_t)(~(GPIO_Pin));
  }
}

  从源码看来,是先把CR2清零了。然后写DDR方向寄存器1是输出,0是输入,然后是CR1。这个配合DDR可以确定4中方式:DDR为0的时候CR1为0的时候是:悬浮输入,CR1为1的时候是上拉输入,DDR为1的时候CR1为0的时候是:开漏输出,CR1为1的时候是:推挽输出。CR1在DDR为0的时候是外部中断的开关,1是开,0是关,DDR为1的时候是控制摆率的,如果需要比较陡峭的边沿可以设置成1。

  不知道为什么会出现这个,硬件仿真发现CR1置位之后就会被拉高,后来我用寄存器方式设置有正常了,代码如下:

  GPIOA->CR2 |= 0x04;
  GPIOA->DDR |= 0x04;
  GPIOA->CR1 |= 0x04;


关键字:STM8s  配置端口 引用地址:STM8s在利用库配置端口的小问题

上一篇:STM8s窗口看门狗
下一篇:STM8S103F3--EEPROM

推荐阅读最新更新时间:2024-10-31 13:13

卡机器人系列之六大汽车配件用机器人
  汽车零配件业对于汽车工业具有越来越重要的意义。汽车零配件业创造价值约达汽车工业的 80 %,除了从事元件生产外,还承担很多研发工作。如今,大部分的创新产品都来自汽车零配件业。   同时汽车制造商的要求也不断提高:此行业的研发周期越来越短、对品质、生产率和生产灵活性的要求日益提高,同时还要求供货的即时可靠度。所以库卡机器人对于提高汽车零配件业的生产率起着日益重要的作用这一点就不足为奇了。   从轮胎到汽油软管、从发动机组到玻璃、从方向盘到塑料部件:它适用于各种用途。因为配备了灵活的应用程式和易于操作的控制技术,即使在极其恶劣的环境下也可确保生产流程不会出现故障而且无需保养。再加上其投资费用低以及加工灵活性极高的优势,它可以帮助此
[机器人]
在Keil4中建立基于V3.4.0固件的STM32工程
几个月前刚接触STM32时,第一感觉就是固件库里的文件又多又深,还好发现固件库里自带有范例文件,但是它们全都是针对特定的评估板的,手头只有一块STM MCU 3 in 1 MiniKit。虽说作些修改就可为我所用,可对于像我这样还没入门的菜鸟,知道要如何修改,并且编译通过,却是非常困难。 昨晚闲暇,在网上找了一些资料,自己也学着新建了一个工程。今天写下来,顺带温故一遍。 首先介绍一下操作环境: Keil版本: μVision 4.1.0 STM32固件库版本: V3.4.0 第一步,建立工程文件夹,在其子文件夹内拷贝并整理好相应的文件。 1.1、建立工程文件夹,将它命名为 Sys
[单片机]
STM8S程序常见错误解决方案
一、IAR中的重复定义问题 在自己写头文件时,要记得将常量定义在.c文件中,如果将常量定义在.h文件中,当在main.c或者其他地方包含该头文件时,会将头文件中的常量定义包含到main.c中,同时,相应的.c文件也有该常量定义语句,就会导致linker报错,有xxxx重定义(redefined)。此外,当要在main.c中使用其他.c文件中定义的量时,要记得+ extern+ +。 标准的做法:在.h文件中声明变量,在一个.c文件中定义变量,其它.c文件要用到变量只要包含.h头文件,相当于变量声明,就可以引用其它.c文件中定义的变量了。一般只在头文件中声明变量,在原文件中定义变量,即使你在头文件中使用了预编译指令 #ifnde
[单片机]
<font color='red'>STM8S</font>程序常见错误解决方案
RS Components进一步扩充3D CAD 数据
世界领先电子产品和维修产品的高端服务分销商,亦是Electrocomponents plc (LSE: ECM) 的交易品牌,RS Components 进一步扩充其免费的网上 3D CAD 产品模型库。最新的 3D CAD 数据库包括由全球最大互连产品制造商 Molex 和全球一线电子零部件供货商 Omron 共同提供的 2000 多款产品的全新三维模型。RS Components 官网现已提供这些源自供货商 3D CAD 模型的免费下载,从而使电子产品设计工程师能够更快、更便捷地进行产品设计。   随着应用最新技术的 1000 个 Molex 连接部件 3D 模型在网上推出,RS Components目前已提供了 7000 多个
[嵌入式]
51单片机汇编程序
简介:下面是一些51单片机汇编语言编程常用到的子程序代码库 1、片内RAM初始化子程序 2、片外RAM初始化子程序 3、片外RAM初始化子程序(双字节个单元) 4、内部RAM数据复制程序 5、外部RAM数据复制程序 6、外部RAM数据复制程序 7、外部RAM数据复制到内部RAM程序 8、限幅滤波程序 9、中位值滤波程序 10、N点算术平均滤波 11、N点加权平均滤波 12、一阶加权滞后滤波程序 13、双字节取补程序 14、N节取补程序 15、双字节无符号数加法程序 16、N字节无符号数加法程序 17、双字节无符号数减法程序 18、N字节无符号数减法程序 19、单字节无符号数乘法程序 20、单字节无符号数乘法程序 21、单字节无
[单片机]
14-HAL之I2C通信
1.I2C协议介绍 I2C是一个支持多设备的总线,可连接多个I2C通讯设备,每个总线包括一条双向串行数据线(SDA)和一条串行时钟线(SCL)。数据线用来表示数据,时钟线用来数据收发同步。通讯过程如下: S:主机的I2C接口产生的传输开始信号,连接在I2C总线上的所有从机都会接收到。 SLAVE_ADDRESS:主机广播的从机地址信号,I2C总线上每个从机地址唯一。 R/W:读写方向,置1为读,置0为写。 A/A-:从机接收到匹配的地址后,主机或从机会返回一个应答信号或非应答信号,只有接收到应答信号主机才继续发送接收数据。写数据的时候,每次发送一个字节数据(DATA:8位)后,都要等待应答信号,重复这个过程可
[单片机]
14-HAL<font color='red'>库</font>之I2C通信
基于LabWindows/CVI的数据编程
    在测试系统的应用开发中,测试数据通常是以文件的方式进行组织管理的。这样的数据存储方式有一定的局限性,特别是远程测试系统,对于大量的数据不能及时的反馈。要实现方便灵活的管理和访问,数据库是一种必然的选择。     LabWindows/CVI是一个完全的标准C开发环境,用于开发虚拟仪器应用系统。CVI5.5及以后的版本提供了支持数据库的sQL TOOLKIT工具包,该工具包提供了丰富的数据库操作函数,给开发带来了方便和快捷。 1 基于PCI的数据采集     对于非NI公司的PCI数据采集卡,一般的驱动程序都是以动态链接库的形式提供的。对于CVI而言,可以直接利用驱动程序的动态链接库文件实现对采集卡的控制。本文采用中泰PCI
[测试测量]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved