欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 3293|回復(fù): 6
收起左側(cè)

51單片機(jī)的基礎(chǔ)學(xué)習(xí)STM32比較吃力,原子的USMART看不懂啊

[復(fù)制鏈接]
ID:140644 發(fā)表于 2020-1-10 16:03 | 顯示全部樓層 |閱讀模式
最近學(xué)習(xí)SD卡讀寫知識(shí),又牽涉到USART函數(shù),對(duì)于結(jié)構(gòu)體定義和函數(shù)調(diào)用知識(shí)匱乏。
研究了三天還沒有眉目。原子的例程是由深入淺,看起來比較吃力,原來學(xué)習(xí)51系列單片機(jī)
都是由淺入深,先點(diǎn)亮一個(gè)LED,再學(xué)習(xí)輸入的定義和操作。看來還得慢慢摸索啊。

  1. #include "usmart.h"
  2. #include "usart.h"
  3. #include "sys.h"
  4. //////////////////////////////////////////////////////////////////////////////////         
  5. //本程序只供學(xué)習(xí)使用,未經(jīng)作者許可,不得用于其它任何用途
  6. //ALIENTEK STM32開發(fā)板           
  7. //正點(diǎn)原子@ALIENTEK
  8. //All rights reserved
  9. //********************************************************************************
  10. //升級(jí)說明
  11. //V1.4
  12. //增加了對(duì)參數(shù)為string類型的函數(shù)的支持.適用范圍大大提高.
  13. //優(yōu)化了內(nèi)存占用,靜態(tài)內(nèi)存占用為79個(gè)字節(jié)@10個(gè)參數(shù).動(dòng)態(tài)適應(yīng)數(shù)字及字符串長度
  14. //V2.0
  15. //1,修改了list指令,打印函數(shù)的完整表達(dá)式.
  16. //2,增加了id指令,打印每個(gè)函數(shù)的入口地址.
  17. //3,修改了參數(shù)匹配,支持函數(shù)參數(shù)的調(diào)用(輸入入口地址).
  18. //4,增加了函數(shù)名長度宏定義.        
  19. //V2.1 20110707                 
  20. //1,增加dec,hex兩個(gè)指令,用于設(shè)置參數(shù)顯示進(jìn)制,及執(zhí)行進(jìn)制轉(zhuǎn)換.
  21. //注:當(dāng)dec,hex不帶參數(shù)的時(shí)候,即設(shè)定顯示參數(shù)進(jìn)制.當(dāng)后跟參數(shù)的時(shí)候,即執(zhí)行進(jìn)制轉(zhuǎn)換.
  22. //如:"dec 0XFF" 則會(huì)將0XFF轉(zhuǎn)為255,由串口返回.
  23. //如:"hex 100"         則會(huì)將100轉(zhuǎn)為0X64,由串口返回
  24. //2,新增usmart_get_cmdname函數(shù),用于獲取指令名字.
  25. //V2.2 20110726        
  26. //1,修正了void類型參數(shù)的參數(shù)統(tǒng)計(jì)錯(cuò)誤.
  27. //2,修改數(shù)據(jù)顯示格式默認(rèn)為16進(jìn)制.
  28. //V2.3 20110815
  29. //1,去掉了函數(shù)名后必須跟"("的限制.
  30. //2,修正了字符串參數(shù)中不能有"("的bug.
  31. //3,修改了函數(shù)默認(rèn)顯示參數(shù)格式的修改方式.
  32. //V2.4 20110905
  33. //1,修改了usmart_get_cmdname函數(shù),增加最大參數(shù)長度限制.避免了輸入錯(cuò)誤參數(shù)時(shí)的死機(jī)現(xiàn)象.
  34. //2,增加USMART_ENTIM_SCAN宏定義,用于配置是否使用TIM定時(shí)執(zhí)行scan函數(shù).
  35. //V2.5 20110930
  36. //1,修改usmart_init函數(shù)為void usmart_init(u8 sysclk),可以根據(jù)系統(tǒng)頻率自動(dòng)設(shè)定掃描時(shí)間.(固定100ms)
  37. //2,去掉了usmart_init函數(shù)中的uart_init函數(shù),串口初始化必須在外部初始化,方便用戶自行管理.
  38. //V2.6 20111009
  39. //1,增加了read_addr和write_addr兩個(gè)函數(shù).可以利用這兩個(gè)函數(shù)讀寫內(nèi)部任意地址(必須是有效地址).更加方便調(diào)試.
  40. //2,read_addr和write_addr兩個(gè)函數(shù)可以通過設(shè)置USMART_USE_WRFUNS為來使能和關(guān)閉.
  41. //3,修改了usmart_strcmp,使其規(guī)范化.                          
  42. //V2.7 20111024
  43. //1,修正了返回值16進(jìn)制顯示時(shí)不換行的bug.
  44. //2,增加了函數(shù)是否有返回值的判斷,如果沒有返回值,則不會(huì)顯示.有返回值時(shí)才顯示其返回值.
  45. //V2.8 20111116
  46. //1,修正了list等不帶參數(shù)的指令發(fā)送后可能導(dǎo)致死機(jī)的bug.
  47. //V2.9 20120917
  48. //1,修改了形如:void*xxx(void)類型函數(shù)不能識(shí)別的bug。
  49. //V3.0 20130425
  50. //1,新增了字符串參數(shù)對(duì)轉(zhuǎn)義符的支持。
  51. //V3.1 20131120
  52. //1,增加runtime系統(tǒng)指令,可以用于統(tǒng)計(jì)函數(shù)執(zhí)行時(shí)間.
  53. //用法:
  54. //發(fā)送:runtime 1 ,則開啟函數(shù)執(zhí)行時(shí)間統(tǒng)計(jì)功能
  55. //發(fā)送:runtime 0 ,則關(guān)閉函數(shù)執(zhí)行時(shí)間統(tǒng)計(jì)功能
  56. ///runtime統(tǒng)計(jì)功能,必須設(shè)置:USMART_ENTIMX_SCAN 為1,才可以使用!!
  57. /////////////////////////////////////////////////////////////////////////////////////
  58. //USMART資源占用情況@MDK [url=mailto:3.80A@2.0]3.80A@2.0[/url]版本:
  59. //FLASH:4K~K字節(jié)(通過USMART_USE_HELP和USMART_USE_WRFUNS設(shè)置)
  60. //SRAM:72字節(jié)(最少的情況下)
  61. //SRAM計(jì)算公式:   SRAM=PARM_LEN+72-4  其中PARM_LEN必須大于等于4.
  62. //應(yīng)該保證堆棧不小于100個(gè)字節(jié).
  63. ////////////////////////////////////////////用戶配置參數(shù)////////////////////////////////////////////////////         
  64. //系統(tǒng)命令
  65.        u8 *sys_cmd_tab[]=
  66.       {
  67.         "?",
  68.         "help",
  69.         "list",
  70.         "id",
  71.         "hex",
  72.         "dec",
  73.         "runtime",           
  74.        };            
  75. //處理系統(tǒng)指令
  76. //0,成功處理;其他,錯(cuò)誤代碼;
  77. u8 usmart_sys_cmd_exe(u8 *str)
  78. {
  79.         u8 i;
  80.         u8 sfname[MAX_FNAME_LEN];                                                         //存放本地函數(shù)名
  81.         u8 pnum;
  82.         u8 rval;
  83.         u32 res;  
  84.         res=usmart_get_cmdname(str,sfname,&i,MAX_FNAME_LEN);                              //得到指令及指令長度
  85.         if(res)return USMART_FUNCERR;                                                     //錯(cuò)誤的指令
  86.         str+=i;                                             
  87.         for(i=0;i<sizeof(sys_cmd_tab)/4;i++)                                              //支持的系統(tǒng)指令
  88.         {
  89.         if(usmart_strcmp(sfname,sys_cmd_tab[i])==0)break;
  90.         }
  91.         switch(i)
  92.         {                                          
  93.         case 0:
  94.         case 1:                                                                         //幫助指令
  95.         printf("\r\n");
  96.        #if USMART_USE_HELP
  97.        printf("------------------------USMART V3.1------------------------ \r\n");
  98.        printf("    USMART是由ALIENTEK開發(fā)的一個(gè)靈巧的串口調(diào)試互交組件,通過 \r\n");
  99.        printf("它,你可以通過串口助手調(diào)用程序里面的任何函數(shù),并執(zhí)行.因此,你可\r\n");
  100.        printf("以隨意更改函數(shù)的輸入?yún)?shù)(支持?jǐn)?shù)字(10/16進(jìn)制)、字符串、函數(shù)入\r\n");         
  101.        printf("口地址等作為參數(shù)),單個(gè)函數(shù)最多支持10個(gè)輸入?yún)?shù),并支持函數(shù)返 \r\n");
  102.        printf("回值顯示.新增參數(shù)顯示進(jìn)制設(shè)置功能,新增進(jìn)制轉(zhuǎn)換功能.\r\n");
  103.        printf("技術(shù)支持:[url=http://www.openedv.com]www.openedv.com[/url]\r\n");
  104.        printf("USMART有7個(gè)系統(tǒng)命令:\r\n");
  105.        printf("?:      獲取幫助信息\r\n");
  106.        printf("help:   獲取幫助信息\r\n");
  107.        printf("list:   可用的函數(shù)列表\r\n\n");
  108.        printf("id:     可用函數(shù)的ID列表\r\n\n");
  109.        printf("hex:    參數(shù)16進(jìn)制顯示,后跟空格+數(shù)字即執(zhí)行進(jìn)制轉(zhuǎn)換\r\n\n");
  110.        printf("dec:    參數(shù)10進(jìn)制顯示,后跟空格+數(shù)字即執(zhí)行進(jìn)制轉(zhuǎn)換\r\n\n");
  111.        printf("runtime:1,開啟函數(shù)運(yùn)行計(jì)時(shí);0,關(guān)閉函數(shù)運(yùn)行計(jì)時(shí);\r\n\n");
  112.        printf("請(qǐng)按照程序編寫格式輸入函數(shù)名及參數(shù)并以回車鍵結(jié)束.\r\n");   
  113.        printf("--------------------------ALIENTEK------------------------- \r\n");
  114.        #else
  115.        printf("指令失效\r\n");
  116.        #endif
  117.        break;
  118.        case 2:                                                                         //查詢指令
  119.        printf("\r\n");
  120.        printf("-------------------------函數(shù)清單--------------------------- \r\n");
  121.       for(i=0;i<usmart_dev.fnum;i++)printf("%s\r\n",usmart_dev.funs[i].name);
  122.       printf("\r\n");
  123.       break;         
  124.      case 3:                                                                         //查詢ID
  125.      printf("\r\n");
  126.      printf("-------------------------函數(shù) ID --------------------------- \r\n");
  127.      for(i=0;i<usmart_dev.fnum;i++)
  128.     {
  129.     usmart_get_fname((u8*)usmart_dev.funs[i].name,sfname,&pnum,&rval);        //得到本地函數(shù)名
  130.     printf("%s id       is:\r\n0X%08X\r\n",sfname,usmart_dev.funs[i].func);  //顯示ID
  131.     }
  132.     printf("\r\n");
  133.     break;
  134.     case 4:                                                                         //hex指令
  135.    printf("\r\n");
  136.    usmart_get_aparm(str,sfname,&i);
  137.    if(i==0)                                                                      //參數(shù)正常
  138.    {
  139.     i=usmart_str2num(sfname,&res);                                                           //記錄該參數(shù)        
  140.     if(i==0)                                                                                                              //進(jìn)制轉(zhuǎn)換功能
  141.     {
  142.     printf("HEX:0X%X\r\n",res);                                                             //轉(zhuǎn)為16進(jìn)制
  143.     }
  144.    else if(i!=4)
  145.    return USMART_PARMERR;                                        //參數(shù)錯(cuò)誤.
  146.    else                                                                                                                          //參數(shù)顯示設(shè)定功能
  147.    {
  148.    printf("16進(jìn)制參數(shù)顯示!\r\n");
  149.    usmart_dev.sptype=SP_TYPE_HEX;  
  150.    }
  151.   }
  152.    else return USMART_PARMERR;                                                                    //參數(shù)錯(cuò)誤.
  153.    printf("\r\n");
  154.    break;
  155.   case 5:                                                                         //dec指令
  156.                         printf("\r\n");
  157.                         usmart_get_aparm(str,sfname,&i);
  158.                         if(i==0)                                                                      //參數(shù)正常
  159.                         {
  160.                                 i=usmart_str2num(sfname,&res);                                                           //記錄該參數(shù)        
  161.                                 if(i==0)                                                                                                               //進(jìn)制轉(zhuǎn)換功能
  162.                                 {
  163.                                         printf("DEC:%lu\r\n",res);                                                             //轉(zhuǎn)為10進(jìn)制
  164.                                 }else if(i!=4)return USMART_PARMERR;                                        //參數(shù)錯(cuò)誤.
  165.                                 else                                                                                                                          //參數(shù)顯示設(shè)定功能
  166.                                 {
  167.                                         printf("10進(jìn)制參數(shù)顯示!\r\n");
  168.                                         usmart_dev.sptype=SP_TYPE_DEC;  
  169.                                 }

  170.                         }else return USMART_PARMERR;                                                                    //參數(shù)錯(cuò)誤.
  171.                         printf("\r\n");
  172.                         break;         
  173.                      case 6:                                                                         //runtime指令,設(shè)置是否顯示函數(shù)執(zhí)行時(shí)間
  174.                         printf("\r\n");
  175.                         usmart_get_aparm(str,sfname,&i);
  176.                         if(i==0)                                                                      //參數(shù)正常
  177.                         {
  178.                       i=usmart_str2num(sfname,&res);                                                                 //記錄該參數(shù)        
  179.                      if(i==0)                                                                                                                     //讀取指定地址數(shù)據(jù)功能
  180.                       {
  181.                 if(USMART_ENTIMX_SCAN==0)printf("\r\nError! \r\nTo EN RunTime function,Please set USMART_ENTIMX_SCAN = 1 first!\r\n");//報(bào)錯(cuò)
  182.                                         else
  183.                                         {
  184.                                                 usmart_dev.runtimeflag=res;
  185.                                                 if(usmart_dev.runtimeflag)printf("Run Time Calculation ON\r\n");
  186.                                                 else printf("Run Time Calculation OFF\r\n");
  187.                                         }
  188.                                 }else return USMART_PARMERR;                                                                   //未帶參數(shù),或者參數(shù)錯(cuò)誤         
  189.                          }else return USMART_PARMERR;                                                                          //參數(shù)錯(cuò)誤.
  190.                         printf("\r\n");
  191.                         break;            
  192.                 default:                                                                        //非法指令
  193.                         return USMART_FUNCERR;
  194.         }
  195.         return 0;
  196. }
  197. ////////////////////////////////////////////////////////////////////////////////////////
  198. //移植注意:本例是以stm32為例,如果要移植到其他mcu,請(qǐng)做相應(yīng)修改.
  199. //usmart_reset_runtime,清除函數(shù)運(yùn)行時(shí)間,連同定時(shí)器的計(jì)數(shù)寄存器以及標(biāo)志位一起清零.并設(shè)置重裝載值為最大,以最大限度的延長計(jì)時(shí)時(shí)間.
  200. //usmart_get_runtime,獲取函數(shù)運(yùn)行時(shí)間,通過讀取CNT值獲取,由于usmart是通過中斷調(diào)用的函數(shù),所以定時(shí)器中斷不再有效,此時(shí)最大限度
  201. //只能統(tǒng)計(jì)2次CNT的值,也就是清零后+溢出一次,當(dāng)溢出超過2次,沒法處理,所以最大延時(shí),控制在:2*計(jì)數(shù)器CNT*0.1ms.對(duì)STM32來說,是:13.1s左右
  202. //其他的:TIM4_IRQHandler和Timer4_Init,需要根據(jù)MCU特點(diǎn)自行修改.確保計(jì)數(shù)器計(jì)數(shù)頻率為:10Khz即可.另外,定時(shí)器不要開啟自動(dòng)重裝載功能!!

  203. #if USMART_ENTIMX_SCAN==1
  204. /***********************************************************/
  205. /***********************復(fù)位runtime*************************/
  206.               void usmart_reset_runtime(void)                                       //需要根據(jù)所移植到的MCU的定時(shí)器參數(shù)進(jìn)行修改
  207.               {
  208.                     TIM4->SR&=~(1<<0);                                                          //清除中斷標(biāo)志位
  209.                     TIM4->ARR=0XFFFF;                                                            //將重裝載值設(shè)置到最大
  210.                     TIM4->CNT=0;                                                                      //清空定時(shí)器的CNT
  211.                     usmart_dev.runtime=0;        
  212.               }
  213. /******** 獲得runtime時(shí)間 **********************************/
  214. /* 返回值:執(zhí)行時(shí)間,單位:0.1ms,最大延時(shí)時(shí)間為定時(shí)器CNT值的2倍*0.1ms */
  215. /* 需要根據(jù)所移植到的MCU的定時(shí)器參數(shù)進(jìn)行修改 ***********************/
  216.       u32 usmart_get_runtime(void)
  217.      {
  218.         if(TIM4->SR&0X0001)                                                               //在運(yùn)行期間,產(chǎn)生了定時(shí)器溢出
  219.         {
  220.        usmart_dev.runtime+=0XFFFF;
  221.         }
  222.         usmart_dev.runtime+=TIM4->CNT;
  223.         return usmart_dev.runtime;                                                                    //返回計(jì)數(shù)值
  224.      }
  225. /**** 下面這兩個(gè)函數(shù),非USMART函數(shù),放到這里,僅僅方便移植. ******/
  226. /**** 定時(shí)器4中斷服務(wù)程序 ***********************************/
  227.       void TIM4_IRQHandler(void)
  228.      {                                                                  
  229.         if(TIM4->SR&0X0001)                                                               //溢出中斷
  230.         {
  231.                 usmart_dev.scan();                                                                    //執(zhí)行usmart掃描        
  232.                 TIM4->CNT=0;                                                                                //清空定時(shí)器的CNT
  233.                 TIM4->ARR=1000;                                                                              //恢復(fù)原來的設(shè)置
  234.         }                                   
  235.         TIM4->SR&=~(1<<0);                                                                //清除中斷標(biāo)志位            
  236.    }
  237. /***************** 使能定時(shí)器4,使能中斷. ********************/
  238.      void Timer4_Init(u16 arr,u16 psc)
  239.     {
  240.         RCC->APB1ENR|=1<<2;                                                                      //TIM4時(shí)鐘使能   
  241.          TIM4->ARR=arr;                                                                          //設(shè)定計(jì)數(shù)器自動(dòng)重裝值  
  242.         TIM4->PSC=psc;                                                                          //預(yù)分頻器7200,得到10Khz的計(jì)數(shù)時(shí)鐘        
  243.         TIM4->DIER|=1<<0;                                                                 //允許更新中斷                                                                                      
  244.         TIM4->CR1|=0x01;                                                                  //使能定時(shí)器2
  245.         MY_NVIC_Init(3,3,TIM4_IRQn,2);                                                    //搶占3,子優(yōu)先級(jí)3,組2(組2中優(yōu)先級(jí)最低
  246.       }
  247. #endif
  248. /************** 初始化串口控制器 ****************************/
  249. /************** sysclk:系統(tǒng)時(shí)鐘(Mhz)***********************/
  250. void usmart_init(u8 sysclk)
  251. {
  252. #if USMART_ENTIMX_SCAN==1
  253.         Timer4_Init(1000,(u32)sysclk*100-1);                                              //分頻,時(shí)鐘為10K ,100ms中斷一次,注意,計(jì)數(shù)頻率必須為10Khz,以和runtime單位(0.1ms)同步.
  254. #endif
  255.         usmart_dev.sptype=1;                                                                    //十六進(jìn)制顯示參數(shù)
  256. }               
  257. /********* 從str中獲取函數(shù)名,id,及參數(shù)信息 *******************/
  258. /********* *str:字符串指針. *********************************/
  259. /********* 返回值:0,識(shí)別成功;其他,錯(cuò)誤代碼. ******************/
  260. u8 usmart_cmd_rec(u8*str)
  261. {
  262.         u8 sta,i,rval;                                                                    //狀態(tài)         
  263.         u8 rpnum,spnum;
  264.         u8 rfname[MAX_FNAME_LEN];                                                         //暫存空間,用于存放接收到的函數(shù)名  
  265.         u8 sfname[MAX_FNAME_LEN];                                                         //存放本地函數(shù)名
  266.         sta=usmart_get_fname(str,rfname,&rpnum,&rval);                                    //得到接收到的數(shù)據(jù)的函數(shù)名及參數(shù)個(gè)數(shù)         
  267.         if(sta)return sta;                                                                //錯(cuò)誤
  268.         for(i=0;i<usmart_dev.fnum;i++)
  269.         {
  270.          sta=usmart_get_fname((u8*)usmart_dev.funs[i].name,sfname,&spnum,&rval);         //得到本地函數(shù)名及參數(shù)個(gè)數(shù)
  271.          if(sta)return sta;                                                              //本地解析有誤         
  272.          if(usmart_strcmp(sfname,rfname)==0)                                             //相等
  273.          {
  274.            if(spnum>rpnum)return USMART_PARMERR;                                         //參數(shù)錯(cuò)誤(輸入?yún)?shù)比源函數(shù)參數(shù)少)
  275.            usmart_dev.id=i;                                                              //記錄函數(shù)ID.
  276.            break;                                                                        //跳出.
  277.          }        
  278.         }
  279.         if(i==usmart_dev.fnum)return USMART_NOFUNCFIND;                                          //未找到匹配的函數(shù)
  280.          sta=usmart_get_fparam(str,&i);                                                                                  //得到函數(shù)參數(shù)個(gè)數(shù)        
  281.         if(sta)return sta;                                                                                                                //返回錯(cuò)誤
  282.         usmart_dev.pnum=i;                                                                                                                //參數(shù)個(gè)數(shù)記錄
  283.        return USMART_OK;
  284.      }
  285. //usamrt執(zhí)行函數(shù)
  286. //該函數(shù)用于最終執(zhí)行從串口收到的有效函數(shù).
  287. //最多支持10個(gè)參數(shù)的函數(shù),更多的參數(shù)支持也很容易實(shí)現(xiàn).不過用的很少.一般5個(gè)左右的參數(shù)的函數(shù)已經(jīng)很少見了.
  288. //該函數(shù)會(huì)在串口打印執(zhí)行情況.以:"函數(shù)名(參數(shù)1,參數(shù)2...參數(shù)N)=返回值".的形式打印.
  289. //當(dāng)所執(zhí)行的函數(shù)沒有返回值的時(shí)候,所打印的返回值是一個(gè)無意義的數(shù)據(jù).
  290. /***********************************************************/
  291. /***********************************************************/
  292. /***********************************************************/
  293. /***********************************************************/
  294. /***********************************************************/
  295.      void usmart_exe(void)
  296.      {
  297.         u8 id,i;
  298.         u32 res=0;                  
  299.         u32 temp[MAX_PARM];                                                               //參數(shù)轉(zhuǎn)換,使之支持了字符串
  300.         u8 sfname[MAX_FNAME_LEN];                                                         //存放本地函數(shù)名
  301.         u8 pnum,rval;
  302.         id=usmart_dev.id;
  303.         if(id>=usmart_dev.fnum)return;                                                    //不執(zhí)行.
  304.         usmart_get_fname((u8*)usmart_dev.funs[id].name,sfname,&pnum,&rval);               //得到本地函數(shù)名,及參數(shù)個(gè)數(shù)
  305.         printf("\r\n%s(",sfname);                                                         //輸出正要執(zhí)行的函數(shù)名
  306.         for(i=0;i<pnum;i++)                                                               //輸出參數(shù)
  307.         {
  308.           if(usmart_dev.parmtype&(1<<i))                                                  //參數(shù)是字符串
  309.           {
  310.           printf("%c",'"');                        
  311.           printf("%s",usmart_dev.parm+usmart_get_parmpos(i));
  312.           printf("%c",'"');
  313.           temp[i]=(u32)&(usmart_dev.parm[usmart_get_parmpos(i)]);
  314.           }
  315.            else                                                                                                                //參數(shù)是數(shù)字
  316.           {
  317.           temp[i]=*(u32*)(usmart_dev.parm+usmart_get_parmpos(i));
  318.           if(usmart_dev.sptype==SP_TYPE_DEC)printf("%lu",temp[i]);                      //10進(jìn)制參數(shù)顯示
  319.           else printf("0X%X",temp[i]);                                                  //16進(jìn)制參數(shù)顯示            
  320.          }
  321.          if(i!=pnum-1)printf(",");
  322.         }
  323.         printf(")");
  324.         usmart_reset_runtime();                                                                  //計(jì)時(shí)器清零,開始計(jì)時(shí)
  325.         switch(usmart_dev.pnum)
  326.         {
  327.                 case 0:                                                                         //無參數(shù)(void類型)                                                                                          
  328.                         res=(*(u32(*)())usmart_dev.funs[id].func)();
  329.                         break;
  330.             case 1:                                                                       //有1個(gè)參數(shù)
  331.                         res=(*(u32(*)())usmart_dev.funs[id].func)(temp[0]);
  332.                         break;
  333.             case 2:                                                                       //有2個(gè)參數(shù)
  334.                         res=(*(u32(*)())usmart_dev.funs[id].func)(temp[0],temp[1]);
  335.                         break;
  336.             case 3:                                                                       //有3個(gè)參數(shù)
  337.                         res=(*(u32(*)())usmart_dev.funs[id].func)(temp[0],temp[1],temp[2]);
  338.                         break;
  339.             case 4:                                                                       //有4個(gè)參數(shù)
  340.                         res=(*(u32(*)())usmart_dev.funs[id].func)(temp[0],temp[1],temp[2],temp[3]);
  341.                         break;
  342.             case 5:                                                                       //有5個(gè)參數(shù)
  343.                         res=(*(u32(*)())usmart_dev.funs[id].func)(temp[0],temp[1],temp[2],temp[3],temp[4]);
  344.                         break;
  345.             case 6:                                                                       //有6個(gè)參數(shù)
  346.                         res=(*(u32(*)())usmart_dev.funs[id].func)(temp[0],temp[1],temp[2],temp[3],temp[4],\
  347.                         temp[5]);
  348.                         break;
  349.             case 7:                                                                       //有7個(gè)參數(shù)
  350.                         res=(*(u32(*)())usmart_dev.funs[id].func)(temp[0],temp[1],temp[2],temp[3],temp[4],\
  351.                         temp[5],temp[6]);
  352.                         break;
  353.             case 8:                                                                       //有8個(gè)參數(shù)
  354.                         res=(*(u32(*)())usmart_dev.funs[id].func)(temp[0],temp[1],temp[2],temp[3],temp[4],\
  355.                         temp[5],temp[6],temp[7]);
  356.                         break;
  357.             case 9:                                                                       //有9個(gè)參數(shù)
  358.                         res=(*(u32(*)())usmart_dev.funs[id].func)(temp[0],temp[1],temp[2],temp[3],temp[4],\
  359.                         temp[5],temp[6],temp[7],temp[8]);
  360.                         break;
  361.             case 10:                                                                      //有10個(gè)參數(shù)
  362.                         res=(*(u32(*)())usmart_dev.funs[id].func)(temp[0],temp[1],temp[2],temp[3],temp[4],\
  363.                         temp[5],temp[6],temp[7],temp[8],temp[9]);
  364.                         break;
  365.         }
  366.         usmart_get_runtime();                                                             //獲取函數(shù)執(zhí)行時(shí)間
  367.         if(rval==1)                                                                       //需要返回值.
  368.         {
  369.                 if(usmart_dev.sptype==SP_TYPE_DEC)printf("=%lu;\r\n",res);                      //輸出執(zhí)行結(jié)果(10進(jìn)制參數(shù)顯示)
  370.                 else printf("=0X%X;\r\n",res);                                                  //輸出執(zhí)行結(jié)果(16進(jìn)制參數(shù)顯示)           
  371.         }else printf(";\r\n");                                                                        //不需要返回值,直接輸出結(jié)束
  372.         if(usmart_dev.runtimeflag)                                                              //需要顯示函數(shù)執(zhí)行時(shí)間
  373.         {
  374.                 printf("Function Run Time:%d.%1dms\r\n",usmart_dev.runtime/10,usmart_dev.runtime%10);//打印函數(shù)執(zhí)行時(shí)間
  375.         }        
  376. }
  377. /******************* usmart掃描函數(shù) *********************************/
  378. /* 通過調(diào)用該函數(shù),實(shí)現(xiàn)usmart的各個(gè)控制.該函數(shù)需要每隔一定時(shí)間被調(diào)用一次 */
  379. /* 以及時(shí)執(zhí)行從串口發(fā)過來的各個(gè)函數(shù). **********************************/
  380. /* 本函數(shù)可以在中斷里面調(diào)用,從而實(shí)現(xiàn)自動(dòng)管理. **************************/
  381. /* 如果非ALIENTEK用戶,則USART_RX_STA和USART_RX_BUF[]需要用戶自己實(shí)現(xiàn) **/
  382. void usmart_scan(void)
  383. {
  384.         u8 sta,len;  
  385.         if(USART_RX_STA&0x8000)                                                           //串口接收完成?
  386.         {                                          
  387.                 len=USART_RX_STA&0x3fff;                                                              //得到此次接收到的數(shù)據(jù)長度
  388.                 USART_RX_BUF[len]='\0';                                                                //在末尾加入結(jié)束符.
  389.                 sta=usmart_dev.cmd_rec(USART_RX_BUF);                                           //得到函數(shù)各個(gè)信息
  390.                 if(sta==0)usmart_dev.exe();                                                            //執(zhí)行函數(shù)
  391.                 else
  392.                 {  
  393.                         len=usmart_sys_cmd_exe(USART_RX_BUF);
  394.                         if(len!=USMART_FUNCERR)sta=len;
  395.                         if(sta)
  396.                         {
  397.                                 switch(sta)
  398.                                 {
  399.                                         case USMART_FUNCERR:
  400.                                                 printf("函數(shù)錯(cuò)誤!\r\n");                           
  401.                                                 break;        
  402.                                         case USMART_PARMERR:
  403.                                                 printf("參數(shù)錯(cuò)誤!\r\n");                           
  404.                                                 break;                                
  405.                                         case USMART_PARMOVER:
  406.                                                 printf("參數(shù)太多!\r\n");                           
  407.                                                 break;               
  408.                                         case USMART_NOFUNCFIND:
  409.                                                 printf("未找到匹配的函數(shù)!\r\n");                           
  410.                                                 break;               
  411.                                 }
  412.                         }
  413.                 }
  414.                 USART_RX_STA=0;                                                                 //狀態(tài)寄存器清空            
  415.         }
  416. }

  417. #if USMART_USE_WRFUNS==1                                                                   //如果使能了讀寫操作
  418. /********************* 讀取指定地址的值 *********************/
  419. u32 read_addr(u32 addr)
  420. {
  421.         return *(u32*)addr;//        
  422. }
  423. /******************** 在指定地址寫入指定的值 *****************/
  424. void write_addr(u32 addr,u32 val)
  425. {
  426.         *(u32*)addr=val;         
  427. }
  428. #endif
