硬汉嵌入式论坛

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

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

[复制链接]

23

主题

58

回帖

127

积分

初级会员

积分
127
发表于 2024-1-15 19:02:16 | 显示全部楼层 |阅读模式


程序卡在这边,但是不知道是哪个语句引起的异常,之前好像看到有一个方法可以查看到进入异常的语句;
[C] 纯文本查看 复制代码
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 */
  }
}

[C] 纯文本查看 复制代码
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);

}

[C] 纯文本查看 复制代码
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[addr][i]=adc_set_ch(10);
    ch2_adc_valve[addr][i]=adc_set_ch(11);
    ch3_adc_valve[addr][i]=adc_set_ch(12);
}

目前有三个ADC引脚,每个引脚通过模拟开关进行扩展,想实现就是可以指定ADC对特定的通道进行采样,因为模拟开关要切换(4051),用查询方式就行。
这边有些疑问,ADC是否在每次采样前进行开启?
上面的代码加完之后程序就会跑飞(卡在while(1)里。

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106649
QQ
发表于 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即可。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-27 18:37 , Processed in 0.264487 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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