잡스러운 블로그
어디선가 주어온 STM32 관련 ADC / UART 소스 코드
Firmware/STM32
2010. 5. 11. 11:01
/****************************************************************************** * 굶匡숭茄君痰ADC친욥꽃섞좃쨌斤뵀깻繫법USART친욥箇놔 * 零ADC1돨끽방瘻뻣埼죗관벵CH10뵨CH16(튬코侊똑눈먁포) * 零죄젯崎瘻뻣친駕,깻賈痰DMA눈渴 * AD瘻뻣令굳렴瞳죄AD_Value[2]鑒莉코,[0]괏닸CH0써벎,[1]괏닸CH16써벎 * GetVolt변鑒셕炬[0]돨令뚤壇돨든箕令(렴댕100굡,괏즛2貫鬼鑒) * GetTemp변鑒셕炬[1]돨令뚤壇돨侊똑令,셕炬무駕瞳宮壇변鑒코唐綱츠 * 鱗諒:jjldc(씽씽) *******************************************************************************/ /* Includes ------------------------------------------------------------------*/ #include "stm32f10x_lib.h" #include "stdio.h" /* Private typedef -----------------------------------------------------------*/ /* Private define ------------------------------------------------------------*/ #define ADC1_DR_Address ((u32)0x4001244C) /* Private macro -------------------------------------------------------------*/ /* Private variables ---------------------------------------------------------*/ vu16 AD_Value[2]; vu16 i=0; s16 Temp; u16 Volt; /* Private function prototypes -----------------------------------------------*/ void RCC_Configuration(void); void GPIO_Configuration(void); void NVIC_Configuration(void); void USART1_Configuration(void); void ADC1_Configuration(void); void DMA_Configuration(void); int fputc(int ch, FILE *f); void Delay(void); u16 GetTemp(u16 advalue); u16 GetVolt(u16 advalue); /* Private functions ---------------------------------------------------------*/ /******************************************************************************* * Function Name : main * Description : Main program. * Input : None * Output : None * Return : None *******************************************************************************/ int main(void) { RCC_Configuration(); GPIO_Configuration(); NVIC_Configuration(); USART1_Configuration(); DMA_Configuration(); ADC1_Configuration(); //폘땡뒤寧늴AD瘻뻣 ADC_SoftwareStartConvCmd(ADC1, ENABLE); //凜槨綠쒔토零봤죄DMA,쌈苟윱AD菱땡젯崎瘻뻣,써벎菱땡괏닸瞳AD_Value뇹 while (1) { Delay(); Temp = GetTemp(AD_Value[1]); Volt = GetVolt(AD_Value[0]); USART_SendData(USART1, 0x0c); //헌팁 //鬧雷,USART_SendData변鑒꼇쇱꿴角뤠랙箇供냥 //된덤랙箇供냥 while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); printf("든箕:%d.%d\t侊똑:%d.%d→\r\n", \ Volt/100, Volt%100, Temp/100, Temp%100); } } /******************************************************************************* * Function Name : 路땍屢溝固putchar변鑒int fputc(int ch, FILE *f) * Description : 눔왯랙寧몸俚쌘 * Input : int ch, FILE *f * Output : * Return : int ch *******************************************************************************/ int fputc(int ch, FILE *f) { //USART_SendData(USART1, (u8) ch); USART1->DR = (u8) ch; /* Loop until the end of transmission */ while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET) { } return ch; } /******************************************************************************* * Function Name : Delay * Description : 儺珂변鑒 * Input : None * Output : None * Return : None *******************************************************************************/ void Delay(void) { u32 i; for(i=0;i<0x4f0000;i++); return; } /******************************************************************************* * Function Name : GetTemp * Description : 몽앴ADC써벎셕炬侊똑 * Input : u16 advalue * Output : * Return : u16 temp *******************************************************************************/ u16 GetTemp(u16 advalue) { u32 Vtemp_sensor; s32 Current_Temp; // ADC瘻뻣써監鹿빈,뗍혤ADC_DR셍닸포櫓돨써벎,瘻뻣侊똑令셕炬무駕흔苟: // V25 - VSENSE // T(→) = ------------ + 25 // Avg_Slope // V25: 侊똑눈먁포瞳25→珂 돨渴놔든箕,듕謹令1.43 V。 // VSENSE:侊똑눈먁포돨뎠품渴놔든箕,宅ADC_DR 셍닸포櫓돨써벎ADC_ConvertedValue裂쇌돨瘻뻣밑溝槨: // ADC_ConvertedValue * Vdd // VSENSE = -------------------------- // Vdd_convert_value(0xFFF) // Avg_Slope:侊똑눈먁포渴놔든箕뵨侊똑돨밑젬꽝鑒,듕謹令4.3 mV/→。 Vtemp_sensor = advalue * 330 / 4096; Current_Temp = (s32)(143 - Vtemp_sensor)*10000/43 + 2500; return (s16)Current_Temp; } /******************************************************************************* * Function Name : GetVolt * Description : 몽앴ADC써벎셕炬든箕 * Input : u16 advalue * Output : * Return : u16 temp *******************************************************************************/ u16 GetVolt(u16 advalue) { return (u16)(advalue * 330 / 4096); } /******************************************************************************* * Function Name : RCC_Configuration * Description : 溝固珂爐零 * Input : None * Output : None * Return : None *******************************************************************************/ void RCC_Configuration(void) { ErrorStatus HSEStartUpStatus; //賈콘棍꼬쑨驪 RCC_HSEConfig(RCC_HSE_ON); //된덤棍꼬쑨驪洸땍 HSEStartUpStatus = RCC_WaitForHSEStartUp(); //흔벎棍꼬쑨驪폘땡냥묘,橙쏵契苟寧꼍꾸鱗 if(HSEStartUpStatus==SUCCESS) { //零HCLK(AHB珂爐)=SYSCLK RCC_HCLKConfig(RCC_SYSCLK_Div1); //PCLK1(APB1) = HCLK/2 RCC_PCLK1Config(RCC_HCLK_Div2); //PCLK2(APB2) = HCLK RCC_PCLK2Config(RCC_HCLK_Div1); //零ADC珂爐틉쪽 RCC_ADCCLKConfig(RCC_PCLK2_Div2); //FLASH珂埼왠齡 //股수令:SYSCLK = 0~24MHz Latency=0 // SYSCLK = 24~48MHz Latency=1 // SYSCLK = 48~72MHz Latency=2 FLASH_SetLatency(FLASH_Latency_2); //역폘FLASH渡혤寧묘콘 FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //PLL零 SYSCLK/1 * 9 = 8*1*9 = 72MHz RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); //폘땡PLL RCC_PLLCmd(ENABLE); //된덤PLL洸땍 while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); //溝固珂爐SYSCLK윱菱PLL渴놔 RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //학뻣珂爐빈된덤溝固珂爐洸땍 while(RCC_GetSYSCLKSource()!=0x08); } //苟충角못몹친욥역폘珂爐 //폘땡GPIO RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | \ RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD,\ ENABLE); //폘땡AFIO RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //폘땡USART1 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); //폘땡DMA珂爐 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //폘땡ADC1珂爐 RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); } /******************************************************************************* * Function Name : GPIO_Configuration * Description : GPIO零 * Input : None * Output : None * Return : None *******************************************************************************/ void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; //PC왯4567신零GPIO渴놔,股共 2M GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_Init(GPIOC, &GPIO_InitStructure); //KEY2 KEY3 JOYKEY //貫黨PD왯돨3 4 11-15신,賈콘零槨渴흙 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_11 | GPIO_Pin_12 |\ GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOD, &GPIO_InitStructure); //USART1_TX 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); //USART1_RX GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); //ADC_CH10--> PC0 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_Init(GPIOC, &GPIO_InitStructure); } /******************************************************************************* * Function Name : NVIC_Configuration * Description : NVIC零 * Input : None * Output : None * Return : None *******************************************************************************/ void NVIC_Configuration(void) { NVIC_InitTypeDef NVIC_InitStructure; #ifdef VECT_TAB_RAM // Set the Vector Table base location at 0x20000000 NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); #else /* VECT_TAB_FLASH */ // Set the Vector Table base location at 0x08000000 NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); #endif //零NVIC膽邱섬롸莉槨Group2:0-3퓽欖駕膽邱섬,0-3돨捲壇駕膽邱섬 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //눔왯櫓뙤댔역 NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQChannel; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } /******************************************************************************* * Function Name : USART1_Configuration * Description : NUSART1零 * Input : None * Output : None * Return : None *******************************************************************************/ void USART1_Configuration(void) { USART_InitTypeDef USART_InitStructure; USART_InitStructure.USART_BaudRate = 19200; 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_Tx | USART_Mode_Rx; USART_Init(USART1, &USART_InitStructure); USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); USART_Cmd(USART1, ENABLE); } /******************************************************************************* * Function Name : ADC1_Configuration * Description : ADC1零(관윅ADC친욥토零뵨菱叫硫) * Input : None * Output : None * Return : None *******************************************************************************/ void ADC1_Configuration(void) { ADC_InitTypeDef ADC_InitStructure; ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode = ENABLE; ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //젯崎瘻뻣역폘 ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel = 2; //零瘻뻣埼죗낀똑槨2 ADC_Init(ADC1, &ADC_InitStructure); //ADC코零侊똑눈먁포賈콘(狼賈痰튬코侊똑눈먁포,학셤狼역폘劍) ADC_TempSensorVrefintCmd(ENABLE); //끽방瘻뻣埼죗1:繫돛10 ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_13Cycles5); //끽방瘻뻣埼죗2:繫돛16(코꼬侊똑눈먁포),꽃湳珂쇌>2.2us,(239cycles) ADC_RegularChannelConfig(ADC1, ADC_Channel_16, 2, ADC_SampleTime_239Cycles5); // Enable ADC1 ADC_Cmd(ADC1, ENABLE); // 역폘ADC돨DMA連넣(狼茄君DMA묘콘,뻘矜뗌접토零DMA繫돛된꽝鑒) ADC_DMACmd(ADC1, ENABLE); // 苟충角ADC菱땡叫硫,역샙빈矜獵契寧늴,괏聯쑹똑 // Enable ADC1 reset calibaration register ADC_ResetCalibration(ADC1); // Check the end of ADC1 reset calibration register while(ADC_GetResetCalibrationStatus(ADC1)); // Start ADC1 calibaration ADC_StartCalibration(ADC1); // Check the end of ADC1 calibration while(ADC_GetCalibrationStatus(ADC1)); // ADC菱땡叫硫써監--------------- } /******************************************************************************* * Function Name : DMA_Configuration * Description : DMA零:닒ADC친욥菱땡뗍瘻뻣써벎逞코닸 * Input : None * Output : None * Return : None *******************************************************************************/ void DMA_Configuration(void) { DMA_InitTypeDef DMA_InitStructure; DMA_DeInit(DMA1_Channel1); DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address; DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&AD_Value; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //BufferSize=2,凜槨ADC瘻뻣埼죗唐2몸繫돛 //흔늪零,賈埼죗1써벎렴瞳AD_Value[0],埼죗2써벎렴瞳AD_Value[1] DMA_InitStructure.DMA_BufferSize = 2; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; //琦뻔친駕역폘,Buffer畇찮빈,菱땡쀼돕놓迦뒈囹역迦눈渴 DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA1_Channel1, &DMA_InitStructure); //토零供냥빈,폘땡DMA繫돛 DMA_Cmd(DMA1_Channel1, ENABLE); }
공유하기
게시글 관리
구독하기
잡스러운 블로그
저작자표시
비영리
변경금지
'
Firmware
>
STM32
' 카테고리의 다른 글
어떤 개발환경으로 시작해야 하나?
(0)
2010.07.06
공유하기
'Firmware/STM32' 의 관련글
어떤 개발환경으로 시작해야 하나?
2010.07.06
더보기
글쓰기
관리자
카테고리
맨위로
티스토리툴바
잡스러운 블로그
구독하기