搜索
bottom↓
回复: 21

如何对STM32的GPIO管脚位值进行取反设置?

[复制链接]

出0入0汤圆

发表于 2011-2-28 15:53:30 | 显示全部楼层 |阅读模式
刚学STM32,在做GPIO的LED灯实验时不知如何对端口进行取反设置,请高手指教:如用PA1脚接按钮,PB1脚接LED,PA1按一次LED灯亮,再按一次LED灯灭,PB1脚如何设置状态取反,从而让LED灯产生亮-灭变化?

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2011-2-28 17:46:27 | 显示全部楼层
int main (void) {
  unsigned int i=0,j=0;

  stm32_Init ();                                  // STM32 setup
   
  GPIOA->CRL = 0x03;//设置PA0为输出       GPIOA->CRH:IO配置寄存器

  GPIOA->ODR &= ~0x01;//PA0=L        GPIOA->ODR:数据输出寄存器
         


  while(1)

  {

        for(i=0;i<10000;i++)

             for(j=0;j<500;j++);

        GPIOA->ODR |= 0x01;//PA0=H
               

        for(i=0;i<10000;i++)

             for(j=0;j<500;j++);

        GPIOA->ODR &= ~0x01;//PA0=L
               
  }

} // end main

用个别人的闪灯代码说明问题。

出0入0汤圆

发表于 2011-2-28 18:12:23 | 显示全部楼层
GPIOx->ODR ^= (1<<n);

如果要将PC7取反,则为GPIOC->ODR ^= (1<<7);

出0入0汤圆

 楼主| 发表于 2011-3-1 17:13:50 | 显示全部楼层
回复【2楼】wso75839840
-----------------------------------------------------------------------
谢谢1、2楼的回答。

出0入0汤圆

发表于 2012-1-27 15:12:03 | 显示全部楼层
回复【2楼】wso75839840  
GPIOx->ODR ^= (1<<n);

如果要将PC7取反,则为GPIOC->ODR ^= (1<<7);
-----------------------------------------------------------------------
为什么GPIOC->ODR ^= (0<<7); 就不行?

出0入0汤圆

发表于 2012-1-27 17:13:25 | 显示全部楼层
回复【4楼】zhang_mike2000  
回复【2楼】wso75839840  
gpiox-&gt;odr ^= (1&lt;&lt;n);
如果要将pc7取反,则为gpioc-&gt;odr ^= (1&lt;&lt;7);
-----------------------------------------------------------------------
为什么gpioc-&gt;odr ^= (0&lt;&lt;7); 就不行?

-----------------------------------------------------------------------

弄清楚1<<7的意义就知道了,如果是0,不管你左移多少位,得出来的都是0x00000000

出0入0汤圆

发表于 2012-1-27 19:54:06 | 显示全部楼层
给相应管脚ODR位对应的bitband的寄存器加一就行了
不过这个操作也得读一次外设寄存器,要是还能有个GPIO寄存器可以写1取反的就好了...

出0入0汤圆

发表于 2012-1-27 20:14:01 | 显示全部楼层
如果你使用库的话可以先读取当前值后取反后写出

出0入0汤圆

发表于 2012-7-7 22:39:37 | 显示全部楼层
原来是这样弄的呀

出0入0汤圆

发表于 2012-7-12 17:47:56 | 显示全部楼层
那用什么语句使一引脚输出保持为低电平?

出0入0汤圆

发表于 2012-7-12 20:54:49 | 显示全部楼层
用异或 "^="

出0入0汤圆

发表于 2012-7-14 01:06:32 | 显示全部楼层
wso75839840 发表于 2011-2-28 18:12
GPIOx->ODR ^= (1

之前用库函数,还是这样简答些

出0入0汤圆

发表于 2012-7-23 20:37:09 | 显示全部楼层
异或是正解

出0入0汤圆

发表于 2012-8-24 00:31:04 | 显示全部楼层
void GPIO_PinReverse(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
  /* Check the parameters */
  assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
  assert_param(IS_GPIO_PIN(GPIO_Pin));
  
  GPIOx->ODR ^=  GPIO_Pin;
}

出0入0汤圆

发表于 2012-8-24 06:52:38 来自手机 | 显示全部楼层
位带操作也挺好的吧

出0入0汤圆

发表于 2012-8-24 07:09:00 | 显示全部楼层
反正 不管怎么弄  都是读改写

出0入0汤圆

发表于 2012-8-24 08:56:37 | 显示全部楼层
本帖最后由 zhyt108 于 2012-8-24 08:58 编辑

让我们分析下  GPIOC->ODR ^= (1<<7); 这种方式吧,其实是有一定的风险的。
看下反汇编如下:
   55:             GPIOC->ODR ^= (1<<7);

     //读取 GPIOC->ODR 的值,放到R0中
1.   0x0800B868 4807         LDR      r0,[pc,#28]  ; @0x0800B888
2.   0x0800B86A 68C0         LDR      r0,[r0,#0x0C]
     //将读取的在R0中的值进行改写
3.   0x0800B86C F0800002   EOR      r0,r0,#0x80
     //写回GPIOC->ODR
4.   0x0800B870 4905          LDR      r1,[pc,#20]  ; @0x0800B888
5.   0x0800B872 60C8          STR      r0,[r1,#0x0C]
……
//GPIOC地址
0x0800B888 1000      DCW      0x1000
……

如果在2~5步之间有中断,改写了GPIOC->ODR的值,那么这个程序执行结果可能不是我们所希望的。

个人推荐没有副作用的方法有两个,
一. 位带操作
二.((GPIOC->ODR & GPIO_Pin_7) ? (GPIOC->BRR  = GPIO_Pin_7): (GPIOC->BSRR = GPIO_Pin_7))

出0入0汤圆

发表于 2013-1-6 14:33:33 | 显示全部楼层
Lucky_Lucky 发表于 2012-7-14 01:06
之前用库函数,还是这样简答些

库怎么弄的?给我学习下

出0入0汤圆

发表于 2013-2-22 16:42:06 | 显示全部楼层
GPIO_WriteBit(GPIOC, GPIO_Pin_3,(BitAction)(1-(GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_3))));
这是一个库函数的,比较容易就理解

出0入0汤圆

发表于 2013-6-13 15:24:17 | 显示全部楼层
好啊

出0入0汤圆

发表于 2014-5-12 23:01:34 | 显示全部楼层
Holye 发表于 2012-8-24 00:31
**** 作者被禁止或删除 内容自动屏蔽 ****

喜欢15楼的风格,顶一个!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-14 21:40

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表