OpenEdv-开源电子网

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

蜂鸣器乱响,不受控制

[复制链接]

3

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2018-7-12
在线时间
21 小时
发表于 2018-8-21 11:28:45 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 hank 于 2018-8-21 11:57 编辑

我的逻辑是:1.将按键端口设为上拉
2.将键盘公共端接GND,另一条线接GPIO,当按键按下的时候,GPIO应该连接GND,呈现低电平
3.KeyScan()函数内部,使用GPIO_ReadInputDataBit()函数读取相应的GPIO,如果是低电平,函数反回1
4.Main()函数,遇到KeyScan()返回1的情况,就执行Beep01(1)蜂鸣器程序,
5.执行一遍之后,使用GPIO_ReadInputDataBit()函数将GPIO置1,

按理说,逻辑没毛病啊,是不是?可一上电,无论有按没按,就是乱响,一点不受控制。

硬件接线 IMG_20180821_114511.jpg

IMG_20180821_114528.jpg


GPIP定义
[mw_shl_code=c,true]        
//For KeyScan
                #define KeyPortA_RCC                                                RCC_APB2Periph_GPIOA
                #define KeyPortA                                                          GPIOA
                #define Key1                                                                                GPIO_Pin_8
               
                #define KeyPortB_RCC                                                RCC_APB2Periph_GPIOB
                #define KeyPortB                                                                GPIOB
                #define Key2                                                                                GPIO_Pin_12
                #define Key3                                                                                GPIO_Pin_13
                #define Key4                                                                                GPIO_Pin_14
                #define Key5                                                                                GPIO_Pin_15
               
                #define KeyPortC_RCC                                                RCC_APB2Periph_GPIOC
                #define KeyPortC                                                                GPIOC
                #define Key6                                                                                GPIO_Pin_13
                #define Key7                                                                                GPIO_Pin_14
                #define Key8                                                                                GPIO_Pin_15

//蜂鸣器管脚定义
#define Beep_1_GPIO                                                GPIOA
#define Beep_1_RCC                                                        RCC_APB2Periph_GPIOA
#define Beep_1_Pin                                                        GPIO_Pin_15


[/mw_shl_code]



端口定义和按键扫描函数
[mw_shl_code=c,true]void KEY_GPIO_Config(void)
{
                GPIO_InitTypeDef KeyA;
                GPIO_InitTypeDef KeyB;
                GPIO_InitTypeDef KeyC;
        
                KeyA.GPIO_Pin = Key1;
                KeyA.GPIO_Mode = GPIO_Mode_IPU;
                KeyA.GPIO_Speed = GPIO_Speed_50MHz;        
                RCC_APB2PeriphClockCmd(KeyPortA_RCC,ENABLE);
                GPIO_Init(KeyPortA,&KeyA);
               
                KeyB.GPIO_Pin = Key2 | Key3 | Key4 | Key5;
                KeyB.GPIO_Mode = GPIO_Mode_IPU;
                KeyB.GPIO_Speed = GPIO_Speed_50MHz;        
                RCC_APB2PeriphClockCmd(KeyPortB_RCC,ENABLE);
                GPIO_Init(KeyPortB,&KeyB);
               
                KeyC.GPIO_Pin = Key6 | Key7 | Key8;
                KeyC.GPIO_Mode = GPIO_Mode_IPU;
                KeyC.GPIO_Speed = GPIO_Speed_50MHz;        
                RCC_APB2PeriphClockCmd(KeyPortC_RCC,ENABLE);
                GPIO_Init(KeyPortC,&KeyC);
               
                GPIO_SetBits(KeyPortA,Key1);
                GPIO_SetBits(KeyPortB,Key2 | Key3 | Key4 | Key5);
                GPIO_SetBits(KeyPortC,Key6 | Key7 | Key8 );
               
}


u8 KeyScan(GPIO_TypeDef* GPIOx,u16 GPIO_Pin)
{
         
                if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == 0)
                {
                                delay_ms(20);

                                if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == 0)
                                {
                                                return 1;
                                }

                }
                return 0;
}[/mw_shl_code]

Main函数:

[mw_shl_code=c,true]                while(1)
                {
                                                
                                                if(KeyScan(KeyPortA,Key1))
                                                {
                                                                GPIO_WriteBit(KeyPortA,Key1,1);
                                                                Beep01(1);
                                                }
                                                else if(KeyScan(KeyPortB,Key2))
                                                {
                                                                GPIO_WriteBit(KeyPortB,Key2,1);
                                                                Beep01(2);
                                                }
                                
                }[/mw_shl_code]


蜂鸣器函数和定义
[mw_shl_code=c,false]void Beep_GPIO_Config(void)
{
                GPIO_InitTypeDef Beep1;

        
                Beep1.GPIO_Pin = Beep_1_Pin;
                Beep1.GPIO_Mode = GPIO_Mode_Out_PP;
                Beep1.GPIO_Speed = GPIO_Speed_50MHz;        
                RCC_APB2PeriphClockCmd(Beep_1_RCC,ENABLE);
                GPIO_Init(Beep_1_GPIO,&Beep1);
        
}


