硬汉嵌入式论坛

 找回密码
 立即注册
查看: 10049|回复: 30
收起左侧

DWT实现一个精确微秒延迟的参考例程

  [复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106437
QQ
发表于 2018-8-24 11:13:51 | 显示全部楼层 |阅读模式
客户需要个这种例子,但是测试不准确,所以我特此制作了1个。

基于CM内核里面的DWT中一个系统时钟计数器做一个精确些的延迟。调整时钟周期个数就行,我这里主频是168MHz,设置个数为135个已经比较精确了,因为函数本身也是占用实现的。

例子基于V6,下载程序后重新上电可测量: US精确延迟.7z (3.02 MB, 下载次数: 1699)

采用PA11引脚测量了10次:
for(i = 0; i < 10; i++)
{
        GPIOA->BSRRL = GPIO_Pin_11;
        bsp_DelayDWT(135);
        GPIOA->BSRRH = GPIO_Pin_11;
        bsp_DelayDWT(135);
}                                


示波器测量前4次,准确的1us:
1.png
2.png
3.png
4.png


PA11引脚在这里:
QQ截图20180824112058.png


回复

使用道具 举报

5

主题

85

回帖

100

积分

初级会员

积分
100
发表于 2018-8-24 11:34:58 | 显示全部楼层
mark, 硬汉666
回复

使用道具 举报

14

主题

207

回帖

254

积分

高级会员

积分
254
发表于 2018-8-24 14:03:08 | 显示全部楼层
666
回复

使用道具 举报

1

主题

17

回帖

20

积分

新手上路

积分
20
发表于 2018-8-24 14:43:48 | 显示全部楼层
666
回复

使用道具 举报

0

主题

36

回帖

36

积分

新手上路

积分
36
发表于 2018-8-24 21:55:16 | 显示全部楼层
是不是和CPU同频的sys tick定时器
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106437
QQ
 楼主| 发表于 2018-8-25 00:25:45 | 显示全部楼层
小志 发表于 2018-8-24 21:55
是不是和CPU同频的sys tick定时器

不是,这个是系统时钟周期计数器,在权威指南里面检索DWT,就可以找到相关的知识。
回复

使用道具 举报

0

主题

36

回帖

36

积分

新手上路

积分
36
发表于 2018-8-25 08:07:34 | 显示全部楼层
eric2013 发表于 2018-8-25 00:25
不是,这个是系统时钟周期计数器,在权威指南里面检索DWT,就可以找到相关的知识。

学习了,谢谢
回复

使用道具 举报

3

主题

13

回帖

22

积分

新手上路

积分
22
发表于 2019-6-4 14:42:44 | 显示全部楼层
请问这个在F103上使用哪些地方需要修改呢
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106437
QQ
 楼主| 发表于 2019-6-4 15:27:15 | 显示全部楼层
Jie_y2dlA 发表于 2019-6-4 14:42
请问这个在F103上使用哪些地方需要修改呢

保证全局变量SystemCoreClock跟你的系统主频一致即可,其它直接初始化使用即可
回复

使用道具 举报

3

主题

13

回帖

22

积分

新手上路

积分
22
发表于 2019-6-4 15:33:08 | 显示全部楼层
eric2013 发表于 2019-6-4 15:27
保证全局变量SystemCoreClock跟你的系统主频一致即可,其它直接初始化使用即可

F103的定时器是16位的,407是32位的有影响吗
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106437
QQ
 楼主| 发表于 2019-6-4 15:33:57 | 显示全部楼层
Jie_y2dlA 发表于 2019-6-4 15:33
F103的定时器是16位的,407是32位的有影响吗

不是,这个DWT在M3,M4和M7上都是32bit时钟计数器,直接移植操作起来,用一次就明白了。
回复

使用道具 举报

3

主题

13

回帖

22

积分

新手上路

积分
22
发表于 2019-6-4 15:43:59 | 显示全部楼层
eric2013 发表于 2019-6-4 15:33
不是,这个DWT在M3,M4和M7上都是32bit时钟计数器,直接移植操作起来,用一次就明白了。

好的,谢谢,我就是UCOS中初始化DS18B20需要延时,但是现在DS18B20重启不起来,我的主频是72Mhz
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106437
QQ
 楼主| 发表于 2019-6-4 15:47:17 | 显示全部楼层
Jie_y2dlA 发表于 2019-6-4 15:43
好的,谢谢,我就是UCOS中初始化DS18B20需要延时,但是现在DS18B20重启不起来,我的主频是72Mhz

FreeRTOS,我专门有做,拿去参考即可,在uCOS上面使用是一样的
http://www.armbbs.cn/forum.php?mod=viewthread&tid=17658&extra=page%3D1

QQ截图20190604154633.jpg
回复

使用道具 举报

3

主题

13

回帖

22

积分

新手上路

积分
22
发表于 2019-6-4 16:31:26 | 显示全部楼层
eric2013 发表于 2019-6-4 15:47
FreeRTOS,我专门有做,拿去参考即可,在uCOS上面使用是一样的
http://www.armbbs.cn/forum.php?mod= ...

非常感谢,我直接把您的例程烧到芯片里,没有开其他外设,改了18B20的管脚为PB0,推挽输出,但是18B20总是起不来。uint8_t DS18B20_Reset(void)
{
        /*
                &#184;′&#206;&#187;ê±Dò, &#188;&#251;DS18B20 page 15

                ê×&#207;è&#214;÷&#187;úà-μíDQ£&#172;3&#214;D&#248;×&#238;éù 480us
                è&#187;oóêí·&#197;DQ£&#172;μè′yDQ±&#187;é&#207;à-μ&#231;×èà-&#184;&#223;£&#172;&#212;&#188; 15-60us
                DS18B20 &#189;&#171;&#199;y&#182;ˉDQ&#206;aμí 60-240us£&#172; &#213;a&#184;&#246;D&#197;o&#197;&#189;D presence pulse  (&#212;ú&#206;&#187;&#194;&#246;3&#229;,±íê&#190;DS18B20×&#188;±&#184;&#190;íD÷ &#191;éò&#212;&#189;óêü&#195;üá&#238;)
                è&#231;1&#251;&#214;÷&#187;ú&#188;ì2aμ&#189;&#213;a&#184;&#246;μíó|′eD&#197;o&#197;£&#172;±íê&#190;DS18B20&#184;′&#206;&#187;3é1|
        */

        uint8_t i;
        uint16_t k;

        DISABLE_INT();/* &#189;&#251;&#214;1è&#171;&#190;&#214;&#214;D&#182;&#207; */

        /* &#184;′&#206;&#187;£&#172;è&#231;1&#251;꧰ü&#212;ò·μ&#187;&#216;0 */
        for (i = 0; i < 1; i++)
        {
                DQ_0();                                /* à-μíDQ */
                bsp_DelayUS(520);        /* &#209;ó3ù 520uS£&#172; òa&#199;ó&#213;a&#184;&#246;&#209;ó3ù′óóú 480us */
                DQ_1();                                /* êí·&#197;DQ */

                bsp_DelayUS(15);        /* μè′y15us */

                /* &#188;ì2aDQμ&#231;&#198;&#189;ê&#199;·&#241;&#206;aμí */
                for (k = 0; k < 10; k++)
                {
                        if (DQ_IS_LOW())
                        {
                                break;
                        }
                        bsp_DelayUS(10);        /* μè′y65us */
                }
                if (k >= 10)
                {
                        continue;                /* ꧰ü */
                }

                /* μè′yDS18B20êí·&#197;DQ */
                for (k = 0; k < 30; k++)
                {
                        if (!DQ_IS_LOW())
                        {
                                break;
                        }
                        bsp_DelayUS(10);        /* μè′y65us */
                }
                if (k >= 30)
                {
                        continue;                /* ꧰ü */
                }

                break;
        }

        ENABLE_INT();        /* ê1&#196;üè&#171;&#190;&#214;&#214;D&#182;&#207; */

        bsp_DelayUS(5);

        if (i >= 1)
        {
                return 0;
        }

        return 1;
}
这个函数返回值总为0
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106437
QQ
 楼主| 发表于 2019-6-4 16:44:06 | 显示全部楼层
Jie_y2dlA 发表于 2019-6-4 16:31
非常感谢,我直接把您的例程烧到芯片里,没有开其他外设,改了18B20的管脚为PB0,推挽输出,但是18B20总 ...

你的芯片跟我们的板子外部晶振一样吗? 该告诉你的都已经告诉你了,剩下自己研究下,今天就帮你这么多吧
回复

使用道具 举报

3

主题

13

回帖

22

积分

新手上路

积分
22
发表于 2019-6-4 17:00:48 | 显示全部楼层
eric2013 发表于 2019-6-4 16:44
你的芯片跟我们的板子外部晶振一样吗? 该告诉你的都已经告诉你了,剩下自己研究下,今天就帮你这么多吧: ...

非常感谢!是硬件的外接了电容,解决了!
回复

使用道具 举报

76

主题

237

回帖

465

积分

高级会员

积分
465
发表于 2019-6-5 10:57:50 | 显示全部楼层
uCOSIII的时间戳用的不就是这个嘛,我看有说如果烧断溶丝后禁止了JTAG调试模块,这个DWT就不能用了,不知到是不是这样,这个DWT确实很好用。
回复

使用道具 举报

19

主题

150

回帖

207

积分

高级会员

积分
207
发表于 2019-8-22 17:44:49 | 显示全部楼层
正在学os,参考下这个时基。
回复

使用道具 举报

16

主题

87

回帖

135

积分

初级会员

积分
135
发表于 2019-10-29 15:10:17 | 显示全部楼层
硬汉兄,这个DWT,可否直接在工程中做为一个FREERUN的TIMER? 例如我一些US延时,HAL库里的MS延时. 我都用这个DWT实现是否可以? 不会有什么影响吧!
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106437
QQ
 楼主| 发表于 2019-10-30 08:21:03 | 显示全部楼层
gpfrank 发表于 2019-10-29 15:10
硬汉兄,这个DWT,可否直接在工程中做为一个FREERUN的TIMER? 例如我一些US延时,HAL库里的MS延时. 我都用 ...

没问题,一直在这么用。
回复

使用道具 举报

10

主题

130

回帖

160

积分

初级会员

积分
160
发表于 2020-8-27 21:29:24 | 显示全部楼层
使用RTOS时,OS使用systick,HAL库的HAL_GetTick()函数直接从DWT_CYCCNT获得,那些有超时机制的函数比如HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout) 比如10ms就Timeout=1680000(假设系统时钟168M),直接去掉为HAL库的超时延时再开一个TIM,这样实际使用是否可行呢?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106437
QQ
 楼主| 发表于 2020-8-28 00:26:59 | 显示全部楼层
