根据这个程序逻辑如何控制其它引脚电平,比如说PB1,GPIOB_ODR &= ~(1<<0);按照C语言怎么理解

已知这是控制PB0引脚为低电平
// 打开GBIOB端口的时钟
RCC_APB2ENR |= ( (1) << 3 );

// 配置IO口为输出
GPIOB_CRL &= ~( (0x0f) << (4*0) );
GPIOB_CRL |= ( (1) << (4*0) );

// 控制ODR寄存器
GPIOB_ODR &= ~(1<<0);
//GPIOB_ODR |= (1<<0);

    stm32以及其它芯片的编程实际上就是操作寄存器。

    stm32的寄存器的含义在它的技术手册中可以查找到,可以看到它每一位的含义。

    |= ( (1) << x )的操作结果就是把这个寄存器的bitxç½®1, &= ~(1<<x)的操作结果就是把bitxç½®0.这样的操作都是为了不影响寄存器的其它位,只去操作指定的bit。至于这两个表达式的运算,你应该清楚吧?不清楚的话可以追问。

    操作io口一般就是3步,如你代码中注释所写。第一步打开时钟,第二步初始化IO口,第三步操作。

    RCC_APB2ENR |= ( (1) << 3 );这一步是把RCC_APB2ENR的bit3置1,即使能GPIOB时钟。对应的应该有stm32的库函数如RCC_APB2PeriphClockCmd.如果你查看对应芯片的datasheet,应该可以看到对这一bit的描述是类似这样的.

    那么如果你要使用GPIOC,那就需要去使能RCC_APB2ENR对应的GPIOC的bit,例如RCC_APB2ENR |= ( (1) << 4 );(如果GPIOC对应的使能bit是bit4的话)

    GPIOB_CRL &= ~( (0x0f) << (4*0) );
    GPIOB_CRL |= ( (1) << (4*0) );同样的道理,去查看寄存器GPIOB_CRL 的定义,不过技术手册中应该是GPIOx_CRL,因为所有的io port的格式是一样的 

    如果你要操作PB1,应该修改后两步,GPIOB_CRL &= ~( (0x0f) << (4*1) );
    GPIOB_CRL |= ( (1) << (4*1) );   GPIOB_ODR &= ~(1<<1);(没有看到datasheet,猜测应该如此)

    最后一点,建议使用stm32官方库函数,编程方便,且以后也便于移植。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2019-01-29
将其中的0替换成1即可实现PB1的设置,替换成几就是PB几追问

为什么我试过了没有用呢,如果把PB1设置成高电平,可以用GPIOB_ODR |= (1<<1)设置吗

追答

还需要设置GPIOB_CRL中相应位,将GPB_1设置成输出。
具体需要查看所使用的cpu数据手册中关于配置GPIO部分的文档,查阅上述程序涉及的寄存器定义

本回答被提问者采纳
第2个回答  2019-01-29
|= ( (1) << x )的操作结果就是把这个寄存器的bitx置1, &= ~(1<<x)的操作结果就是把bitx置0.这样的操作都是为了不影响寄存器的其它位,只去操作指定的bit。至于这两个表达式的运算,你应该清楚吧?不清楚的话可以追问。

操作io口一般就是3步,如你代码中注释所写。第一步打开时钟,第二步初始化IO口,第三步操作。
相似回答