首页 > 其他 > 详细

STM8 STM32 GPIO 细节配置问题

时间:2021-04-05 21:42:21      阅读:19      评论:0      收藏:0      [点我收藏+]

在MCU的GPIO配置中我们经常需要预置某一 IO 上电后为某一固定电平, 如果恰好我们需要上电后的某IO为高电平, 那么在配置GPIO的流程上面需要特别注意。
配置如下: (以下问题仅在STM8 / STM32上测试获得, 其它MCU未知)。

不合理(或者说有bug)的代码初始化流程:

/* GPIO 初始化
  ---------------------------
* DDR : 0-输入, 1-输出
  ---------------------------
* DDR   CR1   CR2
  ---------------------------
  0     0     0    悬浮输入
  0     1     0    上拉输入
  0     0     1    中断悬浮输入
  0     1     1    中断上拉输入
  ---------------------------
  1     0     0    开漏输出
  1     1     0    推挽输出
  1     X     1    输出最快10MHZ
*/
    
void bsp_io_init(void)
{
    /* PIN0 PIN1  */
1.  PB_DDR = 1 << 0 | 1 << 1 ;   //设置方向
2.  PB_CR1 = 1 << 0 | 1 << 1 ;   //
3.  PB_CR2 = 0 << 0 | 0 << 1 ;   //设置推挽输出
4. 
5.  PB_ODR = 1 << 0 | 1 << 1 ;   //设置输出电平为 1
}

如上代码的用意是配置PB0 / PB1为推挽输出,并且默认输出为高电平。 但实际的上电效果如下图所示:

技术分享图片

MCU 上电瞬间会有一个微小的低脉冲输出, 这是我们不想看到的。 正确的配置应该是先配置 ODR 寄存器, 即输出状态寄存器.然后在配置方向和控制寄存器

正确的代码初始化流程如下:

void bsp_io_init(void)
{
    PB_ODR = 1 << 0 | 1 << 1 ;   //设置输出电平为 1
    
    PB_DDR = 1 << 0 | 1 << 1 ;   //设置方向
    PB_CR1 = 1 << 0 | 1 << 1 ;   //
    PB_CR2 = 0 << 0 | 0 << 1 ;   //设置推挽输出
     
}

STM8 STM32 GPIO 细节配置问题

原文:https://www.cnblogs.com/svchao/p/14619188.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!