历史上的今天
今天是:2024年12月10日(星期二)
2018年12月10日 | STM32 定时器输出方波的频率与PSC以及CNT的关系
2018-12-10 来源:eefocus
1.STM32F103的系统时钟最高频率是72MHZ
2.STM32F103的定时器TIM 的CNT计数值最大为65535
3.STM32F103的定时器TIM 的预分频 系数 PSC 的数值 = 72M / 定时器计数频率
因为CNT最大值为65535 所以, 这里有个问题, 当定时器计数频率太高的时候, 例如72M的计数频率.
1秒钟最多有72000000个计数, 当计数到65535个的时候是 0.0009102083秒 也就是 1098.65HZ
要想计数到1秒, 必须修改PSC,提高分频系数. 降低定时器计数频率
经过实际测量, STM32F103C8T6 最高输出方波的频率为18mhz. 再往上就无法输出了.
(有可能是我这个示波器的问题, 我的是pc虚拟示波器最大才20m的采样频率. )
后来实验确定最高确实只能达到18mhz, 因为ARR为1, PSC为0 已经是最高了. 不可能再高了.
估计STM32F4系列应该会更高一些吧.
下面列出了表格.
系统时钟频率 PSC 定时器计数频率
最高输出方波频率 定时器计数频率(MHZ) 最低输出方波频率
72000000 0 72000000.00 72.00 1098.65
72000000 1 36000000.00 36.00 549.32
72000000 3 18000000.00 18.00 274.66
72000000 5 12000000.00 12.00 183.11
72000000 7 9000000.00 9.00 137.33
72000000 11 6000000.00 6.00 91.55
72000000 23 3000000.00 3.00 45.78
72000000 35 2000000.00 2.00 30.52
72000000 71 1000000.00 1.00 15.26
72000000 719 100000.00 0.10 1.53
void ChangCLK(uint32_t fclk )
{
float rfclk = fclk * 2 ; //pwm波的频率是一高一低,两个才是一个周期,所以必须是两倍才能正常输出.同样频率的方波.
//重复计算,MaxCOUNT 和 TIME4_PSC 直到满足条件
while(1)
{
//TIME4_PSC + 1// 预分配需要72 但是要填71. 因为STM32器件就是这么规定的.
//计数频率 = 时钟主频 / 预分频系数
JiShuPinLv = TIME_ZhuPinLv / (TIME4_PSC + 1.0);
//目标频率 = 计数频率 * 计数个数MaxCOUNT;
//目标周期 = 1/目标频率;
//计数周期 = 1/计数频率;
//计数个数MaxCOUNT = 目标周期 / 计数周期
//得
//计数个数MaxCOUNT = (1/目标频率) / (1/计数频率)
//MaxCOUNT = (1.0 / rfclk) / (1 / JiShuPinLv);
//这种做法, 不适合程序执行, 耗时又不准,简化推导过程如下
//x = (1/a) / (1/b)
//x * a = a * (1/a) / (1/b)
//x * a = 1 / (1/b)
//x * a = b
//x = b/a
//代入简化后
MaxCOUNT = JiShuPinLv / rfclk;
if(TIME4_PSC == 0 || TIME4_PSC >= 65535)
{
break; //到极限了,下面就不要再计算PSC了
}
if(MaxCOUNT <= 2)
{
//计数周期大于目标周期, 那么减少预分频数值,提高计数频率
TIME4_PSC = TIME4_PSC / 10;
if(TIME4_PSC > 0)
{
continue; //下一循环再调整 ,并同时重新计算MaxCOUNT
}
}
else if( MaxCOUNT>=65535)
{
//计数值的范围不够了.那么增加预分频数值,降低计数频率
TIME4_PSC = TIME4_PSC * 10;
if(TIME4_PSC < 65535)
{
continue; //下一循环再调整 ,并同时重新计算MaxCOUNT
}
}else{
//一般情况下都是直接退出.
break;
}
}
if(MaxCOUNT <= 2) {
MaxCOUNT =2;//ARR不能等于0 否则就没有频率输出了.
}else if(TIME4_PSC > 65536) {
MaxCOUNT = 65536;
}
TIME4->PSC = TIME4_PSC;
TIME4->ARR = MaxCOUNT - 1; //-1是 STM32 器件本身的特点,填入MaxINT-1才是真正的按照MaxINT运行. //Period == ARR
//TIME4->CNT = 0;
//TIME4->CCR1 = 0 ; //输出比较模式下这个寄存器控制初相位应该都为0, pwm模式才是控制的高电平周期
}
史海拾趣
|
敷铜作为PCB设计的一个重要环节,不管是国产的青越锋PCB设计软件,还国外的一些Protel,PowerPCB都提供了智能敷铜功能,那么怎样才能敷好铜,我将自己一些想法与大家一起分享,希望能给同行带来益处。 所谓覆铜,就是将PCB上闲置的空间作为基准面, ...… 查看全部问答> |
|
P430颅内出血检测设备的研制策略1 引言 在中国有许多因创伤性颅脑损伤的患者急需抢救,但相当一部分颅内出血患者因未能及时诊断,延误了抢救和治疗时机.因而出现脑血肿或脑疝后压迫脑组织.使脑干和脑实质受到不可逆转的损伤。近红外颅内出血检测 ...… 查看全部问答> |
|
UBS to RS232 转接线(PL-2303HX)的特性及应用电路 本帖最后由 paulhyde 于 2014-9-15 09:20 编辑 1.USB转串口线: PROLIFIC推出了USB TO 类RS232接口转换芯片PL-2303HX,PL-2303HX可完美的应用于PDA、Modem、GPS、手机、数码相机、读卡机等与PC机的通讯电缆上,实际上很多手机的USB数据线就是 ...… 查看全部问答> |
|
wince启动信息: Loaded symbols for \'E:\\WINCE420\\PUBLIC\\DIRVERTEST\\RELDIR\\EMULATOR_X86DEBUG\\SCANDLL.DLL\' Unloaded symbols for \'E:\\WINCE420\\PUBLIC\\DIRVERTEST\\RELDIR\\EMULATOR_X86DEBUG\\SCANDLL.DLL\' 可以发现SCANDLL. ...… 查看全部问答> |
|
在http://blog.eeworld.net/knock/archive/2009/11/05/4771874.aspx 看到一文章说s3c6410 winCE6.0 IIC驱动读写冲突的原因是电源管理IC驱动也要通过IIC总线去读取电池电压和电流及充放电状态,这样混在一起,就出现了TX Time Out的现象。而关掉PMU ...… 查看全部问答> |
|
压缩包有四个文件,分别为: 1.MSP430x13x,MSP430x14x 混合信号微控制器 2.MSP430功能模块详解之--TimerA 3.MSP430寄存器详解系列之---AD 4.MSP430寄存器详解系列之--系统时钟 [ 本帖最后由 GONGHCU 于 2011-9-22 04:30 编辑 ...… 查看全部问答> |




