示波器STM32F103_野火平台
参考
STM32定时器+ADC制作简易示波器_lcd屏绘制adc波形-CSDN博客
#include "stm32f10x.h" #include "./lcd/bsp_ili9341_lcd.h" #include "./usart/bsp_usart.h" #include <stdio.h> #include "./adc/bsp_adc.h" #include "./timer/bsp_tim.h" #include "./exti/bsp_exti.h" #include "./led/bsp_led.h" #include "./key/bsp_key.h" static void LCD_Test(void); static void Delay ( __IO uint32_t nCount ); void Printf_Charater(void) ; void display (void); unsigned char dat[255] = {"HELLO WORLD!!!\r\n"}; extern unsigned char Res; extern unsigned char rx[255]; uint16_t temp[1000]={0}; uint16_t xemp[1000]={0}; extern uint16_t ms; extern char mode,Z ; extern char node ; extern char k ; char dispBuff[100]; int main() { static uint8_t testCNT = 0; float temp1,temp2; uint16_t adcx,X,Y,X1,Y1; X =X1= 0; LED_GPIO_Config (); LED1(ON) ; KEY_Init (); USART_Config(); USART_Sent(USART1, dat ); printf("OK1\r\n"); USART_Sent(USART1,dat ); adc_init (); printf("OK2\r\n"); Exti_Init(); LED1_ON; ILI9341_Init (); ILI9341_GramScan ( 5 ); LCD_SetBackColor(WHITE); ILI9341_Clear(0,0,320,240); LCD_SetTextColor(BLUE); LCD_SetFont(&Font8x16); ILI9341_Clear(0,0,320,240); display (); TIM_Init(); while(1) { while( mode ==0) { if(Z==1) { Z = 0; adcx = Get_adcAverage (5); temp[ms] = adcx*(3.3/4096)*20; // while(temp[ms]>33) // { // adcx = Get_adcAverage (3); // temp[ms] =adcx*(3.3/4096)*10; // } while(temp[ms]>66) { adcx = Get_adcAverage (3); temp[ms] =adcx*(3.3/4096)*10; } } if(ms == 320) { TIM_Cmd (TIM3,DISABLE); //ILI9341_Clear(0,0,320,240); display (); for(ms=0;ms<320;ms++)xemp[ms]=temp[ms]; LCD_SetTextColor(BLACK); for(ms=0;ms<320;ms++)ILI9341_DrawLine(ms, 90-xemp[ms], ms+1, 90-xemp[ms+1]); ms = 0; TIM_Cmd (TIM3,ENABLE); } } if(mode == 1) { TIM_Cmd (TIM3,DISABLE); while(mode == 1) { if(node ==1) { display (); LCD_SetTextColor(BLACK); for(ms=0;ms<319;ms++)ILI9341_DrawLine(ms, 180-xemp[ms]-90, ms+1, 180-xemp[ms+1]-90); node = 0; LCD_SetTextColor(RED); X=X+k; if(X > 320)X = 0; ILI9341_DrawLine(X, 0, X, 180); /*ʹÓÃc±ê×¼¿â°Ñ±äÁ¿×ª»¯³É×Ö·û´®*/ sprintf(dispBuff,"%d ",X); ILI9341_DispString_EN(60,188,dispBuff); //LCD_ShowNum(110,400,(u32)X,3,24); } if(node ==2) { display (); LCD_SetTextColor(BLACK); for(ms=0;ms<320;ms++)ILI9341_DrawLine(ms, 180-xemp[ms]-90, ms+1, 180-xemp[ms+1]-90); node = 0; LCD_SetTextColor(RED); X=X-k; if(X > 320)X = 320; ILI9341_DrawLine(X, 0, X, 180); //LCD_ShowNum(110,400,(u32)X,3,24); sprintf(dispBuff,"%d ",X); ILI9341_DispString_EN(60,188,dispBuff); } } } while(mode == 2) { if(node ==1) { display (); LCD_SetTextColor(BLACK); for(ms=0;ms<319;ms++)ILI9341_DrawLine(ms, 180-xemp[ms]-90, ms+1, 180-xemp[ms+1]-90); LCD_SetTextColor(RED); ILI9341_DrawLine(X, 0, X, 180); node = 0; X1=X1+k; if(X1 > 320)X1 = 0; ILI9341_DrawLine(X1, 0, X1, 180); //LCD_ShowNum(110,424,(u32)X1,3,24); sprintf(dispBuff,"%d ",X1); ILI9341_DispString_EN(60,204,dispBuff); } if(node ==2) { display (); LCD_SetTextColor(BLACK); for(ms=0;ms<319;ms++)ILI9341_DrawLine(ms, 180-xemp[ms]-90, ms+1, 180-xemp[ms+1]-90); LCD_SetTextColor(RED); ILI9341_DrawLine(X, 0, X, 180); node = 0; X1=X1-k; if(X1 > 320)X1 = 320; ILI9341_DrawLine(X1, 0, X1, 180); //LCD_ShowNum(110,424,(u32)X1,3,24); sprintf(dispBuff,"%d ",X1); ILI9341_DispString_EN(60,204,dispBuff); } if(X1>X) { sprintf(dispBuff,"%d ",X1-X); ILI9341_DispString_EN(80,220,dispBuff); } //LCD_ShowNum(110,448,(u32)X1-X,3,24); else { sprintf(dispBuff,"%d ",X-X1); ILI9341_DispString_EN(80,220,dispBuff); } //LCD_ShowNum(110,448,(u32)X-X1,3,24); } while(mode == 3) { if(node ==1) { display (); LCD_SetTextColor(BLACK); for(ms=0;ms<319;ms++)ILI9341_DrawLine(ms, 180-xemp[ms]-90, ms+1, 180-xemp[ms+1]-90); node = 0; LCD_SetTextColor(RED); X=X+k; if(X > 180)X = 0; ILI9341_DrawLine(0,X, 320,X); //LCD_ShowNum(310,400,(u32)(340-X)*10,4,24); sprintf(dispBuff,"%d ",X); ILI9341_DispString_EN(200,188,dispBuff); } if(node ==2) { display (); LCD_SetTextColor(BLACK); for(ms=0;ms<319;ms++)ILI9341_DrawLine(ms, 180-xemp[ms]-90, ms+1, 180-xemp[ms+1]-90); node = 0; LCD_SetTextColor(RED); X=X-k; if(X > 180)X = 180; ILI9341_DrawLine(0,X,320,X); sprintf(dispBuff,"%d ",X); ILI9341_DispString_EN(200,188,dispBuff); //LCD_ShowNum(310,400,(u32)(340-X)*10,4,24); } } if(mode == 4) { while(mode == 4) { if(node ==1) { display (); LCD_SetTextColor(BLACK); for(ms=0;ms<319;ms++)ILI9341_DrawLine(ms, 180-xemp[ms]-90, ms+1, 180-xemp[ms+1]-90); LCD_SetTextColor(RED); ILI9341_DrawLine(0, X, 320, X); node = 0; X1=X1+k; if(X1 > 180)X1 = 0; ILI9341_DrawLine(0,X1, 320, X1); sprintf(dispBuff,"%d ",X1); ILI9341_DispString_EN(200,204,dispBuff); //LCD_ShowNum(310,424,(u32)(340-X1)*10,4,24); } if(node ==2) { display (); LCD_SetTextColor(BLACK); for(ms=0;ms<319;ms++)ILI9341_DrawLine(ms, 180-xemp[ms]-90, ms+1, 180-xemp[ms+1]-90); LCD_SetTextColor(RED); sprintf(dispBuff,"%d ",X); ILI9341_DispString_EN(200,188,dispBuff); ILI9341_DrawLine(0, X, 320, X); //LCD_DrawLine(0, X, 800, X); node = 0; X1=X1-k; if(X1 > 180)X1 = 180; ILI9341_DrawLine(0,X1, 320, X1); sprintf(dispBuff,"%d ",X1); ILI9341_DispString_EN(200,204,dispBuff); //LCD_ShowNum(310,424,(u32)(340-X1)*10,4,24); } if(X1>X) { sprintf(dispBuff,"%d ",X1-X); ILI9341_DispString_EN(200,220,dispBuff); } //LCD_ShowNum(310,448,(u32)(X1-X)*10,4,24); else { sprintf(dispBuff,"%d ",X-X1); ILI9341_DispString_EN(200,220,dispBuff); } //LCD_ShowNum(310,448,(u32)(X-X1)*10,4,24); } ms = 0; TIM_Cmd (TIM3,ENABLE); } } } //320*240 void display(void) { uint16_t t; LCD_SetBackColor(WHITE); ILI9341_Clear(0,0,320,180); LCD_SetTextColor(GREEN); for (t = 0 ; t <= 180;t = t+ 10 ) ILI9341_DrawLine(0,t,320,t); for (t = 0 ; t <= 320;t = t+10) ILI9341_DrawLine(t,0,t,180); LCD_SetTextColor(BLUE); ILI9341_DrawLine(0,90,320,90); ILI9341_DrawLine(160,0,160,180); //LCD_ShowNum(84,376,k,2,24); sprintf(dispBuff,"%d ",k); ILI9341_DispString_EN(50,172,dispBuff); ILI9341_DispString_EN(0,172,"move:"); ILI9341_DispString_EN(20,188,"t1:"); ILI9341_DispString_EN(20,204,"t2:"); ILI9341_DispString_EN(0,220,"|t1-t2|:"); ILI9341_DispString_EN(100,188,"ms"); ILI9341_DispString_EN(100,204,"ms"); ILI9341_DispString_EN(120,220,"ms"); ILI9341_DispString_EN(160,188,"V1:"); ILI9341_DispString_EN(160,204,"V2:"); ILI9341_DispString_EN(140,220,"|V1-V2|:"); ILI9341_DispString_EN(300,188,"mv"); ILI9341_DispString_EN(300,204,"mv"); ILI9341_DispString_EN(300,220,"mv"); }
void adc_init(void) { GPIO_InitTypeDef adc1io; ADC_InitTypeDef adc1; RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOA|RCC_APB2Periph_ADC1,ENABLE); adc1io.GPIO_Mode = GPIO_Mode_AIN ; adc1io.GPIO_Pin = GPIO_Pin_1 ; GPIO_Init (GPIOA,&adc1io); ADC_DeInit(ADC1); RCC_ADCCLKConfig(RCC_PCLK2_Div6); adc1.ADC_Mode = ADC_Mode_Independent ; adc1.ADC_ContinuousConvMode = ENABLE ;//Á¬Ðø×ª»»Ä£Ê½ adc1.ADC_ScanConvMode = DISABLE;//ɨÃèģʽ £¬ÔÚÓÚµ¥Í¨µÀ»¹ÊÇ˫ͨµÀ adc1.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None ;//ת»»ÓÉÈí¼þÆô¶¯¶ø²»ÊÇÍⲿ adc1.ADC_DataAlign = ADC_DataAlign_Right ; adc1.ADC_NbrOfChannel = 1; ADC_Init (ADC1,&adc1); ADC_Cmd(ADC1,ENABLE ); ADC_ResetCalibration(ADC1); while(ADC_GetResetCalibrationStatus(ADC1)); //µÈ´ý¸´Î»Ð£×¼½áÊø ADC_StartCalibration(ADC1); while(ADC_GetCalibrationStatus(ADC1)); //µÈ´ýУ AD ×¼½áÊø ADC_RegularChannelConfig(ADC1, 1, 1, ADC_SampleTime_239Cycles5 );//ͨµÀ 1,¹æÔò²ÉÑù˳ÐòֵΪ 1,²ÉÑùʱ¼äΪ 239.5 ÖÜÆÚ ADC_SoftwareStartConvCmd (ADC1,ENABLE);//ʹÄÜÈí¼þת»»¹¦ÄÜ } uint16_t Get_adc(void) { while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//µÈ´ýת»»½áÊø return ADC_GetConversionValue(ADC1); //·µ»Ø×î½üÒ»´Î ADC1 ¹æÔò×éµÄת»»½á¹û } uint16_t Get_adcAverage(uint8_t times)//×î¸ß255£¬×îÉÙ3 { uint32_t t; uint16_t a[255]={0}; int i,g1,g2; for(i=0;i<times;i++) { while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//µÈ´ýת»»½áÊø a[i] = ADC_GetConversionValue(ADC1); } g1= g2 = a[0]; for(i = 0;i<times-1;i++) { if(g1>a[i+1])g1 = a[i+1];//Èà g1Ϊ×îСֵ if(g2<a[i+1])g2 = a[i+1];//Èà g2Ϊ×î´óÖµ } for(i = 0;i<times;i++) { t += a[i]; } return t = (t-g1-g2)/(times-2); }
#include "bsp_tim.h" uint8_t t=0; uint16_t ms; char Z; void TIM_Init(void) { TIM_TimeBaseInitTypeDef Tim3; NVIC_InitTypeDef NVIC_Tim; RCC_APB1PeriphClockCmd (RCC_APB1Periph_TIM3 ,ENABLE); Tim3.TIM_Period = 10; Tim3.TIM_CounterMode = TIM_CounterMode_Up ; Tim3.TIM_Prescaler = 7199; Tim3 .TIM_ClockDivision = TIM_CKD_DIV1 ; TIM_TimeBaseInit (TIM3,&Tim3 ); TIM_ITConfig (TIM3,TIM_IT_Update ,ENABLE );//ÔÊÐí¸üÐÂÖÐ¶Ï NVIC_Tim .NVIC_IRQChannel = TIM3_IRQn ; NVIC_Tim .NVIC_IRQChannelPreemptionPriority = 0; NVIC_Tim .NVIC_IRQChannelSubPriority = 0; NVIC_Tim .NVIC_IRQChannelCmd = ENABLE ; NVIC_Init (&NVIC_Tim); TIM_Cmd (TIM3,ENABLE); } void TIM3_IRQHandler(void) //TIM3ÖÐ¶Ï { if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //¼ì²éTIM3¸üÐÂÖжϷ¢ÉúÓë·ñ { Z=1; TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //Çå³ýTIMx¸üÐÂÖжϱêÖ¾ ms++; } }
#include "bsp_exti.h" #include "bsp_led.h" #include "bsp_key.h" char mode =0; char k = 1; char node =3; int time = 0; void Exti_Init(void) { EXTI_InitTypeDef Exti1; NVIC_InitTypeDef NVIC1; RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //¿ªÆôAFIOʱÖÓ GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource4); Exti1.EXTI_Line = EXTI_Line4 ; Exti1.EXTI_Mode = EXTI_Mode_Interrupt ; Exti1 .EXTI_Trigger = EXTI_Trigger_Falling ; Exti1 .EXTI_LineCmd = ENABLE ; EXTI_Init (&Exti1); GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource3); Exti1.EXTI_Line = EXTI_Line3 ; EXTI_Init (&Exti1); GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource2); Exti1.EXTI_Line = EXTI_Line2 ; EXTI_Init (&Exti1); GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0); Exti1.EXTI_Line=EXTI_Line0; Exti1.EXTI_Trigger = EXTI_Trigger_Rising; EXTI_Init(&Exti1); //¸ù¾ÝEXTI_InitStructÖÐÖ¸¶¨µÄ²ÎÊý³õʼ»¯ÍâÉèEXTI¼Ä´æÆ÷ NVIC1.NVIC_IRQChannel =EXTI4_IRQn; NVIC1.NVIC_IRQChannelPreemptionPriority = 2; NVIC1.NVIC_IRQChannelSubPriority = 2; NVIC1.NVIC_IRQChannelCmd = ENABLE; NVIC_Init (&NVIC1); NVIC1.NVIC_IRQChannel = EXTI0_IRQn; NVIC_Init (&NVIC1); NVIC1.NVIC_IRQChannel =EXTI3_IRQn; NVIC_Init (&NVIC1); NVIC1.NVIC_IRQChannel =EXTI2_IRQn; NVIC_Init (&NVIC1); } void EXTI0_IRQHandler(void) { for(time = 0;time<40000;time++); if(GPIO_ReadInputDataBit (WKUP_GPIO ,WKUP_GPIO_PIN ) == SET) //WK_UP°´¼ü { mode ++; if(mode ==5)mode =0; } EXTI_ClearITPendingBit(EXTI_Line0); //Çå³ýLINE0ÉϵÄÖжϱê־λ } void EXTI2_IRQHandler(void) { for(time = 0;time<40000;time++); if(GPIO_ReadInputDataBit (KEY2_GPIO ,KEY2_GPIO_PIN ) == RESET) { node =1; } EXTI_ClearITPendingBit(EXTI_Line2); //Çå³ý LINE2 ÉϵÄÖжϱê־λ } void EXTI3_IRQHandler(void) { for(time = 0;time<40000;time++); if(GPIO_ReadInputDataBit (KEY1_GPIO ,KEY1_GPIO_PIN ) == RESET) { k++; if(k>10)k=1; } EXTI_ClearITPendingBit(EXTI_Line3); //Çå³ý LINE3 ÉϵÄÖжϱê־λ } void EXTI4_IRQHandler(void) { for(time = 0;time<40000;time++); if(GPIO_ReadInputDataBit (KEY0_GPIO ,KEY0_GPIO_PIN ) == RESET) { //LED1_OFF ; //LED0_OFF ; LED1(0); LED2(0); node = 2; } EXTI_ClearITPendingBit(EXTI_Line4); //Çå³ý LINE4 ÉϵÄÖжϱê־λ }