第8章让开发板发出声音,蜂鸣器驱动
心得体会
在目录下创建一个Makefile文件
先运行make clean命令清楚到编译生成的一些工程文件,执行make命令,重新编译驱动程序。将编译生成的buzzer.ko内核镜像文件拷贝出来,adb push buzzer.ko /fpga/moudles
然后插入内核镜像文件到系统中,insmod buzzer.ko,并且装载设备驱动程序,mknod /dev/buzzer c 248 0
现在就可以在库层直接编写C/C++文件来调用这个驱动程序,这个可以在ubuntu中安装NDK编译环境,新建buzzer文件,编译生成一个库文件,那样就可以直接在应用层使用这个库提供的JNI方法,那样调用会显得更加的简单,当然这个调用方式google并不提倡,我在这里只是想展示这种调用方式而已
构建一个jni工程,新建一个buzzer.c的源文件
进行NDK编译,生成libbuzzer.so,这个库就可以直接在应用层进行调用
- #include <reg52.h>
- sbit BUZZ = P1^6; //蜂鸣器控制引脚
- unsigned char T0RH = 0; //T0 重载值的高字节
- unsigned char T0RL = 0; //T0 重载值的低字节
- void OpenBuzz(unsigned int frequ);
- void StopBuzz();
- void main(){
- unsigned int i;
- TMOD = 0x01; //配置 T0 工作在模式 1,但先不启动
- EA = 1;
- while (1){ //使能全局中断
- OpenBuzz(4000); //以 4KHz 的频率启动蜂鸣器
- for (i=0; i<40000; i++);
- StopBuzz(); //停止蜂鸣器
- for (i=0; i<40000; i++);
- OpenBuzz(1000); //以 1KHz 的频率启动蜂鸣器
- for (i=0; i<40000; i++);
- StopBuzz(); //停止蜂鸣器
- for (i=0; i<40000; i++);
- }
- }
- /* 蜂鸣器启动函数,frequ-工作频率 */
- void OpenBuzz(unsigned int frequ){
- unsigned int reload;//计算所需的定时器重载值
- reload = 65536 - (11059200/12)/(frequ*2); //由给定频率计算定时器重载值
- T0RH = (unsigned char)(reload >> 8); //16 位重载值分解为高低两个字节
- T0RL = (unsigned char)reload;
- TH0 = 0xFF; //设定一个接近溢出的初值,以使定时器马上投入工作
- TL0 = 0xFE;
- ET0 = 1; //使能 T0 中断
- TR0 = 1; //启动 T0
- }
- /* 蜂鸣器停止函数 */
- void StopBuzz(){
- ET0 = 0; //禁用 T0 中断
- TR0 = 0; //停止 T0
- }
- /* T0 中断服务函数,用于控制蜂鸣器发声 */
- void InterruptTimer0() interrupt 1{
- TH0 = T0RH; //重新加载重载值
- TL0 = T0RL;
- BUZZ = ~BUZZ; //反转蜂鸣器控制电平
- }
时间: 2024-10-14 03:49:58