打印
[Kinetis]

Ke02如何使用外部晶振来作为时钟源?求助

[复制链接]
3833|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
之前帖子发到技术交流去了......文件组织结构如图,官方库有点难懂,所以没有使用,直接在Keil安装目录下找的这些文件,编译环境:MDK

问题1:这些文件是在keil下找到的,dirvers用的别人写的,外设能用起来,没有使用官方库,单步时这个system_MKE02Z2.c
好像只是关了看门狗,也没干别的,不知道时钟怎么配置,使用的是内部时钟还是外部时钟,看官方库,看的很晕。

问题2:我想自己配置一下,使用外部晶振,来调整成自己需要的BUS ,core,plat,system clock ,etc频率。但是又不知道
怎么配。看了文档,但是看的晕晕乎乎的,不知道如何下手,感觉KE02的clocking diagram 还不是很复杂,但是就是下不了手,
不知道如何把这个要配置的寄存器连贯起来。先配哪个后配置哪个?




相关帖子

沙发
FSL_TICS_ZJJ| | 2015-11-10 12:29 | 只看该作者
你还是直接参考官方的KE02的驱动,那里面用的就是外部10M的晶振。
代码下载链接:
http://www.freescale.com/webapp/ ... nt_pageType=product

使用特权

评论回复
板凳
ldysucc2017|  楼主 | 2015-11-10 13:19 | 只看该作者
FSL_TICS_ZJJ 发表于 2015-11-10 12:29
你还是直接参考官方的KE02的驱动,那里面用的就是外部10M的晶振。
代码下载链接:
http://www.freescale.co ...

:'(,要是有你们能讲解下调整bus,core clock,etc的**就好了,对我们初学者来说文档挺吃力,代码也是一样的

使用特权

评论回复
地板
FSL_TICS_ZJJ| | 2015-11-10 13:28 | 只看该作者
ldysucc2017 发表于 2015-11-10 13:19
,要是有你们能讲解下调整bus,core clock,etc的**就好了,对我们初学者来说文档挺吃力,代码也是 ...

现在就以KEXX_DRIVERS_V1.2.1_DEVD\kexx_drv_lib\build\iar\ke02\platinum这个例程,你看sysinit.c文件中的
void sysinit (void)函数,顺着看,哪里不懂,你直接问我。
关于时钟模式转换在ICS_Init函数中。
你对照这个reference manual看,如果看不懂的地方,直接跟帖问我,我会把这块讲解给你听的。

使用特权

评论回复
5
ldysucc2017|  楼主 | 2015-11-10 14:42 | 只看该作者
本帖最后由 ldysucc2017 于 2015-11-10 14:49 编辑
FSL_TICS_ZJJ 发表于 2015-11-10 13:28
现在就以KEXX_DRIVERS_V1.2.1_DEVD\kexx_drv_lib\build\iar\ke02\platinum这个例程,你看sysinit.c文件中 ...

1. 为什么要tirm,是因为能使时钟达到40M? 39.0625*1024=40Mhz,32.768Khz*1024=33554432hz。如果我想用外部晶振,那这个是不是可以删掉?

2.sSIMConfig.u32PinSel |= SIM_PINSEL_SPI0PS_MASK;    remap SPI0 pins to alternative pins ,在SIM_PINSEL中有,将他们映射到SPI0_SCK, SPI0_MOSI, SPI0_MISO, and SPI0_PCS0 are mapped on PTE0, PTE1, PTE2, and PTE3.管脚不是有优先级的吗?还映射?

3,    #if !defined(CPU_KE04) //如果用CPU_KE02这种芯片,则做下面这些工作,是这个意思吧???
    /*  下面这些都是操作SIM_SCGC,打开相应的clock gate*/
    sSIMConfig.u32SCGC |= SIM_SCGC_SWD_MASK | SIM_SCGC_FLASH_MASK |
                         SIM_SCGC_UART0_MASK | SIM_SCGC_UART1_MASK |
                         SIM_SCGC_UART2_MASK    ;
    #else  //如果用CPU_KE04这种芯片,则做下面这些工作
    sSIMConfig.u32SCGC |= SIM_SCGC_SWD_MASK | SIM_SCGC_FLASH_MASK |
                         SIM_SCGC_UART0_MASK