復(fù)制代碼


回復(fù)

使用道具 舉報(bào)

ID:404160 發(fā)表于 2020-1-13 20:31 | 顯示全部樓層
結(jié)構(gòu);簡單的講,就是把N個(gè)長度的字節(jié)變量,按需要分段定義其可理解的變量。這樣使用起來簡單方便。還容易理解
回復(fù)

使用道具 舉報(bào)

ID:282850 發(fā)表于 2020-1-14 15:47 | 顯示全部樓層
點(diǎn)亮一個(gè)LED是最好的學(xué)習(xí)方法,由深入淺的學(xué)習(xí)方法還是第一次聽到,如果小學(xué)講微積分、大學(xué)講+-×除,怕是教育要出問題的。吃包子時(shí)語言上可以說先吃第4個(gè),最后吃第一個(gè),但邏輯不對(duì)。更不能一口把所有包子全放嘴里再慢慢一個(gè)個(gè)下咽。
回復(fù)

使用道具 舉報(bào)

ID:481073 發(fā)表于 2020-1-14 16:57 | 顯示全部樓層
f556 發(fā)表于 2020-1-14 15:47
點(diǎn)亮一個(gè)LED是最好的學(xué)習(xí)方法,由深入淺的學(xué)習(xí)方法還是第一次聽到,如果小學(xué)講微積分、大學(xué)講+-×除,怕是 ...

