本帖最后由 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
本次分享到这,如有问题,大家评论区一起讨论,谢谢!
|
hi 大佬 本篇文章不足800字,此次不进行审核哦~