zoukankan      html  css  js  c++  java
  • 4412--PWM驱动部分

    1.有源蜂鸣器和无源蜂鸣器的概念

    有源蜂鸣器和无源蜂鸣器(高电平可以响的就是有源蜂鸣器)

    #include <linux/init.h>
    #include <linux/module.h>
    
    #include <linux/kernel.h>
    #include <linux/fs.h>
    #include <mach/gpio.h>
    #include <plat/gpio-cfg.h>
    #include <linux/miscdevice.h>
    #include <linux/platform_device.h>
    //#include <mach/gpio-bank.h>
    #include <mach/regs-gpio.h>
    #include <asm/io.h>
    #include <linux/regulator/consumer.h>
    //#include "gps.h"
    #include <linux/delay.h>
    
    struct {  
        unsigned int    TCFG0;  
        unsigned int    TCFG1;  
        unsigned int    TCON;  
        unsigned int    TCNTB0;  
        unsigned int    TCMPB0;  
        unsigned int    TCNTO0;  
        unsigned int    TCNTB1;  
        unsigned int    TCMPB1;  
        unsigned int    TCNTO1;  
        unsigned int    TCNTB2;  
        unsigned int    TCMPB2;  
        unsigned int    TCNTO2;  
        unsigned int    TCNTB3;  
        unsigned int    TCMPB3;  
        unsigned int    TCNTO3;  
        unsigned int    TCNTB4;  
        unsigned int    TCNTO4;  
        unsigned int    TINT_CSTAT;  
    }*PWM;
    volatile unsigned long virt_addr,virt_addr_gpio,phys_addr,phys_addr_gpio;//用于存放虚拟地址和物理地址
    volatile unsigned long *GPD0CON,*GPD0PUD;
    
    void addr_init(void)
    {    
        phys_addr = 0x139D0000;
        virt_addr = (unsigned long)ioremap(phys_addr,0x32);
        PWM = (unsigned long*)(virt_addr+0x00);
        
        phys_addr_gpio = 0x11400000+0xA0;
        virt_addr_gpio = (unsigned long)ioremap(phys_addr_gpio,0x10);
        GPD0CON = (unsigned long*)(virt_addr_gpio+0x00);
        GPD0PUD = (unsigned long*)(virt_addr_gpio+0x00A8-0x00A0);
    }
    
    void pwm_init(void)
    {
        addr_init();
        *GPD0CON =  *GPD0CON&(~(0xf))|0x2;
        *GPD0PUD =  *GPD0PUD&(~(0xf));
        
        //预分频1-254 + 1
        (*PWM).TCFG0 = (*PWM).TCFG0 &(~(0xff))|0xf9;
        //分频1.2.4.8.16
        (*PWM).TCFG1 = (*PWM).TCFG1 &(~(0xf))|0x2;
        //设置占空比
        (*PWM).TCMPB0 = 50;
        (*PWM).TCNTB0 = 100;
        //设置手动加载,开启定时器
        (*PWM).TCON = (*PWM).TCON & (~(0xf)) | 0x1 | 0x2;    
    }
    static void beep_on(void)
    {
        //开启自动重载
        (*PWM).TCON = (*PWM).TCON & (~(0xf)) | 0x1 | 0x8;
    }
    
    static int iTop4412_PWM_init(void)
    {
        pwm_init();
        beep_on();
        return 0;
    }
    static void beep_off(void)
    {
        (*PWM).TCON = (*PWM).TCON & (~(0xf)) | 0x0;
        //定时器结束之后,输出的是高电平还是低电平?
        *GPD0CON =  *GPD0CON&(~(0xf))|0x0;
    }
    static void iTop4412_PWM_exit(void)
    {
        beep_off();
    }
    
    module_init(iTop4412_PWM_init);
    module_exit(iTop4412_PWM_exit);
    MODULE_LICENSE("GPL");


    2.简单用法

    GPD0_0设置为pwm输出GPD0CON[0]=0x02
    TCFG0预分频(1-255)
    TCFG1分频(1.2.4.8.16)
    设置占空比:
    TCMPB0和TCNTB0(TCMPB0<TCNTB0)
    设置自动重载,开启定时器等
    TCON寄存器



  • 相关阅读:
    前端优化分析 之 javascript放在底部
    HTML、SHTML、XHTML、DHTML、XML有什么不同
    web项目开发流程及规范
    sql developer连接mysql数据库
    hibernate自动创建表报错,提示不存在
    04关键字和标识符
    03注释与API文档
    WEB应用中的路径问题及乱码问题
    01java开发环境配置
    Eclipse Java EE IDE for Web Developers 4.5.1 安装hibername tools 插件
  • 原文地址:https://www.cnblogs.com/hkyst/p/7753386.html
Copyright © 2011-2022 走看看