打印
[应用方案]

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

[复制链接]
836|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 xiaoqi976633690 于 2022-11-8 17:49 编辑

我用的是keil,没有用官方的图形界面,可能和个人习惯有关
先看下keil的主目录结构:



免按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



工程源文件: led_blink.zip (1.26 MB)


使用特权

评论回复
沙发
xiaoqi976633690|  楼主 | 2022-11-8 16:56 | 只看该作者
一键下载视频已上传哔哩哔哩https://www.bilibili.com/video/BV1qe4y1x71v/?is_story_h5=false&share_from=ugc&share_medium=android&share_plat=android&share_source=WEIXIN&share_tag=s_i&timestamp=1667897699&unique_k=kWz0pn9&vd_source=9166b23ad1512b09b83c27c7f405de44

使用特权

评论回复
板凳
claretttt| | 2022-12-4 19:57 | 只看该作者
三极管驱动的重新复位的吗?              

使用特权

评论回复
地板
mnynt121| | 2022-12-4 20:06 | 只看该作者
这个下载器使用是什么呢?              

使用特权

评论回复
5
dspmana| | 2022-12-4 21:54 | 只看该作者
用了RST了吗?              

使用特权

评论回复
6
xiaoqi976633690|  楼主 | 2022-12-5 13:39 | 只看该作者

不用rst

使用特权

评论回复
7
xiaoqi976633690|  楼主 | 2022-12-5 13:40 | 只看该作者
claretttt 发表于 2022-12-4 19:57
三极管驱动的重新复位的吗?

不用三极管了

使用特权

评论回复
8
xiaoqi976633690|  楼主 | 2022-12-5 13:41 | 只看该作者
mnynt121 发表于 2022-12-4 20:06
这个下载器使用是什么呢?

官方的串口下载工具

使用特权

评论回复
9
alvpeg| | 2022-12-14 10:50 | 只看该作者
使用的是ch340设计的电路吗?

使用特权

评论回复
10
minzisc| | 2022-12-14 11:31 | 只看该作者
这个代码需要集合使用。              

使用特权

评论回复
11
adolphcocker| | 2022-12-14 12:00 | 只看该作者
这个不是自带下载器的吗?              

使用特权

评论回复
12
minzisc| | 2023-1-7 16:36 | 只看该作者
这个需要修改BootLoader吗?

使用特权

评论回复
评论
xiaoqi976633690 2023-1-7 16:47 回复TA
不用 
13
wilhelmina2| | 2023-1-7 16:44 | 只看该作者
串口printf需要注意的地方比较多了

使用特权

评论回复
14
gygp| | 2023-1-7 17:24 | 只看该作者
当前就是isp下载程序的吧。              

使用特权

评论回复
15
sdlls| | 2023-1-9 13:11 | 只看该作者
rst引脚应该怎么设计复位呢?              

使用特权

评论回复
16
backlugin| | 2023-1-9 16:14 | 只看该作者
意见下载就是复位就行了。              

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

27

主题

161

帖子

2

粉丝