大鼻子JOJO 2023-06-21 10:34 采纳率: 75%
浏览 25
已结题

ARM ADC读取数据写SD卡过程问题

ADC读取数据写SD卡过程问题
在使用定时器触发ADC读取数据写入SD卡过程中,每完成一次ADC进入一次ADC中断,中断中读取数据,代码如下

void ADC1_2_IRQHandler(void)
{
    if (ADC_GetITStatus(ADC1, ADC_IT_EOC))

    {
        GPIO_WriteBit(GPIOE, GPIO_Pin_0, (i == 0) ? (i = Bit_SET) : (i = Bit_RESET));
  
            if(number2<1400)
            {
                if(flag%2==0)
                {
                    //BUF =ADC_GetConversionValue(ADC1);//ADC中断中读取数据寄存器的值
                    DMA_Cmd( DMA1_Channel1, ENABLE );
                    buf1[number2]=BUF[0]&0XFF;
                    buf1[number2+1]=(BUF[0]>>8)&0XFF;
                    DMA_Cmd( DMA1_Channel1, DISABLE );
                    number2=number2+2;
                    ADC_ClearITPendingBit(ADC1, ADC_IT_EOC);

                }
                if(flag%2==1)
                {
                       //BUF =ADC_GetConversionValue(ADC1);//ADC中断中读取数据寄存器的值
                    DMA_Cmd( DMA1_Channel1, ENABLE );
                    buf1_ex[number2]=BUF[0]&0XFF;
                    buf1_ex[number2+1]=(BUF[0]>>8)&0XFF;
                    DMA_Cmd( DMA1_Channel1, DISABLE );
                    number2=number2+2;
                    ADC_ClearITPendingBit(ADC1, ADC_IT_EOC);
                }

            }
            if(number2>1400)
            {
                number2=2;
                printf("01\r\n");
                ADC_ClearITPendingBit(ADC1, ADC_IT_EOC);
            }
        }
         ADC_ClearITPendingBit(ADC1, ADC_IT_EOC);
    }

}

每进入一次中断GPIO翻转一次,计数到1400后写卡

    if(number2==1400)
                    {
                        number2=2;
                        flag=flag+1;

                           if(flag%2==1)
                           {

                               counter=counter+0X0001;

                               f_write(&fnew,buf1,sizeof(buf1),&fnum);

                               buf1[1]=counter&0xff;
                               buf1[0]=((counter>>8)&0XFF);
                           }
                           if(flag%2==0)
                           {
                               counter=counter+0X0001;

                               f_write(&fnew,buf1_ex,sizeof(buf1_ex),&fnum);
                               buf1_ex[1]=counter&0xff;
                               buf1_ex[0]=((counter>>8)&0XFF);
                           }
                    }

实际上用逻辑分析仪得到的波形如下

img

img


每隔一段时间就无法进入中断导致丢包,怀疑是由于写卡导致过度占用了CPU导致AD无法正常进行,想问一下解决方案

  • 写回答

2条回答 默认 最新

  • 泡沫o0 2023年度博客之星上海赛道TOP 1 2023-06-21 10:44
    关注

    从你的描述来看,这确实可能是一个经典的嵌入式系统问题,也就是一个资源(在这个例子中是CPU)被一个过程(写SD卡)过度使用,从而阻止了其他重要的过程(ADC读取)的执行。这样的问题在实时系统中尤其常见,因为它们经常需要同时处理多个任务。

    解决此类问题的一个常见方法是将写SD卡的任务放到一个单独的低优先级线程或任务中去执行。这样,只要ADC需要执行,它就能立即抢占CPU,而SD卡写入任务则会在ADC读取完成后再继续。这种技术需要你的系统支持多任务或多线程,如RTOS(实时操作系统)。

    另一种解决方案是通过使用DMA(直接内存访问)来写SD卡。DMA控制器可以在CPU执行其他任务时自动完成数据的传输,这样可以有效地释放CPU资源。

    最后,也可以考虑优化SD卡写入的代码,尽量减少写操作的时间。例如,可以尽量缓存数据,然后一次性将大块数据写入SD卡,而不是频繁地写入小块数据。

    需要注意的是,每种解决方案都有其优点和缺点,需要根据具体的系统需求和约束来选择最合适的方案。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 7月4日
  • 已采纳回答 6月26日
  • 创建了问题 6月21日

悬赏问题

  • ¥15 汇编语言没有主程序吗?
  • ¥15 这个函数为什么会爆内存
  • ¥15 无法装系统,grub成了顽固拦路虎
  • ¥15 springboot aop 应用启动异常
  • ¥15 matlab有关债券凸性久期的代码
  • ¥15 lvgl v8.2定时器提前到来
  • ¥15 qtcp 发送数据时偶尔会遇到发送数据失败?用的MSVC编译器(标签-qt|关键词-tcp)
  • ¥15 cam_lidar_calibration报错
  • ¥15 拓扑学,凸集,紧集。。
  • ¥15 如何扩大AIS数据容量