oneV 发表于 2020-8-27 21:29
使用RTOS时,OS使用systick,HAL库的HAL_GetTick()函数直接从DWT_CYCCNT获得,那些有超时机制的函数比如HAL ...

OS里面的使用有更简单的方案,此贴:

ThreadX的系统时钟节拍和STM32的HAL库时间基准都使用Systick的简单方法
http://www.armbbs.cn/forum.php?mod=viewthread&tid=99213

为FreeRTOS和RTX5使用HAL库整理的两种HAL库时间基准方案
http://www.armbbs.cn/forum.php?mod=viewthread&tid=93166



回复

使用道具 举报

2

主题

63

回帖

69

积分

初级会员

积分
69
发表于 2021-9-30 16:26:52 | 显示全部楼层
信号过冲了,振铃很大
回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
发表于 2021-10-13 11:27:31 | 显示全部楼层
为啥硬复位后dwt才工作?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106437
QQ
 楼主| 发表于 2021-10-14 00:18:35 | 显示全部楼层
147258 发表于 2021-10-13 11:27
为啥硬复位后dwt才工作?

以重新上电后,是否可以正常运行为准。

STM32H7使用DWT时钟周期计数器注意事项,不要选择MDK的Reset and Run
http://www.armbbs.cn/forum.php?m ... 1707&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
发表于 2021-10-15 09:16:22 | 显示全部楼层
eric2013 发表于 2021-10-14 00:18
以重新上电后,是否可以正常运行为准。

