一文简析TC3xx Rest/Clock/Watch模块

前言
本文包括tc3xx mcu的复位系统,时钟系统和看门狗模块三部分内容。在复位系统部分主要介绍了各种复位类型。在时钟系统部分主要介绍时钟源选择,pll倍频配置,时钟分发等内容。在看门狗模块部分主要介绍了开门狗复位的触发路径,看门狗模块的工作原理,cpu endinit/safe endinit的实现原理等内容。
1.reset
post这个信号对于mcu来说是双向的,也就是说在上电过程中porst是mcu的输出引脚,在完成上电过程后,porst是mcu的输入引脚。esr0是受porst控制的,porst输出低电平的时候,esr0也会输出低电平。
从post引脚引起的reset就叫warm power on reset,cold porst复位的范围最大,基本上mcu所有的模块都会reset。
刚上电的时候,mcu的电压是从0往上升的,所以刚开始的时候mcu处于一个under voltage的状态,mcu主要监控vext, vddp3, vdd三个输入电源,在刚开始的时候只要这三个电源有一个处于under voltage状态,或门(or)就会输出点平导通mos管,porst就会被拉低到地。
所以在电源上升的过程中这三个电源有一个处于lbd reset hold(电源监控阈值)以下,mos管就会被导通,porst就会被一直拉低到地(输出状态,输出低电平)。
电压起来后(大于监控阈值),mos管关断,porst变为输入状态,如果porst外接了一个ic或者复位按钮给了一个低电平,也会对mcu产生reset(warm power on reset)。
电压没起来前的reset叫做cold power on reset。
system or application reset包含的种类比较多:
1)software reset
2)来自于smu的reset
3)来自esr0的复位请求
一些模块可以单独reset(sw module reset,debug reset)。
复位原因寄存器
stm0-stm5代码stm compare match造成的reset
evrc, evr33,swd代表三个低电压引起的reset
stbyr表示standby regulator的under voltage detect
正常情况下reset后这个寄存器的值应该是0x10010000,也就是pors和stbyr会被置位。
reset status register中的关于cold power on reset的flag需要软件清除(rstcon2.clrc),不然就会一直为1 。
第四种的cold reset原因是:evr previous regulator的输出/standby supply电压小于1.13v。
warm power on reset就是在post变为输入状态后,外部对post产生一个低电平引起的复位(ram数据是可以保持的)。
posr和esr0的复位时序:首先在post(input)上产生一个下降沿的负脉冲,通过mcu内部的一些逻辑电路产生延迟后esr0被拉低,mcu内部的一些模块和电路(pads/port reset)就会被reset,在esr0被拉下来以后,cpux核、peripheral、flash、clock就会发生复位,这些模块复位后esr0就会被释放掉,从0变成1,从这个点开始,mcu的firmware(boot rom)开始执行(execution)。
对于esr0我们也可以配置一个esr0的delay,当esr0的delay大于boot rom的执行时间后,boot rom执行完准备跳转到user code前会去检测esr0是不是被拉低,如果没有被拉低的话,就会等待esr0被拉低后再跳转到user code。
2.clock system
时钟选择部分:外部晶振接入作为mcu的source clock,sysclk这个pin脚信号输入作为mcu的source clock,也可以使用fback这个100mhz的片内时钟作为source clock。
倍频pll部分:在tc3xx里面有两个pll:
1)system_pll主要是倍频后给mcu的内核提供时钟。
2)peripheral_pll主要是倍频后通过一些分频给外设提供时钟。
时钟分配(distribution)部分:system_pll产生倍频时钟fpll0,peripheral_pll产生倍频时钟fpll1和fpll2,他们通过clock distribution
后通过时钟分频器可以产生各种各样的时钟频率供外设使用。
tc3xx有两种内部晶振:
1)100mhz的 back-up clock
2)70mhz的 standby clock,精度比较低,给scr提供时钟。
extclk0和extclk1可以配置输出上面各种时钟用来观测。
一般我们选择20mhz或者25mhz的外部晶振输入,通过system_pll倍频后产生一个300mhz的fpll0,fpll0一般直接输出300mhz给cpu各个内核提供时钟。通过peripheral_pll产生160mhz的fpll1和200mhz的fpll2,再通过分配给各种外设提供时钟。
fsource0,fsource1,fsource2就是fpll0,fpll1,fpll2通过各种xxxdiv分屏器产生时钟给各个模块使用,一般fcpux是300mhz,fgeth为150mhz。
note:fmcanh是给can模块的寄存器和ram操作提供时钟的,fmcan是给can波特率产生提供时钟的。
fsri通过分频产生fcpux给cpu提供时钟,三个cpu的时钟可以不同,cpu时钟的改变不会影响其他外设时钟。
但是注意系统时钟频率的改变会使得系统电流发生改变,影响系统的稳定性。
外接晶振有两种模式可以选择:
1)external input mode,这种模式下只需要用到输入的xtal1就行了(xtal2不需要),也就是在这种模式下需要接一个有源晶振。
2)external crystal mode,这种模式下xtal1和xtal2都会用到,外部接的无源晶振。
外部晶振频率范围是16mhz到40mhz。
在tc3xx里面还有有load capacitor(负载电容),也就是晶振的负载电容可以不用外部接,可以通过配置寄存器使用内部负载电容。
oscillator watchdog
在system_pll里面有一块电路叫oscillator watchdog,这块电路主要用来检测输入的晶振在一定的范围里面。它的检测方法是通过内部的100mhz的fbak通过1/40分频产生一个2.5mhz的reference clock,以这个reference clock对fosc经过1/(oscval+1)分频后的时钟进行monitor,如果对比后在一个tolerance range范围外的话,就会置位osccon.pllhv或者osccon.plllv两个寄存器位域。

