??
文章目录
- ??定时器的原理
-
- ??脉宽调制- PWM
- ??连接时间、周期、空比和调制频率
- ??PWM硬件控制器
- ??基本操作定时器
-
- ??定时器采用手动更新位置和反转位置进行初始化
- ??定时器操作步骤
- ??脉宽调制
- ??配置寄存器的值
- ??PWM蜂鸣器实验
-
- ??寄存器设置
- ??主要程序
- ??系统初始化
??定时器的原理
??在S5PV在210中,有5个32位定时器,可以发送中断信号ARM子系统。另外,定 时器0、1、2、3包含脉冲宽度调制(PWM),并且可以驱动其扩展I/O。PWM对定时器0有可选的dead-zone 支持大电流设备的功能。需要注意的是,定时器4是内置的,不接外引脚。 ??定时器0与定时器1共用8位预分频器,定时器2、定时器3与定时器4共用8位预分频器 频器,每个定时器都有一个时钟分频器,有五种分频输出(1/2、1/4、1/8、1/16和外部时钟 TCLK)。此外,定时器可以选择时钟源,定时器0?4可以选择外部时钟源,如PWM_TCLK。
??脉宽调制- PWM
??脉宽调制(PWM)它是一种非常有效的技术,利用微处理器的数字输出来控制模拟电路。 ??脉宽调制(PWM)它是一种非常有效的技术,利用微处理器的数字输出来控制模拟电路。 ??PWM从处理器到被控制系统的信号都是数字的,不需要数模转换。将信号保持在数字形式,以尽量减少噪声影响。 ??PWM这是一种数字编码模拟信号电平的方法。通过使用高分辨率计数器,调制方波的空比,编码特定模拟信号的电平。 ??PWM信号仍然是数字的,因为在给定的任何时刻,满幅值的直流电源要么完全可用(ON),要么完全无(OFF)。 ??电压或电流源是一种通过(ON)或断(OFF)重复脉冲序列被添加到模拟负载中。当直流电源被添加到负载中时,当电源被切断时。只要带宽足够,就可以使用任何模拟值PWM进行编码。
??连接时间、周期、空比和调制频率
??以上页面为例,连接时间为灯泡点亮时间 ??周期是一次通断的时间 ??空比是连接时间与周期之比 ??调制频率是周期的倒数。为了达到调光灯(保持点亮)的效果,必须提高调制频率。调制频率通常为1kHz到200kHz之间。
??PWM硬件控制器
??许多微控制器都包含在内PWM控制器。一般可以选择连接时间和周期。空比是连接时间与周期之比;调制频率为周期倒数。PWM控制器的编程细节会有所不同,但它们的基本想法通常是一样的。PWM操作前,微处理器需要在软件中完成以下工作: ??设置提供调制方波的片定时器/计数器周期; ??在PWM接通时间设置在控制寄存器中; ??启动定时器。
??定时器基本操作
??定时器(定时器4除外)均包含TCNTBn、TCNTn、TCMPBn和TCMPn几个寄存器。定时器计数缓冲寄存器(TCNTBn)中有一个初始值,当定时器使能后,这个值就被装载到递减计数器( TCNTn )中。与定时器相比,缓冲寄存器(TCMPBn)还有一个初始值,装载在比较寄存器中( TCMPn )用于比较递减计数器的值。当频率和占空比发生变化时,这两个缓冲器仍能产生稳定的输出。当TCNTn当0和中断使能时,定时器会产生中断请求。 ??自动加载和双缓冲模式脉宽调制定时器具有双缓冲功能,在不影响当前定时周期的情况下,改变下一个加载值。因此,尽管设置了新的定时器值,但当前定时器的操作将在不受影响的情况下继续完成。定时器的值可以写入定时器的值缓冲寄存器(TCNTBn)当前的计数器值可以通过读定时器计值观察寄存器(TCNTOn)得到。当TCNTn当值为0时,自动加载操作复制TCNTBn的值到TCNTn中。
??定时器采用手动更新位置和反转位置进行初始化
??只有当递减计数器的值达到0时,才能自动加载。因此,用户必须提前处理TCNTn定义一个起始值。因此,起始值必须由手动更新位载入。以下步骤描述了如何启动定时器。 ??① 写入初始值TCNTBn和TCMPBn中。 ??② 手动更新位置设置相应的定时器。推荐配置反转位开关(无论反转位是否使用)。 ??③ 设置相应定时器的起始位置,启动定时器(同时清除手动更新位置)。
??定时器操作步骤
??① 自动加载功能。TCNTBn为160,TCMPBn 为110。设置手动更新位置和反转位置。设置手动更新位置TCNTn 和 TCMPn 的值与 TCNTBn 和TCMPBn 同样的。然后设置 TCNTBn 和TCMPBn下一个周期的值分别为80和40。 ??② 如果手动更新位为0,反转位关闭并自动加载,则设置起始位置,定时器在定时器延迟后开始减少计数。 ??③ 当TCNTn的值和TCMPn相等时,则TOUTn逻辑电平将从低到高发生变化。 ??④ 当TCNTn当值达到0时,会产生中断,并且会TCNTBn在下一个时钟周期,TCNTn由临时寄存器加载TCNTn中。 ??⑤ 在中断服务程序中,TCNTBn和TCMPBn分别设置为80和60。 ??⑥ 当TCNTn的值和TCMPn相等时,则TOUTn逻辑电平将从低到高发生变化。 ??⑦ 当TCNTn到0时,TCNTn自动重新加载并发出中断请求。 ??⑧ 禁止自动加载和中断请求中断服务子程序,从而停止定时器。 ??⑨ 当TCNTn的值和TCMPn相等时,则TOUTn逻辑电平将从低到高发生变化。 ??⑩ 当TCNTn的值为0时,TCNTn将不再重新加载新值,以停止定时器。 ??禁止中断请求,不再产生中断请求。
??脉宽调制
??脉宽调制功能可以通过改变TCMPBn值实现。寄存器TCMPBn当计数器TCNTn中值减为和TCMPBn当值相同时,TOUT输出值取反。PWM的频率由TCNTBn决定,改变TCMPB输出方波的比例发生了变化。
??配置寄存器的值
?? ??在8位预定标准器和4位分频器的作用下,输出频率。TCFG0和TCFG1.数值分割PCLK。设PCLK的频率为50MHz,计算给定时器的计数时钟频率后,进行预标定和分频器。 ??计数时钟和输出: ??(1)定时器输入时钟频率fTclk(即计数时钟频率) ??fTclk=[fpclk/(Prescaler 1)] × 分频值 ??式中:Prescaler其值为0~255,分频值为1/2、1/4、1/8、1/16。 ??(2)PWM输出时钟频率 ??PWM输出时钟频率 = fTclk/TCNTBn ??(3)PWM输出信号占空比(即高电平持续时间占信号周期的比例) ??PWM输出信号占空比 = TCMPBn/TCNTBn ?? ??如表所示,定时器专用寄存器有6种、17种。 ??TCNTBn为Timern计数初值寄存器(计数缓冲寄存器,16位); ??TCMPBn为Timern比较寄存器(比较缓冲寄存器,16位); ??TCNTOn为Timern计数读出寄存器(16位)。
??PWM蜂鸣器实验
??定时器3的输出引脚TOUT3与蜂鸣器的三极管相连,该电路的三极管是PNP性,当TOUT三是高电平时,三极管饱和,电路导通,电流流过蜂鸣器,蜂鸣器发出声音;相反,当TOUT3 这三极管处于低电平时的截止状态,当电路关闭时,蜂鸣器停止发声。蜂鸣器声音的长度和频率完全是TOUT控制导通时间,一般可以设置延迟,长度可以自己实验。
??寄存器设置
??1、将PWMTOUT1相应的引脚配置PWM输出模式 ??2、 配置分频值和设置计数缓冲器和比较缓冲器的值 ??3、 启动相应的定时器,生成PWM波 ??4、 不断改变占空比和PWM蜂鸣器可以发出不同的声音
??主要程序
GPD0.GPD0CON = (GPD0.GPD0CON & (~0xF000) | (0x2 << 12)); //设置Tou3输出
TIMER.TCFG0 = (TIMER.TCFG0 & ~0xFF00) | 0xFF00; //配置预分频值为256
TIMER.TCFG1 = (TIMER.TCFG1 & ~0xF000) | 4 <<12;//配置分频的值为1/16分频
TIMER.TCNTB3 = 1280; //设置基数缓冲器的值
TIMER.TCMPB3 = 1280/4; //设置比较缓冲器的值
TIMER.TCON = 0x0e << 16; //手动更新,是缓冲器的值到计数器里面,双缓冲机制
TIMER.TCON = 0x0d << 16; //清除手动更新位,并启动定时器3
💦系统初始化
系统初始化有两个阶段:首先初始化运行环境,如异常向量表、中断向量表、堆栈、I/O等;其次初始化应用程序,如C语言变量初始化等。对有操作系统的应用系统,运行环境在操作系统启动时初始化,然后通过main()函数自动进入应用程序,C运行时库中的main()函数初始化应用程序。对于没有操作系统的应用系统,ROM中的代码必须提供一种应用程序初始化自身和开始执行的方法。 通常初始化代码位于复位后执行的代码,完成下面的内容:标识初始化代码的入口;设置异常向量表、中断向量表;初始化存储器系统;初始化堆栈指针;初始化一些关键的I/O口;初始化中断系统需要的RAM变量;使能中断;如果需要,切换处理器模式;如果需要,切换处理器状态。 运行环境初始化后,接下来就是应用程序初始化,然后进入C程序。 1)设置初始入口地址。一命可执行映像必须有一个入口。一个嵌入式ROM映像入口地址通常在0,入口可以通过汇编语言ENTRY来定义。系统中可能有多个入口,当系统中有多个入口时,其中某个入口必须通过_entry来指定为初始入口。如果包含C程序的系统程序中有main()函数,在C运行时库初始化代码中也有一个入口。 2)设置异常向量表。异常向量表包含一系列不能修改的指令,用以跳转到各异常的响立程序。 3)初始化存储器系统。如果系统中有内存管理或保护单元,必须在初始化前做两件事情:其一是中断禁止;其二是没有进行依赖于RAM的程序调用。 4)初始化堆栈。用来初始化代码、初始化堆栈指针寄存器,可以初始化部分或所有的堆栈指针,这取决于系统中用到的中断和异常。通常,SP_abt和SP_und在简单系统中没有用到,当然也可以初始化它们以用于调试。在处理器切换到用户模式,开始执行应用程序前设置SP_und。 5)初始化一些关键的I/O口设备。关键的I/O设备是使能中断前必须初始化的I/O设备。通常系统在此处初始化这些设备,如果没有初始化,当中断使能时,这些设备可能导致不期望的中断。 6)初始化中断系统需要的RAM变量。如果中断系统有缓冲区指针用来读取数据到内存缓冲器,该指针必须在中断使能前被初始化。 7)中断使能。如果需要,初始化代码现在能通过清除CPSR寄存器的中断禁止位来使能中断了,这是安全使能中断的最简单的方法。 8)切换处理器模式。程序执行到这仍然处于Svc模式,如果应用程序运行在USR模式,在此处切换到USR模式并初始化USR模式堆栈寄存器SP_Usr。 9)切换处理器状态。所有的RAM棱包括有Thumb功能的处理器,复位时都处于ARM状态,初始化代码都会是ARM状态。如果应用程序编译成Thumb代码,链接器会自动添加ARM状态到Thumb状态的小代码段,以实现由ARM状态到Thumb状态的切换。当然,也可以手动写初始化代码来完成切换。
.text
.global _start
_start:
ldr r0, =0xE2700000
mov rl, #0
str rl,[r0]
ldr sp,= 0xD0037D80 ;设置栈,以便调用c函数
ldr r0, =main
ldr r1, =0xD0030000 ;0xd0030000目标地址
ldr r2, =redirt_end
cmp r0, r1
beq run_on_dram
copy_loop:
ldr r3, [r0], #4 ;源
str r3, [r1], #4 ;目的
cmp r0,r2
bne copy_loop
run_on_dram:
ldr pc, =0xD0030008 ;跳转
halt:
b halt
S5 PV210上电将从IROM处执行固化的启动代码BL0,它对时钟等初始化、对启动设备进行判断,并从启动设备中复制BL1(最大16KB)到IRAM(地址0xD0020000处,其中0xD0020010之前的16个字节存储BL1的校验信息和BL1的尺寸)中,并对BL1进行校验,校验成功后转入BL1进行执行。 •BL0:是指S5PV210微处理器的IROM中固化的启动代码。 •BL1:是指在IRAM自动从外存储器(nand/sd/usb)中复制的uboot. bin二进制文件 的头16 KB代码。 •BL2:是指在代码重定向后在内存中执行的UBOOT的完整代码。 上述三者之间的关系是:BL0将BL1加载到IRAM,然后BL1在IRAM中运行并将BL2加载到SDRAM,BL2加载嵌入式操作系统内核。BL是bootloader的简称。 S5PV210微处理器的IRAM的地址范围是0xD0020000 - 0xD003FFF,上电后执行完固化的 BL0,并将启动设备的代码复制到IRAM中,并跳转到0xD0020010处执行。