新定义MCU开发板测评+免rst一键烧录+串口重定向打印+ADC

免按RST一键烧录功能:

使用开发板调试的时候经常要烧录验证,不断的按rst键非常影响效率,于是想着看能不能不按rst键自动进入复位然后自动下载。
代码:
首先我们把rst信号接入到自己选的P02脚,然后初始化

/*****************************************************
*函数名称: SC_GPIO_Init
*函数功能: GPIO初始化函数
*入口参数:void
*出口参数:void
*****************************************************/
void SC_GPIO_Init(void)
{
        GPIO_Init(GPIO0, GPIO_PIN_1,GPIO_MODE_OUT_PP);
        GPIO_Init(GPIO0, GPIO_PIN_2,GPIO_MODE_OUT_PP);
        GPIO_WriteHigh(P0_2);
        /*GPIO_Init write here*/                
}

一键复位函数:

void auto_FLASH(void)
{
         if((RX_BUFF[1]==0x01)||(RX_BUFF[2]==0x00)||(RX_BUFF[3]==0x00))//点击“更新程序”串口RX_BUFF会更新,PC会向单片机串口不断发送68 01               00 00 69 16 数据(请求进入BootLoader)
         {
                 GPIO_WriteLow(P0_2);//接单片机复位脚
         }
}

中断函数:
void USCI1Interrupt()                interrupt 15                
{        
                
                if(USCI1_GetFlagStatus(USCI1_UART_FLAG_RI))
                        {
                                        if(rx_flag>=6) rx_flag=0;
                                        RX_BUFF[rx_flag]=USCI1_UART_ReceiveData8();
                                        rx_flag++;
                                        USCI1_UART_SendData8( USCI1_UART_ReceiveData8());//发送完成置0
                                        while(USCI1_GetFlagStatus(USCI1_UART_FLAG_TI));
                                        USCI1_ClearFlag(USCI1_UART_FLAG_RI);//软件置1
                        }

    USCI1_ClearFlag(USCI1_UART_FLAG_RI);
    USCI1_ClearFlag(USCI1_UART_FLAG_TI);

}
ADC获取输入电压:
float get_vdd(void)//获取输入电压值
{
        u16 i=0,time_err=0;
        u32 adc_value=0;
        ADC_VrefConfig(ADC_VREF_2_048V);//设置参考电压
        for(i=0;i<10;i++)//采样次数
        {
        ADC_ChannelConfig(ADC_CHANNEL_VDD_D4,ENABLE);
        ADC_StartConversion();

        while(!ADC_GetFlagStatus())                                  //等待 ADC转换完成;
        {
                        time_err++;
                        if(time_err>=500)
                        {
                                ADC_ClearFlag();
                                break;
                        }                                
        }
        ADC_ClearFlag();
        adc_value+=ADC_GetConversionValue();
        }
        adc_value/=10;
        return (adc_value*0.002);//adc_value*2.048/4096*4  可以提前算出已知变量2.048/4096*4=0.002
}

获取任意ADC通道:

u16 adc_get_value(ADC_Channel_TypeDef ADC_Channel)//获取ADC通道值ADC_CHANNEL_0~ADC_CHANNEL_15
{
                u16 i=0,time_err=0;
                u32 adc_value=0;
                ADC_VrefConfig(ADC_VREF_VDD);//设置参考电压
                for(i=0;i<10;i++)//采样10次
                     {

                          ADC_ChannelConfig(ADC_Channel,ENABLE);
                           ADC_StartConversion();
                           while(!ADC_GetFlagStatus())                        //等待 ADC转换完成;
                             {

                                  time_err++;
                                   if(time_err>=500) 
                                      {
                                           ADC_ClearFlag();
                                          break;
                                      }
                              }
                ADC_ClearFlag();
                adc_value+=ADC_GetConversionValue();
        }
                return adc_value/10;
}
延时和串口重定向:
 void delay_10us()
{
    /*<UserCodeStart>*//*<SinOne-Tag><47>*/
    unsigned char a,b;
    for(b=1;b>0;b--)
        for(a=157;a>0;a--);
    /*<UserCodeEnd>*//*<SinOne-Tag><47>*/
}
32mhz 延时1ms
 void delay_1ms(void)
{
    /*<UserCodeStart>*//*<SinOne-Tag><26>*/
    u32 i=579;
    while(i--);
    
    /*<UserCodeEnd>*//*<SinOne-Tag><26>*/
}
 void delay_ms(u32 i)
{
    /*<UserCodeStart>*//*<SinOne-Tag><29>*/
    while(i--)
    {
        delay_1ms();
    }
    
    /*<UserCodeEnd>*//*<SinOne-Tag><29>*/
}
 void sendByte(u8 dat)
{
    /*<UserCodeStart>*//*<SinOne-Tag><103>*/
                delay_10us();//没有延时会发送失败
                delay_10us();
        //        delay_1ms();
                USCI1_UART_SendData8(dat);//发送完成置零
          while(USCI1_GetFlagStatus(USCI1_UART_FLAG_TI));
                USCI1_ClearFlag(USCI1_UART_FLAG_TI);
        //        delay_1ms();
    
    /*<UserCodeEnd>*//*<SinOne-Tag><103>*/
}
 void sendString(unsigned char *string)
{
    /*<UserCodeStart>*//*<SinOne-Tag><105>*/
    while(*string!='\0') //指针的数据没到最后一位一直执行循环体
    {   
                                sendByte(*string); //发送指针指向的数据(字节byte)
                                string++;            //指针自增,指向下一个数据 
     }
    
    /*<UserCodeEnd>*//*<SinOne-Tag><105>*/
}

/*
KEIL里扩展出了b,h,l来对输入字节宽的设置:
(1)b八位
(2)h十六位(默认)
(3)l三十二位
注意包含 #include <stdio.h>
在Keil C51中用printf输出一个单字节变量时要使用%bd,如
unsigned char counter;
printf(“Current count: %bd\n”, counter);//输出8位”十进制有符号整数”
printf(“Current count: %bx\n”, counter);//输出8位”无符号以十六进制表示的整数”
*/
char putchar(char c){

        sendByte(c);
        return c; 
}

/*************************************.Generated by EasyCodeCube.************************************/

main函数:
void main(void)
{        

          unsigned char  b=0;
                
    // MCU init
    SC_Init();

    while(1)
    {
        GPIO_WriteLow(P0_1);
        delay_ms(500);
                                auto_FLASH();
                                printf("\r");
                                printf("%bu,%bu \r",b++,sizeof(b));//%d=short, %bd=char, %ld=long   u=unsigned du,bu,lu
                                printf("AIN0_adc= %d,AIN0_voltage= %.2f \r",adc_get_value(ADC_CHANNEL_0),get_vdd()/4096*adc_get_value(ADC_CHANNEL_0));
                                printf("VDD= %.2F \r",get_vdd());
                          GPIO_WriteHigh(P0_1);
        delay_ms(500);
                                
    }

}

串口打印:

180,1 
AIN0_adc= 2639,AIN0_voltage= 3.30 
VDD= 5.12 

181,1 
AIN0_adc= 2637,AIN0_voltage= 3.30 
VDD= 5.12 

182,1 
AIN0_adc= 2639,AIN0_voltage= 3.30 
VDD= 5.11 




演示视频

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiaoqi976633690

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值