|
|
#include "./BSP/ADC/adc.h"
#include "./SYSTEM/delay/delay.h"
#include "os.h"
static ADC_HandleTypeDef hadc1;
static ADC_HandleTypeDef hadc2;
static ADC_HandleTypeDef hadc3;
DMA_HandleTypeDef g_dma2_nch_adc1_handle;
ADC_HandleTypeDef g_adc1_nch_dma2_handle;
volatile uint16_t ADC1_Value_buffer[200 = {0}; //ADC1通道采样值缓冲区
volatile uint8_t ADC1_Dma_TransferFlag = DMA_TRANSFER_NONE; //DMA传输状态标志
extern uint32_t ADC_digital[4];
void MX_ADC1_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_ADC1_CLK_ENABLE();
__HAL_RCC_DMA2_CLK_ENABLE();
g_dma2_nch_adc1_handle.Instance = DMA2_Stream0;
g_dma2_nch_adc1_handle.Init.Channel = DMA_CHANNEL_0;
g_dma2_nch_adc1_handle.Init.Direction = DMA_PERIPH_TO_MEMORY;
g_dma2_nch_adc1_handle.Init.PeriphInc = DMA_PINC_DISABLE;
g_dma2_nch_adc1_handle.Init.MemInc = DMA_MINC_ENABLE;
g_dma2_nch_adc1_handle.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
g_dma2_nch_adc1_handle.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
g_dma2_nch_adc1_handle.Init.Mode = DMA_CIRCULAR;//循环模式
g_dma2_nch_adc1_handle.Init.Priority = DMA_PRIORITY_MEDIUM;
HAL_DMA_Init(&g_dma2_nch_adc1_handle);
HAL_NVIC_SetPriority(DMA2_Stream0_IRQn, 5, 0); // 优先级必须>=5才能安全调用RTOS API
HAL_NVIC_EnableIRQ(DMA2_Stream0_IRQn);
__HAL_LINKDMA(&g_adc1_nch_dma2_handle, DMA_Handle, g_dma2_nch_adc1_handle);
/* 设置 ADC 对应的 DMA */
g_adc1_nch_dma2_handle.DMA_Handle = &g_dma2_nch_adc1_handle;
g_adc1_nch_dma2_handle.Instance = ADC1;
g_adc1_nch_dma2_handle.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;//由84Mhz进行4分频
g_adc1_nch_dma2_handle.Init.Resolution = ADC_RESOLUTION_12B;
g_adc1_nch_dma2_handle.Init.DataAlign = ADC_DATAALIGN_RIGHT; //数据右对齐
g_adc1_nch_dma2_handle.Init.ScanConvMode = ENABLE; //启用ADC扫描转换模式
g_adc1_nch_dma2_handle.Init.ContinuousConvMode = ENABLE; //启用连续转换模式
g_adc1_nch_dma2_handle.Init.DiscontinuousConvMode = DISABLE; //禁用不连续转换模式
g_adc1_nch_dma2_handle.Init.NbrOfConversion = 4; //设置转换的通道数为4
g_adc1_nch_dma2_handle.Init.NbrOfDiscConversion = 0;//不连续转换的通道数为0
g_adc1_nch_dma2_handle.Init.ExternalTrigConv = ADC_SOFTWARE_START; //软件触发转换
g_adc1_nch_dma2_handle.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;//禁用外部触发转换
g_adc1_nch_dma2_handle.Init.DMAContinuousRequests = ENABLE; //启动DMA连续请求
HAL_ADC_Init(&g_adc1_nch_dma2_handle);
//GPIO初始化
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_6;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* 设置采样规则序列 1、2、3、6 */
adc1_channel_set(&g_adc1_nch_dma2_handle, ADC_CHANNEL_1, 1, ADC_SAMPLETIME_480CYCLES); //GRN_NTC
adc1_channel_set(&g_adc1_nch_dma2_handle, ADC_CHANNEL_2, 2, ADC_SAMPLETIME_480CYCLES); //RED_NTC
adc1_channel_set(&g_adc1_nch_dma2_handle, ADC_CHANNEL_3, 3, ADC_SAMPLETIME_480CYCLES); //VPD_GRN
adc1_channel_set(&g_adc1_nch_dma2_handle, ADC_CHANNEL_6, 4, ADC_SAMPLETIME_480CYCLES); //VPD_RED
// 注意:DMA不在这里启动,而是在RTOS信号量创建后启动
// 避免在信号量创建前触发DMA中断
// 启动ADC1的DMA循环传输
}
/**
* @brief 启动ADC1的DMA传输
* @note 必须在RTOS启动且信号量创建后调用此函数
*/
void adc1_start_dma(void)
{
// 启动ADC1的DMA循环传输
HAL_ADC_Start_DMA(&g_adc1_nch_dma2_handle, (uint32_t*)ADC1_Value_buffer, 200);
// 使能半传输和全传输中断
__HAL_DMA_ENABLE_IT(&g_dma2_nch_adc1_handle, DMA_IT_HT | DMA_IT_TC);
}
|
-
|