一般都是使用外部20mhz的输入晶振以及分频/倍频参数来参数cpu和外设时钟。
pll配置流程:
1)使能使用外部晶振
2)clock control unit的input clock选择fbak,clock control unit已经属于clock distribution了,没有选择fpll而是选择fbak作为它的输入时钟,所以这个时候cpu和peripheral都是基于fback的。
3)选择fosc作为pll的输入时钟。
4)设置一个初始的pll配置参数,比如我们先把system_pll倍频到100mhz,peripheral_pll可以直接倍频到最终频率,比如peripheral_pll1到320mhz,peripheral_pll2到200mhz。
5)设置分频寄存器。
6)把clock control unit的input clock选择从fbak切换到pll。
7)system_pll也就是fpll0慢慢从100mhz倍频到300mhz,是的系统的电流平稳上升。
cpu时钟慢慢倍频上去,让电流的变化平滑上升。
3.watchdog
tc3xx芯片的watchdog在scu模块里面,watchdog分为两种,一种是cpu watchdog,一种是safety watchdog,每一个cpu都有自己的cpu watchdog。
每个watchdog有三个register,wdtxcon0,wdtxcon1,wdtxsr。
watchdog一般情况下如果watchdog time溢出了就会产生一个watch dog reset,在tc3xx中watchdog的timeout并不会直接触发reset,而是经过配置smu后会触发smu里面的一个recovery timer启动,recovery timer的timeout时间可以配置,单recovery timerout后就会产生一个alarm,如果这个alarm配置为reset信号的话,就会触发reset。
endinit的保护有三种:
1)“ce”保护,只有把每一个cpu的endinit设为0后,这个cpu的critical registers保护才被解除(可写)。
2)“e”保护,任意一个cpu的endinit设为0后,所有cpu的system critical registers保护就解除了。
3)“se”保护,safety watchdog的endinit设为0后,safety endinit的保护就解除了。
endinit设置为0的操作,需要一套较为复杂的操作序列。
endinit置为0需要一段时间,只有等到endinit真的为0后才能执行往下的操作,不然可能会产生异常。
eicon0和seicon0是两个global的endinit保护寄存器,如果不想改变watchdog cpux或者safety watchdog的endinit值,但是又想解除保护,就可以使用global的eicon0和seicon0(前提是endinit的保护等级是“e”或者“se”)。
对于保护等级为“e”或者“se”的寄存器,在操作它之前需要先解除endinit保护。
fsys类似fspb,类似于外设总线频率。
复位以后cpu的watchdog默认是处在time-out mode下的,wdt在time-out mode下就会从0xfffc开始往上计数,如果计数到0xffff就会溢出,如果在计数到0xffff之前对wdt_con0进行了password access后对wdt_con0进行了modify access,重新对wdt进了reload value到rel_1值(写寄存器前endinit值改为1了,也就是先要介绍endinit保护),这样wdt从time-out模式切换到了normal mode,这个时候wdt开始从rel_1值晚上计数。
note: 后面会介绍password access和modify access
在上图中的3)的地方对wdt_con0进行了password access,wdt就会切换到time-out mode,wdt又从0xfffc开始计数,如果在4)这个点,又对wdt_con0做了password access就会切换wdt到normal mode,同时对wdt_con0做了一次modify access后,wdt从rel_2开始计数。
计数到0xffff后wdt就溢出了,触发smu的timeout的alarm,这个alarm会触发smu里面的一个recovery time进行计数,recovery time也timeout后就会产生一个smu的reset。
password access的条件是lck为0,endinit为1。wdtxcon0.pw[7:2]写入当前wdtxcon0.pw[7:2]值的反转值,wdtxcon0.pw[15:8]写入当前wdtxcon0.pw[15:8]值,这样password access就解锁了。
如果password成功以后,就相当于这个寄存器被解锁了,然后就可以在pw中填入新的password,rel和endinit也可以写入新的值,当完成modify access后,这个寄存器就又被lock住了,如果要改它就需要再来一次password access。
当wdt_con0进行了一次password access之后wdt的状态会切换为time-out mode,也就是说接下来操作这个寄存器的时间必须要比较短,就是要在watchdog timeout之前完成操作。
set endinit的modify access动作会设置wdt_con0.init为1,wdt的reload timer会重新reload一次,也就是和watchdog的喂狗操作是一样的。


郭董失算了,传LG拟穷尽手段助三星解面板断货之危
京东物流与跨越速运强强联合
哪个品牌的蓝牙耳机质量比较好、高品质蓝牙耳机排行榜
信捷产品在折弯机系统中的应用
三菱FX5U PID自动调节控制案例
一文简析TC3xx Rest/Clock/Watch模块
英伟达携手沃尔沃打造自动驾驶汽车:将使用Nvidia硬件
利用Microchip的即插即用传感器库简化您的下一个位置传感器设计
8GB运存+小米三星的黑科技、国产机有一加5还斗不过苹果?
全方位体成分报告+智能识别身材,八电极华为体脂秤2Pro双十二正式开售
智能家电的热潮方太联合业界呼吁冷静,智能家电的出现让想象中的生活变为现实!
延长蓄电池寿命十大招数
智慧工厂的制造执行系统MES
直流电机辐射不合格,有哪些整改方案可以加?
三星在印度推出了一款基于Micro LED显示的电视
无线通讯OFDM调制的实现
母线槽安装使用与维护
研华工控一体机使用教程
新27英寸iMac评测:全身是细节的高生产力工作设备
谷歌想研发芯片推动人工智能发展 英特尔受威胁