STM32
直播中

京五环以外

10年用户 3173经验值
擅长:EMC/EMI设计
私信 关注
[问答]

STM32F103VE ADC采样正弦波,程序阻塞如何处理?

开发环境为keil uvsion3 v3.9
程序运行到cr4_fft_1024_STM32( X_out[0],  adcin[0], 1024);就阻塞住了。
cr4_fft_1024_stm32函数的实现是汇编实现的,无法跟踪。请问应该如何处理?
如果有类似的例子,也请给我参考一下。
请指教,谢谢!

程序代码:
u32 adcin[1024]={0};
   while(1)
   {
     
        for(i=0;i<1024;i++)
        {
        ADC_SoftwareStartConvCmd(ADC1,ENABLE);
        while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));
        adcin=ADC_GetConversionValue(ADC1);               
        }
        /*参数pssOUT表示FFT输出数组指针,参数pssIN表示要进行FFT运算的输入数组指针,参数Nbin表示了点数*/
        cr4_fft_1024_stm32( X_out[0],  adcin[0], 1024);
        dsp_asm_powerMag();        
        adcx=10000;
        while(adcx--);


   }        




回帖(1)

吴湛

2024-5-15 16:55:04
在STM32F103VE上使用ADC采样正弦波时,如果程序在某个函数处阻塞,可以尝试以下方法来解决问题:

1. **检查硬件连接**:确保ADC输入引脚正确连接到正弦波信号源,并且没有短路或断路。

2. **检查ADC配置**:确保ADC的时钟、通道、触发方式等配置正确。例如,使用正确的ADC时钟源,设置合适的采样周期和转换时间。

3. **使用中断**:为了避免程序阻塞,可以使用ADC中断来处理采样。在ADC转换完成后,硬件会自动触发中断,然后在中断服务程序中读取ADC值并处理。这样可以避免在主循环中等待ADC转换完成。

4. **优化汇编函数**:如果cr4_fft_1024_stm32函数的实现是汇编语言,可以尝试优化该函数以减少阻塞时间。但是,由于汇编语言的复杂性,这可能需要一定的汇编语言知识和调试技巧。

5. **使用RTOS**:如果程序中有多个任务需要同时执行,可以考虑使用实时操作系统(RTOS)来管理任务调度。这样可以避免单个任务阻塞整个程序。

6. **调试**:使用调试器逐步执行程序,观察程序在哪个地方阻塞。这有助于找到问题所在。

7. **查看示例代码**:可以参考STM32官方提供的ADC采样示例代码,以确保你的程序与官方示例相似。这有助于发现潜在的问题。

以下是一个简化的示例代码,展示了如何使用中断进行ADC采样:

```c
#include "stm32f10x.h"

volatile uint32_t adc_value = 0;

void ADC1_IRQHandler(void)
{
    if (ADC_GetITStatus(ADC1, ADC_IT_EOC) != RESET)
    {
        adc_value = ADC_GetConversionValue(ADC1);
        ADC_ClearITPendingBit(ADC1, ADC_IT_EOC);
    }
}

int main(void)
{
    ADC_DeInit(ADC1);
    ADC_InitTypeDef ADC_InitStructure;

    // ADC配置代码...

    ADC_ITConfig(ADC1, ENABLE);
    ADC_Cmd(ADC1, ENABLE);

    while (1)
    {
        if (adc_value != 0)
        {
            // 处理adc_value
            adc_value = 0;
        }
    }
}
```

请注意,这只是一个简化的示例,实际应用中可能需要根据具体需求进行调整。希望这些建议能帮助你解决问题。
举报

更多回帖

×
20
完善资料,
赚取积分