21ic电子技术开发论坛

标题: 使用内部振荡,大家帮看看这段STM32程序哪里不对 [打印本页]

作者: xushouxue999    时间: 2014-10-29 17:49
标题: 使用内部振荡,大家帮看看这段STM32程序哪里不对
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了还是不行,忘记改回去了

作者: 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下的语句屏蔽掉测试下效果! 担心你的延时函数并不是准确的延时!

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

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

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

作者: xushouxue999    时间: 2014-10-30 11:09
观测下来,程序根本就没有运行,用的是内部时钟,没挂晶振,这种情况下,PD0、PD1是否需要设置呢

作者: 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

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

作者: joyme    时间: 2014-10-30 11:42
好好看看函数原型,先了解这些函数是干什么的

作者: xushouxue999    时间: 2014-10-30 12:18
GPIO_DeInit(GPIOB); 是给端口复位的,初始化时用的,其他地方没用

作者: xushouxue999    时间: 2014-10-30 12:20
LOVE_ELEC 发表于 2014-10-30 11:35
楼主在启动文件中(.s文件)屏蔽红色部分试一下
; Reset handler
Reset_Handler   PROC

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

作者: LOVE_ELEC    时间: 2014-10-30 12:23
xushouxue999 发表于 2014-10-30 12:20
启动文件中直接跳进主函数里面试过了,没好使

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

作者: xushouxue999    时间: 2014-10-31 15:53
问题已解决,感谢大家提示!问题:下载器与Keil软件兼容性不好导致!

作者: 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);
  }







欢迎光临 21ic电子技术开发论坛 (https://bbs.21ic.com/)