现象描述(网友原话):做DDS实验的时候,我把输入频率降到665HZ, 发出了极其难听的噪音 ,简直要死, 频率升高之后就听不见了、
经过确认噪声来源为开发板上的蜂鸣器。那么问题来了,网友表示,他的程序中并没有任何驱动蜂鸣器的代码,也没有给蜂鸣器分配管脚,那么为啥蜂鸣器会响呢?
原理解析:
其实,不只是蜂鸣器,开发板上的数码管、LED灯也经常会出现这些莫名其妙的现象,本来程序和他们一点关系都没有,也没有分配这些外设的管脚,为啥他们就会被驱动了呢?
事实是因为Quartus软件在执行编译时,如果发现某个信号用户没有指定管脚,那么软件会默认随机指定一个空闲管脚到该端口上,而如果恰好该引脚又是一个功能引脚,就会驱动该功能产生相应现象,例如蜂鸣器、数码管、LED灯等容易看到现象的外设。 如何确定是否有信号的管脚被默认分配到了该功能上呢,其实很简单,在quartus软件的引脚分配界面就可以查看,如下图,就是上面做DDS实验的网友的引脚分配界面:
可以看到,当前该网友还没有对这些信号分配引脚,所以对应的Location这一列有很多信号都是空着的,没有指定引脚,所以编译时候,quartus软件就会默认分配一个管脚给这个信号,软件默认分配的信号再Filter Location这一列里面,可以看到,在上面的截图中,q0[6]刚好被分配到了L6管脚,而L6管脚就恰好对应了AC620开发板的蜂鸣器功能,所以当程序运行时候,q0[6]信号就会驱动蜂鸣器发声了。
再次总结下: - Location这一列是用户自己分配实际IO对应的管脚的列,
- filtera Location这一列是软件布局布线是默认分配的
- 如果用户在Location中自己填入了确定的引脚,那么分配完成后Location和Filter Location一列中的管脚就是一致的
- 用户没有在Location一列中指定确定管脚,编译后软件会再Filter Location中默认指定一个管脚。
同样的情况可能发生在任意一个没有分配的管脚上,比如LED、数码管等在当前工程中没有用到的功能。
如果需要解决这个问题,最彻底的方案就是手动将该功能置一个确定值,例如在代码里加入蜂鸣器控制脚,并将其拉低,然后分配正确的引脚,比如在代码里加一个beep端口,并赋值为0,然后分配正确的蜂鸣器端口占用掉该蜂鸣器引脚,这样软件就无法默认分配该引脚给其他信号了,问题得以解决。
|