/
ADC Config.c
128 lines (107 loc) · 3.49 KB
/
ADC Config.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#include "main.h"
extern ADC_HandleTypeDef g_AdcHandle;
extern DMA_HandleTypeDef g_DmaHandle;
extern uint32_t values[ADC_BUFFER_LENGTH];
extern volatile unsigned short values_BUF[ADC_BUFFER_LENGTH];
uint16_t ctr;
extern uint8_t IRQ_FLAG;
extern osThreadId Main_thID;
extern osThreadId tid_TH_GUI;
HAL_StatusTypeDef ADC_INIT(ADC_HandleTypeDef* AdcHandle)
{
GPIO_InitTypeDef gpioInit;
ADC_ChannelConfTypeDef adcChannel;
__GPIOC_CLK_ENABLE();
__ADC3_CLK_ENABLE();
gpioInit.Pin = GPIO_PIN_10;
gpioInit.Mode = GPIO_MODE_ANALOG;
gpioInit.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOF, &gpioInit);
HAL_NVIC_SetPriority(ADC_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(ADC_IRQn);
AdcHandle->Instance = ADC3;
AdcHandle->Init.ClockPrescaler = ADC_CLOCKPRESCALER_PCLK_DIV8;
AdcHandle->Init.Resolution = ADC_RESOLUTION_8B;
AdcHandle->Init.ScanConvMode = DISABLE;
AdcHandle->Init.ContinuousConvMode = ENABLE;
AdcHandle->Init.DiscontinuousConvMode = DISABLE;
AdcHandle->Init.NbrOfDiscConversion = 0;
AdcHandle->Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
AdcHandle->Init.ExternalTrigConv = ADC_EXTERNALTRIGCONV_T1_CC1;
AdcHandle->Init.DataAlign = ADC_DATAALIGN_RIGHT;
AdcHandle->Init.NbrOfConversion = 1;
AdcHandle->Init.DMAContinuousRequests = ENABLE;
AdcHandle->Init.EOCSelection = DISABLE;
if (HAL_ADC_Init(AdcHandle) != HAL_OK)
{
/* ADC initialization Error */
return HAL_ERROR;
}
adcChannel.Channel = ADC_CHANNEL_8;
adcChannel.Rank = 1;
/*
ADC_SAMPLETIME_3CYCLES
ADC_SAMPLETIME_15CYCLES
ADC_SAMPLETIME_28CYCLES
ADC_SAMPLETIME_56CYCLES
ADC_SAMPLETIME_84CYCLES
ADC_SAMPLETIME_112CYCLES
ADC_SAMPLETIME_144CYCLES
ADC_SAMPLETIME_480CYCLES
*/
adcChannel.SamplingTime = ADC_SAMPLETIME_3CYCLES;
adcChannel.Offset = 0;
if (HAL_ADC_ConfigChannel(AdcHandle, &adcChannel) != HAL_OK)
{
/* Channel Configuration Error */
return HAL_ERROR;
}
return HAL_OK;
}
HAL_StatusTypeDef ConfigureDMA(DMA_HandleTypeDef* DmaHandle, ADC_HandleTypeDef* AdcHandle)
{
__DMA2_CLK_ENABLE();
DmaHandle->Instance = DMA2_Stream0;
DmaHandle->Init.Channel = DMA_CHANNEL_2;
DmaHandle->Init.Direction = DMA_PERIPH_TO_MEMORY;
DmaHandle->Init.PeriphInc = DMA_PINC_DISABLE;
DmaHandle->Init.MemInc = DMA_MINC_ENABLE;
DmaHandle->Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
DmaHandle->Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
DmaHandle->Init.Mode = DMA_NORMAL;
DmaHandle->Init.Priority = DMA_PRIORITY_HIGH;
DmaHandle->Init.FIFOMode = DMA_FIFOMODE_DISABLE;
DmaHandle->Init.FIFOThreshold = DMA_FIFO_THRESHOLD_HALFFULL;
DmaHandle->Init.MemBurst = DMA_MBURST_SINGLE;
DmaHandle->Init.PeriphBurst = DMA_PBURST_SINGLE;
if (HAL_DMA_Init(DmaHandle) != HAL_OK)
{
/* Configuration Error */
return HAL_ERROR;
}
__HAL_LINKDMA(AdcHandle, DMA_Handle, *DmaHandle);
HAL_NVIC_SetPriority(DMA2_Stream0_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(DMA2_Stream0_IRQn);
return HAL_OK;
}
void HAL_ADC_ConvHalfCpltCallback(ADC_HandleTypeDef* AdcHandle)
{
//HAL_ADC_Stop_DMA(&g_AdcHandle);
//osSignalSet(tid_TH_GUI,DMA_ConvHalfCpltSig);
}
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* AdcHandle)
{
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_9);
HAL_ADC_Stop_DMA(&g_AdcHandle);
osSignalSet(tid_TH_GUI,DMA_ConvCpltSig);
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_9);
//GPIOB->ODR ^= GPIO_PIN_9; // this is just for test of DMA speed
}
void DMA2_Stream0_IRQHandler()
{
HAL_DMA_IRQHandler(&g_DmaHandle);
}
void ADC_IRQHandler()
{
HAL_ADC_IRQHandler(&g_AdcHandle);
}