關鍵字: Micro2440, Mini2440, Beep, 蜂鳴
Micro2440/Mini2440 linux缺省內核中已加入了蜂鳴器支持(見<<micro2440用戶手冊 -2010-6-9.pdf>>P346),因此可以直接通過文件ioctl的方式操作蜂鳴器。
(ls /dev/pwm 存在,則表明你的Micro2440/Mini2440已經有蜂鳴器功能。)
下面的代碼參考了<<micro2440用戶手冊 -2010-6-9.pdf>>
#include <stdio.h>
#include <termios.h>
#include <unistd.h>
#include <stdlib.h>
#define PWM_IOCTL_SET_FREQ 1
#define PWM_IOCTL_STOP 0 // 注意:<<micro2440用戶手冊 -2010-6-9.pdf>>中,
// PWM_IOCTL_STOP定義為2,有誤;
// 應該與蜂鳴器的內核代碼一致,為0
static int fd = -1; /**< 保存蜂鳴器文件句柄 */
/** 關閉蜂鳴器 */
static void close_buzzer(void)
{
if (fd >= 0)
{
ioctl(fd, PWM_IOCTL_STOP);
close(fd);
fd = -1;
}
}
/** 打開蜂鳴器 */
static void open_buzzer(void)
{
fd = open("/dev/pwm", 0);
if (fd < 0)
{
perror("open pwm_buzzer device");
exit(1);
}
// any function exit call will stop the buzzer
atexit(close_buzzer);
}
/** 以freq蜂鳴 */
static void set_buzzer_freq(int freq)
{
// this IOCTL command is the key to set frequency
int ret = ioctl(fd, PWM_IOCTL_SET_FREQ, freq);
if(ret < 0)
{
perror("set the frequency of the buzzer");
exit(1);
}
}
/** 停止蜂鳴 */
static void stop_buzzer(void)
{
int ret = ioctl(fd, PWM_IOCTL_STOP);
if(ret < 0)
{
perror("stop the buzzer error.\n");
exit(-1);
}
}
/**
* 蜂鳴函數。
* \param freq 蜂鳴的頻率
* \param t1 每次蜂鳴持續的時間長度。單位毫秒
* \param t2 蜂鳴的次數
* \remark 經測試,./testBeep 3000 2000 3 作為正常情況的蜂鳴效果較好(3k頻率蜂鳴3次,每次2秒)
* ./testBeep 3000 500 20 作為失敗告警的蜂鳴效果較好(3k頻率蜂鳴20次,每次0.5秒)
*/
static void Beep(int freq, int t1, int t2)
{
printf("freq=%d,each_ms=%d,ntimes=%d\n", freq, t1, t2);
open_buzzer();
int i=0;
for(i=0; i<t2;++i)
{
set_buzzer_freq(freq);
usleep(t1*100); // *100 是經驗值,沒有為啥~
stop_buzzer();
usleep(t1*100); // *100 是經驗值,沒有為啥~
}
close_buzzer();
}
/** 測試程序main */
int main(int argc, char **argv)
{
int freq;
if(argc >=2)
{
freq = atoi(argv[1]);
if ( freq < 1000 || freq > 20000 )
{
freq = 10000;
}
}
int each_ms = 500;
if(argc >=3)
{
each_ms = atoi(argv[2]);
if ( each_ms < 100 || each_ms > 5000 )
{
each_ms = 500;
}
}
int times = 0;
if(argc >=4)
{
times = atoi(argv[3]);
if ( times < 1 || times > 30 )
{
times = 5;
}
}
Beep(freq, each_ms, times);
return 0;
}
// EasyVCR@csdn, 2012.01.04
編譯:arm-linux-gcc testBeep.c -o testBeep
摘自 EasyVCR的專欄