基于STM32Cube的ADC多通道采样(ADC+DMA+USART)

STM32Cube+MDK

用HALL库写的好处就是免得配置IO的繁琐步骤。还有兼容性也不错的。换芯片的话改代码也简单。废话就少说了。

一、我们先打开STM32cube。
基于STM32Cube的ADC多通道采样(ADC+DMA+USART)_第1张图片

STM32cube的界面还是挺简洁的。
1、点击New Projrct。
2、选择芯片,我的是STM32F051R8T6
3、选择完毕出现下面的画面
基于STM32Cube的ADC多通道采样(ADC+DMA+USART)_第2张图片

4、我们在左侧,配置一下芯片的相关配置。
基于STM32Cube的ADC多通道采样(ADC+DMA+USART)_第3张图片基于STM32Cube的ADC多通道采样(ADC+DMA+USART)_第4张图片
在这里插入图片描述
因为我是ST-LINK下载所以选择SW模式。 ADC是4通道采样1-4.
打开串口一。只要左边的选项选好,右边的芯片的引脚就自动配置好。我们看下图吧

基于STM32Cube的ADC多通道采样(ADC+DMA+USART)_第5张图片
好的我们现在设置一下这里
在这里插入图片描述RCC我在左侧的表格里没勾选,因为我用的是内部时钟啊,不用选也没事的la ,但是要注意设置时钟哦!!我的芯片的ADC时钟最大好像不能超过12M,STM32F4系列的是32M,自己查芯片手册吧。
下面是我的配置时钟
基于STM32Cube的ADC多通道采样(ADC+DMA+USART)_第6张图片
不是说不能超过48M? 不要疑惑是48M,等等还要分频呢!!!
打字太累了!!!上图
基于STM32Cube的ADC多通道采样(ADC+DMA+USART)_第7张图片

基于STM32Cube的ADC多通道采样(ADC+DMA+USART)_第8张图片

基于STM32Cube的ADC多通道采样(ADC+DMA+USART)_第9张图片

其他的啥都默认好了。当然也可以去改下波特率,点击那个USART1.不改也没事。

然后按ALT+P,设置下工程!!!格式如下,路径自己定!
基于STM32Cube的ADC多通道采样(ADC+DMA+USART)_第10张图片
这个可以把代码格式更模块化。建议选择
基于STM32Cube的ADC多通道采样(ADC+DMA+USART)_第11张图片然后按那个小东西,就生成代码了
基于STM32Cube的ADC多通道采样(ADC+DMA+USART)_第12张图片

串口问题就一个重定向就解决了,写在int mian()的前面
 #ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif 
PUTCHAR_PROTOTYPE
{
HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF);
return ch;

}
int main(void)
{

  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_USART1_UART_Init();
  MX_ADC_Init();
 HAL_ADC_Start_DMA(&hadc, (uint32_t*)&uhADCxConvertedValue, 4);

  while (1)
  { 
  
	if(flag==1)
	{	   
	flag=0;	
  HAL_Delay(400);	
	printf("ch1 = %d\n",uhADCxConvertedValue[0]);	
	HAL_Delay(400);		
	printf("ch2 = %d\n",uhADCxConvertedValue[1]);
	HAL_Delay(400);			
	printf("ch3 = %f\n",(uhADCxConvertedValue[2]*3.3)/4095);
	HAL_Delay(400);			
	printf("ch4 = %f\n",(uhADCxConvertedValue[3]*3.3)/4095);		
	HAL_Delay(400);			
	}	
	HAL_ADC_Start_DMA(&hadc, (uint32_t*)&uhADCxConvertedValue, 4);
	HAL_Delay(500);  
  }

}
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
	flag=1;
 HAL_ADC_Stop_DMA(hadc); 
}

注意回调的flag必须写!!!不写的多通道会出问题!!!
这样就可以出数据了,吼吼就慢慢微调吧!
上班写的,有时间我会补上说明!

你可能感兴趣的:(STM32)