[应用方案] 新定义MCU开发板测评+免rst一键烧录+串口重定向打印+ADC

[复制链接]
 楼主| xiaoqi976633690 发表于 2022-11-8 16:53 | 显示全部楼层 |阅读模式
<
本帖最后由 xiaoqi976633690 于 2022-11-8 17:49 编辑

我用的是keil,没有用官方的图形界面,可能和个人习惯有关
先看下keil的主目录结构: Snipaste_2022-11-08_16-33-42.jpg



免按RST一键烧录功能:
使用开发板调试的时候经常要烧录验证,不断的按rst键非常影响效率,于是想着看能不能不按rst键自动进入复位然后自动下载。
代码:
首先我们把rst信号接入到自己选的P02脚,然后初始化
  1. /*****************************************************
  2. *函数名称: SC_GPIO_Init
  3. *函数功能: GPIO初始化函数
  4. *入口参数:void
  5. *出口参数:void
  6. *****************************************************/
  7. void SC_GPIO_Init(void)
  8. {
  9.         GPIO_Init(GPIO0, GPIO_PIN_1,GPIO_MODE_OUT_PP);
  10.         GPIO_Init(GPIO0, GPIO_PIN_2,GPIO_MODE_OUT_PP);
  11.         GPIO_WriteHigh(P0_2);
  12.         /*GPIO_Init write here*/               
  13. }

一键复位函数:

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

中断函数:
  1. void USCI1Interrupt()                interrupt 15               
  2. {        
  3.                
  4.                 if(USCI1_GetFlagStatus(USCI1_UART_FLAG_RI))
  5.                         {
  6.                                         if(rx_flag>=6) rx_flag=0;
  7.                                         RX_BUFF[rx_flag]=USCI1_UART_ReceiveData8();
  8.                                         rx_flag++;
  9.                                         USCI1_UART_SendData8( USCI1_UART_ReceiveData8());//发送完成置0
  10.                                         while(USCI1_GetFlagStatus(USCI1_UART_FLAG_TI));
  11.                                         USCI1_ClearFlag(USCI1_UART_FLAG_RI);//软件置1
  12.                         }

  13.     USCI1_ClearFlag(USCI1_UART_FLAG_RI);
  14.     USCI1_ClearFlag(USCI1_UART_FLAG_TI);

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

  10.         while(!ADC_GetFlagStatus())                                  //等待 ADC转换完成;
  11.         {
  12.                         time_err++;
  13.                         if(time_err>=500)
  14.                         {
  15.                                 ADC_ClearFlag();
  16.                                 break;
  17.                         }                                
  18.         }
  19.         ADC_ClearFlag();
  20.         adc_value+=ADC_GetConversionValue();
  21.         }
  22.         adc_value/=10;
  23.         return (adc_value*0.002);//adc_value*2.048/4096*4  可以提前算出已知变量2.048/4096*4=0.002
  24. }
获取任意ADC通道:

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

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

  12.                                   time_err++;
  13.                                    if(time_err>=500)
  14.                                       {
  15.                                            ADC_ClearFlag();
  16.                                           break;
  17.                                       }
  18.                               }
  19.                 ADC_ClearFlag();
  20.                 adc_value+=ADC_GetConversionValue();
  21.         }
  22.                 return adc_value/10;
  23. }
