示波器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 ÉϵÄÖжϱê־λ 
}

 

posted @ 2025-07-21 15:38  多多和羊羊  阅读(9)  评论(0)    收藏  举报