[APM32F4] 基于APM32F411 DWT测试IQmath函数模板使用

[复制链接]
1335|3
 楼主| lzh12a3nf 发表于 2023-11-28 23:48 | 显示全部楼层 |阅读模式
本帖最后由 lzh12a3nf 于 2023-11-29 22:40 编辑

#申请原创#@21小跑堂
1、前言
    最近在学习IQmath函数中,想对其中的一些性能参数进行功能测试,具体研究过GPIO电平反转、RTC实时计时等方法,然而,最近注意到了Cortex-M内核中带有的DWT硬件计时器,并对此进行了研究。因此,这次将基于我上篇文章,基于APM32F411 IQmath的模板上,增加DWT硬件计时器,对模板的操作进行一个简单的"升级"。

2、基于APM32F411 DWT模板实现
2.1 如何开启DWT
根据查找资料,要想使用DWT硬件计时器,分别要对三个寄存器进行不同的操作,如下:
(1)DEMCR:图文标注,在使用DWT时,需要将此位置为1。
DEMCR.png

(2)DWT_CTRL:开启DWT功能、DWT_CYCCNT:获得时钟计数值。

DWT.png

2.2 基于APM32F411 升级IQmath模板 简单测试性能(1)针对于2.1章节操作
  1. #define    DWT_CTRL    *(uint32_t*)0xE0001000
  2. #define    DWT_CYCCNT    *(uint32_t*)0xE0001004
  3. #define    DEM_CTRL    *(uint32_t*)0xE000EDFC


  4. #define    DEM_CTRL_ENABLE    (1<<24)
  5. #define    DWT_CR_CYCCNT_START    (1<<0)
  1. void DWT_init(void)
  2. {
  3.   DEM_CTRL |= (uint32_t)DEM_CTRL_ENABLE;
  4.   DWT_CYCCNT = (uint32_t)0u;
  5.   DWT_CTRL |= (uint32_t)DWT_CR_CYCCNT_START;
  6. }
  1. uint32_t DWT_TIME_GET(void)
  2. {
  3.   return((uint32_t)DWT_CYCCNT);
  4. }

(2)针对主函数,在函数初始化后,进入测试函数前,我在将CYCCNT函数进行一次清0操作,以确保测试前的值从0开始。
  1.   _iq X,Y,Z;
  2.   uint32_t start,end;
  3.   DWT_init();
  4.   DWT_CYCCNT = (uint32_t)0u;
  5.   start = DWT_TIME_GET();
  6.   X = _IQ(5);
  7.   Y = _IQ(6);
  8.   Z = _IQmpy(X,Y);
  9.   end = DWT_TIME_GET();        
  10.   printf("X = 0x%lX\r\n", X);
  11.   printf("Y = 0x%lX\r\n", Y);
  12.   printf("Z = 0x%lX\r\n", Z);
  13.   printf("start time is %d\r\n",start);
  14.   printf("end time is %d",end);
(3)结果图
结果图.png

现工程中,APM32F411配置的时钟为100M,即一个周期数所经历的时间为1/100M=10ns,而测试IQmath的函数,总共经历41个时钟周期,即410ns。


3、基于APM32F411 DWT测试IQmath函数Demo

DWT Demo.rar (7.85 MB, 下载次数: 2)


本次分享到这,如有问题,大家评论区一起讨论,谢谢!



评论

hi 大佬 本篇文章不足800字,此次不进行审核哦~  发表于 2023-12-6 10:56
 楼主| lzh12a3nf 发表于 2023-11-29 22:33 | 显示全部楼层
昨天不小心误操发了草稿文章,今天对内容进行了完善更新,不好意思给大家带来麻烦了!

评论

哈哈哈哈 这是小事儿  发表于 2023-12-6 10:53
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

37

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部