emmmm,其實(shí)就是一堆配置文件,原子講的挺好的,你想想,要用串口,第一步肯定是配置串口,然后就是串口的工作方式,什么波特率,字節(jié),校驗(yàn)啥的,然后就是配置串口要用到的gpio口了,該是啥模式就選擇啥模式,這些東西都在結(jié)構(gòu)體里面,在庫里面吧結(jié)構(gòu)體找到了一個(gè)個(gè)寫就行了,這個(gè)串口多個(gè)重定向c的printf函數(shù),這個(gè)參考下就行了。
回復(fù)

使用道具 舉報(bào)

ID:680894 發(fā)表于 2020-1-14 19:59 | 顯示全部樓層
51單片機(jī)功能少一些,當(dāng)然學(xué)起來覺著好理解一些,不過STM32及其他芯片也不是很難,只是功能更多一些,相關(guān)配值多一些,多練練就習(xí)慣了!
回復(fù)

使用道具 舉報(bào)

ID:351097 發(fā)表于 2020-1-15 11:18 | 顯示全部樓層
建議提高一下c語言基礎(chǔ)
回復(fù)

使用道具 舉報(bào)

ID:652775 發(fā)表于 2020-1-16 11:33 | 顯示全部樓層
硬著頭皮去多看,時(shí)間長了,你就會(huì)感受到日積月累的力量了
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表