当前位置: 代码迷 >> 驱动开发 >> 哪位高手来救救小弟我的PWM程序啊
  详细解决方案

哪位高手来救救小弟我的PWM程序啊

热度:119   发布时间:2016-04-28 11:07:04.0
谁来救救我的PWM程序啊!!
各位CSDND的大侠们。小弟初学嵌入式。用s3c2410的定时器0产生PWM信号。但是当我结束应用程序后,驱动产生的PWM波还在。这是怎么回事啊?望各位大侠不吝赐教。
我的驱动程序如下:
C/C++ code
#include<linux/kernel.h>#include<linux/module.h>#include<linux/init.h>#include<linux/fs.h>#include<linux/types.h>#include<linux/poll.h> #include<linux/version.h>#include<linux/errno.h>#include <asm/io.h>#include <linux/clk.h>#include<asm-arm/arch-s3c2410/regs-gpio.h>#include <asm-arm/plat-s3c/regs-timer.h> #define pwm_device_MAJOR 50#define DEVICE_NAME "pwm_device"#define FREQ 50#define PWM_CLOSE 0#define PWM_OPEN 1static int pwm_device_close(struct inode *inode,struct file *file);static int pwm_device_open(struct inode *inode,struct file *file);static int pwm_device_ioctl(struct inode *inode,struct file *file,unsigned int cmd,unsigned long arg);static int __init pwm_device_init(void);static void __exit pwm_device_cleanup(void);static struct file_operations pwm_device_fops={    owner:        THIS_MODULE,    open:        pwm_device_open,    release:    pwm_device_close,    ioctl:        pwm_device_ioctl,};static void set_pwm_duty(unsigned long duty){    unsigned long tcon;    unsigned long tcnt;    unsigned long tcmp;    unsigned long tcfg0;    unsigned long tcfg1;    struct clk *clk_p;    unsigned long pclk;    s3c2410_gpio_cfgpin(S3C2410_GPB0,S3C2410_GPB0_TOUT0);    tcfg0 = __raw_readl(S3C2410_TCFG0);    tcfg1 = __raw_readl(S3C2410_TCFG1);    tcfg0 &= ~S3C2410_TCFG_PRESCALER0_MASK;    tcfg0 |= (256 - 1);    tcfg1 &= ~S3C2410_TCFG1_MUX0_MASK;    tcfg1 |= S3C2410_TCFG1_MUX0_DIV16;        __raw_writel(tcfg0, S3C2410_TCFG0);    __raw_writel(tcfg1, S3C2410_TCFG1);      clk_p = clk_get(NULL, "pclk");    pclk  = clk_get_rate(clk_p);    tcnt  = (pclk/256/16)/FREQ;    tcmp  = (tcnt*duty)/100;        __raw_writel(tcnt, S3C2410_TCNTB(0));    __raw_writel(tcmp, S3C2410_TCMPB(0));            tcon = __raw_readl(S3C2410_TCON);                tcon &= ~0x1f;    tcon |= 0xb;    __raw_writel(tcon, S3C2410_TCON);        tcon &= ~2;        __raw_writel(tcon, S3C2410_TCON);}static int __init pwm_device_init(void){    int result;    result=register_chrdev(pwm_device_MAJOR,DEVICE_NAME,&pwm_device_fops);    if (result<0)    {        printk(KERN_INFO "[FAILED:Cannot register pwm_device Device!]\n");        return -EIO;    }    else        printk("Initializing pwm_device Device\t----->\t");        printk("[OK]\n");        return 0;}static int pwm_device_open(struct inode *inode,struct file *file){    printk(KERN_CRIT "DEMO:pwm_device Device Open!\n");    return 0;}static int pwm_device_ioctl(struct inode *inode,struct file *file,unsigned int cmd,unsigned long arg){    switch(cmd)    {    case PWM_CLOSE:        break;    case PWM_OPEN:        if (arg == 0)            return -EINVAL;        set_pwm_duty(arg);        break;    default:        break;        }    return 0;}static int pwm_device_close(struct inode *inode,struct file *file){    printk(KERN_CRIT "DEMO:pwm_device Device close!\n");    return 0;}static void __exit pwm_device_cleanup(void){    unregister_chrdev(pwm_device_MAJOR,DEVICE_NAME);    printk("DEMO:pwm_device Device Is Cleanup!\n");}module_init(pwm_device_init);modele_exit(pwm_device_cleanup);MODULE_LICENSE("GPL");

应用程序如下:
C/C++ code
#include<stdlib.h>#include<sys/ioctl.h>#include<sys/stat.h>#include<fcntl.h>#include<unistd.h>#include<stdio.h>#define DEVICE "/dev/pwm_device"int main(){    int fd;    int on_off;    int duty;    fd=open(DEVICE,O_RDWR);    if(fd<0)    {        printf("open device error!\n");        exit(-1);    }    printf("请输入控制信号.0为关闭PWM输出,1为打开PWM输出功能!\n");    scanf("%d",&on_off);    printf("您的输入是:%d\n",on_off);    printf("请输入小于100的占空比值!\n");    scanf("%d",&duty);    printf("您的输入是:%d\n",duty);    ioctl(fd,on_off,duty);    while(1);    close(fd);    return 0;}
  相关解决方案