OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2779|回复: 2

想问一下关于systeminit函数的内容

[复制链接]

5

主题

15

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2019-7-3
在线时间
7 小时
发表于 2019-7-30 18:23:27 | 显示全部楼层 |阅读模式
2金钱
本帖最后由 afsfafaf 于 2019-7-30 18:45 编辑

我想问一下这个代码
#else   
    /*  PLL configuration: PLLCLK = HSE * 9 = 72 MHz */
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE |
                                        RCC_CFGR_PLLMULL));
    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9);

我知道是给HSE9倍频,但是我有点看不懂上半句  

RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE |
                                        RCC_CFGR_PLLMULL));
~取反之后有什么用呢?



W5@YG@EBIBU%W2EIQH79U5N.png

最佳答案

查看完整内容[请看2#楼]

你应该先查一下这些符号的宏定义就清楚了, RCC_CFGR_PLLXTPRE等三个符号是对应的控制位为1,其它位均为0 这三个符号相或之后,得到一个所有这些对应的控制为1,其它位都为0的一个32位数值, 取反就会使对应的控制位为0,其它位都为1的一个32位数值, RCC->CFGR &=这个数值的结果就是,使对应的控制位为0,其它位不变。 总结:这句执行的结果是使 CFGR寄存器的对应的控制位为0而不影响其它位。 注意后面的设置操作RCC->CFG ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4524
金钱
4524
注册时间
2018-5-11
在线时间
947 小时
发表于 2019-7-30 18:23:28 | 显示全部楼层
本帖最后由 warship 于 2019-7-31 09:45 编辑

你应该先查一下这些符号的宏定义就清楚了,
RCC_CFGR_PLLXTPRE等三个符号是对应的控制位为1,其它位均为0
这三个符号相或之后,得到一个所有这些对应的控制为1,其它位都为0的一个32位数值,
取反就会使对应的控制位为0,其它位都为1的一个32位数值,
RCC->CFGR &=这个数值的结果就是,使对应的控制位为0,其它位不变。
总结:这句执行的结果是使 CFGR寄存器的对应的控制位为0而不影响其它位。

注意后面的设置操作RCC->CFGR |=......
使用的是或操作,只有先将相应的位清0之后,才能实现“或什么值就得到什么值”,
举例:000|011=011,假如不先清0, 原有值为100, 100|011能得到011么?


   
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

5

主题

15

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2019-7-3
在线时间
7 小时
 楼主| 发表于 2019-7-30 18:25:23 | 显示全部楼层
本帖最后由 afsfafaf 于 2019-7-30 18:30 编辑

C:\Users\Administrator\Desktop这是时钟系统框图 求大佬帮帮我
HJ(KE4FE)~]%DT]}TB37)4X.png
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-26 07:50

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表