历史上的今天
返回首页

历史上的今天

今天是:2024年09月23日(星期一)

正在发生

2020年09月23日 | STM8s在利用库配置端口的小问题

2020-09-23 来源:eefocus

  在应用的时候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;


推荐阅读

史海拾趣

东通电子公司的发展小趣事

为满足日益增长的市场需求,东通电子在2003年新建了厂房,并于2004年整体搬迁至新址进行生产和经营。随着生产规模的扩大,公司的产能得到了大幅提升,月生产有感箔式电容器3000万只,无感金属化、无感箔式电容器4500万只。此外,东通电子还积极开拓国际市场,产品出口到多个国家和地区,实现了国际化的发展。

博流(Bouffalo Lab)公司的发展小趣事

博流智能科技始创于2016年,由一群来自硅谷顶级芯片公司的创始团队组成。他们凭借在移动通讯及物联网技术领域的深厚积累,以及对未来科技趋势的敏锐洞察,决定投身于新一代物联网集成电路芯片的研发。初创时期,公司面临着资金、技术和市场等多重挑战,但团队凭借坚定的信念和不懈的努力,逐步克服了困难,为公司的长远发展奠定了坚实基础。

Anixter Inc公司的发展小趣事

自成立以来,博流公司一直致力于物联网、车联网和智能穿戴领域集成电路芯片的研发。经过不断的技术创新和突破,公司成功推出了多款具有竞争力的芯片产品,广泛应用于智能家居、智慧城市、智能制造等领域。同时,博流还注重与物联网生态合作伙伴的紧密合作,共同提供端到端、边缘计算到云的整体解决方案,为客户创造价值。

Horizon Electronics Enterprises Group公司的发展小趣事

在21世纪初,随着数字技术的兴起,Horizon Electronics Enterprises Group(以下简称“Horizon”)由一群对电子技术充满热情的工程师创立。公司初期专注于研发高性能的半导体芯片,以解决当时市场上对高速、低功耗芯片的迫切需求。通过不懈努力,Horizon成功研发出了一款具有突破性的芯片产品,该产品在数据处理速度和能效比上远超同类产品,迅速获得了市场的认可。这一技术创新不仅为公司赢得了首批客户,也为后续发展奠定了坚实的技术基础。

Doodle Labs公司的发展小趣事

Doodle Labs公司成立于2010年代初,由一群热衷于无线通信和物联网技术的工程师创立。在成立之初,公司就明确了自己的定位:专注于开发高性能、智能化的无线电技术产品,以满足日益增长的无人机和物联网设备的需求。通过不断的技术研发和创新,Doodle Labs成功推出了其首款智能无线电产品,为无人机提供了稳定、高效的通信解决方案。

CBM_America_Corporation公司的发展小趣事

随着科技的快速发展,CBM_America_Corporation意识到传统电子产品市场的饱和趋势。为了保持竞争力,公司决定进行创新转型,将业务重心转向智能家居和物联网领域。通过研发智能家居设备和物联网解决方案,CBM成功打开了新的市场空间。同时,公司还积极拓展多元化业务,涉及到了电子支付、数据安全等领域,进一步提升了公司的综合实力。

问答坊 | AI 解惑

一种改进的电压跟随PFCCukAC/DC变换器

一种改进的电压跟随PFCCukAC/DC变换器 随着半导体器件的发展,电力电子装置的大量应用,导致大量谐波电流涌入电网,污染电网,这一问题已引起了各国的重视。为了限制总的谐波含量(THD)以提高功率因数,制定了许多标准,如IEC1000?3?2。近年来,如 ...…

查看全部问答>

求助:FFT-v2.1.1的介绍

本帖最后由 paulhyde 于 2014-9-15 09:50 编辑 哪位高手手头上有altera公司的FFT-v2.1.1 ipcore的介绍,麻烦发给我一份,不胜感激。 邮箱:hutiao-001@163.com  …

查看全部问答>

截图软件

找到一个很好的截图软件 分享一下…

查看全部问答>

最近做了一个lattice下载次数限制的VC程序.

最近做了一个lattice下载次数限制的VC程序. 有需要的可以联系我,QQ:289525317 只愿对技术人员开源,免费.…

查看全部问答>

eboot编译出错!!

在移植2440的usb下载nk功能到2410的eboot中时: s3c2410a_usbd.c文件中:三个函数定义和实现 BOOL UbootReadData (DWORD cbData, LPBYTE pbData); BOOL InitUSB (); void Isr_Init(); main.c文件中: // For USB Download function. extern ...…

查看全部问答>

嵌入式系统的学习

   我想往嵌入式系统发展,有哪位专家是在这方面发展的给我点建议,我想知道我得掌握哪些知识,嵌入式系统对c语言的要求高吗,应该掌握到哪一个程度?谢了~~…

查看全部问答>

退出系统后变量存储问题

我想要实现这样的功能:在单片机系统程序启动的时候,用键盘输入给一个变量赋值,在退出系统后这个值也保存下来,在下一次系统再次启动时该变量还是这个值,请问各位大侠C代码如何实现!…

查看全部问答>

小巧的LPC1114做图象开发板

    LPC1114到了,相机不在身边,拍不了照。呵呵!     前面已经我为他设计了一个舞台,该搭建了,让他在上面尽情的发挥。 [ 本帖最后由 zhdphao 于 2010-7-31 17:38 编辑 ]…

查看全部问答>

ucos+lwip在lm3s8962上的以太网发送问题

最近一个项目,要求使用ucos+lwip在lm3s8962上的以太网发送、接收,我ucos-ii下建立了建立了一个任务(线程)用于处理以太网发送和接收任务,TCP和UDP接收和发送都正常,但是我在一个定时器中断中调用tcp_write和udp_write发送时,就不能成功发送, ...…

查看全部问答>

万利的技术支持太扯淡了

                                 开始电话咨询,我把问题细细说了一遍,某工说电话不方便,EMAIL把程序发给他(一提及EMAIl我就冒火,没有一次回的 ...…

查看全部问答>