本帖最后由 hexbei 于 2024-1-13 13:27 编辑
perf_counter 是一个 Cortex-M 系统专用的性能计数器库,它与用户原有的 SysTick 功能共享 SysTick,且不干扰用户原有的 SysTick 功能。
用这个库可以实现一些如 delay_us(),get_system_ms(),用宏测量指定代码段的 CPU 周期,以及自动适配 EventRecorder 等功能,还是十分方便的。
下面介绍一下如何在 APM32F103 的 MDK 工程上移植 perf_counter。
1. 首先从官方库下载源码:https://github.com/GorgonMeducer/perf_counter
2. 在源码目录下的子目录cmsis-pack中,找到GorgonMeducer.perf_counter.2.2.4.pack,双击安装。完成后,可以在 Pack-Installer 中找到:
3. 打开极海例程,例如 APM32F10x_SDK_V1.8\Examples\GPIO\GPIO_Toggle\Project\MDK\GPIO_Toggle.uvprojx
4. 打开 RTE 管理窗口,找到 Utilities 并选择 perf_counter 里面的 Core,如下图:
5. 在相应的 C 源文件中包含 perf_counter.h :
#include "perf_counter.h"
6. 更新 CMSIS 版本为 5.7.0 或更高版本 。
更新之后,在 RTE 中选上 CMSIS 的 CORE
7. 确保 SystemCoreClock 更新为与 CPU 频率相同的值。这里使用的 GPIO_Toggle 例程已配置好,无需修改。
8. 确保 SysTick->CTRL 寄存器的 SysTick_CTRL_CLKSOURCE_Msk 位(位 2)为 1 ,目的是使 SysTick 用与目标 Cortex-M 处理器相同的时钟源运行。本例程也无需修改。
9. 调用 void init_cycle_counter(bool bIsSysTickOccupied) 函数初始化 perf_counter,bIsSysTickOccupied 参数代表 SysTick 是否已被主程序或 RTOS 占用 。修改后的主函数如下:
int main(void)
{
SystemCoreClockUpdate(); // <-- 新增
init_cycle_counter(false); // <-- 新增
APM_MINI_LEDInit(LED2);
APM_MINI_LEDInit(LED3);
while (1)
{
delay_ms(1000); // <-- 修改为 perf_counter 的延时函数
APM_MINI_LEDToggle(LED2);
APM_MINI_LEDToggle(LED3);
}
}
10. 检查编译器是否启用 GNU 扩展。在 Option for target 对话框中选择 C99 模式和 GNU 扩展,如下所示:
11. 编译下载工程并复位运行开发板,可以看到 LED 正常闪烁,移植成功
|