您的位置 首页 软件

GNU ARM汇编–(九)s3c2440的PWM

依旧从datasheet开始看起,锻炼下阅读英文技术手册的能力PWMTIMER概述s3c2440有5个16bit的定时器Timer0,1,2和3有PWM功能Tim

仍旧从datasheet开端看起,训练下阅览英文技能手册的才能

PWM TIMER
概述
s3c2440有5个16bit的守时器.Timer0,1,2和3有PWM功用.Timer4是没有输出管脚的内部守时器.Timer0有一个dead-zone发生器,用于大电流设备.
Timer0和1共用一个8bit的预分频器,而timer2,3,4共用别的一个8bit的预分频器.每一个守时器都有一个时钟除法器,能够发生5个不同的除法信号(1/2,1/4,1/8,1/16和TCLK).每一个守时器从时钟除法器接纳各自的时钟信号,除法器从各自的8bit预分频器接纳时钟.8bit的预分频器是可编程操控的,将PCLK除成要加载的值,存在TCFG0和TCFG1中.
当守时器启用时守时器计数缓冲寄存器(TCNTBn)将初始值加载到down-counter中.守时器比较缓冲寄存器(TCMPBn)将初始值加载到比较寄存器中与donw-counter的值比较.当频率变化时TCNTBn和TCMPBn的双缓冲特点确保守时器发生安稳的输出.
每个守时器有自己的16bit down-counter,由守时器时钟驱动.当down-counter为0,守时器中止恳求发生来告诉CPU守时器操作以及完结了.当守时器的计数器为0,相关的TCNTBn的值会主动的加载到down-counter中来继续下一次操作.但是,当守时器中止,比如在守时器运转中铲除TCONn的守时器使能位,TCNTBn不会重加载到计数器中.
TCMPBn的值被用于PWM.当down-counter的值与比较寄存器的值吻合时,守时器操控逻辑会改动输出电平.所以比较寄存器决议PWM输出的翻开时刻.

特点
5个16bit的守时器
两个8bit的预分频器&两个4bit的除法器
输出波形可编程操控
主动重加载形式或one-shot pulse mode
dead-zone发生器

PWM TIMER OPERATION
Prescaler&Divider

BASIC TIMER OPERATION
一个守时器(除了5)有TCNTBn,TCNTn,TCMPBn和TCMPn.当守时器为0时TCNTBn和TCMPBn加载到TCNTn和TCMPn中.当TCNTn为0,假如中止敞开的话就会发生一个中止恳求.

AUTO RELOAD&DOUBLE BUFFERING
PWM守时器有一个双缓冲功用,确保下次守时器操作时重加载的值改动时无需中止当时的守时器操作.所以新的守时器的值设定,当时的守时器操作也能够成功完结.
守时器的值能够写到TCNTBn中,守时器的当时计数值能够从TCNTOn中读到.TCNTBn被读取的值,不标明计数器的当时状况,而是下一次守时器继续期间的重加载值.
当TCNTn为0,主动重加载操作会仿制TCNTBn到TCNTn中.假如TCNTn为0,而主动重加载的使能位为0,那么TCNTn不会再操作了.

TIMER INITIALIZATION USING MANUAL UPDATE BIT AND INVERTER BIT
当down-counter为0,守时器的主动重加载操作就会动作.所以user要预先界说TCNTn的初始值.在这种情况下,初始值经过手动更新位进行加载.下面的过程描绘怎么发动一个守时器:
1.向TCNTBn和TCMPBn中些初始值
2.设置守时器的手动更新位.引荐装备inverter on/off bit(不管用不用)
3.设置守时器的开端位来发动守时器(一起铲除手动更新位)
假如守时器被强行中止,TCNTn坚持计数器的值并且不会从TCNTBm中重加载.假如要设置一个新值,要履行手动更新.
留意:不管何时TOUT inverter on/off bit被更改,在守时器运转时TOUTn的逻辑值都会改动.因而,最好在装备手动更新位的时分装备inverter on/off bit.
TIMER OPERATION

上面的图是下面操作的成果:

1.使能主动重加载功用.设置TCNTBn为160(50+110),TCMPBn为110.设置手动更新位并装备回转位(on/off).手动更新位将TCNTn和TCMPn的值更新到TCNTBn和TCMPBn中. 接下来设置TCNTBn为80(40+40),TCMPBn为40,它们决议下一次重加载的值.

2.设置开端位,手动更新位设为0.封闭回转器,翻开主动重加载.在等待时刻后守时器开端计数

3.当TCNTn和TCMPn有相同的值时,TOUTn的逻辑电平由低变为高

4.当TCNTn为0时,中止恳求发生,TCNTBn的值被加载到一个暂时寄存器.在下次守时器周期,TCNTn会重载暂时寄存器的值.

5.在中止服务例程中,TCNTBn设为80(20+60),TCMPBn设置为60,相同用于下一次周期.

