STM32 System and Timer Clock Configurations
STM32 System and Timer Clock Configurations
I've started writing some software to drive a series of TLC5940 16 Channel LED Driver chips on an ST STM32F407 Microcontroller.
I previously had code working on an Atmel microcontroller, but obviously with the change of hardware comes
the need for re-writing some of the lower peripheral configuration and application code.
The two main requirements for driving the TLC5940 chip from a microcontroller are:
- The grayscale clock
- A serial data bus
- system_stm32f4xx.c - the PLL register value #DEFINEs and initialisation code is found here
- stm32f4xx.h - the HSE frequency is defined at the start
- f(VCO clock) = f(PLL clock input) × (PLLN / PLLM)
- f(PLL general clock output) = f(VCO clock) / PLLP
These equations describe what is happening in the hardware.
My initial setup used the following configuration:
stm32f4xx.h:
- #define HSE_VALUE ((uint32_t)8000000)
- #define PLL_M 8
- #define PLL_N 336
- #define PLL_P 2
However after noticing the mention of increased clock jitter, I decided to change PLL_M to '4', PLL_N to '168'.
Using the peripheral library commands below, I've selected the HSE for MCO1, and SYSCLK divided by 5 for MCO2.
- RCC_MCO1Config(RCC_MCO1Source_HSE, RCC_MCO1Div_1);
- RCC_MCO2Config(RCC_MCO2Source_SYSCLK, RCC_MCO2Div_5);
And viewing these signals in the images below we can see that this is roughly the case.

UPDATE:
I've taken some measurements with the scopes at work and they appear to agree with the 8MHz result,




Now that I've verified my system's core clock is functioning as expected,
I can move onto configuring the clock modules to produce the desired BLANK and GSCLK signals to control the TLC5940 chips.
Using the SYSCLK signal, the 'Advanced High-performance Bus' (AHB) clock frequency is set via a prescaler.
In this case I am using the maximum frequency of the AHB by setting the prescaler to divide by 1.
The two 'Advanced Peripheral Bus' clocks (APB1 and APB2) are generated from the AHB via their associated prescalers.
They have maximum frequencies of 42 and 84MHz respectively,
so my APB1 prescaler is set to '4' and APB2 prescaler is set to '2'.
The internal signal that can be selected as the timer peripherals' clock is the APB1 clock.
HOWEVER...
and this is an important part to take note of:
While the APB1 signal provides the clock for numerous peripherals including the timer modules,
the timers can receive a faster clock if the APB1 prescaler is set to anything other than '1'. The manual states:
- If the APB prescaler is 1, the timer clock frequencies are set to the same frequency as that of the APB domain to which the timers are connected.
- Otherwise, they are set to twice (×2) the frequency of the APB domain to which the timers are connected.
Since the APB1 prescaler I am using is '4' and the AHB clock is 168MHz, the internal clock presented to the timer modules is actually (168/4) * 2 = 84MHz.
Inside the TIMx modules there are three main clock signals:
- CK_INT - The internal clock before prescaling
- CK_PSC - The clock signal after being divided by the prescaler
- CK_CNT - The counter clock, which generates pulses every time the prescaler counter overflows
Note that while there are different clock signals (internal clock, external clock, internal triggers, etc)
that can be used as the main input to each timer module, since I don't need to synchronise to external signals,
I will use the default internal clock, APB1.
The internal clock signal APB1 is fed into my main timer module TIM3.
This module will be used to provide both the GSCLK signal on an external GPIO pin,
and also to trigger/clock the slave TIM4 module which will provide the BLANK pulses.
Initially I intend to have the TIM3 setup for its fastest possible rate,
and then configure the output for the desired GSCLK frequency once both signals are synchronised correctly.
I am using a prescaler divide factor of 1 (TIM3_PSC = 0), so CK_PSC = CK_INT = APB1 * 2 = 84MHz.
This trigger is passed into TIM4 on the Internal Trigger network, which, when these two specific timers are used, is the Internal Trigger 2 signal (ITR2).
Returning to the original task of providing grayscale clock and blanking pulse signals for the TLC5940,
For the GSCLK signal, the TIM3 Output Compare Channel 1 (OC1) signal is configured to toggle its output
For the BLANK signal, we need to be able to synchronise the signals with a phase shift so that the desired number of GSCLK pulses are generated
so that it counts up to the ARR value and then counts down to zero and repeats.
- CCR1 = GSCLK_COUNT + 1
The timing for each timer module, and the resulting signals seen by the TLC5940 chip are shown below in Fig.1.



