STM32L051 ADC多通道 和 低功耗串口冲突问题
使用STM32L051因为要使用低功耗模式,用Cube配置的,ADC多通道是可以正常工作了,现在要加入低功耗串口,两个模块单独调试都是正常的,现在组合到一起,发现初始化串口时,会造成ADC的DMA一直触发,然后就会一直卡在那边把初始化顺序调整下看看,MX_LPUART1_UART_Init 放到 MX_GPIO_Init 后面,然后再DMA和ADC初始化 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__);
}
}
楼主,ADC采集用的有和串口配置冲突的引脚吗? 安 发表于 2017-11-6 08:58
楼主,ADC采集用的有和串口配置冲突的引脚吗?
没有冲突啊,A0 - A3 是AD输入, 串口是B10 B11 楼主方便把工程传上来吗?大家有代码好帮忙分析一下 本帖最后由 adersonl 于 2017-11-6 13:00 编辑
工程来了
安 发表于 2017-11-6 11:09
楼主方便把工程传上来吗?大家有代码好帮忙分析一下
非常感谢版主出力,工程已传 看了一下,感觉没什么问题,手头也没有L051的板子帮忙测试。 lawesly 发表于 2017-11-9 14:17
把初始化顺序调整下看看,MX_LPUART1_UART_Init 放到 MX_GPIO_Init 后面,然后再DMA和ADC初始化 ...
后来也试过了,貌似没有什么用,不知道是哪里的问题。。我现在先不用DMA了,正常的。。
页:
[1]
2