打印
[APM32F4]

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

[复制链接]
898|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。

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


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


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

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

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


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

DWT Demo.rar (7.85 MB)


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



使用特权

评论回复
评论
21小跑堂 2023-12-6 10:56 回复TA
hi 大佬 本篇文章不足800字,此次不进行审核哦~ 
沙发
lzh12a3nf|  楼主 | 2023-11-29 22:33 | 只看该作者
昨天不小心误操发了草稿文章,今天对内容进行了完善更新,不好意思给大家带来麻烦了!

使用特权

评论回复
评论
21小跑堂 2023-12-6 10:53 回复TA
哈哈哈哈 这是小事儿 
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

37

帖子

0

粉丝