STM32 System and Timer Clock Configurations的更多相关文章
- STM32 Timer Clock sources -- External Clock Both Edge
Timers get their clock source from External pins or Internal timer sources. External External = pins ...
- STM32F10xxx 之 System tick Timer(SYSTICK Timer)
背景 研究STM32F10xxx定时器的时候,无意间看到了System tick Timer,于是比较深入的了解下,在此做个记录. 正文 System tick Timer是Cotex-M内核的24位 ...
- System.Threading.Timer 定时器的用法
System.Threading.Timer 是C# 中的一个定时器,可以定时(不断循环)执行一个任务.它是在线程上执行的,具有很好的安全性.为此 .Net Framework 提供了5个重载的构造 ...
- C# System.Timers.Timer的一些小问题?
比如设置间隔时间是 1000msSystem.Timers.Timer mytimer = new System.Timers.Timer(1000);问题若响应函数执行的时间超过了 1000 ms, ...
- C# System.Threading.Timer 使用方法
public class TimerHelper { System.Threading.Timer timer; public TaskSendMMS tasksendmms { get; set; ...
- [C#]System.Timers.Timer
摘要 在.Net中有几种定时器,最喜欢用的是System.Timers命名空间下的定时器,使用起来比较简单,作为定时任务,有Quartz.net,但有时候,一个非常简单的任务,不想引入这个定时任务框架 ...
- C# --System.Timers.Timer 定时方法
注意Start() 注意要等Interval 时间间隔 static void Main(string[] args) { System.Timers.Timer t = new System.Tim ...
- System.Threading.Timer使用心得
System.Threading.Timer 是一个使用回调方法的计时器,而且由线程池线程服务,简单且对资源要求不高. "只要在使用 Timer,就必须保留对它的引用."对于任何托 ...
- System.Windows.Forms.Timer与System.Timers.Timer的区别(zz)
.NET Framework里面提供了三种Timer: System.Windows.Forms.Timer System.Timers.Timer System.Threading.Timer VS ...
随机推荐
- swift中Any,AnyObject,AnyClass的区别
这几个概念让人很迷惑,看了很多帖子,终于搞明白了,简单总结: Any 和 AnyObject 是 Swift 中两个妥协的产物.什么意思呢,oc中有个id关键字,表示任何对象,oc和swift混编的时 ...
- [机器学习笔记]主成分分析PCA简介及其python实现
主成分分析(principal component analysis)是一种常见的数据降维方法,其目的是在“信息”损失较小的前提下,将高维的数据转换到低维,从而减小计算量. PCA的本质就是找一些投影 ...
- Nginx使用笔记
本篇记录使用Nginx的一些tricks. 一.更改默认Web根目录 修改配置文件 Nginx默认的Web根目录是:/usr/share/nginx/html/,一般我们都是习惯的是:/var/www ...
- CodeForces Contest #1110: Global Round 1
比赛传送门:CF #1110. 比赛记录:点我. 涨了挺多分,希望下次还能涨. [A]Parity 题意简述: 问 \(k\) 位 \(b\) 进制数 \(\overline{a_1a_2\cdots ...
- C#排队处理DEMO
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- 最完整的PS快捷键大全(绝对经典)
快速恢复默认值 有些不擅长Photoshop的朋友为了调整出满意的效果真是几经周折,结果发现还是原来的默认效果最好,这下傻了眼,后悔不该当初呀!怎么恢复到默认值呀?试着轻轻点按选项栏上的工具图标,然后 ...
- 转:vue-router 2.0 常用基础知识点之router.push()
转载地址:http://www.jianshu.com/p/ee7ff3d1d93d router.push(location) 除了使用 <router-link> 创建 a 标签来定义 ...
- C++Primer #7 类
类的定义 简单的来说类就是数据和它的操作的一种封装,内部提供接口函数 类的成员函数的声明必须在类的内部,而它的定义则既可以放在类的内部也可以放在类的外部.(一般在类内进行声明,类外实现函数定义) 定义 ...
- Nginx + PHP(php-fpm)遇到的502 Bad Gateway错误
我一个统计程序估计要跑1分多钟以上 查看了一个php-fpm 配置文件 [13-Oct-2013 12:06:07] WARNING: [pool www] child 7458, script '/ ...
- Windows 7 x64环境下SDK Manager闪退的解决方法
1.下载并解压:http://dl.google.com/android/adt/adt-bundle-windows-x86_64-20140702.zip 2.安装JDK,否则SDK Manage ...