STM8 STM32 GPIO 细节配置问题

在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 ;   //设置推挽输出
     
}
posted @ 2021-04-05 19:31  svchao  阅读(322)  评论(0)    收藏  举报