• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

【视频问题】stm32的gpio口可以直接赋值1和0吗

huihui163 2018-01-08 浏览量:3435

程序中都是这样定义后才可以赋值?

#define LED0 PBout(5)// PB5

#define LED1 PEout(5)// PE5


LED0=0;
LED1=1;

0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  •  PBout(5) 这样写,一般是使用了位绑定。

    首先GPIO口的输出寄存器是16位的,如果直接给这个寄存器 0和1,也只是操作最低位IO。

    但是GPIO输出寄存器是和位带区绑定的。

    位绑定区是使用一个32位寄存器来代表被绑定区的寄存器中的1个位。

    使用位绑定方式就可以像你上面这个程序这样操作了,直接给0或者1。

    • 发布于 2018-01-08
    • 举报
    • 评论 3
    • 0
    • 0
huihui163 回复了 我是爆米花啊:只能通过这种方式才可以赋0或1 回复
我是爆米花啊 回复了 我是爆米花啊:对,使用位带操作可以直接通过赋0或1的方式来操作一个位。位带操作的好处:1 直接赋0或1比较直观;2 程序执行效率高 ;3 避免了读-修改-写 这种操作,实现了‘原子’操作,在嵌入式操作系统中,起到很好的互斥访问的效果。 回复
电子老工程师 回复了 :https://www.digikey.cn/zh/products/detail/nexperia-usa-inc/PESD2CANFD24U-UX/12325028?amp%3BWT.z_header=search_go&s=N4IgTCBcDaIAoFEDKARMBhAggOQGJoBYBVAWiIA0QBdAXyA 回复

其他答案 数量:10
  • 这属于位带操作,这部分建议详细阅读和理解《Crotex-M3权威指南》存储器系统章节,位带操作部分。
    • 发布于2018-01-08
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :工作温度不同,见附件 回复

  • #define LED0 PBout(5)// PB5

    #define LED1 PEout(5)// PE5


    这是位带操作的定义宏,其实后面需要多次展开,因为PBout和PEout也都是宏,如

    #define PBout(n)   BIT_ADDR(GPIOB_ODR_Addr,n)  //输出  

    #define PEout(n)   BIT_ADDR(GPIOE_ODR_Addr,n)  //输出


    而且里面的 BIT_ADDR、GPIOB_ODR_AddrGPIOE_ODR_Addr也是宏

    #define BIT_ADDR(addr, bitnum)   MEM_ADDR(BITBAND(addr, bitnum)) 
    #define GPIOB_ODR_Addr    (GPIOB_BASE+12) //0x40010C0C 
    #define GPIOE_ODR_Addr    (GPIOE_BASE+12) //0x4001180C


    所以简短的一点展开后其实就分别获得了2个变量地址,这样才能设置LED0和LED1的值,其中LEDX中的X小于16。



    • 发布于2018-01-08
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :LM35CAZ/LFT4 TI 回复

  • 可以直接赋值,每个引脚对应的都有读写寄存器,直接往寄存器里写值就ok
    • 发布于2018-01-08
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :AEC-Q100规范标准更高,AEC-Q100规范标准是全球汽车行业标准,针对应用行业。是被全球汽车OME终端认可。JEDEC知识针对半导体行业标准。JEDEC规范不能覆盖AEC-Q100规范 回复

  • 直接写应该有问题,还是需要方法的。
    • 发布于2018-01-08
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :封装: TO-252 品牌: SINO-IC(光宇睿芯) 型号: SE40P20B 回复

  • 可以操作,但是需要注意PBout(5)的定义,看它的数据类型
    • 发布于2018-01-08
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :尾缀包装区别,产品同一物料, 回复

  • 可以的,这属于位带操作,跟直接给输出寄存器赋值是一个道理。

    • 发布于2018-01-08
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :按照规格书和图纸说明OPB100Z由两部分组成。 回复

  • 可以,这种写法在原子的代码中经常看到,是51的风格,已经通过宏做了地址寄存器的封装了,可以直接赋值。
    • 发布于2018-01-08
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :同一物料 回复

  • 现在16,32单片机提供的库好像都是没有直接这样操作,当然你可以定义宏之后这样调用。
    • 发布于2018-01-09
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :尾缀包装区别,RL:每卷5000pcs, -WP:托盘50 回复

  • 按宏展开就是正常的函数了
    • 发布于2018-01-10
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :https://fscdn.rohm.com/en/products/databook/datasheet/discrete/transistor/bipolar/bc847bu3t106-e.pdf 回复

  • 你要找到PBout的定义的地方,看看是哪个寄存器。
    • 发布于2018-01-11
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :可以替代。 回复

相关问题

问题达人换一批

【视频问题】stm32的gpio口可以直接赋值1和0吗