OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3282|回复: 3

跑马灯实验及蜂鸣器实验中产生的一个疑问,求高手解答

[复制链接]

1

主题

2

帖子

0

精华

新手入门

积分
29
金钱
29
注册时间
2016-8-13
在线时间
2 小时
发表于 2016-8-13 21:02:31 | 显示全部楼层 |阅读模式
1金钱
led.c中的代码
#include "led.h"
#include "stm32f10x.h"
void led_init(void)
{
        /*
        //以下为调用库函数来使能GPIOB和GPIOE的时钟和初始化PB5和PE5的代码
        GPIO_InitTypeDef LED_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);
        LED_InitStructure.GPIO_Pin=GPIO_Pin_5;
        LED_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
        LED_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  GPIO_Init(GPIOB,&LED_InitStructure);
        GPIO_SetBits(GPIOB,GPIO_Pin_5);
        LED_InitStructure.GPIO_Pin=GPIO_Pin_5;
        LED_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
        LED_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  GPIO_Init(GPIOE,&LED_InitStructure);
        GPIO_SetBits(GPIOE,GPIO_Pin_5);
        */
       
        //以下为操作寄存器来使能GPIOB和GPIOE的时钟和初始化PB5和PE5的代码
        RCC->APB2ENR|=1<<3;
        RCC->APB2ENR|=1<<6;
        GPIOB->CRL&=0xff0fffff;
        GPIOB->CRL|=0x00300000;
        GPIOB->ODR|=1<<5;
        GPIOE->CRL&=0xff0fffff;
        GPIOE->CRL|=0x00300000;
        GPIOE->ODR|=1<<5;
       
}
beep.c中的代码
#include "stm32f10x.h"
#include "beep.h"
void beep_init(void)
{
        /*
        //以下为调用库函数来使能GPIOB的时钟和初始化PB8的代码
        GPIO_InitTypeDef BEEP_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
        BEEP_InitStructure.GPIO_Pin=GPIO_Pin_8;
        BEEP_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
        BEEP_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOB,&BEEP_InitStructure);
        GPIO_ResetBits(GPIOB,GPIO_Pin_8);
        */       

        //以下为操作寄存器来使能GPIOB的时钟和初始化PB8的代码
        RCC->APB2ENR=1<<3;
        GPIOB->CRH&=0xfffffff0;
        GPIOB->CRH|=0x00000003;
        GPIOB->ODR&=~(1<<8);
       
}
main.c中的代码
#include "led.h"
#include "beep.h"
#include "delay.h"
#include "stm32f10x.h"
int main(void)
{
        delay_init();
        led_init();
        beep_init();
        while(1)
        {
                /*
                //以下为调用库函数来实现PB5PB8和PE5交替输出高低电平
                GPIO_SetBits(GPIOB,GPIO_Pin_5);
                GPIO_ResetBits(GPIOE,GPIO_Pin_5);
                GPIO_SetBits(GPIOB,GPIO_Pin_8);
                delay_ms(500);
                GPIO_SetBits(GPIOE,GPIO_Pin_5);
                GPIO_ResetBits(GPIOB,GPIO_Pin_5);
                GPIO_ResetBits(GPIOB,GPIO_Pin_8);
                delay_ms(500);
                */
               
                /*
                //以下为操作寄存器来实现PB5PB8和PE5交替输出高低电平
                GPIOB->ODR|=1<<5;//GPIOB->BSRR|=1<<5;
                GPIOE->ODR&=~(1<<5);//GPIOE->BSRR|=1<<21;//GPIOE->BRR|=1<<5;
                GPIOB->ODR|=1<<8;//GPIOB->BSRR|=1<<8;
                delay_ms(500);
                GPIOE->ODR|=1<<5;//GPIOE->BSRR|=1<<5;
                GPIOB->ODR&=~(1<<5);//GPIOB->BSRR|=1<<21;//GPIOB->BRR|=1<<5;
                GPIOB->ODR&=~(1<<8);//GPIOB->BSRR|=1<<24;//GPIOB->BRR|=1<<8;
                delay_ms(500);
                */
               
                //以下为通过位带操作来实现PB5PB8和PE5交替输出高低电平
                PBout(5)=1;
    PEout(5)=0;
                PBout(8)=1;
                delay_ms(500);
                PBout(5)=0;
    PEout(5)=1;
                PBout(8)=0;               
                delay_ms(500);       
        }
}
上面的代码无法使蜂鸣器响时,绿灯同时点亮(精英板),只有红灯和蜂蜜器交替工作,找了许久,未找到原因,后来尝试将main.c中的beep_init写到led_init前,才解决问题,请教前辈高手是什么原因,新手提的问题可能比较笨,请见谅,谢谢!!




正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2016-8-17 22:40:42 | 显示全部楼层
回复

使用道具 举报

1

主题

2

帖子

0

精华

新手入门

积分
29
金钱
29
注册时间
2016-8-13
在线时间
2 小时
 楼主| 发表于 2016-8-17 22:50:34 | 显示全部楼层
正点原子 发表于 2016-8-17 22:40
3个IO你只控制了2个啊

是3个呢,原子哥,我把beep_init和led_init交换顺序后就可以了,但是我不明白是为什么。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2016-8-18 22:35:47 | 显示全部楼层
Life_Init(); 发表于 2016-8-17 22:50
是3个呢,原子哥,我把beep_init和led_init交换顺序后就可以了,但是我不明白是为什么。

看看是不是初始化互相干扰了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-6 19:05

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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