延时和串口重定向:
  1. void delay_10us()
  2. {
  3.     /*<UserCodeStart>*//*<SinOne-Tag><47>*/
  4.     unsigned char a,b;
  5.     for(b=1;b>0;b--)
  6.         for(a=157;a>0;a--);
  7.     /*<UserCodeEnd>*//*<SinOne-Tag><47>*/
  8. }
  9. ////32mhz 延时1ms
  10. void delay_1ms(void)
  11. {
  12.     /*<UserCodeStart>*//*<SinOne-Tag><26>*/
  13.     u32 i=579;
  14.     while(i--);
  15.    
  16.     /*<UserCodeEnd>*//*<SinOne-Tag><26>*/
  17. }
  18. void delay_ms(u32 i)
  19. {
  20.     /*<UserCodeStart>*//*<SinOne-Tag><29>*/
  21.     while(i--)
  22.     {
  23.         delay_1ms();
  24.     }
  25.    
  26.     /*<UserCodeEnd>*//*<SinOne-Tag><29>*/
  27. }
  28. void sendByte(u8 dat)
  29. {
  30.     /*<UserCodeStart>*//*<SinOne-Tag><103>*/
  31.                 delay_10us();//没有延时会发送失败
  32.                 delay_10us();
  33.         //        delay_1ms();
  34.                 USCI1_UART_SendData8(dat);//发送完成置零
  35.           while(USCI1_GetFlagStatus(USCI1_UART_FLAG_TI));
  36.                 USCI1_ClearFlag(USCI1_UART_FLAG_TI);
  37.         //        delay_1ms();
  38.    
  39.     /*<UserCodeEnd>*//*<SinOne-Tag><103>*/
  40. }
  41. void sendString(unsigned char *string)
  42. {
  43.     /*<UserCodeStart>*//*<SinOne-Tag><105>*/
  44.     while(*string!='\0') //指针的数据没到最后一位一直执行循环体
  45.     {   
  46.                                 sendByte(*string); //发送指针指向的数据(字节byte)
  47.                                 string++;            //指针自增,指向下一个数据
  48.      }
  49.    
  50.     /*<UserCodeEnd>*//*<SinOne-Tag><105>*/
  51. }

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

  64.         sendByte(c);
  65.         return c;
  66. }

  67. /*************************************.Generated by EasyCodeCube.************************************/
main函数:
  1. void main(void)
  2. {        

  3.           unsigned char  b=0;
  4.                
  5.     // MCU init
  6.     SC_Init();

  7.     while(1)
  8.     {
  9.         GPIO_WriteLow(P0_1);
  10.         delay_ms(500);
  11.                                 auto_FLASH();
  12.                                 printf("\r");
  13.                                 printf("%bu,%bu \r",b++,sizeof(b));//%d=short, %bd=char, %ld=long   u=unsigned du,bu,lu
  14.                                 printf("AIN0_adc= %d,AIN0_voltage= %.2f \r",adc_get_value(ADC_CHANNEL_0),get_vdd()/4096*adc_get_value(ADC_CHANNEL_0));
  15.                                 printf("VDD= %.2F \r",get_vdd());
  16.                           GPIO_WriteHigh(P0_1);
  17.         delay_ms(500);
  18.                                 
  19.     }

  20. }
串口打印:
  1. 180,1
  2. AIN0_adc= 2639,AIN0_voltage= 3.30
  3. VDD= 5.12

  4. 181,1
  5. AIN0_adc= 2637,AIN0_voltage= 3.30
  6. VDD= 5.12

  7. 182,1
  8. AIN0_adc= 2639,AIN0_voltage= 3.30
  9. VDD= 5.11



工程源文件: led_blink.zip (1.26 MB, 下载次数: 6)


 楼主| 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 | 显示全部楼层
这个下载器使用是什么呢?              
dspmana 发表于 2022-12-4 21:54 | 显示全部楼层
用了RST了吗?              
 楼主| xiaoqi976633690 发表于 2022-12-5 13:39 | 显示全部楼层

不用rst
 楼主| xiaoqi976633690 发表于 2022-12-5 13:40 | 显示全部楼层
claretttt 发表于 2022-12-4 19:57
三极管驱动的重新复位的吗?

不用三极管了
 楼主| xiaoqi976633690 发表于 2022-12-5 13:41 | 显示全部楼层
mnynt121 发表于 2022-12-4 20:06
这个下载器使用是什么呢?

官方的串口下载工具
alvpeg 发表于 2022-12-14 10:50 | 显示全部楼层
使用的是ch340设计的电路吗?
minzisc 发表于 2022-12-14 11:31 | 显示全部楼层
这个代码需要集合使用。              
adolphcocker 发表于 2022-12-14 12:00 | 显示全部楼层
这个不是自带下载器的吗?              
minzisc 发表于 2023-1-7 16:36 | 显示全部楼层
这个需要修改BootLoader吗?

评论

不用  发表于 2023-1-7 16:47
wilhelmina2 发表于 2023-1-7 16:44 | 显示全部楼层
串口printf需要注意的地方比较多了
gygp 发表于 2023-1-7 17:24 | 显示全部楼层
当前就是isp下载程序的吧。              
sdlls 发表于 2023-1-9 13:11 | 显示全部楼层
rst引脚应该怎么设计复位呢?              
backlugin 发表于 2023-1-9 16:14 | 显示全部楼层
意见下载就是复位就行了。              
您需要登录后才可以回帖 登录 | 注册

本版积分规则

35

主题

204

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部

35

主题

204

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部