全志XR806 Freertos+XRMCU+ADC采样频率偏低
-
1.主题
Freertos+XRMCU+ADC采样频率偏低
2.问题背景
硬件:XRMCU
软件:freertos + ADC3.问题描述
3.1复现步骤
使用SDK自带的example/adc。
修改adc_callback,adc_callback为中断回调,该函数的调用频率和ADC的频率一致,在该函数里面加一个IO口翻转。
编译并烧录。
用示波器或逻辑分析仪,检查IO口翻转频率和ADC_FEQ是否一致。
3.2具体表现
通过逻辑分析仪检查,实际ADC采样频率只有ADC_FEQ设置的1000分之一。4.问题分析
读取ADC的所有相关寄存器,发现ADC使用的并不是默认时钟,而是低速时钟。高速时钟大约是40M,低速时钟是32K,大约相差1000倍,和测试结果相符。
5.根本原因
ADC的时钟选择已经在ROM化代码HAL_ADC_Init中写死,如下所示:
__rom_xip_text HAL_Status HAL_ADC_Init(ADC_InitParam *initParam) { …… HAL_CCM_GPADC_SetMClock(CCM_APB_PERIPH_CLK_SRC_LFCLK, CCM_PERIPH_CLK_DIV_N_1, CCM_PERIPH_CLK_DIV_M_1); …… }
即使外部再怎么修改修改时钟也不会生效。
6.解决办法
默认使用低速时钟的原因时,可以让ADC在低功耗模式时,依旧可以运行,而且ADC频率过高时,容易因为频繁进出中断导致程序卡死。
如果希望设置成高速时钟,需要把src/rom/rom_bin/src/driver/chip/hal_adc.c
部分的代码去ROM,如果设置的频率偏高,请使用burst模式。 -
-
Copyright © 2024 深圳全志在线有限公司 粤ICP备2021084185号 粤公网安备44030502007680号