OpenEdv-开源电子网

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

求助,stm32f103精英版的定时器,请大佬帮我看看我逻辑哪里有错误

[复制链接]

2

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
89
金钱
89
注册时间
2018-8-13
在线时间
16 小时
发表于 2018-8-15 15:53:03 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 w541554282 于 2018-8-15 16:06 编辑

主函数

主函数
这个是主函数,程序都会从主函数开始,先执行设置优先级的函数,然后是delay_init函数

delay_init函数

delay_init函数

其中delayinit函数里还有一个SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8) 函数

选择时钟函数

选择时钟函数

这是选择时钟的  而代码  选择的是8分频的时钟 所以 在SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8)函数里 有对ctrl寄存器的写操作,CTRL和SysTick_CLKSource_HCLK_Div8做与运算  而SysTick_CLKSource_HCLK_Div8变量是宏定义的

宏定义

宏定义

32位的常量 所以 CTRL 前28位不变 最后的4位 第3位清0 其他不变,然后就会回到delayinit函数 最后面有 两条语句是对ctrl进行写的操作

delayinit写ctrl

delayinit写ctrl

而这两个也是宏定义的常量,分别为32位的 10 和 1  所以CTRL的值不会方发生改变, delayinit 函数执行完  回到main函数,就是串口初始化函数 与ctrl 无关  继续往下执行就是whille1 循环  然后是 delay_ms()函数

delay_ms函数

delay_ms函数

在delay_ms函数里有判断时间到达和是否溢出的while语句前面对ctrl 的写操作“SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;"
同样是宏定义的32位的常量,这个常量宏定义
1534319010(1).jpg

在这里我 定义了一个u32的变量 temd和三个断点,并把断点设置在对ctrl的或运算之前
断点1.jpg 断点2.jpg
然后把temp 和temd 加入观察窗口 如图,我不理解为什么在到第二个断点的时候,temd的值为0,也就是为什么在delay_ms函数里 执行到第二个断点的时候 ctrl寄存器的值为0?求帮忙看看 我哪里有错误了,还是疏漏了重要的环节?  感激不尽

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2018-8-15 16:12:22 | 显示全部楼层
检查一下 SYSTEM_SUPPORT_OS 的定义吧
回复

使用道具 举报

0

主题

28

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1013
金钱
1013
注册时间
2017-8-8
在线时间
67 小时
发表于 2018-8-15 16:24:35 | 显示全部楼层
为什么不用通用定时器???
回复

使用道具 举报

2

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
89
金钱
89
注册时间
2018-8-13
在线时间
16 小时
 楼主| 发表于 2018-8-15 16:31:38 | 显示全部楼层
戏命生 发表于 2018-8-15 16:24
为什么不用通用定时器???

这个是固件库里的delay函数
回复

使用道具 举报

57

主题

1680

帖子

3

精华

资深版主

Rank: 8Rank: 8

积分
4306
金钱
4306
注册时间
2018-6-30
在线时间
808 小时
发表于 2018-8-15 16:48:20 | 显示全部楼层
帮顶
回复

使用道具 举报

0

主题

28

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1013
金钱
1013
注册时间
2017-8-8
在线时间
67 小时
发表于 2018-8-15 16:52:11 | 显示全部楼层
w541554282 发表于 2018-8-15 16:31
这个是固件库里的delay函数

恩,这里面用的是内核里带的嘀嗒定时器吧,但定时一般用通用定时器就可以了哇!而且这个嘀嗒定时器定时时间长了好像就不怎么准的,好像1分钟以上吧,论坛里以前有个贴子就说了这个问题,你可以找找看!
回复

使用道具 举报

0

主题

28

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1013
金钱
1013
注册时间
2017-8-8
在线时间
67 小时
发表于 2018-8-15 16:55:42 | 显示全部楼层
还有这delay函数好像是原子哥为了方便大家使用,写的一个通用函数,不是固件库里带的吧!
回复

使用道具 举报

2

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
89
金钱
89
注册时间
2018-8-13
在线时间
16 小时
 楼主| 发表于 2018-8-16 09:31:34 | 显示全部楼层
戏命生 发表于 2018-8-15 16:52
恩,这里面用的是内核里带的嘀嗒定时器吧,但定时一般用通用定时器就可以了哇!而且这个嘀嗒定时器定时时 ...

谢谢  我会找找看的
回复

使用道具 举报

2

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
89
金钱
89
注册时间
2018-8-13
在线时间
16 小时
 楼主| 发表于 2018-8-16 09:32:06 | 显示全部楼层
戏命生 发表于 2018-8-15 16:55
还有这delay函数好像是原子哥为了方便大家使用,写的一个通用函数,不是固件库里带的吧!

emmm 现在 不是函数的问题 而是我 搞不懂  数值.
回复

使用道具 举报

2

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
89
金钱
89
注册时间
2018-8-13
在线时间
16 小时
 楼主| 发表于 2018-8-16 09:40:55 | 显示全部楼层
戏命生 发表于 2018-8-15 16:24
为什么不用通用定时器???

emmm,我就是想搞懂 在delay_ms函数里 ctrl 的值为什么是0?肯定是我哪里出问题了 但是我找不到 问题
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-8-17 02:07:32 | 显示全部楼层
是不是在其它地方调用了延时? 比如中断服务函数
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-18 15:02

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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