Y1ng 发表于 2024-1-15 19:02:16

怎么查看程序是因为哪个语句进入异常的?&&另外这个HAL 库ADC采样多个通道是不是有问题?

https://pic.imgdb.cn/item/65a50ec8871b83018aff5417.jpg

程序卡在这边,但是不知道是哪个语句引起的异常,之前好像看到有一个方法可以查看到进入异常的语句;
void MX_ADC1_Init(void)
{

/* USER CODE BEGIN ADC1_Init 0 */

/* USER CODE END ADC1_Init 0 */

ADC_ChannelConfTypeDef sConfig = {0};

/* USER CODE BEGIN ADC1_Init 1 */

/* USER CODE END ADC1_Init 1 */

/** Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion)
*/
hadc1.Instance = ADC1;
hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2;
hadc1.Init.Resolution = ADC_RESOLUTION_12B;
hadc1.Init.ScanConvMode = DISABLE;
hadc1.Init.ContinuousConvMode = DISABLE;
hadc1.Init.DiscontinuousConvMode = ENABLE;
hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc1.Init.NbrOfConversion = 1;
hadc1.Init.DMAContinuousRequests = DISABLE;
hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
if (HAL_ADC_Init(&hadc1) != HAL_OK)
{
    Error_Handler();
}

/** Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time.
*/
sConfig.Channel = ADC_CHANNEL_10;
sConfig.Rank = 1;
sConfig.SamplingTime = ADC_SAMPLETIME_144CYCLES;
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
{
    Error_Handler();
}
/* USER CODE BEGIN ADC1_Init 2 */
       
/* USER CODE END ADC1_Init 2 */

}

void HAL_ADC_MspInit(ADC_HandleTypeDef* adcHandle)
{

GPIO_InitTypeDef GPIO_InitStruct = {0};
if(adcHandle->Instance==ADC1)
{
/* USER CODE BEGIN ADC1_MspInit 0 */

/* USER CODE END ADC1_MspInit 0 */
    /* ADC1 clock enable */
    __HAL_RCC_ADC1_CLK_ENABLE();

    __HAL_RCC_GPIOC_CLK_ENABLE();
    __HAL_RCC_GPIOA_CLK_ENABLE();
    __HAL_RCC_GPIOB_CLK_ENABLE();
    /**ADC1 GPIO Configuration
    PC0   ------> ADC1_IN10
    PC1   ------> ADC1_IN11
    PC2   ------> ADC1_IN12
    PC3   ------> ADC1_IN13
    PA6   ------> ADC1_IN6
    PA7   ------> ADC1_IN7
    PC4   ------> ADC1_IN14
    PC5   ------> ADC1_IN15
    PB0   ------> ADC1_IN8
    PB1   ------> ADC1_IN9
    */
    GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3
                        |GPIO_PIN_4|GPIO_PIN_5;
    GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

    GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;
    GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1;
    GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

    /* ADC1 interrupt Init */
    HAL_NVIC_SetPriority(ADC_IRQn, 0, 0);
    HAL_NVIC_DisableIRQ(ADC_IRQn);
/* USER CODE BEGIN ADC1_MspInit 1 */

/* USER CODE END ADC1_MspInit 1 */
}
}
static uint16_t adc_set_ch(uint8_t ch)
{
    ADC_ChannelConfTypeDef sConfig = {0};   
    static uint8_t lock=0;
    sConfig.Rank = 1;
    sConfig.SamplingTime = ADC_SAMPLETIME_56CYCLES;
    sConfig.Channel=(uint32_t)ch;
        if(lock==0)
    if (HAL_ADC_Start(&hadc1) != HAL_OK)
    {      
      Error_Handler();
    }
        else
        {
                lock=1;
        }
    if(HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
    {
      Error_Handler();
    }
    if (HAL_ADC_PollForConversion(&hadc1, 100)!= HAL_OK)
    {
      Error_Handler();
    }
    return (uint16_t)HAL_ADC_GetValue(&hadc1);

}
static void adc_single_get(uint8_t addr,uint8_t i)
{
    addr%=8;
    addr_a(addr&0x01);
    addr_b(addr&0x02);
    addr_c(addr&0x04);
        HAL_Delay(2);
    ch1_adc_valve=adc_set_ch(10);
    ch2_adc_valve=adc_set_ch(11);
    ch3_adc_valve=adc_set_ch(12);
}
目前有三个ADC引脚,每个引脚通过模拟开关进行扩展,想实现就是可以指定ADC对特定的通道进行采样,因为模拟开关要切换(4051),用查询方式就行。
这边有些疑问,ADC是否在每次采样前进行开启?
上面的代码加完之后程序就会跑飞(卡在while(1)里。

eric2013 发表于 2024-1-16 00:22:28

1、MDK快速定位硬件异常位置方法,调用show caller code即可快速锁定
https://www.armbbs.cn/forum.php?mod=viewthread&tid=94364
2、代码实现有点问题,配置好后,每次仅需调用HAL_ADC_Start,HAL_ADC_PollForConversion和HAL_ADC_GetValue即可。
页: [1]
查看完整版本: 怎么查看程序是因为哪个语句进入异常的?&&另外这个HAL 库ADC采样多个通道是不是有问题?