STM32 HAL库 ADC+DMA

 

 软件触发:STM32 HAL库 软件触发ADC 多通道连续转换_随风飘零翼的博客-CSDN博客

配置如图 

STM32 HAL库 ADC+DMA_第1张图片

 STM32 HAL库 ADC+DMA_第2张图片

STM32 HAL库 ADC+DMA_第3张图片

  注意采样周期不要过小,不然频繁中断会导致在RTOS中卡死

#define   ADC_CHANNEL  3       //通道数

struct ADC1_x
{
	__IO uint16_t ch2,
	ch3,ch6;
};



union _ADC1
{
     struct ADC1_x adc1_x;
	__IO uint16_t all[ADC_CHANNEL];
};

union _ADC1 _adc1;

void Sensor_Task( void *pvParameters )
{
	//adc1内部校准
	HAL_ADCEx_Calibration_Start(&hadc1); 
	HAL_ADC_Start_DMA(&hadc1, (uint32_t*)_adc1.all, ADC_CHANNEL);
	
		for( ;; )
		{

			ADC_Conversion();

			osDelay(200);
			uxHighWaterMark_Sensor = uxTaskGetStackHighWaterMark( NULL );
		}
}

写了部分关键代码,在两个任务中OLED和串口打印分别显示的通道值。

后来发现使用的杜邦线接触不良,固定好之后,接到3.3V的值稳定在4095  

我不怎么经常使用串口输出看log,一般是debug。在我调试rtos时候,常使用一个串口被多个任务使用,发送数据,没有加入接收功能。当加入adc+dma之后,系统运行一会便会卡死。在删除一个任务的串口打印任务后才恢复正常,我对一个任务使用了挂起任务调度器函数,然后在发送,再恢复,没有死机。

换了个方法,使用互斥信号量,将两个任务中的打印功能上锁和释放,也不会死机。

一般情况下我不会对一个串口在多个任务下发送不同内容,串口顶多用来和别的设备通信。希望有经验的人给个建议。

你可能感兴趣的:(stm32,stm32,单片机)