OpenEdv-开源电子网

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

新手来的,请回答详细点,谢谢!

[复制链接]

7

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
114
金钱
114
注册时间
2016-4-18
在线时间
17 小时
发表于 2016-4-18 16:05:35 | 显示全部楼层 |阅读模式
1金钱
system_stm32f10x.h文件里

/*  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);   





/* Select PLL as system clock source */
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
    RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;



  这两段代码里的第一行作用是什么?



还有学过51单片机,现在自学stm32,跟着原子哥的视频走,现在需要比较深入的去理解函数背后调用哪个寄存器吗

最佳答案

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

单从代码来看, 第一行是将 RCC->CFGR 这个寄存器中一些位清为零, 清哪几个位,是后面的参数来决定的, 第二行是将这个寄存器的一些位置1 置哪几个为1 由后面的参数决定, 比如, U8 BY = 0XFF; 二进制为 11111111; 将 D4位清零 BY &= ~(1
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

9

主题

507

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3347
金钱
3347
注册时间
2013-4-10
在线时间
333 小时
发表于 2016-4-18 16:05:36 | 显示全部楼层
单从代码来看, 第一行是将  RCC->CFGR 这个寄存器中一些位清为零, 清哪几个位,是后面的参数来决定的,
第二行是将这个寄存器的一些位置1 置哪几个为1 由后面的参数决定,

比如,  U8 BY = 0XFF;  二进制为 11111111;
将 D4位清零
BY &=  ~(1<<4);

再将D4位置1
BY |= 1<<4;

在32中由于寄存器比51多, 且有些位又不能像51一样按位来操作, 所以,这是一般操作寄存器的方式.

有学过51的基础, 学32不会太难,都是一回事, 只事32的功能要强大很多, 所以内部寄存器多一点而以.   从我个人的关点来说, 要学单片机还是要从寄存器学起, 因为单片机必尽是单片机, 一般都是拿来做一些低层的东西,所以只有真正了解了芯片的性能,你才能做得出好的产品来.
回复

使用道具 举报

7

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
114
金钱
114
注册时间
2016-4-18
在线时间
17 小时
 楼主| 发表于 2016-4-18 17:15:01 | 显示全部楼层
人呢人呢
回复

使用道具 举报

12

主题

228

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1730
金钱
1730
注册时间
2016-3-8
在线时间
678 小时
发表于 2016-4-18 17:47:24 | 显示全部楼层
以第二个为例。
第一行RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));中,使用了按位取反,并且使用" &= ",是按位与运算。其作用就是,清除CFGR寄存器中RCC->RCC_CFGR_SW指定的位。
第二行,用的是" |= ",是按位或运算。
两行代码的作用,就是注释中的描述,选择PLL作为系统时钟源。
回复

使用道具 举报

12

主题

228

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1730
金钱
1730
注册时间
2016-3-8
在线时间
678 小时
发表于 2016-4-18 17:55:11 | 显示全部楼层
本帖最后由 adlu 于 2016-4-18 17:58 编辑

详细展开来讲,如下:

假设,只是假设,当前RCC->CFGR = 0x12345678,
RCC_CFGR_SW      的宏定义为0x000000F0,即,bit7~bit4为1其他为0。
RCC_CFGR_SW_PLL的宏定义为0x000000C0,

那么第一行运算的结果是RCC->CFGR = 0x12345608,
      第二行运算的结果是RCC->CFGR = 0x123456C8。

无论原来RCC->CFGR的bit7~bit4是什么值,经过这两行运算之后,它的值都是C。
回复

使用道具 举报

12

主题

228

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1730
金钱
1730
注册时间
2016-3-8
在线时间
678 小时
发表于 2016-4-18 18:10:57 | 显示全部楼层
学STM32不能用学51的方法,累!
51如果不包含增强型外设,其寄存器不到百个。
通用的STM32少说有上千个寄存器,不可能记得住,也没必要记。

跟原子哥学,学的是方法和步骤。
比如学一个外设,学的是怎么查资料了解这个外设的架构,有哪些功能和用法,需要设置什么参数,不是记操作了哪个寄存器,这是有区别的。
STM32的基本架构中,基本每个外设都可以独立关闭以降低功耗,因此使用一个外设前,都必须先使能其时钟。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-16 22:50

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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