1 | #include "stm32f10x.h"
|
2 | u16 ADC_Data;
|
3 |
|
4 |
|
5 | void Usart1Init(void);
|
6 | void Usart1Put(uint8_t ch);
|
7 |
|
8 | void ADConverter_Init( void )
|
9 | {
|
10 | ADC_InitTypeDef ADC_InitStructure;
|
11 | GPIO_InitTypeDef GPIO_InitStructure;
|
12 |
|
13 | // Enable PORT clock
|
14 | RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
|
15 |
|
16 | /* Configure pin as analog input ---------------*/
|
17 | GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
|
18 | GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
|
19 | GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
|
20 | GPIO_Init(GPIOC, &GPIO_InitStructure);
|
21 |
|
22 | /* Enable ADC1 clock */
|
23 | RCC_APB2PeriphClockCmd( RCC_APB2Periph_ADC1, ENABLE );
|
24 |
|
25 | /* ADC1 Configuration ------------------------------------------------------*/
|
26 | ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
|
27 | ADC_InitStructure.ADC_ScanConvMode = DISABLE;
|
28 | ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
|
29 | ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
|
30 | ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
|
31 | ADC_InitStructure.ADC_NbrOfChannel = 1;
|
32 | ADC_Init( ADC1, &ADC_InitStructure );
|
33 |
|
34 | /* ADC1 Regular Channel 14 */
|
35 | ADC_RegularChannelConfig( ADC1, ADC_Channel_14, 1, ADC_SampleTime_239Cycles5);
|
36 |
|
37 | /* Enable ADC1 external trigger conversion */
|
38 | ADC_ExternalTrigConvCmd( ADC1, ENABLE );
|
39 |
|
40 | /* Enable ADC1 */
|
41 | ADC_Cmd(ADC1, ENABLE);
|
42 |
|
43 | /* Enable ADC1 reset calibaration register */
|
44 | ADC_ResetCalibration(ADC1);
|
45 |
|
46 | /* Check the end of ADC1 reset calibration register */
|
47 | while(ADC_GetResetCalibrationStatus(ADC1));
|
48 |
|
49 | /* Start ADC1 calibaration */
|
50 | ADC_StartCalibration(ADC1);
|
51 |
|
52 | /* Check the end of ADC1 calibration */
|
53 | while(ADC_GetCalibrationStatus(ADC1));
|
54 |
|
55 | }
|
56 |
|
57 | u16 Get_Measure()
|
58 | {
|
59 | // Start ADC1 Software Conversion
|
60 | ADC_SoftwareStartConvCmd( ADC1, ENABLE );
|
61 |
|
62 | // Wait for end of conversion
|
63 | while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);
|
64 |
|
65 | // Return the conversion value
|
66 | return (ADC_GetConversionValue(ADC1));
|
67 | }
|
68 |
|
69 |
|
70 | /* Private function prototypes -----------------------------------------------*/
|
71 | void RCC_Configuration(void);
|
72 | void GPIO_Configuration(void);
|
73 | void Delay(__IO uint32_t nCount);
|
74 | void start_dma(uint32_t *sintable);
|
75 |
|
76 | /* Private functions ---------------------------------------------------------*/
|
77 |
|
78 | /**
|
79 | * @brief Main program.
|
80 | * @param None
|
81 | * @retval None
|
82 | */
|
83 | int main(void)
|
84 | {
|
85 |
|
86 |
|
87 | RCC_Configuration();
|
88 |
|
89 | /* Enable GPIOx Clock */
|
90 | RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
|
91 |
|
92 | /* Initialise LEDs LD3&LD4, both off */
|
93 | GPIO_DeInit(GPIOC);
|
94 |
|
95 | ADConverter_Init();
|
96 |
|
97 |
|
98 | Usart1Init();
|
99 |
|
100 |
|
101 | /* main while */
|
102 | while(1)
|
103 | {
|
104 | ADC_Data = Get_Measure();
|
105 |
|
106 | Usart1Put(0x00);
|
107 | Usart1Put(0x00);
|
108 | Usart1Put(0x00);
|
109 | Usart1Put(0x00);
|
110 | Usart1Put(0x00);
|
111 | Usart1Put(0xFF);
|
112 | Usart1Put(0xFF);
|
113 | Usart1Put(0xFF);
|
114 | Usart1Put(0xFF);
|
115 | Usart1Put(0xFF);
|
116 | Usart1Put(0xFF);
|
117 | Usart1Put(0xFF);
|
118 | Usart1Put(0xFF);
|
119 | Delay(10);
|
120 |
|
121 | }
|
122 | }
|
123 |
|
124 | /**
|
125 | * @brief Inserts a delay time.
|
126 | * @param nTime: specifies the delay time length, in milliseconds.
|
127 | * @retval None
|
128 | */
|
129 | void Delay(uint32_t nTime)
|
130 | {
|
131 | uint32_t TimingDelay = nTime;
|
132 | uint32_t i;
|
133 |
|
134 | while(TimingDelay != 0){
|
135 | i = 1000;
|
136 | while( i > 0 ){
|
137 | i--;
|
138 | }//*/
|
139 | TimingDelay--;
|
140 | }
|
141 | }
|
142 |
|
143 | /**
|
144 | * @brief Decrements the TimingDelay variable.
|
145 | * @param None
|
146 | * @retval None
|
147 | */
|
148 |
|
149 | void RCC_Configuration(void)
|
150 | {
|
151 | /* RCC system reset(for debug purpose) */
|
152 | RCC_DeInit();
|
153 |
|
154 | /* Enable HSE */
|
155 | RCC_HSEConfig(RCC_HSE_ON);
|
156 |
|
157 | /* Wait till HSE is ready */
|
158 | ErrorStatus HSEStartUpStatus = RCC_WaitForHSEStartUp();
|
159 |
|
160 | if(HSEStartUpStatus == SUCCESS)
|
161 | {
|
162 | /* Enable Prefetch Buffer */
|
163 | FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
|
164 |
|
165 | /* Flash 2 wait state */
|
166 | FLASH_SetLatency(FLASH_Latency_0);
|
167 |
|
168 | /* HCLK = SYSCLK */
|
169 | RCC_HCLKConfig(RCC_SYSCLK_Div1);
|
170 |
|
171 | /* PCLK2 = HCLK */
|
172 | RCC_PCLK2Config(RCC_HCLK_Div1);
|
173 |
|
174 | /* PCLK1 = HCLK/2 */
|
175 | RCC_PCLK1Config(RCC_HCLK_Div1);
|
176 |
|
177 | /* ADCCLK = PCLK2/4 */
|
178 | RCC_ADCCLKConfig(RCC_PCLK2_Div4);
|
179 |
|
180 | /* PLLCLK = 8MHz * 7 = 56 MHz */
|
181 | //RCC_PLLConfig(RCC_PLLSource_PREDIV1, RCC_PLLMul_7);
|
182 |
|
183 | /* PLLCLK = (8MHz/2) * 6 = 24 MHz */
|
184 | RCC_PREDIV1Config(RCC_PREDIV1_Source_HSE, RCC_PREDIV1_Div2);
|
185 | RCC_PLLConfig(RCC_PLLSource_PREDIV1, RCC_PLLMul_6);
|
186 |
|
187 | /* Enable PLL */
|
188 | RCC_PLLCmd(ENABLE);
|
189 |
|
190 | /* Wait till PLL is ready */
|
191 | while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
|
192 | {
|
193 | }
|
194 |
|
195 | /* Select PLL as system clock source */
|
196 | RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
|
197 |
|
198 | /* Wait till PLL is used as system clock source */
|
199 | while(RCC_GetSYSCLKSource() != 0x08)
|
200 | {
|
201 | }
|
202 | }
|
203 |
|
204 | /* Enable peripheral clocks --------------------------------------------------*/
|
205 | /* Enable DMA1 and DMA2 clocks */
|
206 | RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
|
207 |
|
208 | /* Enable ADC1, ADC2, ADC3 and GPIOC clocks */
|
209 | RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOC, ENABLE);
|
210 | }
|
211 |
|
212 | void Usart1Init(void)
|
213 |
|
214 | {
|
215 |
|
216 | GPIO_InitTypeDef GPIO_InitStructure;
|
217 | USART_InitTypeDef USART_InitStructure;
|
218 | USART_ClockInitTypeDef USART_ClockInitStructure;
|
219 |
|
220 | //enable bus clocks
|
221 | RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
|
222 |
|
223 | //Set USART1 Tx (PA.09) as AF push-pull
|
224 | GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
|
225 | GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
|
226 | GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
|
227 | GPIO_Init(GPIOA, &GPIO_InitStructure);
|
228 |
|
229 | //Set USART1 Rx (PA.10) as input floating
|
230 | GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
|
231 | GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
|
232 | GPIO_Init(GPIOA, &GPIO_InitStructure);
|
233 | USART_ClockStructInit(&USART_ClockInitStructure);
|
234 | USART_ClockInit(USART1, &USART_ClockInitStructure);
|
235 |
|
236 | USART_InitStructure.USART_BaudRate = 9600;
|
237 | USART_InitStructure.USART_WordLength = USART_WordLength_8b;
|
238 | USART_InitStructure.USART_StopBits = USART_StopBits_1;
|
239 | USART_InitStructure.USART_Parity = USART_Parity_No ;
|
240 | USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
|
241 | USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
|
242 |
|
243 | //Write USART1 parameters
|
244 | USART_Init(USART1, &USART_InitStructure);
|
245 |
|
246 | //Enable USART1
|
247 | USART_Cmd(USART1, ENABLE);
|
248 | }
|
249 |
|
250 | void Usart1Put(uint8_t ch)
|
251 | {
|
252 | USART_SendData(USART1, (uint8_t) ch);
|
253 | //Loop until the end of transmission
|
254 | while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
|
255 | {
|
256 | }
|
257 | }
|