硬汉嵌入式论坛

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

[Amazon FreeRTOS] RTOS中ADC的回调函数没有调用

[复制链接]

18

主题

92

回帖

146

积分

初级会员

积分
146
QQ
发表于 2025-1-1 22:07:12 | 显示全部楼层 |阅读模式
是这样的,我想把裸机的程序移植到RTOS中,然后第一次是想用任务通知,外部上升沿触发任务通知,然后ADC开始采集,按理说采集完之后 应该会进入ADC的回调函数,我在ADC回调函数用了信号量还有任务通知都没用触发我的另外一个任务,我就怀疑是不是根本没有进入ADC的回调函数,请求大佬解答一波
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) // 处理GPIO_PIN_1的中断事件
{
        BaseType_t xGPIO_risingTaskWoken = pdFALSE;
    if (GPIO_Pin == GPIO_PIN_1)
    {
//      g_adc3_dma_start_flag = 1; // 设置采集完成标志位,开始采集  
           /* 发送任务通知*/
        vTaskNotifyGiveFromISR(ADCTaskHandle,&xGPIO_risingTaskWoken);
        portYIELD_FROM_ISR(xGPIO_risingTaskWoken);//进行一次任务调度               
    }
}
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc) //采集完成回调函数
{        BaseType_t xADC_ConvCpltTaskWoken = pdFALSE;
        if(hadc->Instance==ADC3)
        {       
//        g_adc3_dma_complete_flag = 1;//采集完成标志       
        HAL_ADC_Stop_DMA(&hadc3);
        xSemaphoreGiveFromISR(ADC_BinarySemHandle,&xADC_ConvCpltTaskWoken);       
//        vTaskNotifyGiveFromISR(defaultTaskHandle,&xADC_ConvCpltTaskWoken);       
        portYIELD_FROM_ISR(xADC_ConvCpltTaskWoken);//进行一次任务调度
        }
}

void StartDefaultTask(void *argument) //adc回调函数里面触发任务通知进行数据处理的,我现在是想先通过打印试一下
{
  /* init code for USB_HOST */
//  MX_USB_HOST_Init();
  /* USER CODE BEGIN StartDefaultTask */
       
  /* Infinite loop */
  for(;;)
  {
//        printf(" Successfully1");
        BaseType_t result = xSemaphoreTake(ADC_BinarySemHandle,portMAX_DELAY);
          if(result == pdTRUE)
          {
                printf(" Successfully22");
          }
//        BaseType_t result1 = ulTaskNotifyTake(pdFALSE,portMAX_DELAY);
//         if(result1 == pdTRUE){
//        printf(" Successfully22");
//         }
  }
void ADC_DMATask(void *argument) 由外部上升沿触发的中断里进行任务通知开始的ADC采集任务
{
  /* USER CODE BEGIN ADC_DMATask */
       
  /* Infinite loop */
  for(;;)
  {
        BaseType_t result = ulTaskNotifyTake(pdFALSE,portMAX_DELAY);
        if( result == pdTRUE)
        {
        HAL_ADC_Start_DMA(&hadc3,(uint32_t *)g_adc3_dma_data,ADC_DATA_LENGTH);
        printf("ADC IS RUNNING!");
        }
//        vTaskDelete(NULL);
  }
  /* USER CODE END ADC_DMATask */
}

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115434
QQ
发表于 2025-1-2 07:53:32 | 显示全部楼层
这个可以回调里面打个断点调试一下看看。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-26 00:22 , Processed in 0.228033 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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