adersonl 发表于 2017-11-5 21:41:18

STM32L051 ADC多通道 和 低功耗串口冲突问题

使用STM32L051因为要使用低功耗模式,用Cube配置的,ADC多通道是可以正常工作了,现在要加入低功耗串口,两个模块单独调试都是正常的,现在组合到一起,发现初始化串口时,会造成ADC的DMA一直触发,然后就会一直卡在那边

lawesly 发表于 2017-11-5 21:41:19

把初始化顺序调整下看看,MX_LPUART1_UART_Init 放到 MX_GPIO_Init 后面,然后再DMA和ADC初始化

adersonl 发表于 2017-11-5 21:44:36

MX_GPIO_Init();
MX_LPUART1_UART_Init();
MX_ADC_Init();
/* USER CODE BEGIN 2 */

        HAL_UART_Transmit(&hlpuart1, (uint8_t *)"Init OK", 7, 10);
        HAL_Delay(100);
/* USER CODE END 2 */
        uint16_t adv = 0;
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
       
/* USER CODE BEGIN 3 */
                adv = Get_Adc(1);
                Led_SW(0);
                HAL_Delay(1000);
                Led_SW(1);
                HAL_Delay(1000);
                //User_Uart_Send((uint8_t*)"AAAAAAAAAAAAAA");
                HAL_UART_Transmit(&hlpuart1, (uint8_t *)&adv, 2, 1000);
        }
/* USER CODE END 3 */

}
主循环

ADC && 串口
static void MX_ADC_Init(void)
{

ADC_ChannelConfTypeDef sConfig;

    /**Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion)
    */
AdcHandle.Instance = ADC1;

AdcHandle.Init.OversamplingMode      = DISABLE;

AdcHandle.Init.ClockPrescaler      = ADC_CLOCK_SYNC_PCLK_DIV1;
AdcHandle.Init.LowPowerAutoPowerOff= DISABLE;
AdcHandle.Init.LowPowerFrequencyMode = ENABLE;
AdcHandle.Init.LowPowerAutoWait      = DISABLE;
   
AdcHandle.Init.Resolution            = ADC_RESOLUTION_12B;
AdcHandle.Init.SamplingTime          = ADC_SAMPLETIME_7CYCLES_5;
AdcHandle.Init.ScanConvMode          = ADC_SCAN_DIRECTION_FORWARD;
        //AdcHandle.Init.ScanConvMode                                = DISABLE;
AdcHandle.Init.DataAlign             = ADC_DATAALIGN_RIGHT;
AdcHandle.Init.ContinuousConvMode    = DISABLE;
AdcHandle.Init.DiscontinuousConvMode = ENABLE;
AdcHandle.Init.ExternalTrigConvEdge= ADC_EXTERNALTRIGCONVEDGE_NONE;
AdcHandle.Init.EOCSelection          = ADC_EOC_SINGLE_CONV;
AdcHandle.Init.DMAContinuousRequests = DISABLE;
if (HAL_ADC_Init(&AdcHandle) != HAL_OK)
{
    _Error_Handler(__FILE__, __LINE__);
}

        if (HAL_ADCEx_Calibration_Start(&AdcHandle, ADC_SINGLE_ENDED) != HAL_OK)
{
    Error_Handler();
}
    /**Configure for the selected ADC regular channel to be converted.
    */
sConfig.Channel = ADC_CHANNEL_0;
sConfig.Rank = 1;
        if (HAL_ADC_ConfigChannel(&AdcHandle, &sConfig) != HAL_OK)
{
    _Error_Handler(__FILE__, __LINE__);
}

    /**Configure for the selected ADC regular channel to be converted.
    */
sConfig.Channel = ADC_CHANNEL_1;
sConfig.Rank = 2;
        if (HAL_ADC_ConfigChannel(&AdcHandle, &sConfig) != HAL_OK)
{
    _Error_Handler(__FILE__, __LINE__);
}

    /**Configure for the selected ADC regular channel to be converted.
    */
sConfig.Channel = ADC_CHANNEL_2;
sConfig.Rank = 3;
        if (HAL_ADC_ConfigChannel(&AdcHandle, &sConfig) != HAL_OK)
{
    _Error_Handler(__FILE__, __LINE__);
}

    /**Configure for the selected ADC regular channel to be converted.
    */
sConfig.Channel = ADC_CHANNEL_3;
        sConfig.Rank = 4;
if (HAL_ADC_ConfigChannel(&AdcHandle, &sConfig) != HAL_OK)
{
    _Error_Handler(__FILE__, __LINE__);
}

}

/* LPUART1 init function */
static void MX_LPUART1_UART_Init(void)
{

hlpuart1.Instance = LPUART1;
hlpuart1.Init.BaudRate = 9600;
hlpuart1.Init.WordLength = UART_WORDLENGTH_8B;
hlpuart1.Init.StopBits = UART_STOPBITS_1;
hlpuart1.Init.Parity = UART_PARITY_NONE;
hlpuart1.Init.Mode = UART_MODE_TX_RX;
hlpuart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
hlpuart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
hlpuart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
if (HAL_UART_Init(&hlpuart1) != HAL_OK)
{
    _Error_Handler(__FILE__, __LINE__);
}

}

发表于 2017-11-6 08:58:01

楼主,ADC采集用的有和串口配置冲突的引脚吗?

adersonl 发表于 2017-11-6 10:16:28

安 发表于 2017-11-6 08:58
楼主,ADC采集用的有和串口配置冲突的引脚吗?

没有冲突啊,A0 - A3 是AD输入, 串口是B10 B11

发表于 2017-11-6 11:09:19

楼主方便把工程传上来吗?大家有代码好帮忙分析一下

adersonl 发表于 2017-11-6 12:56:34

本帖最后由 adersonl 于 2017-11-6 13:00 编辑

工程来了

adersonl 发表于 2017-11-6 13:01:18

安 发表于 2017-11-6 11:09
楼主方便把工程传上来吗?大家有代码好帮忙分析一下

非常感谢版主出力,工程已传

发表于 2017-11-7 10:30:54

看了一下,感觉没什么问题,手头也没有L051的板子帮忙测试。

adersonl 发表于 2017-11-10 11:38:53

lawesly 发表于 2017-11-9 14:17
把初始化顺序调整下看看,MX_LPUART1_UART_Init 放到 MX_GPIO_Init 后面,然后再DMA和ADC初始化 ...

后来也试过了,貌似没有什么用,不知道是哪里的问题。。我现在先不用DMA了,正常的。。
页: [1] 2
查看完整版本: STM32L051 ADC多通道 和 低功耗串口冲突问题