|
继续前文的说。
楼主首先研究了FR5969的时钟系统。根据手册,大家可以知道,小狼它有着这样的时钟树——
只是截个图而已,大家可以找原版,更清晰。
在这里面,对于楼主来说,能够找到一条又好又快又便宜的解决方案。那就是使用DCO提供24M的时钟,然后利用它来提供给主时钟和系统子时钟。
但是,一定要注意一点:忘记了在哪里看到,FR5969最高支持16M主频(在哪里,在哪里见过你~),所以24M的时钟供给主时钟的时候一定要分频,除以2就可以了。我试图认为我的理解是错的,所以故意没有分频就提供给主时钟了,但是芯片跑的火云邪神似的……如果你做了实验可以不用分频提供高达24M的主时钟,请一定要来纠正我的错误。
思路基本就是这样的。所以操作上就很容易啦:
- //DCO = 24MHz (RSEL = 1, FSEL = 6)
- CSCTL0 = CSKEY;
- CSCTL1 = DCORSEL | DCOFSEL_6;
- CSCTL2 = SELM__DCOCLK | SELS__DCOCLK | SELA__VLOCLK;
- CSCTL3 = DIVM__2 | DIVS__1 | DIVA__1;
- CSCTL0_H = 0;
复制代码 想设置成其他频率的话,参考这些设置,自行调整就可以了。
接下来聊聊看门狗WDT。
看门狗当然是为了防止程序异常而不能恢复的,会强制让芯片Reset。不过楼主经常那它做别的事——在没有Tick计时器的系统中充当Tick计时器。
好在大多数的看门狗都具有这一本事。
经过学习,发现FR5969的看门狗真的很简单,只有一个寄存器。
如果把它当成计时器,那么记得选上WDTTMSEL;处理好计时器超时后的处理,比如计数复位WDTCNTCL;选好时钟源和分频,由于我们给系统提供了比较高频的时钟,而我又不希望我的Tick太频繁,所以我用一个慢一些的时钟,找一个合适分频比例,最后提供了6.4ms的Tick。
请看代码,不要忘了写这个寄存器要提供密码:WDTPW
- void timer_init(void)
- {
- SFRIE1 |= WDTIE;
- WDTCTL = (WDTPW + WDTTMSEL + WDTSSEL__VLO + WDTCNTCL + WDTIS__64); /* 0.1ms * 64 */
- }
- #pragma vector=WDT_VECTOR
- __interrupt void watchdog_timer(void)
- {
- static u8_t i = 0;
- if(i < 5)
- {
- /* 6.4ms * 5 */
- i++;
- }
- else
- {
- i = 1;
- spf_call_proc(PROC_TIMER, TIMER_TICK, PROC_CALL_SINGLE);
- }
- }
复制代码 如上述代码,6.4ms的中断又被我整理了一下,实际对于我的系统,Tick变成32ms了。
好了,这两部分都很简单吧,楼主可是研究了好一阵的。
By the way, 楼主也弄了弄GPIO,其实也很简单的,和在MSP430G2553上差不多呢,暂时先不啰嗦了。官网上也可以找到FR5969的例程,大家可以下载研究研究。
眼下就是国庆了,休息休息也不能研究了,搞起假期大迁徙,小伙伴儿们国庆快乐!
|
|