OpenEdv-开源电子网

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

SysTick->CTRL &= SysTick_CLKSource_HCLK_Div8

[复制链接]

7

主题

11

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2019-7-13
在线时间
5 小时
发表于 2019-7-27 10:34:25 | 显示全部楼层 |阅读模式
2金钱
  SysTick->CTRL |= SysTick_CLKSource_HCLK和SysTick->CTRL &= SysTick_CLKSource_HCLK_Div8中的|=和&=是什么意思,还有什么时候用|=什么时候用&=?

最佳答案

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

查一下SysTick_CLKSource_HCLK的具体值, 再查一下SysTick->CTRL寄存器的具体控制位定义, 这句的作用是,将SysTick->CTRL寄存器中的控制SysTick时钟源的哪一位置1, 使之使用系统高速时钟。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4518
金钱
4518
注册时间
2018-5-11
在线时间
945 小时
发表于 2019-7-27 10:34:26 | 显示全部楼层
STM32白纸 发表于 2019-7-27 19:00
我知道与运算和或运算, SysTick->CTRL |= SysTick_CLKSource_HCLK就相当于 SysTick->CTRL = SysTick_CLK ...

查一下SysTick_CLKSource_HCLK的具体值,
再查一下SysTick->CTRL寄存器的具体控制位定义,
这句的作用是,将SysTick->CTRL寄存器中的控制SysTick时钟源的哪一位置1,
使之使用系统高速时钟。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

9

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
194
金钱
194
注册时间
2015-12-3
在线时间
29 小时
发表于 2019-7-27 11:48:53 | 显示全部楼层
C语言基础,建议百度
走不一样的路,让别人看吧
回复

使用道具 举报

7

主题

11

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2019-7-13
在线时间
5 小时
 楼主| 发表于 2019-7-27 19:00:57 | 显示全部楼层
石头0218 发表于 2019-7-27 11:48
C语言基础,建议百度

我知道与运算和或运算, SysTick->CTRL |= SysTick_CLKSource_HCLK就相当于 SysTick->CTRL = SysTick_CLKSource_HCLK|SysTick->CTRL,但是这个怎么理解呢?
回复

使用道具 举报

7

主题

11

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2019-7-13
在线时间
5 小时
 楼主| 发表于 2019-7-29 09:08:05 | 显示全部楼层
那么请问一下第二句或运算是什么意思啊
回复

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2021-4-13
在线时间
7 小时
发表于 2021-4-19 18:26:53 | 显示全部楼层
本帖最后由 hitzjh 于 2021-4-19 18:31 编辑

      这句代码应该是选择滴答计时器SysTick的时钟源时使用的,时钟源由CTRL寄存器中CLKSOURCE位(第三位)的值决定,分两种情况:

    (1)使用外部八分频时钟源时需要将该位赋值为0,为了保证寄存器其他位的值不受影响,采用将SysTick->CTRL寄存器的值和0xFFFFFFFB按位与后赋值(即&=)的方法:SysTick->CTRL &= SysTick_CLKSource_HCLK_Div8,这也是楼主疑问的地方。下面解释为什么这样操作(个人理解):因为0xFFFFFFFB的二进制表示法中,只有第3位是0,其余位全为1,那么CTRL寄存器和该数与运算后,CTRL寄存器中和1对应的位都保持不变(和1与运算,结果等于本身),而第三位结果为0,实现选择外部八分频时钟源的目的。

    (2)使用内核HCLK时钟时,需要将第三位置为1,同理,为了保证寄存器其他位的值不受影响,采用采用将SysTick->CTRL寄存器的值和0x00000004按位或后赋值(即|=)的方法:SysTick->CTRL |= SysTick_CLKSource_HCLK。0x00000004的二进制表示法中,只有第3位是1,其余位全为0,那么CTRL寄存器和该数或运算后,CTRL寄存器中和0对应的位都保持不变(和0或运算,结果等于本身),而第三位结果为1,实现选择内核HCLK时钟的目的。

      总结:如果要将寄存器某位置为0,就将该寄存器与一个对应位为0,其余位全为1的数进行&=(对应位与运算后赋值)的方法;如果要将寄存器某位置为1,就将该寄存器与一个对应位为1,其余为全为0的数进行|=(对应位或运算后赋值)的方法。
回复

使用道具 举报

2

主题

32

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
299
金钱
299
注册时间
2020-9-25
在线时间
54 小时
发表于 2021-9-12 09:50:18 | 显示全部楼层
hitzjh 发表于 2021-4-19 18:26
这句代码应该是选择滴答计时器SysTick的时钟源时使用的,时钟源由CTRL寄存器中CLKSOURCE位(第三位) ...

总结的通俗易懂,好呀
人生中的贵人是不断努力的自己
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-8 17:52

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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