打印

我这样设置gpio对吗??

[复制链接]
3713|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sunshine98|  楼主 | 2007-12-26 23:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我怀疑我的设置顺序,如下:
  //初始化GPIO接口
  /* Enable GPIOC clock */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);

  /* Configure PA.8, PC.15 as Output push-pull */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_15 ;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  /* Configure PB.0 --, PB.9 as Output push-pull */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | 
              GPIO_Pin_4 | GPIO_Pin_5 |GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 ;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOB, &GPIO_InitStructure);

  /* Configure PC.13, PC.14 as Output push-pull */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 ;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOC, &GPIO_InitStructure);

后面应该怎么去设置输出的高低电平呢??
沙发
hotpower| | 2007-12-26 23:09 | 只看该作者

GPIO,定时,中断是菜鸟三部曲,可惜俺还没加电开机~~~

使用特权

评论回复
板凳
grant_jx| | 2007-12-27 00:02 | 只看该作者

那方法可多了。

常规的可以到固件库的手册中找到:
如:
GPIO_WriteBit(GPIOA, GPIO_Pin_15, Bit_SET);   Bit_RESET是清零

GPIO_Write(GPIOA, 0x1101);

GPIO_SetBits(GPIOA, GPIO_Pin_10 | GPIO_Pin_15);

GPIO_ResetBits(GPIOA, GPIO_Pin_10 | GPIO_Pin_15);

非常规的,你该知道Cortex M3是支持Bit banding的,IO的寄存器的每一个位都被映射到一个32Bit的虚拟字节上,首先你要计算出这个虚拟的自己在哪个地址上,计算的方法也有好多种:

/* GPIOC offset */
#define GPIOC_OFFSET  (GPIOC_BASE - PERIPH_BASE)

/* GPIOC BSRR offset */
#define GPIOC_BSRR_OFFSET (GPIOC_OFFSET + 0x10)

 
/* define the bit set number for PC0.6, PC.07, PC.08 & PC.09 in the BSRR*/
  #define GPIOC_Bit6_SET  ((u8)0x06)
  #define GPIOC_Bit7_SET  ((u8)0x07)
  #define GPIOC_Bit8_SET  ((u8)0x08)
  #define GPIOC_Bit9_SET  ((u8)0x09)

  /* define the bit set address in the alias region for PC0.6, PC.07, PC.08 & PC.09*/
  #define GPIOC_Bit6_SET_BB  (PERIPH_BB_BASE + (GPIOC_BSRR_OFFSET * 32) + (GPIOC_Bit6_SET * 4))
  #define GPIOC_Bit7_SET_BB  (PERIPH_BB_BASE + (GPIOC_BSRR_OFFSET * 32) + (GPIOC_Bit7_SET * 4))
  #define GPIOC_Bit8_SET_BB  (PERIPH_BB_BASE + (GPIOC_BSRR_OFFSET * 32) + (GPIOC_Bit8_SET * 4))
  #define GPIOC_Bit9_SET_BB  (PERIPH_BB_BASE + (GPIOC_BSRR_OFFSET * 32) + (GPIOC_Bit9_SET * 4))
#endif
计算公式:bit_band_base + (byte_offset x 32) + (bit_number * 4)
 
#define GPIOC_BRR_OFFSET (GPIOC_OFFSET + 0x14)

1、 *(vu32 *) GPIOC_Bit6_SET_BB = 1;

2、*(vu32 *) (GPIOC_BRR_OFFSET + PERIPH_BASE) =  (u32) (GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9)

3、直接对计算出来的地址操作


使用Bit band写奇数或偶数即可达到置1或清零的目的

使用特权

评论回复
地板
hotpower| | 2007-12-27 00:05 | 只看该作者

请问这几种方法编译长度都一样吗???哪个最佳???

谢谢~~~

GPIO_WriteBit(GPIOA, GPIO_Pin_15, Bit_SET);   Bit_RESET是清零

GPIO_Write(GPIOA, 0x1101);

GPIO_SetBits(GPIOA, GPIO_Pin_10 | GPIO_Pin_15);

GPIO_ResetBits(GPIOA, GPIO_Pin_10 | GPIO_Pin_15);

使用特权

评论回复
5
johnnyqyun| | 2007-12-27 07:48 | 只看该作者

GPIO,定时,中断是菜鸟三部曲

hotpower越来越崇拜你了,哈哈。

使用特权

评论回复
6
yocheng| | 2007-12-27 11:16 | 只看该作者

呵呵....條條大路通羅馬

GPIO_SetBits(GPIOA, GPIO_Pin_10 | GPIO_Pin_15);

GPIO_ResetBits(GPIOA, GPIO_Pin_10 | GPIO_Pin_15);

上面這個有點匯編語言的味道.   ST7的BSET  BRES

使用特权

评论回复
7
sunshine98|  楼主 | 2007-12-27 11:22 | 只看该作者

hehe,

感谢以上回复!
灵活且简单!这就是我喜欢st库的原因,hehe,缺点是时间长了,都忘了,
我是懒人,:D

使用特权

评论回复
8
grant_jx| | 2007-12-27 13:01 | 只看该作者

hotpower,我没有具体看过汇编得结果

我上传个GPIO得例子,里面有上述几种方法的实例。工程包含了IAR和Keil的两种,可直接编译,在STM3210 Evaluation Board上调试。



我想从理论上看应该是Bit Band技术的代码要少一些指令吧。
相关链接:https://bbs.21ic.com/upfiles/img/200712/2007122713140457.rar

使用特权

评论回复
9
hotpower| | 2007-12-27 13:17 | 只看该作者

哈哈~~~下午俺再研究一下~~~不过俺看STM32的汇编"很眼熟"~~~

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

48

主题

571

帖子

0

粉丝