1 | /* Includes ------------------------------------------------------------------*/
|
2 |
|
3 | #include "global.h"
|
4 |
|
5 | /* Private typedef -----------------------------------------------------------*/
|
6 | /* Private define ------------------------------------------------------------*/
|
7 | #define BUFFER_SIZE 16
|
8 |
|
9 | /* Private macro -------------------------------------------------------------*/
|
10 | /* Private variables ---------------------------------------------------------*/
|
11 | __IO uint16_t uhADCxConvertedValue[BUFFER_SIZE] = { 0, };
|
12 | __IO uint32_t uwADCxConvertedVoltage = 0;
|
13 | __IO uint8_t state = 0;
|
14 | /* Private function prototypes -----------------------------------------------*/
|
15 | /* Private functions ---------------------------------------------------------*/
|
16 |
|
17 | void init_tim2() {
|
18 | TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
|
19 | TIM_OCInitTypeDef TIM_OCInitStructure;
|
20 | RCC_APB2PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
|
21 | TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
|
22 | TIM_TimeBaseStructure.TIM_Period = 10;
|
23 | TIM_TimeBaseStructure.TIM_Prescaler = 4200 - 1;
|
24 | TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV4;
|
25 | TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
|
26 | TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
|
27 |
|
28 | TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
|
29 | TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
|
30 | TIM_OCInitStructure.TIM_Pulse = 10;
|
31 | TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
|
32 | TIM_OC2Init(TIM2, &TIM_OCInitStructure);
|
33 |
|
34 | TIM_Cmd(TIM2, ENABLE);
|
35 | }
|
36 |
|
37 | void init_dma(void) {
|
38 | DMA_InitTypeDef DMA_InitStructure;
|
39 |
|
40 | ADC_DeInit();
|
41 | DMA_DeInit(DMA2_Stream0);
|
42 |
|
43 | RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);
|
44 |
|
45 | DMA_InitStructure.DMA_Channel = DMA_Channel_2;
|
46 | DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t) &ADC3->DR;
|
47 | DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t) uhADCxConvertedValue;
|
48 | DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
|
49 | DMA_InitStructure.DMA_BufferSize = BUFFER_SIZE;
|
50 | DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
|
51 | DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
|
52 | DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
|
53 | DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
|
54 | DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
|
55 | DMA_InitStructure.DMA_Priority = DMA_Priority_High;
|
56 | DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
|
57 | DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
|
58 | DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
|
59 | DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
|
60 | DMA_Init(DMA2_Stream0, &DMA_InitStructure);
|
61 | DMA_Cmd(DMA2_Stream0, ENABLE);
|
62 |
|
63 | DMA_ITConfig(DMA2_Stream0, DMA_IT_TC, ENABLE);
|
64 | NVIC_InitTypeDef NVIC_InitStructure;
|
65 | NVIC_InitStructure.NVIC_IRQChannel = DMA2_Stream0_IRQn;
|
66 | NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
|
67 | NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
|
68 | NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
|
69 | NVIC_Init(&NVIC_InitStructure);
|
70 | }
|
71 |
|
72 | void init_adc() {
|
73 | GPIO_InitTypeDef GPIO_InitStructure;
|
74 | ADC_InitTypeDef ADC_InitStructure;
|
75 | ADC_CommonInitTypeDef ADC_CommonInitStructure;
|
76 | RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
|
77 | RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC3, ENABLE);
|
78 |
|
79 | GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
|
80 | GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
|
81 | GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
|
82 | GPIO_Init(GPIOA, &GPIO_InitStructure);
|
83 |
|
84 | ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
|
85 | ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2;
|
86 | ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
|
87 | ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;
|
88 | ADC_CommonInit(&ADC_CommonInitStructure);
|
89 |
|
90 | ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
|
91 | ADC_InitStructure.ADC_ScanConvMode = DISABLE;
|
92 | ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
|
93 | ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
|
94 | ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T2_CC2;
|
95 | ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
|
96 | ADC_InitStructure.ADC_NbrOfConversion = 1;
|
97 | ADC_Init(ADC3, &ADC_InitStructure);
|
98 |
|
99 | ADC_RegularChannelConfig(ADC3, ADC_Channel_1, 1, ADC_SampleTime_15Cycles);
|
100 |
|
101 | ADC_ExternalTrigInjectedConvConfig(ADC3, ADC_ExternalTrigConv_T2_CC2);
|
102 |
|
103 | ADC_DMARequestAfterLastTransferCmd(ADC3, ENABLE);
|
104 |
|
105 | ADC_DMACmd(ADC3, ENABLE);
|
106 |
|
107 | ADC_Cmd(ADC3, ENABLE);
|
108 | }
|
109 |
|
110 | int main(void) {
|
111 | SystemInit();
|
112 |
|
113 | init_uart2(38400);
|
114 | init_uart2_IT();
|
115 | ms_delay(3000);
|
116 |
|
117 | RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
|
118 | GPIO_InitTypeDef GPIO_InitStructure;
|
119 | GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
|
120 | GPIO_InitStructure.GPIO_Pin |= GPIO_Pin_13;
|
121 | GPIO_InitStructure.GPIO_Pin |= GPIO_Pin_14;
|
122 | GPIO_InitStructure.GPIO_Pin |= GPIO_Pin_15;
|
123 | GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
|
124 | GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
|
125 | GPIO_Init(GPIOD, &GPIO_InitStructure);
|
126 |
|
127 | init_tim2();
|
128 | GPIO_SetBits(GPIOD, GPIO_Pin_12);
|
129 | char buffer[10];
|
130 | while (1) {
|
131 | putString("--\n", 3);
|
132 | GPIO_ToggleBits(GPIOD, GPIO_Pin_13);
|
133 | init_dma();
|
134 | init_adc();
|
135 | ADC_SoftwareStartConv(ADC3);
|
136 | state = 0;
|
137 | while (state == 0)
|
138 | ;
|
139 | GPIO_ToggleBits(GPIOD, GPIO_Pin_13);
|
140 | uint16_t i;
|
141 | for (i = 0; i < BUFFER_SIZE; i++) {
|
142 | uwADCxConvertedVoltage = uhADCxConvertedValue[i] * 3300 / 0xFFF;
|
143 | myitoa(uwADCxConvertedVoltage, buffer, 9);
|
144 | putString(buffer, 10);
|
145 | putString("\n", 3);
|
146 | }
|
147 |
|
148 | ms_delay(500);
|
149 | }
|
150 | }
|
151 |
|
152 | void DMA2_Stream0_IRQHandler() {
|
153 | DMA_ClearITPendingBit(DMA2_Stream0, DMA_FLAG_TCIF0);
|
154 | state = 1;
|
155 | GPIO_ToggleBits(GPIOD, GPIO_Pin_14);
|
156 | }
|