#include "stm32f10x_lib.h"
unsigned short ADC_ConvertedValue;
char str[14];
//------------------------------ Function RCC Configuration ------------------------------------------//
void RCC_setup()
{
ErrorStatus HSEStartUpStatus; // Keep error status
RCC_DeInit(); // RCC system reset(for debug purpose)
RCC_HSEConfig(RCC_HSE_ON); // Enable HSE
HSEStartUpStatus = RCC_WaitForHSEStartUp(); // Wait till HSE is ready
if(HSEStartUpStatus == SUCCESS)
{
RCC_HCLKConfig(RCC_SYSCLK_Div1); // HCLK = SYSCLK
RCC_PCLK2Config(RCC_HCLK_Div1); // PCLK2 = HCLK
RCC_PCLK1Config(RCC_HCLK_Div4); // PCLK1 = HCLK/2
//RCC_ADCCLKConfig(RCC_PCLK2_Div4); // ADCCLK = PCLK2/4
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
FLASH_SetLatency(FLASH_Latency_2); // Flash 2 wait state
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); // Enable Prefetch Buffer
RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9); // PLLCLK = 8MHz * 9 = 72 MHz
RCC_PLLCmd(ENABLE); // Enable PLL
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); // Wait until PLL is ready
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); // Select PLL as system clock source
while(RCC_GetSYSCLKSource() != 0x08); // Wait till PLL is used as system clock source
}
}
//------------------------------ Function GPIO Configuration -----------------------------------------//
void GPIO_setup()
{
GPIO_InitTypeDef GPIO_InitStructure;
// Enable GPIOC clock and Enable GPIOA and AFIO clock
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO,ENABLE);
// Configure PC0 as analog input(ADC Channel10) //ADC_CH1(ADC10)
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOC, &GPIO_InitStructure);
// Configure USART1 Tx (PA9) as alternate function push-pull
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// Configure USART1 Rx (PA10) as input floating
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
//------------------------------ Function ADC Configuration ------------------------------------------//
void ADC_setup()
{
ADC_InitTypeDef ADC_InitStructure;
// Enable ADC1 clock
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
// ADC1 configuration
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfChannel = 1;
ADC_Init(ADC1, &ADC_InitStructure);
ADC_Cmd(ADC1, ENABLE); // Enable ADC1
ADC_ResetCalibration(ADC1); // Enable ADC1 reset calibaration register
while(ADC_GetResetCalibrationStatus(ADC1));
ADC_StartCalibration(ADC1); // Start ADC1 calibration
while(ADC_GetCalibrationStatus(ADC1)); // Check the end of ADC1 calibration
ADC_SoftwareStartConvCmd(ADC1, ENABLE); // Start ADC1 Software Conversion
}
//------------------------------ Function USART1 Configuration -----------------------------------------//
void USART1_setup()
{
USART_InitTypeDef USART_InitStructure;
// Enable USART1 clock
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
// USART1 configured
USART_InitStructure.USART_BaudRate = 115200;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART1, &USART_InitStructure); // Configure the USART1
USART_Cmd(USART1, ENABLE); // Enable USART1
}
//------------------------------ Function USART1 send 1 character ------------------------------------//
void usart1_putc(unsigned char c)
{
while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET); // Wait until transmition ready
USART_SendData(USART1,(int)c); // Send character
}
//------------------------------ Function USART1 send string -----------------------------------------//
void usart1_puts(unsigned char *s)
{
while(*s) // Check end of string
{
usart1_putc(*s++); // Send charracter 1 time
}
}
//------------------------------ Function USART1 wait character --------------------------------------//
int usart1_getc()
{
while(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)==RESET); // Wait until receive data
return(USART_ReceiveData(USART1)); // Return character
}
//---------------------------------------- Main Program ----------------------------------------------//
int main()
{
unsigned int percentage;
RCC_setup(); // RCC Configuration
GPIO_setup(); // GPIO Configuration
ADC_setup(); // ADC Configuration
USART1_setup(); // USART1 Configuration
usart1_puts("TEST\r\n");
usart1_puts("ADC\r\n");
while(1)
{
ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_239Cycles5);
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);
percentage = ADC_GetConversionValue(ADC1); // Convert analog to percentage(0-100% reference from 0-4095)
sprintf(str,"%d ",percentage); // Convert percentage value to string
usart1_puts(str); // Send character from buffer
usart1_puts("\r\n"); // New line
delay_ms(100); // Delay a few time
}
}
อันนี้เป็นโค้ตที่ผมแปลงมาจากของคุณครับ