做adc采集的时候用扫描模式发现读数据时只能读到一个通道的数据,想显示其他几个通道的数据只能进行多次单个扫描,违背了扫描模式的本意,故用ai做了一个将扫描数据用dma储存在内存的adc三通道采集实验,若有巨佬发现有错望告知。
代码如下:
#include "stm32f4xx_hal.h" // ?? HAL ????
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "key.h"
#include "lcd.h"
#include "sdram.h"
DMA_HandleTypeDef dma_handle; // DMA ??
ADC_HandleTypeDef adc_handle; // ADC ??
uint16_t adc_buffer[3]; // ADC ???????
void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc)
{
__HAL_RCC_GPIOA_CLK_ENABLE(); // ?? GPIOA ??
__HAL_RCC_ADC1_CLK_ENABLE(); // ?? ADC1 ??
__HAL_RCC_DMA2_CLK_ENABLE(); // ?? DMA2 ??
GPIO_InitTypeDef GPIO_Initure;
GPIO_Initure.Pin = GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_5; // ?? PA1?PA2?PA3 ??
GPIO_Initure.Mode = GPIO_MODE_ANALOG; // ??????
GPIO_Initure.Pull = GPIO_NOPULL; // ???????
GPIO_Initure.Speed = GPIO_SPEED_HIGH; // ????
HAL_GPIO_Init(GPIOA, &GPIO_Initure); // ??? GPIOA
// DMA ??
dma_handle.Instance = DMA2_Stream0; // ?? DMA2 ? 0
dma_handle.Init.Channel = DMA_CHANNEL_0;
dma_handle.Init.Direction = DMA_PERIPH_TO_MEMORY; // ?????
dma_handle.Init.PeriphInc = DMA_PINC_DISABLE; // ????????
dma_handle.Init.MemInc = DMA_MINC_ENABLE; // ????????
dma_handle.Init.PeriphInc = DMA_PDATAALIGN_HALFWORD; // ??????? 16 ?
dma_handle.Init.MemBurst = DMA_MDATAALIGN_HALFWORD; // ??????? 16 ?
dma_handle.Init.Mode = DMA_CIRCULAR; // ????
dma_handle.Init.Priority = DMA_PRIORITY_LOW; // ????
dma_handle.Init.FIFOMode = DMA_FIFOMODE_DISABLE; // ?? FIFO ??
HAL_DMA_Init(&dma_handle); // ??? DMA
// ?? DMA ? ADC
__HAL_LINKDMA(hadc, DMA_Handle, dma_handle); // ? DMA ? ADC ????
}
void MY_ADC1_Init(void)
{
adc_handle.Instance = ADC1;
adc_handle.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;
adc_handle.Init.ContinuousConvMode = ENABLE;
adc_handle.Init.DataAlign = ADC_DATAALIGN_RIGHT;
adc_handle.Init.DiscontinuousConvMode = DISABLE;
adc_handle.Init.DMAContinuousRequests = ENABLE; // ?? DMA ????
adc_handle.Init.EOCSelection = DISABLE;
adc_handle.Init.ExternalTrigConv = ADC_SOFTWARE_START; // ??????
adc_handle.Init.NbrOfConversion = 3; // ?? 3 ???
adc_handle.Init.Resolution = ADC_RESOLUTION_12B; // 12 ????
adc_handle.Init.ScanConvMode = ENABLE; // ????
HAL_ADC_Init(&adc_handle); // ??? ADC
}
void MY_ADC1_ConfigChannels(void)
{
ADC_ChannelConfTypeDef channelConfig;
// ???? 1 (PA1)
channelConfig.Channel = ADC_CHANNEL_1;
channelConfig.Rank = 1; // ???????
channelConfig.SamplingTime = ADC_SAMPLETIME_480CYCLES; // ??????
channelConfig.Offset = 0;
HAL_ADC_ConfigChannel(&adc_handle, &channelConfig);
// ???? 2 (PA2)
channelConfig.Channel = ADC_CHANNEL_2;
channelConfig.Rank = 2; // ???????
HAL_ADC_ConfigChannel(&adc_handle, &channelConfig);
// ???? 3 (PA3)
channelConfig.Channel = ADC_CHANNEL_5;
channelConfig.Rank = 3; // ???????
HAL_ADC_ConfigChannel(&adc_handle, &channelConfig);
}
void Start_ADC_DMA_Conversion(void)
{
// ?? ADC ????? DMA
HAL_ADC_Start_DMA(&adc_handle, (uint32_t*)adc_buffer, 3); // ?? ADC ? DMA,3 ???? 3 ???
}
int main(void)
{
HAL_Init(); // ??? HAL ?
MY_ADC1_Init(); // ??? ADC1
MY_ADC1_ConfigChannels(); // ?? ADC ??
Start_ADC_DMA_Conversion(); // ?? ADC DMA ??
u16 adcx;
float temp;
HAL_Init(); //???HAL?
Stm32_Clock_Init(360,25,2,8); //????,180Mhz
delay_init(180); //???????
uart_init(115200); //???USART
LED_Init(); //???LED
KEY_Init(); //?????
SDRAM_Init(); //???SDRAM
LCD_Init(); //???LCD //???LCD
// ???????,?? USART?LCD ?
POINT_COLOR=RED;
LCD_ShowString(30,50,200,16,16,"Apollo STM32F4/F7");
LCD_ShowString(30,70,200,16,16,"ADC TEST");
LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");
LCD_ShowString(30,110,200,16,16,"2016/1/13");
POINT_COLOR=BLUE;//???????
LCD_ShowString(30,130,200,16,16,"ADC1_CH5_VAL:");
while (1)
{
// ????? dma ?????????? LCD
// ??:
LCD_ShowxNum(134, 130, adc_buffer[0], 4, 16, 0); // ???? 1 ? ADC ?
LCD_ShowxNum(134, 150, adc_buffer[1], 4, 16, 0); // ???? 2 ? ADC ?
LCD_ShowxNum(134, 170, adc_buffer[2], 4, 16, 0); // ???? 3 ? ADC ?
HAL_Delay(500); // ?? 500ms
}
}