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 ;   //设置推挽输出
     
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值