打印

STM32 I/O口配置奇怪的问题?

[复制链接]
4763|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
雨落沉轩|  楼主 | 2013-1-5 22:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 雨落沉轩 于 2013-1-5 23:01 编辑

今天跑了一个stm32f3的官方例子,关于GPIO的使用,一开始程序就是点亮两个led灯。程序下载后两个led点亮,但亮度非常低。后来看了一本书上的GPIO配置方法,这两个led正常点亮。接着我修改了一下程序想点亮8个led,可有另外两个led就是无法点亮。先亮出我的部分程序:

#include "main.h"
#define BSRR_VAL 0xFF00
GPIO_InitTypeDef        GPIO_InitStructure;
int main(void)
{

  /* GPIOE Periph clock enable */
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOE, ENABLE);
  
  /* Configure PE14 and PE15 in output pushpull mode */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15 | GPIO_Pin_14 | GPIO_Pin_13 | GPIO_Pin_12 | GPIO_Pin_11 | GPIO_Pin_10 | GPIO_Pin_9 | GPIO_Pin_8;
  
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
//GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  //GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  GPIO_Init(GPIOE, &GPIO_InitStructure);
  
  while (1)
  {
    /* Set PE14 and PE15 */
    GPIOE->BSRR = BSRR_VAL;
    /* Reset PE14 and PE15 */
    GPIOE->BRR = BSRR_VAL;
   
  }
}    //上面程序能正常点亮6个led。两个无法点亮
还有关于推免和开漏问题
其一:在上述程序中,如果不注释掉“GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;”这句就无**常点亮led(显示亮度很低),这句话的意识应该是配置为推免输出,但查看datasheet发现默认配置就为推免输出。那为何我主动配置一下就不行了呢。   

其二:通过查看资料发现推免输出可能驱动能力不够,于是我试试采用开漏方式,也就是GPIO_InitStructure.GPIO_OType = GPIO_OType_OD(开漏方式);且把程序中红色 //GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;注释去掉,也就是使能上拉。以为这样驱动能力强点应该没问题,可还是无法点亮,求大神指点,是哪里弄错了。
沙发
uet_cache| | 2013-1-6 11:12 | 只看该作者
你的WHILE(1)中置0和置1切换的是不是快了。加点延时。。另外硬件上加上拉电阻试试。。

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
雨落沉轩 + 2 赞一个!
板凳
13249207512| | 2013-1-6 11:30 | 只看该作者
楼上正解啦

使用特权

评论回复
地板
sy_lixiang| | 2013-1-6 11:53 | 只看该作者
1.延时是一方面原因。加吧。

2.另外,你用的这个PE口是否有第二功能?它是否被别的资源占用了?这个要确定。。。。

3.这个口是否内部有上拉?看手册。如没有,你配置成OD门的时候要外加。

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
雨落沉轩 + 2 赞一个!
5
雨落沉轩|  楼主 | 2013-1-6 12:12 | 只看该作者
uet_cache 发表于 2013-1-6 11:12
你的WHILE(1)中置0和置1切换的是不是快了。加点延时。。另外硬件上加上拉电阻试试。。 ...

多谢你的回答,问题基本解决,但我使用输出开漏方式,配置了上拉电阻,led也亮了,但亮度却很低,这种方式不应该驱动能力更强些吗?

使用特权

评论回复
6
jomosiron| | 2013-1-6 12:28 | 只看该作者
[b]推挽电路是两个参数相同的三极管或MOSFET,以推挽方式存在于电路中,各负责正负半周的波形放大任务,电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小、效率高。输出既可以向负载灌电流,也可以从负载抽取电流。推拉式输出级既提高电路的负载能力,又提高开关速度。
开漏输出:输出端相当于三极管的集电极. 要得到高电平状态需要上拉电阻才行,它主要是利用外部电路的驱动能力,减少IC内部的驱动。

使用特权

评论回复
7
雨落沉轩|  楼主 | 2013-1-6 12:35 | 只看该作者
sy_lixiang 发表于 2013-1-6 11:53
1.延时是一方面原因。加吧。

2.另外,你用的这个PE口是否有第二功能?它是否被别的资源占用了?这个要确定 ...

你说的很对,STM配置为OD门时好像应该是需要外接上拉的(不是很确定),但按理说我不接上拉就只能输出0。但我试了一下,只配置为上拉,但不接外接电阻居然能点亮led,只是亮度却很低,很奇怪。。。。。我只有一块开发板,外接上拉不方便所以就不试了。现在也基本解决我的问题的了,就不纠结了,多谢。

使用特权

评论回复
8
MrWang_| | 2013-1-6 18:56 | 只看该作者
正准备学习...:lol

使用特权

评论回复
9
lirunze| | 2013-1-6 20:21 | 只看该作者
没遇到过类似问题啊

使用特权

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

本版积分规则

19

主题

250

帖子

0

粉丝