一、PWM原理
1.有源蜂鸣器和无源蜂鸣器的概念
有源蜂鸣器高电平就响,无源蜂鸣器需要PWM波才响。
2.PWM脉冲波
PWM = 定时器 + 定时器中断(重载) + IO输出(翻转)
3.分析原理图
GPIO-GPD0_0
XpwmTOUT0定时器0,同上面IO口
4.pwm定时器上的资源
5个32位定时器
定时器会产生内部中断
定时器0,1,2,3可以通过编程实现PWM,定时器4有内部计时而没有输出
定时器都有各自对应的分频区
TCNTBn--,TCNTBn=TCMPBn
5.分频器 图形24-2
XpwmTOUT0 = PRESCALER0 + MUX + TCMPB0 + TCNTB0
6.例子分析
开启自动重载
设置TCNTBn和TCMPBn寄存器
手动设置
设置自动翻转,更新TCNTBn和TCMPBn寄存器
再次设置TCNTBn和TCMPBn寄存器(双缓冲再次更新)
定时器开启
TCNTBn--,TCNTBn=TCMPBn,翻转
TCNTn=0,产生中断
自动重载
TCNTBn--,TCNTBn=TCMPBn,翻转
TCNTn=0,产生中断
自动重载,产生中断。然后关闭自动重载
TCNTBn--,TCNTBn=TCMPBn,翻转
TCNTn=0,关闭自动重载,不再产生中断
自动重载关闭,停止。
7.简单用法
GPIO-GPD0_0设置为PWM输出GPD0CON[0] = 0x02
TCFG0 预分频(1-255)
TCFG1分频(1,2,4,8,16)
设置占空比:TCMPB0 和 TCNTB0 (TCMPB0
设置自动重载,开启定时器,自动翻转等。TCON 寄存器
二、pwm的ioremap
1.配置步骤
GPD0_0设置为pwm输出GPD0CON[0]=0x02
TCFG0预分频(1-255)
TCFG1分频(1.2.4.8.16)
设置占空比:TCMPB0和TCNTB0(TCMPB0
设置自动重载,开启定时器等
TCON寄存器
2.写代码
beep驱动
pwm
#include #include #include #include #include #include #include #include #include #include #define DRIVER_NAME "PWM" #define DEVICE_NAME "PWM" MODULE_LICENSE("Dual BSD/GPL"); MODULE_AUTHOR("TOPEET"); struct pwm_addr{ 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; //sotre virtual address and physical address volatile unsigned long virt_addr, virt_addr_gpio, phys_addr, phys_addr_gpio; volatile unsigned long *GPD0CON, *GPD0PUD; static void addr_init(void) { phys_addr = 0x139D0000; //(PWM Base Address) virt_addr = (unsigned long)ioremap(phys_addr, 0x48); //maybe 0x32 not enough PWM = (struct pwm_addr*)(virt_addr + 0x00); phys_addr_gpio = 0x11400000+0xA0; //GPD0 virt_addr_gpio = (unsigned long)ioremap(phys_addr_gpio, 0x24); GPD0CON = (unsigned long*)(virt_addr_gpio + 0x00); GPD0PUD = (unsigned long*)(virt_addr_gpio + 0x00A8 - 0x00A0); } static void PWM_Init(void) { addr_init(); /* config gpio */ *GPD0CON &= ~(0xf); *GPD0CON |= 0x2; //TOUT_0 *GPD0PUD &= ~(0x03); //disable pull-up/pull-down //prescaler0 0-254 + 1 (*PWM).TCFG0 = (((*PWM).TCFG0&(~(0xff)))|(0xf9)); //prescaler1 1.2.4.8.16 (*PWM).TCFG1 = ((*PWM).TCFG1&(~(0xf)))|(0x2); //set duty cycle (*PWM).TCMPB0 = 50; (*PWM).TCNTB0 = 100; //set auto-reload,timer on (*PWM).TCON = ((*PWM).TCON & (~(0xf))) | (0x1) | (0x2); } static void beep_on(void) { (*PWM).TCON = ((*PWM).TCON & (~(0xf)))|(0x1)|(0x8); } static void beep_off(void) { (*PWM).TCON = ((*PWM).TCON & (~(0xf)))|(0x0); //After timer stop,GPIO = 0; *GPD0CON = (*GPD0CON & (~(0xf)))|(0x0); } static int iTop4412_PWM_init(void) { PWM_Init(); beep_on(); return 0; } static void iTop4412_PWM_exit(void) { beep_off(); } module_init(iTop4412_PWM_init); module_exit(iTop4412_PWM_exit); 测试结果: [root@iTOP-4412]# insmod pwm.ko [root@iTOP-4412]# rmmod pwm 加载后蜂鸣器开启,不过频率不对 总结:根据逻辑框图中的寄存器名字,在PDF中搜索然后依次配置它。找到一个后,可以往下翻。类似的可能会在一起
上一篇:4412 按键和中断
下一篇:4412 RS485
推荐阅读


推荐帖子
- 问一下声音优化的问题
- 现在我要优化音频,希望能有一个可以直接对dsp芯片操作的api,现在的芯片是ti的tms320c54X系列芯片,可是我在下到的文档里面看到的函数好像都是dsp开发用的,没有对应用类直接支持的函数。 问一下,就是dsp开发时,一般芯片都会对音频提供硬件支持,这部分支持是否可以直接在应用层调用,还是依赖底层的驱动实现,如果有,应该去那里找,如果没有,实现的驱动一般会在上层提供什么样的接口给应用层。问一下声音优化的问题
-
highsea
嵌入式系统
- 掉电保护at24c02
- 本帖最后由paulhyde于2014-9-1503:09编辑请问:能不能只有当掉电的前一瞬间将数据存入at24c02进行保护,要怎么实现,一定还要添加外部电路吗 掉电保护at24c02
-
huangweichi123
电子竞赛
- 【KW41Z】LED点灯记
- 几经周转,折腾最好还是用了MCUXpresso点亮了LED 相比下,确实MCUXpresso比KinetisDesignStudio(KDS)好用很多。 KinetisDesignStudio(KDS)应该算是逐渐淘汰了。日后还是习惯用MCUXpresso比较方便的好 在导入工程的时修改,注意 这些选项都是宏定义的,其中宏定义在工程的属性在 后期可以根据实质进行修改 【KW41Z】LED点灯记
-
dvd1478
NXP MCU
- wince lcd 驱动
- pxa270 wince6.0 lcd是nec的NL2432HC22-41B。需要使用spi 在给lcd发送poweron命令的时候有个datainputstart 这个是做什么用的?应该发送什么data呢? wincelcd驱动
-
yoyomomo
WindowsCE
- EEWORLD大学堂----C2000系列之Concerto讲座
- C2000系列之Concerto讲座:http://training.eeworld.com.cn/course/276??TI推出的新型C2000Concerto双核微控制器(MCU)系列,可帮助开发人员设计出环保性能与连接能力更佳的应用。这种新型Concerto32位微控制器将TI的具有同类领先性能的C28x内核及控制外设与ARMCortex-M3内核及连接外设组合起来,以提供一种分区明确的架构,可在单个具有成本效益的器件中支持实时控制和高级连接。为方便其使用,TI利用一种
-
chenyy
单片机
- 逻辑功能求助
- inoutreg[15:0]Fsmc_data; regid_temp;always@(negedgeFsmc_NOEornegedgerst_n) begin case({Fsmc_addr,Fsmc_NBL0,Fsmc_NBL1,Fsmc_NE3,Fsmc_NOE,Fsmc_NWE}) 13'b0000111100001: begin//addr=0x6800000FNBL=0NE3=
-
bioger
FPGA/CPLD
设计资源 培训 开发板 精华推荐
最新视频课程更多
- 全国首创:提供支持RM/RMVB格式和MMS流媒体协议的无线IPTV方案
- 【规整帖】恩智浦 LPC1000社区精华帖 (更新至7月13日)
- 求教PB5.0中定制作wince的nk.bin文件和模拟器问题
- TCL史万文:未来数字家庭核心是平板电视“3C”化
- 【BG22-EK4108A 蓝牙开发套件】 一 、信息互传失败+实现bg22ncp写入
- PK台:凭什么男孩挑老婆要先看长相?
- 有没有设计单片机或CPU的 视频教程,请提供一下链接
- 如何在AM3359+SYSBIOS下建立GPIO HWI
- RDA的push方法报错:The table is not a tracked table。是什么原因呀?
- 难忘2017——不忘初心,继续前行