问题有些幼稚,也有些啰嗦,请见谅哈,^_^



使用特权

评论回复
6
FSL_TICS_ZJJ| | 2015-11-10 14:50 | 只看该作者
ldysucc2017 发表于 2015-11-10 14:42
1. 为什么要tirm,是因为能使时钟达到40M? 39.0625*1024=40Mhz,32.768Khz*1024=33554432hz。如果我想用 ...

回答你的几个问题:
1. trim主要是针对内部时钟的,可以实现内部时钟在31.25Khz 到 39.0625khz之间的trim,出厂值是31.26khz,这些都可以在datasheet中查到。如果你用外部时钟,当然可以不调用trim,就默认出厂值就行了。
2.你如果看reference manual的话,这个位就很容易理解了。
I2C0 Port Pin Select
Selects the I2C0 port pins.
0 I2C0_SCL and I2C0_SDA are mapped on PTA3 and PTA2, respectively.
1 I2C0_SCL and I2C0_SDA are mapped on PTB7 and PTB6, respectively.
也就是说,对于I2C SDA这个脚,到底是放在PTA口还是PTB口。
3.如果是KE02,那么这段代码就要运行,其实就是打开一些模块的时钟。

我们提倡有问题就问,不过,建议你先仔细读读我们的参考手册,这样很多问题就不是问题了。

使用特权

评论回复
7
ldysucc2017|  楼主 | 2015-11-10 20:39 | 只看该作者
本帖最后由 ldysucc2017 于 2015-11-10 20:48 编辑
FSL_TICS_ZJJ 发表于 2015-11-10 14:50
回答你的几个问题:
1. trim主要是针对内部时钟的,可以实现内部时钟在31.25Khz 到 39.0625khz之间的trim ...

问题1:u32Sopt |= ((pConfig->u8BusRef & 0x07) << 16);  是将分频后的总线时钟通过PTH2输出???                       BUSREF BUS Clock Output select            
             Enables bus clock output on PTH2 via an optional prescaler.,
            这个看不太懂,通过可选的预分频器,balala。。。
            u32Sopt |= ((pConfig->u8Delay) << 24);  //FTM2 Trigger Delay
            u32Sopt |= ((pConfig->sBits.u8ADHWT & 0x03) << 8);这里的u8AHDWT 是0 ,所以无效

问题2:#define SIM_SOPT_RXDFE_MASK    0x2000u
             u32Sopt |= SIM_SOPT_RXDFE_MASK; UART_RX的输入信号经过ACMP滤波,然后再送给UART0; 这是做有什么用意吗?
        RXDFE=1  UART0_RX input signal is filtered by ACMP, then injected to UART0.

问题3:while(!(ICS->S & ICS_S_LOCK_MASK));        
        /* now FLL output clock is FLL reference clock* FLL multiplication factor.
         * See Reference Manual for multiplication factor. 那这个FLL的倍频是多少怎么算呢?
         */
          Refer Manual——P272  The FLL loop locks the frequency to 1024 times the external reference frequency, as
               selected by ICS_C1[RDIV] and  OSC_CR[RANGE ]. The external reference clock is enabled.
问题4:/* clear Loss of lock sticky bit */不明白这里
               ICS->S |= ICS_S_LOLS_MASK;
              0 FLL has not lost lock since LOLS was last cleared.
             1 FLL has lost lock since LOLS was last cleared.

问题5:CLKS这个在程序里好像没找到,不过它默认就是0,也就是选择FLL输出的频率,是因为这个原因程序才没写的吗?