6.当TCNTn和TCMPn有相同的值时,TOUTn的逻辑电平由低变为高

7.当TCNTn为0,TCNTn主动加载TCNTBn的值,触发中止恳求.

8.在中止服务例程中主动重加载和中止恳求被禁用,中止守时器

9.当TCNTn与TCMPn有相同值,TOUTn的逻辑电平由低变为高

10.即便TCNT0为0,由于主动重加载被禁用了所以TCNTn不会再重加载,守时器中止了

11.没有中止恳求发生了

PULSE WIDTH MODULATION(PWM)

经过运用TCMPBn来完成PWM功用.PWM的频率由TCNTBn来决议.
削减TCMPBn的值能够有更高的PWM值.添加TCMPBn的值能够有更低的PWM值.假如输出回转使能了,添加和削减操作也要回转.
双缓冲功用答应在ISR中将下一次PWM的TCMPBn的值在当时PWM的周期的任何一个时刻点被写入.

OUTPUT LEVEL CONTROL

假定回转功用时封闭的,下面的过程描绘怎么确保TOUT是高仍是低:
1.封闭主动重加载位.TOUTn时高电平,当TCNTn为0时守时器中止.
2.经过铲除守时器的开端位来中止守时器.假如TCNTn<=TCMPn,输出高;假如TCNTn>TCMPn,输出低.
3.能够经过TCON的回转开关来决议TOUT是否回转.回转器会移除额定的电流来习惯输出电平.

PWM的各个寄存器描绘

(注:由于TQ2440的板子是用TOUT0来操控蜂鸣器的,所以有些寄存器就不重视了)

守时器装备寄存器0(TCFG0)

守时器输入时钟周期 = PCLK/(prescaler + 1)/(divider value)

{prescaler} = 0~255

{divider value} = 2,4,8,16

Register Address R/W Description

TCFG0 0x51000000 R/W 装备两个8的预分频器

TCFG0 Bit Description

Dead zone length [23:16] 死区的长度,长度等于timer0的单位长度

Prescaler1 [15:8] 这个是给Timer2 3 4用的

Prescaler0 [7:0] 这个是给Timer0 1用的

守时器装备寄存器1(TCFG1)

Register Address R/W Description

TCFG1 0x51000004 R/W 5路MUX和DMA形式挑选寄存器

TCFG1 Bit Description

DMA mode [23:20] 挑选DMA恳求通道

0000=No select 0001=Timer00010=Timer1

0011=Timer20100=Timer3 0101=Timer4

MUX4 [19:16] 为PWM Timer4挑选复用输入

0000=1/2 0001=1/4 0000=1/8

0011=1/16 01xx=External TCLK1

MUX3 [15:12] 为PWM Timer3挑选复用输入

0000=1/2 0001=1/4 0000=1/8

0011=1/16 01xx=External TCLK1

MUX2 [11:8] 为PWM Timer2挑选复用输入

0000=1/2 0001=1/4 0000=1/8

0011=1/16 01xx=External TCLK1

MUX1 [7:4] 为PWM Timer1挑选复用输入

0000=1/2 0001=1/4 0010=1/8

0011=1/16 01xx=External TCLK1

MUX0 [3:0] 为PWM Timer0挑选复用输入

0000=1/2 0001=1/4 0010=1/8

0011=1/16 01xx=External TCLK1

Timer操控寄存器
Register Address R/W Description
TCON 0x51000008 R/W 守时器操控寄存器
TCON Bit Descrption
Dead zone enable [4] 决议死区的操作 0=disable 1=enable
Timer0 auto reload on/off [3] 决议Timer0的主动重载 0=one-shot 1=auto reload
Timer0 output inverter on/off [2] 决议Timer0的输出电平回转开关0=封闭 1=翻开TOUT0的回转
Timer0手动更新(留意) [1] 决议Timer0的手动更新位0=不操作 1=更新TCNTB0&TCMPB0
Timer0开端/中止 [0] 决议Timer0的开端/封闭0=中止 1=敞开

留意:在下次写之前要被铲除

Timer0 COUNT BUFFER REGISTER & COMPARE BUFFER REGISTER(TCNTB0/TCMPB0)
Register Address R/W Description
TCNTB0 0x5100000c R/W Timer0计数缓冲寄存器
TCMPB0 0x51000010 R/W Timer0比较缓冲寄存器
TCMPB0 Bit Description
守时器比较缓冲寄存器 [15:0] 为Timer0设置比较缓冲值
TCNTB0 Bit Description
守时器计数缓冲寄存器 [15:0] 为Timer0设置计数缓冲值
Timer0计数调查寄存器(TCNTO0)
Register Address R/W Description
TCNTO0 0x51000014 R Timer0计数调查寄存器
依照datasheet的一些阐明和过程,给出汇编代码:
[cpp]view plaincopy

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qianrushi/ruanjian/258072.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部