yanjiesh 发表于 2013-11-29 14:25:36

STM32F107VC systeminit() 解析遇到困难,请教高手 RCC_CFGR的用法 ...

正在配置IIC总线的时钟 ,但是 配给它的PCLK1 的时钟信息不明, 所以查到 systeminit()里去了 ,看到以下语句:
void SystemInit (void)
{
/* Reset the RCC clock configuration to the default reset state(for debug purpose) */
/* Set HSION bit */
RCC->CR |= (uint32_t)0x00000001;

/* Reset SW, HPRE, PPRE1, PPRE2, ADCPRE and MCO bits */
#ifndef STM32F10X_CL
RCC->CFGR &= (uint32_t)0xF8FF0000;
#else
RCC->CFGR &= (uint32_t)0xF0FF0000;
#endif /* STM32F10X_CL */   
就解析RCC->CFGR &= (uint32_t)0xF8FF0000 ,发现硬件配置外部晶振是25MHz,就 0B 1111 1000 11 11111100 000000 0000 0000 而言,前五个bit属于保留区域,接着的 000 表示没有时钟输出,而后Bit23=1属于保留位置;bit22=1 表示 PLL 时钟直接作为USB时钟,bit21:18=1111表示PLL16倍频输出。bit17=1表示HSE2分频,bit16=1表示HSE时钟作为PLL输入时钟。bit15:14=00,表示 PCLK2 2分频后作为ADC时钟。Bit13:11=000 表示APB2 时钟(PCLK2) 不分频。Bit10:8 = 000, 表示 APB1时钟( PCLK1)不分频。Bit7:4 = 0000 表示 AHB Prescaler =1,即sysclk 不分频。bit3:2 = 00 表示 系统时钟切换状态 ,HSI作为系统时钟。 Bit1:0 = 00 表示 系统时钟切换为HSI为系统时钟。

以上解析是否正确,请教高手指点。
问题是 25MHz一分二后再16倍频就等于200MHz,远远超过SYSCLK允许的最大值72MHz?
请教下高手,错误理解在哪里,谢谢。

lkl10800139 发表于 2013-11-30 00:09:22

你看看I2C属于哪条时钟线,时钟分频跟这里关系不大,还有,你的宏定义STM32F10X_CL 在头文件里面有没有打开。

wuzhujian 发表于 2013-11-30 19:03:19

实际上,上述的代码,只不过是把RCC寄存器恢复到复位状态而已。也是所谓的Reset。

另外,要加强英文的学习。
ST都已经把代码意思说清楚了,你自己不懂英文而已。
/* Reset the RCC clock configuration to the default reset state(for debug purpose) */
/* Set HSION bit */                                                                  【设置HSI为ON】
RCC->CR |= (uint32_t)0x00000001;

/* Reset SW, HPRE, PPRE1, PPRE2, ADCPRE and MCO bits */         【复位SW, HPRE, PPRE1, PPRE2, ADCPRE和MCO】
#ifndef STM32F10X_CL
RCC->CFGR &= (uint32_t)0xF8FF0000;
#else
RCC->CFGR &= (uint32_t)0xF0FF0000;
#endif /* STM32F10X_CL */   

之所以上述在复位SW, HPRE, PPRE1, PPRE2, ADCPRE和MCO时,要互联型和非互联型,原因就在MCO输出源选择上,互联型和非互联型的,宽度不一样,一个是4位的,另一个是3位的。

LZ,你的C语言是半调子,看手册也不过一带而过。
建议LZ换别的工作。

yanjiesh 发表于 2013-12-1 21:09:56

lkl10800139 发表于 2013-11-30 00:09
你看看I2C属于哪条时钟线,时钟分频跟这里关系不大,还有,你的宏定义STM32F10X_CL 在头文件里面有没有打 ...

谢谢回复,我看的是STM32_RM_CH_V10_1.pdf,结合其中的时钟树图和STM32F10x_StdPeriph_Lib_V3.5.0中的RCC.h,感觉I2C是属于APB1总线,所以,前面有APB1的分配系数 和 AHB的分配系数,再前面是Sysclk 源的选择——三选一: HSI,HSE和PLL, 其中PLL前面还有PLL倍频系数,在PLL倍频前还有PLL源的选择,PLL可以是HSI/2,也可以是HSE_OSC输入或该输入的二分频作为振荡源。但是我在时钟树图看到的HSE_OSC为4-16MHz,而开发板上的是25MHz,自然是有点不明白了。{:smile:}

yanjiesh 发表于 2013-12-1 21:21:57

wuzhujian 发表于 2013-11-30 19:03
实际上,上述的代码,只不过是把RCC寄存器恢复到复位状态而已。也是所谓的Reset。

另外,要加强英文的学习 ...

哈哈,又仔细看了STM32_RM_CH_V10_1.pdf, 才发现确实没看仔细,关于时钟树图有CL型非CL型的,HSE_OSC选用25MHz时钟是可以的。谢谢你。



yanjiesh 发表于 2013-12-1 21:24:33

lkl10800139 发表于 2013-11-30 00:09
你看看I2C属于哪条时钟线,时钟分频跟这里关系不大,还有,你的宏定义STM32F10X_CL 在头文件里面有没有打 ...

不好意思 后来又看了STM32_RM_CH_V10_1.pdf   时钟树图型号看错了 哈哈 {:handshake:}

lkl10800139 发表于 2013-12-1 23:46:31

本帖最后由 lkl10800139 于 2013-12-1 23:49 编辑

yanjiesh 发表于 2013-12-1 21:09
谢谢回复,我看的是STM32_RM_CH_V10_1.pdf,结合其中的时钟树图和STM32F10x_StdPeriph_Lib_V3.5.0中的RCC ...

如果能确定 I2C是属于APB1总线 ,你设置好 APB1的时钟,就等于设置好了 I2C 的时钟,不必纠结于从头到尾的去看时钟配置过程,
就类似于,一个排插,电风扇和台灯插在上面,他们的电压都是 220V,因为排插接的一段接的就是220V的电压。

我发过一个帖子,附件是讲stm32f107的时钟树的,把附件下载下来好好看看。不懂再交流。另外,要善于利用论坛的搜索功能,前面学习的人也有可能会遇到此类问题,要善于学习

http://www.amobbs.com/forum.php?mod=viewthread&tid=5465623


yanjiesh 发表于 2013-12-2 09:02:34

lkl10800139 发表于 2013-12-1 23:46
如果能确定 I2C是属于APB1总线 ,你设置好 APB1的时钟,就等于设置好了 I2C 的时钟,不必纠结于从头到尾 ...

LkL10800l39,谢谢你,人品很好! 祝你一切顺利!
页: [1]
查看完整版本: STM32F107VC systeminit() 解析遇到困难,请教高手 RCC_CFGR的用法 ...