下面的图是现在的理解,有错请指出下哈,现在感觉要好一些了,不知道FLL的倍频是不是1024?如果是,那么最后经
过sysinit(void)初始化的BUS clock ,Core clock,Plat clock ,system clock都是20Mhz了




谢谢你,




使用特权

评论回复
8
FSL_TICS_ZJJ| | 2015-11-11 11:13 | 只看该作者
回答你的几个问题:
问题1:u32Sopt |= ((pConfig->u8BusRef & 0x07) << 16);  是将分频后的总线时钟通过PTH2输出???                       
BUSREF BUS Clock Output select   
             Enables bus clock output on PTH2 via an optional prescaler.,
            这个看不太懂,通过可选的预分频器,balala。。。
            u32Sopt |= ((pConfig->u8Delay) << 24);  //FTM2 Trigger Delay
            u32Sopt |= ((pConfig->sBits.u8ADHWT & 0x03) << 8);这里的u8AHDWT 是0 ,所以无效

答1:1)u8BusRef 对应的其实是寄存器SIM_SOPT[BUSREF],只有三位,是把bus时钟经过分频输出到PTH2引脚,默认就是bus时钟,不分频,你也可以看到代码中没有对u8BusRef配置,所以就是直接的bus输出。
2)u32Sopt |= ((pConfig->u8Delay) << 24);就是SIM_SOPT[DELAY],FTM2 Trigger Delay,具体你看RM中这个位的解释,我不需要都贴出来。
3) u32Sopt |= ((pConfig->sBits.u8ADHWT & 0x03) << 8);SIM_SOPT[ADHWT],选择ADC的硬件触发源,默认RTC溢出位ADC硬件触发源,具体可以在使用ADC模块的时候进行配置。

使用特权

评论回复
9
FSL_TICS_ZJJ| | 2015-11-11 11:15 | 只看该作者
问题2:#define SIM_SOPT_RXDFE_MASK    0x2000u
             u32Sopt |= SIM_SOPT_RXDFE_MASK; UART_RX的输入信号经过ACMP滤波,然后再送给UART0; 这是做有什么用意吗?
        RXDFE=1  UART0_RX input signal is filtered by ACMP, then injected to UART0.
答2:u32Sopt |= SIM_SOPT_RXDFE_MASK; SIM_SOPT[RXDFE]=1,这个其实在讲UART配置为红外接收功能的时候用的,KE02的uart0还有红外功能,关于红外功能,我在论坛分享过一篇经验分享,你可以看看:https://bbs.21ic.com/icview-1183522-1-1.html

使用特权

评论回复
10
FSL_TICS_ZJJ| | 2015-11-11 11:17 | 只看该作者
问题3:while(!(ICS->S & ICS_S_LOCK_MASK));        
        /* now FLL output clock is FLL reference clock* FLL multiplication factor.
         * See Reference Manual for multiplication factor. 那这个FLL的倍频是多少怎么算呢?
         */
          Refer Manual——P272  The FLL loop locks the frequency to 1024 times the external reference frequency, as
               selected by ICS_C1[RDIV] and  OSC_CR[RANGE ]. The external reference clock is enabled.
答3:FLL的倍频系数是固定的,1024,
你可以在reference manual的272页看到这样的话:
The FLL loop locks the frequency to 1024 times the external reference frequency
所以这个值,不用算,直接就是1024固定,是芯片特性。

使用特权

评论回复
11
FSL_TICS_ZJJ| | 2015-11-11 11:19 | 只看该作者
问题4:/* clear Loss of lock sticky bit */不明白这里
               ICS->S |= ICS_S_LOLS_MASK;
              0 FLL has not lost lock since LOLS was last cleared.
             1 FLL has lost lock since LOLS was last cleared.

答4:也就是检查FLL的锁频状态,你要知道FLL的输入是有范围的,如果你输入在FLL的范围之外,就会导致FLL锁频失败,所以只是一个状态标识位,在操作之前,需要先清除这个位。

使用特权