STM32H7使用DWT时钟周期计数器注意事项,不要选择MDK的Reset a ...

重新上电后可以运行,我用的是f407的,407也不能选择reset and run
回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
发表于 2021-10-15 09:45:00 | 显示全部楼层
Jie_y2dlA 发表于 2019-6-4 17:00
非常感谢!是硬件的外接了电容,解决了!

老哥,你的dwt可以不硬复位运行吗,我的必须硬复位才运行
回复

使用道具 举报

19

主题

150

回帖

207

积分

高级会员

积分
207
发表于 2021-11-11 15:52:24 | 显示全部楼层
banzhangzzw 发表于 2021-9-30 16:26
信号过冲了,振铃很大

请问 这个时基会对什么有影响吗?另外 请问这个和 定时器实现的波形相比,谁的更好些呢?我看您的回复很专业。意思就是这个DWT时基会产生额外的频率干扰吗?
回复

使用道具 举报

19

主题

150

回帖

207

积分

高级会员

积分
207
发表于 2021-11-11 15:53:33 | 显示全部楼层
谢谢艾老师。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106437
QQ
 楼主| 发表于 2021-11-11 15:59:01 | 显示全部楼层
tianqi911 发表于 2021-11-11 15:52
请问 这个时基会对什么有影响吗?另外 请问这个和 定时器实现的波形相比,谁的更好些呢?我看您的回复很 ...

过冲跟这个例子没关系,是我没有调节示波器探头的补偿电容。
回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
发表于 2021-12-9 17:28:53 | 显示全部楼层
厉害厉害,感谢分享
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-20 19:48 , Processed in 0.447680 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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