硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1162|回复: 3
收起左侧

[TIMER] TIM中断问题

[复制链接]

32

主题

64

回帖

160

积分

初级会员

积分
160
发表于 2022-1-3 17:23:08 | 显示全部楼层 |阅读模式
想要在定时器中断中处理ad采集的数据,程序如下:

adc是单次转换,在dma中断处理是没有问题的,一切正常,开一次采集一次储存一次,这说明adc没有问题,但是在定时器中断中处理有问题,TIM中断里只一个灯闪烁的话也完全正常,定时时间到然后LED闪烁,这说明TIM也是正常的,但是只要在TIM中断里HAL_ADC_Start_DMA,程序执行结果是灯亮不闪烁,单步仿真卡在LED处,请问这是什么原因呢?
回复

使用道具 举报

32

主题

64

回帖

160

积分

初级会员

积分
160
 楼主| 发表于 2022-1-3 17:24:21 | 显示全部楼层
//void DMA1_Stream1_IRQHandler(void)
//{       
//          if( __HAL_DMA_GET_FLAG(&DMA_Handler,DMA_FLAG_TCIF1_5)!=RESET)
//          {
//                        SCB_InvalidateDCache();           //使 D-cache 无效,即CPU读取数据时,忽略 D-cache 中的内容,去真实的物理地址读取对应的数据(DMA-SRAM)。                       
//                  ADC_1 = ADC_Value[0] * 3.3 / 65536;
//                       
//                        sprintf((char*)ADC_2,"ADC:%10.3f",ADC_1);       
//                       
//                  __HAL_DMA_CLEAR_FLAG(&DMA_Handler,DMA_FLAG_TCIF1_5);       
//          }               
//                 
//                        HAL_ADC_Start_DMA(&ADC2_Handler,(uint32_t *)&ADC_Value, 1);
//}

//定时器3中断服务函数调用
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
                HAL_ADC_Start_DMA(&ADC2_Handler,(uint32_t *)&ADC_Value, 1);
       
                if(htim==(&TIM3_Handler))
                {
                                LED1_Toggle;
               
                                ADC_1 = ADC_Value[0] * 3.3 / 65536;                        
                          sprintf((char*)ADC_2,"ADC:%10.3f",ADC_1);       
                                LCD_ShowString(10,130,240,32,32,ADC_2);                //显示LCD ID                           
                }
}
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106738
QQ
发表于 2022-1-3 19:51:05 | 显示全部楼层
感觉你的玩法有点臃肿。而且中断里面调用LCD等操作也非常不合理。

如果你仅仅是需要定时采集一次存储一次,如果使用了RTOS,直接开个定时器任务,定期ADC软件触发方式转换一次即可。DMA,中断等不必要的操作都省去了。程序言简意赅。

如果是裸机的,开个软件定时器,也非常方便。

回复

使用道具 举报

32

主题

64

回帖

160

积分

初级会员

积分
160
 楼主| 发表于 2022-1-3 21:11:49 | 显示全部楼层
eric2013 发表于 2022-1-3 19:51
感觉你的玩法有点臃肿。而且中断里面调用LCD等操作也非常不合理。

如果你仅仅是需要定时采集一次存储一 ...

我是想用GRAPH显示波形的,在GRAPH例程里加入双adc+dma传输,既然显示波形,那只能是定时器中断里面软件触发或者直接adc定时器触发,当然我是优先后者的,但是我在其中缩小pwm的触发时间,屏幕就会黑屏卡死,1s触发一次不会黑屏但是也会卡死,我就想先测试一下软件触发在定时器中断里这种方式,这种屏幕不卡死,只是没有波形显示,原因不详。所以我就是做一个最简单的一个ad一个通道定时器中断里处理数据这么一个简单的小程序来看一下是不是也有问题,结果就是这样了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-3 08:14 , Processed in 0.199804 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表