评论回复
12
FSL_TICS_ZJJ| | 2015-11-11 11:23 | 只看该作者
问题5:CLKS这个在程序里好像没找到,不过它默认就是0,也就是选择FLL输出的频率,是因为这个原因程序才没写的吗?

答5:其实你从时钟框图就可以看出,这个就是选择ICSOUTCLK的来源,默认是FLL,因为芯片上电模式是FEI模式,所以CLKS就是默认的FLL输出,具体看你需要什么时钟模式。只要用FLL,内核时钟都会选择FLL输出作为时钟源。

使用特权

评论回复
13
FSL_TICS_ZJJ| | 2015-11-11 11:25 | 只看该作者
最后一个图,你的理解是正确的,其实你可以ke02_config.h中看到具体的时钟值。都是20M的。

使用特权

评论回复
14
forthlab| | 2015-11-11 11:57 | 只看该作者
如果是做产品,建议直接用PE,不要把时间浪费在看手册上。
如果是学习那就另当别论了。
好比是用集成电路还是分立元件,用C还是汇编。

使用特权

评论回复
15
ldysucc2017|  楼主 | 2015-11-12 14:00 | 只看该作者
forthlab 发表于 2015-11-11 11:57
如果是做产品,建议直接用PE,不要把时间浪费在看手册上。
如果是学习那就另当别论了。
好比是用集成电路还 ...

好的,谢谢

使用特权

评论回复
16
ldysucc2017|  楼主 | 2015-11-12 15:59 | 只看该作者
FSL_TICS_ZJJ 发表于 2015-11-11 11:25
最后一个图,你的理解是正确的,其实你可以ke02_config.h中看到具体的时钟值。都是20M的。 ...

谢谢大神啦,搞了一天,终于把官方的那个sysinit()移植好了另外想问下,这个延时函数是延时怎么算的?
unsigned int myClock = 20000000 ;//自己改的
void DelayInit(void)
{
        SysTick->CTRL |= 0x04; //使用系统时钟,20MHz
        fac_us = myClock/1000000;   //10MHz
       fac_ms = (uint32_t)fac_us*1000;
}


fac_us = SystemCoreClock/1000000;   //10MHz 想问下这里为什么要除以10M?



使用特权

评论回复
17
FSL_TICS_ZJJ| | 2015-11-13 09:48 | 只看该作者
ldysucc2017 发表于 2015-11-12 15:59
谢谢大神啦,搞了一天,终于把官方的那个sysinit()移植好了另外想问下,这个延时函数是延时怎么算的?
u ...

关于systick,我建议你去看看内核文档。
内核自带一个24位向下计数的定时器,叫systick, 其控制寄存器CTRL中的bit2, CLKSOURCE,如果设置为1,说明选择内核时钟作为时钟源。
然后systick计数一次就代表一个内核时钟的时间,具体定时时间,你可以设置Systick 的加载值,等计数到0的时候,完成定时,关掉systick。
先搞清楚原理,然后你就不难设置了。

使用特权

评论回复
18
ldysucc2017|  楼主 | 2015-11-13 14:22 | 只看该作者
FSL_TICS_ZJJ 发表于 2015-11-13 09:48
关于systick,我建议你去看看内核文档。
内核自带一个24位向下计数的定时器,叫systick, 其控制寄存器CT ...

好的,谢谢ZJJ!

使用特权

评论回复
19
FSL_TICS_ZJJ| | 2015-11-13 17:46 | 只看该作者

不客气,如果还有问题,欢迎继续交流。
如果问题解决了,还请帮我们及时结贴,谢谢!

使用特权

评论回复
20
我是酱油哥| | 2016-2-17 11:55 | 只看该作者
FSL_TICS_ZJJ 发表于 2015-11-11 11:19
问题4:/* clear Loss of lock sticky bit */不明白这里
               ICS->S |= ICS_S_LOLS_MASK;
      ...

1、trim  修改的是内部时钟么?那个进入FLL的时钟必须是31k~39.0625khz么?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

60

帖子

1

粉丝