void Beep01(int on)
{
                int i = 0;
                if (on == 0)
                {
                        
                                GPIO_WriteBit(Beep_1_GPIO,Beep_1_Pin, Bit_SET);

                }
                else if(on == 1)
                {
                                
                                for(i = 0 ; i < 168 ; i ++)
                                {
                                                GPIO_WriteBit(Beep_1_GPIO,Beep_1_Pin, Bit_RESET);
                                                //PAout(12) = 0;
                                                delay_us(100);
                                                GPIO_WriteBit(Beep_1_GPIO,Beep_1_Pin, Bit_SET);
                                                //PAout(12) = 1;
                                                delay_us(100);
                                }
                }
               
                else if(on == 2)
                {
                                
                                for(i = 0 ; i < 168 ; i ++)
                                {
                                                GPIO_WriteBit(Beep_1_GPIO,Beep_1_Pin, Bit_RESET);
                                                //PAout(12) = 0;
                                                delay_us(200);
                                                GPIO_WriteBit(Beep_1_GPIO,Beep_1_Pin, Bit_SET);
                                                //PAout(12) = 1;
                                                delay_us(200);
                                }
                }

}[/mw_shl_code]








IMG_20180821_111802.jpg
IMG_20180821_111815.jpg
IMG_20180821_111831.jpg
IMG_20180821_111838.jpg
IMG_20180821_111847.jpg
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

686

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
10979
金钱
10979
注册时间
2014-6-12
在线时间
1045 小时
发表于 2018-8-21 11:38:57 | 显示全部楼层
应该把硬件接法,特别是蜂鸣器模块接法要告诉大家。
回复

使用道具 举报

9

主题

796

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2038
金钱
2038
注册时间
2017-8-2
在线时间
522 小时
发表于 2018-8-21 11:45:08 | 显示全部楼层
看看你蜂鸣器io脚有没有接错...还有用PA15要关闭JTAG复用...最好换个gpio口
猪猪熊呢?
回复

使用道具 举报

3

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2018-7-12
在线时间
21 小时
 楼主| 发表于 2018-8-21 11:59:53 | 显示全部楼层
323232 发表于 2018-8-21 11:45
看看你蜂鸣器io脚有没有接错...还有用PA15要关闭JTAG复用...最好换个gpio口

已关JTAG,[mw_shl_code=c,true]RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO ,ENABLE);//重映射需要先使能AFIO时钟
                GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);//只关闭JTAG而保留SWD[/mw_shl_code]
回复

使用道具 举报

24

主题

695

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1666
金钱
1666
注册时间
2016-4-29
在线时间
266 小时
发表于 2018-8-21 12:27:29 | 显示全部楼层
仿真找原因
回复

使用道具 举报

4

主题

211

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2600
金钱
2600
注册时间
2016-7-6
在线时间
546 小时
发表于 2018-8-21 13:54:54 | 显示全部楼层
我感觉可能是第5步有点问题,用来采集高低电平的IO口,你不需要给他置1复位吧。
把复杂的事,做简单!
回复

使用道具 举报

2

主题

686

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
10979
金钱
10979
注册时间
2014-6-12
在线时间
1045 小时
发表于 2018-8-21 14:10:19 | 显示全部楼层
蜂鸣器控制IO PA15 不能推挽输出,要浮空输出。
回复

使用道具 举报

0

主题

20

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
409
金钱
409
注册时间
2018-8-21
在线时间
85 小时
发表于 2018-8-21 16:50:17 | 显示全部楼层
在大循环前IO初始化了没
回复

使用道具 举报

19

主题

246

帖子

0

精华

高级会员

Rank: 4

积分
608
金钱
608
注册时间
2017-9-21
在线时间
171 小时
发表于 2018-8-21 17:59:44 | 显示全部楼层
首先通过接线方式模拟信号,蜂鸣器IO接VCC,接GND,如果正常则再测量芯片IO口输出是否正常
回复

使用道具 举报

3

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2018-7-12
在线时间
21 小时
 楼主| 发表于 2018-8-21 18:13:44 | 显示全部楼层
xuyaqi 发表于 2018-8-21 14:10
蜂鸣器控制IO PA15 不能推挽输出,要浮空输出。

请问为什么不能推挽?另外一个是,好像只有浮空输入模式。

蜂鸣器单独测试没有问题。因为上电之后,有代码控制发短声,表壳启动成功。
回复

使用道具 举报

3

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2018-7-12
在线时间
21 小时
 楼主| 发表于 2018-8-21 18:14:34 | 显示全部楼层
哆啦A萌 发表于 2018-8-21 17:59
首先通过接线方式模拟信号,蜂鸣器IO接VCC,接GND,如果正常则再测量芯片IO口输出是否正常

蜂鸣器没有问题,程序刚启动时会发短声,代表启动成功。
回复

使用道具 举报

3

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2018-7-12
在线时间
21 小时
 楼主| 发表于 2018-8-21 18:16:23 | 显示全部楼层
Akon 发表于 2018-8-21 16:50
在大循环前IO初始化了没

今天发现一个非常奇怪的现象,就是,如果我没有初始化IO,但我使用位带操作方式的话,居然可以比较正常响应,虽然有时候会有漏掉的按键,可能10次按键,有一两次没有反应。

相反,如果初始化IO,反而无有反应……。
回复

使用道具 举报

2

主题

686

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
10979
金钱
10979
注册时间
2014-6-12
在线时间
1045 小时
发表于 2018-8-21 19:03:46 | 显示全部楼层
hank 发表于 2018-8-21 18:13
请问为什么不能推挽?另外一个是,好像只有浮空输入模式。

蜂鸣器单独测试没有问题。因为上电之后,有 ...

如果蜂鸣器接5v电源,推挽输出只有3.3v,无法彻底关断蜂鸣器电源。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-11 22:16

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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