打印
[STM32F1]

使用内部振荡,大家帮看看这段STM32程序哪里不对

[复制链接]
1269|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xushouxue999|  楼主 | 2014-10-29 17:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
int main(void)
{
        NVIC_Configuration();
        GPIO_InitTypeDef  GPIO_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
        GPIO_DeInit(GPIOB);
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;   
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);   
        GPIO_ResetBits(GPIOB,GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5);
        while(1)
       {  
                GPIO_SetBits(GPIOB,GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5);
                delay_ms(1000);
                GPIO_ResetBits(GPIOB,GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5);
                delay_ms(1000);
       }   
}

示波器观察:PB3、4、5一直都是高电平
沙发
xushouxue999|  楼主 | 2014-10-29 17:51 | 只看该作者
或者说还缺少点什么东西?

使用特权

评论回复
板凳
LOVE_ELEC| | 2014-10-29 18:00 | 只看该作者
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;看着楼主想用作输出模式,但是这句设置的可是输入!

使用特权

评论回复
地板
xushouxue999|  楼主 | 2014-10-29 18:29 | 只看该作者
是的,就是要输出只是点亮3个LED,开始是设的GPIO_Mode_Out_PP 推挽 ,后面看了不行又设成GPIO_Mode_IPD了还是不行,忘记改回去了

使用特权

评论回复
5
LOVE_ELEC| | 2014-10-29 18:46 | 只看该作者
xushouxue999 发表于 2014-10-29 18:29
是的,就是要输出只是点亮3个LED,开始是设的GPIO_Mode_Out_PP 推挽 ,后面看了不行又设成GPIO_Mode_IPD了 ...

可以设置成GPIO_Mode_Out_PP模式,然后把主函数中while下的语句屏蔽掉测试下效果! 担心你的延时函数并不是准确的延时!

使用特权

评论回复
6
xushouxue999|  楼主 | 2014-10-30 08:42 | 只看该作者
应该不是楼上所说问题,直接在初始化时给端口置0,都输出不了低电平(while(1)下所有都屏蔽)
郁闷这么个问题折腾一天

使用特权

评论回复
7
LOVE_ELEC| | 2014-10-30 10:08 | 只看该作者
xushouxue999 发表于 2014-10-30 08:42
应该不是楼上所说问题,直接在初始化时给端口置0,都输出不了低电平(while(1)下所有都屏蔽)
郁闷这么个 ...

你可以在线仿真下,然后看看GPIO对应的寄存器的值是否按照你的程序进行设置或者更改!若能够按照你的程序进行寄存器的操作那说明程序没有问题,可能是电路上的问题!要是寄存器没有按照程序进行变动,那就是程序的问题(但是看着楼主的程序确实没有什么问题)。

使用特权

评论回复
8
xushouxue999|  楼主 | 2014-10-30 11:09 | 只看该作者
观测下来,程序根本就没有运行,用的是内部时钟,没挂晶振,这种情况下,PD0、PD1是否需要设置呢

使用特权

评论回复
9
LOVE_ELEC| | 2014-10-30 11:35 | 只看该作者
xushouxue999 发表于 2014-10-30 11:09
观测下来,程序根本就没有运行,用的是内部时钟,没挂晶振,这种情况下,PD0、PD1是否需要设置呢
...

楼主在启动文件中(.s文件)屏蔽红色部分试一下
; Reset handler
Reset_Handler   PROC
                EXPORT  Reset_Handler             [WEAK]
                IMPORT  __main
                IMPORT  SystemInit/* 屏蔽该条语句试试 */
                LDR     R0, =SystemInit
                BLX     R0      
        
                LDR     R0, =__main
                BX      R0
                ENDP

使用特权

评论回复
10
joyme| | 2014-10-30 11:41 | 只看该作者
很简单的问题,搞那么复杂,GPIO_DeInit(GPIOB); 这是干什么?不理解的函数不要乱调用

使用特权

评论回复
11
joyme| | 2014-10-30 11:42 | 只看该作者
好好看看函数原型,先了解这些函数是干什么的

使用特权

评论回复
12
xushouxue999|  楼主 | 2014-10-30 12:18 | 只看该作者
GPIO_DeInit(GPIOB); 是给端口复位的,初始化时用的,其他地方没用

使用特权

评论回复
13
xushouxue999|  楼主 | 2014-10-30 12:20 | 只看该作者
LOVE_ELEC 发表于 2014-10-30 11:35
楼主在启动文件中(.s文件)屏蔽红色部分试一下
; Reset handler
Reset_Handler   PROC

启动文件中直接跳进主函数里面试过了,没好使

使用特权

评论回复
14
LOVE_ELEC| | 2014-10-30 12:23 | 只看该作者
xushouxue999 发表于 2014-10-30 12:20
启动文件中直接跳进主函数里面试过了,没好使

建议屏蔽掉GPIO_DeInit(GPIOB); 试一下!

使用特权

评论回复
15
xushouxue999|  楼主 | 2014-10-31 15:53 | 只看该作者
问题已解决,感谢大家提示!问题:下载器与Keil软件兼容性不好导致!

使用特权

评论回复
16
joyme| | 2014-10-31 16:37 | 只看该作者
GPIO_DeInit(GPIOB),这个语句不去掉能正常才奇怪,原型里函数会把GPIOB去使能
  else if (GPIOx == GPIOB)
  {
    RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOB, ENABLE);
    RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOB, DISABLE);
  }


使用特权

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

本版积分规则

个人签名:白羊座的人就是喜欢战斗,也勇于战斗!

31

主题

291

帖子

0

粉丝