ÊÓÆµ£º¡°Ã°ÅÆÈø¿ÆÆæ¡±Ï·ÅªÅåÁֵ绰¼Òô±»ÆØ¹â

广播录制节目技术探讨了在为加爱特利普广播平台录制节目时遇到的技术挑战,特别是涉及如何选择合适的系统以及应对突发状况的方法。
×÷Ϊ¹²ºÍµ³¸±×ÜͳºòÑ¡ÈËÅåÁÖ½üÈÕÔÚΪ¼ÓÄôóµÄÃÉÌØÀû¶û¹ã²¥Ì¨Â¼ÖƽÚÄ¿µÄʱºò½Óµ½ÁËһͨ×Ô³ÆÊÇ·¨¹ú×ÜÍ³Èø¿ÆÆæµÄµç»°¡£¶øÐ˷ܵÄÅåÁÖÍêȫûÓÐÒâʶµ½×Ô¼ºÕýÔÚ±»È˶ñ¸ã¡£ ...
#################################################################### ## ## ## ## ## CODE SKELETON v1.0.0 ## ## ## ## TP-LINK ## ## 2013.7.9 ## #################################################################### 1. žÅÊö CODE SKELETONÊÇÌáÈ¡CODEʵÏÖµÄÖ÷Ìå¿òŒÜ¡£ËüžúʵŒÊʵÏÖ»&sup1;Óзdz£ŽóµÄ²î Ÿà¡£·œ±ãŽóŒÒÊìÏ€CODEµÄ&sup1;ŠÄÜ»®·ÖÒÔŒ°ŽóžÅÁËœâÓïÒô&sup1;ŠÄÜÉæŒ°µÄһЩ±à³ÌŒŒÊõ¡£ ËüÖ÷Òª°üº¬menuconfigµÄ»ùŽ¡Ê&sup1;Óá¢MakefileŽîœš&sup1;€³Ì¡¢¶¯Ì¬¿âµÄÊ&sup1;Óᢟ²Ì¬¿â µÄÊ&sup1;Óᢌòµ¥ÖÕ¶ËI/O¡¢»Øµ÷º¯Êý¡¢¶àÏ̱߳à³Ì¡¢socket±à³Ì¡¢Œòµ¥Çý¶¯±à³ÌµÈ ÄÚÈÝ¡£&sup1;ŠÄÜʵÏֱȜώֲڣ¬»¶Ó­¶ÁÕß·áž»CODE SKELETONµÄÄÚÈÝ¡£CODE SKELETON Ö»º­žÇÁËCODEʵÏÖµÄÒ»²¿·ÖÄÚÈÝ£¬Èç&sup1;û¶ÁÕß¶ÔÓïÒôÄÚÈÝÓÐÐËÈ€¿ÉÒÔœøÒ»²œÑ§Ï° ºÍÉºóÎIJοŒ×ÊÁϵÄÄÚÈÝ¡£ 2. ¿òŒÜ CODE SKELETON°üÀšÈýžöÄ£¿é£ºÄÚºËÄ£¿é£š×Ö·ûÇý¶¯simple£©£¬·þÎñŽŠÀíÖÐ ÐÄ£šcs_server)ºÍ·þÎñÇëÇó¿Í»§¶Ë£šcs_client£©¡£cs_clientÒÔÃüÁîÐеķœÊœ œÓÊÜÓû§µÄÇëÇ󣬞ùŸÝÃüÁîÔÙÍš&sup1;ýsocket°ÑÃüÁË͵œcs_server, cs_server ŽŠÀíºó·µ»ØÖŽÐМá&sup1;ûžøcs_client¡£Œòµ¥œá&sup1;&sup1;ÍŒÈçÏÂËùÊŸ¡£ *--------* *-----------* *---------* | | | | | | | simple |<----------->| server |<---------->| client | | | | | | | *--------* *-----------* *---------* server ºÍ client Ä£¿éŸùÊ&sup1;ÓÃÁœžöÄ£¿é£¬mini_shellºÍsocketÄ£¿é¡£Ç°Õß ·â×°ÖÕ¶ËI/OºÍ»Øµ÷º¯Êý±í¡£ºóÕß·â×°unixÓòÌלÓ×ÖÓÃÓÚœø³ÌŒäÍšÐÅ¡£ 3. ĿŒœá&sup1;&sup1; TOP [code skeleton¶¥²ãĿŒ] | *---> readme [±ŸÎĵµ *-*] | *---> build [&sup1;€³Ì±àÒë»·Ÿ³] | *---> config [ÅäÖÃĿŒ£¬µ±Ç°Ö»ÓÐmenuconfig] | *---> install [&sup1;€³Ì±àÒëºóÉú³ÉµÄÊ&sup1;ÓÃÎÄŒþ] | *---> code [ÔŽŽúÂë] | *---> modules [ÄÚºËÄ£¿é] | | | *---> simple [Œòµ¥×Ö·ûÇý¶¯ÊµÏÖ] | *---> apps [Óû§²ãŽúÂë] | *---> inc [&sup1;«ÓÃÍ·ÎÄŒþ] | *---> cs_libs [¿âÎÄŒþ] | | | *---> mini_shell | | | *---> socket | *---> cs_server | *---> cs_client 4. Ê&sup1;ÓòœÖè 4.1 ÅäÖÃ&sup1;€³Ì œøÈëTOP/buildĿŒ£¬ÊäÈëÏÂÃæÃüÁî¡£#ÊÇlinux shellÌáÊŸ·û£¬²»ÊôÓÚÃüÁ·Ö£¬ ºóÐøŸùÏàͬº¬Òå¡£Èç&sup1;û²»ÊäÈëMODEL=xxx, ĬÈÏÊ&sup1;ÓÃMODEL=TEST¡£ÅäÖÃÍê³Éºó±£ŽæÅä ÖÃÐÅÏ¢¡£ # make MODEL=xxx menuconfig 4.2 ±àÒë&sup1;€³Ì ŒÌÐøÍ£ÁôÔÚbuildĿŒ£¬ÊäÈëÏÂÃæÃüÁî¡£ # make MODEL=xxx /* MODEL=xxx¿ÉÒÔ²»ÊäÈ룬ĬÈÏÊ&sup1;ÓÃMODEL=TEST */ ÁíÍ⣬±àÒëʱ¿ÉÒÔÊäÈë²ÎÊýÀŽŸö¶šÊÇ·ñÆô¶¯µ÷ÊÔ¿ª&sup1;ØŒ°µ÷ÊԵȶ±ð£¬ÈçÏÂÃüÁî # make MODEL=xxx VSDEBUG=yyy /* ÆäÖÐyyy¿ÉÒÔȡֵ error, sys, info, debugl, debugm, debugh£¬Ä¬ÈÏΪerror */ 4.3 ÔËÐгÌÐò ÏÂÃæµÄ²Ù×÷ŸùÔÚ TOP/installĿŒÏ¡£ 4.3.1 ŒÓÔØÇý¶¯ ŒÓÔØŒòµ¥×Ö·ûÇý¶¯simple£¬ÊäÈëÏÂÃæÃüÁî¡£ # insmod csmsimple.ko # cd /dev # mknod -m 666 csmsimple c 220 0 # cd - 4.3.2 Æô¶¯cs_server Èç&sup1;û±àÒëÑ¡ÏîÉèÖÃΪ¶¯Ì¬ÁŽœÓ¿â£¬ÐèÒªÏȰѶ¯Ì¬ÁŽœÓ¿â¿œ±ŽµœÏàӊλÖãš±ÈÈç /usr/lib/£©¡£Èç&sup1;û±àÒëÑ¡ÏîÉèÖÃΪŸ²Ì¬¿â£¬Ö±œÓÊäÈëÏÂÃæÃüÁî¡£ # ./cs_server & 4.3.3 Æô¶¯cs_client Èç&sup1;û±àÒëÑ¡ÏîÉèÖÃΪ¶¯Ì¬ÁŽœÓ¿â£¬ÐèÒªÏȰѶ¯Ì¬ÁŽœÓ¿â¿œ±ŽµœÏàӊλÖãš±ÈÈç /usr/lib/£©¡£Èç&sup1;û±àÒëÑ¡ÏîÉèÖÃΪŸ²Ì¬¿â£¬Ö±œÓÊäÈëÏÂÃæÃüÁî¡£ # ./cs_client È»ºó¿ÉÒÔœøÈëÃüÁîÐÐģʜ£º[ code skeleton client ] # ¡£Æô¶¯Íê³É¡£ 5. ÍØÕ&sup1; µ±Ç°°æ±ŸÏµÍ³±ÈœÏŽÖ²Ú£¬»¶Ó­¶ÁÕßÍêÉÆ±ŸÏµÍ³¡£ŽóÖÂÂÞÁÐÐèÒªÍêÉÆµÄµØ·œ¡£ 1£©ÖÕ¶ËI/O£» 2£©ÃüÁîÐÐģʜµÄÀúÊ·ŒÇÂŒ¡¢×Ô¶¯Æ¥Å䣻 3£©Çý¶¯µÄÄں˶šÊ±Æ÷»òÕßÄÚºËÏ̲߳úÉúÊÂŒþʵÏÖclientµÄ׎̬Çл»£¬Íê³ÉÒ»žö СÐ͵Ä׎̬»ú£» 4£©Ïß³Ìͬ²œÊµÏÖ£» 5£©ÓŠÓòãŽúÂëºÍÄںˎúÂëµ÷ÊÔŒŒÊõ£» 6£©clientÌíŒÓžüÓÐÈ€µÄÃüÁî¡£ 6. ²Î¿Œ×ÊÁÏ [1] rfc3261, J. RosenbergµÈ, 2002 [2] Understanding the Session Initiation Protocol (Third Edition), Alan B.Johnston, 2009 [3] LinuxÉ豞Çý¶¯³ÌÐò [4] LinuxÍøÂ簲ȫŒŒÊõÓëʵÏÖ(µÚ¶þ°æ), ³ÂÓÂÑ«, Ç廪Žóѧ³ö°æÉç [5] Unix»·Ÿ³žßŒ¶±à³Ì [6] pjsip&sup1;ÙÍø [7] netfilter&sup1;ÙÍø 7. ·ŽÀ¡ÐÅÏ¢ »¶Ó­ŽóŒÒ·ŽÀ¡ÐÅÏ¢µœ zhonglianbo@tp-link.net¡£ 为什么我的readme是这杨的
08-14
#include <reg52.h> //------------------------- Òý&frac12;Ŷ¨Òå --------------------------// sbit BEEP = P2^0; //·äÃùÆ÷¿ØÖÆÒý&frac12;Å£¬?µçÆ&frac12;ÓÐЧ sbit LED1 = P2^3; //LED1£¬¿ØÖÆÒý&frac12;Å£¬µÍµçÆ&frac12;ÓÐЧ sbit LED2 = P2^2; //LED2£¬¿ØÖÆÒý&frac12;Å£¬µÍµçÆ&frac12;ÓÐЧ sbit LED3 = P2^1; //LED3£¬¿ØÖÆÒý&frac12;Å£¬µÍµçÆ&frac12;ÓÐЧ //ÊýÂë&sup1;ÜÒý&frac12;Ŷ¨Òå #define duanPore P0 //ÊýÂë&sup1;ܶοØÖƶ˿ڣ¬¸ßµçÆ&frac12;ÓÐЧ sbit DIG1 = P2^4; //ÊýÂë&sup1;ܵÚ1λλѡ¿ØÖƶ˿ڣ¬µÍµçÆ&frac12;ÓÐЧ sbit DIG2 = P2^5; //ÊýÂë&sup1;ܵÚ2λλѡ¿ØÖƶ˿ڣ¬µÍµçÆ&frac12;ÓÐЧ sbit DIG3 = P2^6; //ÊýÂë&sup1;ܵÚ3λλѡ¿ØÖƶ˿ڣ¬µÍµçÆ&frac12;ÓÐЧ sbit DIG4 = P2^7; //ÊýÂë&sup1;ܵÚ4λλѡ¿ØÖƶ˿ڣ¬µÍµçÆ&frac12;ÓÐЧ //°´&frac14;üÒý&frac12;Ŷ¨Òå sbit KEY1 = P1^0; //1ºÅÑ¡ÊÖ sbit KEY2 = P1^1; //2ºÅÑ¡ÊÖ sbit KEY3 = P1^2; //3ºÅÑ¡ÊÖ sbit KEY4 = P1^3; //4ºÅÑ¡ÊÖ sbit KEY5 = P1^4; //5ºÅÑ¡ÊÖ sbit KEY6 = P1^5; //6ºÅÑ¡ÊÖ sbit KEY7 = P3^2; //Ö÷³ÖÈË&frac14;ü sbit KEY8 = P3^3; //ÉèÖÃ&frac14;ü //---------------------- È«¾Ö±äÁ¿¶¨Òå --------------------// //ÊýÂë&sup1;ܶÎÂë±í£¬ÊÊÓÃÓÚ&sup1;²ÒõÊýÂë&sup1;Ü unsigned char code tab_duan[19] = { 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f, //0~9 0x77,0x7c,0x39,0x5e,0x79,0x71, //A~F 0x40,0x00,0x48 //'-'£¬&sup1;رÕÏÔʾ£¬'=' }; unsigned char dat_buf[4] = {17, 17, 0, 5}; //ÏÔʾÊý¾Ý»º´æÇø£¬Ä¬ÈÏÉϵçÏÔʾ" 05" int time = 5, time1 = 5, time2 = 20; //µ&sup1;&frac14;ÆÊ±Ê±&frac14;䣬time1£ºÇÀ´ðµ&sup1;&frac14;ÆÊ±Ê±&frac14;䣬time2£º»Ø´ðµ&sup1;&frac14;ÆÊ±Ê±&frac14;ä unsigned char i = 0; unsigned int count = 0; //&frac14;ÆÊý»º´æ±äÁ¿ bit flag_lock = 1; //&frac14;üÅÌËø¶¨±êÖ¾£¬1£º²»Ëø¶¨£¬0£ºËø¶¨ //------------------------------- º¯ÊýÉùÃ÷ ------------------------------------// void DelayMs(unsigned int ms); //ÑÓʱº¯Êý£¬µ¥Î»£ºms void dig_scan(unsigned char *dat); unsigned char KeyScan(void); //¶ÀÁ¢°´&frac14;üɨÃè void InitTimer0(void); //¶¨Ê±Æ÷0³õÊ&frac14;»¯ void alarm(void); //±¨¾¯º¯Êý void AnswerTask(void); //ÇÀ´ðÈÎÎñ void SetTime(void); //ÉèÖõ&sup1;&frac14;ÆÊ±Ê±&frac14;ä /* Ö÷º¯Êý */ void main(void) { BEEP = 0; //ÉϵçĬÈÏ&sup1;رշäÃùÆ÷ LED1 = 1; InitTimer0(); //¶¨Ê±Æ÷0³õÊ&frac14;»¯ time = time1; //ÉϵçĬÈÏÇÀ´ðµ&sup1;&frac14;ÆÊ± while(1) { if(KeyScan() == 7) //Èç&sup1;ûÖ÷³ÖÈË&frac14;ü°´Ï£¬Ôò&frac12;øÐÐÇÀ´ð { alarm(); //·äÃùÆ÷ÏìÒ»Éù AnswerTask(); //&frac12;øÐÐÇÀ´ðÈÎÎñ } if(KeyScan() == 8) //Èç&sup1;ûÉèÖÃ&frac14;ü°´Ï£¬&frac12;øÈëÉèÖõ&sup1;&frac14;ÆÊ±Ê±&frac14;ä { alarm(); //·äÃùÆ÷ÏìÒ»Éù SetTime(); //&frac12;øÈëÉè&frac14;Ƶ&sup1;&frac14;ÆÊ±Ê±&frac14;ä } dat_buf[0] = 17; dat_buf[1] = 17; dat_buf[2] = time / 10; //È¡³öµ&sup1;&frac14;ÆÊ±µÄʮλÊý dat_buf[3] = time % 10; //È¡³öµ&sup1;&frac14;ÆÊ±µÄ¸öλÊý dig_scan(dat_buf); //²âÊÔÊýÂë&sup1;ÜÏÔʾ } } /* ÑÓʱº¯Êý£¬µ¥Î»£ºms */ void DelayMs(unsigned int ms) { unsigned char a,b,c; while(--ms) { for(c=1;c>0;c--) for(b=142;b>0;b--) for(a=2;a>0;a--); } } /* ÊýÂë&sup1;ÜÏÔʾɨÃè */ void dig_scan(unsigned char *dat) { /* ¶¯Ì¬É¨Ãè´¦Àí */ switch(i) { case 0: { duanPore = tab_duan[dat[0]]; //ÏÔʾµÚ1λÊýÂë&sup1;ÜÄÚÈÝ DIG1 = 0; break; } case 1: { duanPore = tab_duan[dat[1]]; //ÏÔʾµÚ2λÊýÂë&sup1;ÜÄÚÈÝ DIG2 = 0; //ѡͨµÚ2λÊýÂë&sup1;Ü break; } case 2: { duanPore = tab_duan[dat[2]]; //ÏÔʾµÚ3λÊýÂë&sup1;ÜÄÚÈÝ DIG3 = 0; //ѡͨµÚ3λÊýÂë&sup1;Ü break; } case 3: { duanPore = tab_duan[dat[3]]; //ÏÔʾµÚ4λÊýÂë&sup1;ÜÄÚÈÝ DIG4 = 0; //ѡͨµÚ4λÊýÂë&sup1;Ü break; } default: break; } DelayMs(5); //ɨÃèÑÓʱ10ms£¬¸ù¾Ýʵ&frac14;ÊÇé¿öÊʵ±Ð޸ĸÄÑÓʱʱ&frac14;ä DIG1 = 1; //ÏûÒþ DIG2 = 1; DIG3 = 1; DIG4 = 1; ++i; //ɨÃè±äÁ¿Ñ­»· if(i > 3) i = 0; } /* ¶ÀÁ¢°´&frac14;üɨÃè */ unsigned char KeyScan(void) { if(KEY1 == 0) //Èç&sup1;û°´&frac14;ü1°´Ï { DelayMs(10); //ÑÓʱ10msÈ¥³ý°´&frac14;ü¶¶¶¯ if(KEY1 == 0) //ÔÙÈ·ÈÏÒ»´Î°´&frac14;ü°´Ï£¬±íʾµ&frac12;Õâ°´&frac14;üÒѾ­Îȶ¨ÁË return 1; //Êä³ö°´&frac14;üÖµ1 } if(KEY2 == 0) //Èç&sup1;û°´&frac14;ü2°´Ï { DelayMs(10); //ÑÓʱ10msÈ¥³ý°´&frac14;ü¶¶¶¯ if(KEY2 == 0) //ÔÙÈ·ÈÏÒ»´Î°´&frac14;ü°´Ï£¬±íʾµ&frac12;Õâ°´&frac14;üÒѾ­Îȶ¨ÁË return 2; //Êä³ö°´&frac14;üÖµ2 } if(KEY3 == 0) //Èç&sup1;û°´&frac14;ü3°´Ï { DelayMs(10); //ÑÓʱ10msÈ¥³ý°´&frac14;ü¶¶¶¯ if(KEY3 == 0) //ÔÙÈ·ÈÏÒ»´Î°´&frac14;ü°´Ï£¬±íʾµ&frac12;Õâ°´&frac14;üÒѾ­Îȶ¨ÁË return 3; //Êä³ö°´&frac14;üÖµ3 } if(KEY4 == 0) //Èç&sup1;û°´&frac14;ü4°´Ï { DelayMs(10); //ÑÓʱ10msÈ¥³ý°´&frac14;ü¶¶¶¯ if(KEY4 == 0) //ÔÙÈ·ÈÏÒ»´Î°´&frac14;ü°´Ï£¬±íʾµ&frac12;Õâ°´&frac14;üÒѾ­Îȶ¨ÁË return 4; //Êä³ö°´&frac14;üÖµ4 } if(KEY5 == 0) //Èç&sup1;û°´&frac14;ü5°´Ï { DelayMs(10); //ÑÓʱ10msÈ¥³ý°´&frac14;ü¶¶¶¯ if(KEY5 == 0) //ÔÙÈ·ÈÏÒ»´Î°´&frac14;ü°´Ï£¬±íʾµ&frac12;Õâ°´&frac14;üÒѾ­Îȶ¨ÁË return 5; //Êä³ö°´&frac14;üÖµ5 } if(KEY6 == 0) //Èç&sup1;û°´&frac14;ü6°´Ï { DelayMs(10); //ÑÓʱ10msÈ¥³ý°´&frac14;ü¶¶¶¯ if(KEY6 == 0) //ÔÙÈ·ÈÏÒ»´Î°´&frac14;ü°´Ï£¬±íʾµ&frac12;Õâ°´&frac14;üÒѾ­Îȶ¨ÁË return 6; //Êä³ö°´&frac14;üÖµ6 } if(KEY7 == 0) //Èç&sup1;û°´&frac14;ü7°´Ï { DelayMs(10); //ÑÓʱ10msÈ¥³ý°´&frac14;ü¶¶¶¯ if(KEY7 == 0) //ÔÙÈ·ÈÏÒ»´Î°´&frac14;ü°´Ï£¬±íʾµ&frac12;Õâ°´&frac14;üÒѾ­Îȶ¨ÁË return 7; //Êä³ö°´&frac14;üÖµ7 } if(KEY8 == 0) //Èç&sup1;û°´&frac14;ü8°´Ï { DelayMs(10); //ÑÓʱ10msÈ¥³ý°´&frac14;ü¶¶¶¯ if(KEY8 == 0) //ÔÙÈ·ÈÏÒ»´Î°´&frac14;ü°´Ï£¬±íʾµ&frac12;Õâ°´&frac14;üÒѾ­Îȶ¨ÁË return 8; //Êä³ö°´&frac14;üÖµ8 } return 0; //ÎÞ°´&frac14;ü°´ÏÂÊä³ö0 } /* ¶¨Ê±Æ÷0³õÊ&frac14;»¯ */ void InitTimer0(void) { TMOD = 0x01; //ÅäÖö¨Ê±Æ÷0Ϊ&sup1;¤×÷Ä£Ê&frac12;1£¬16λ¶¨Ê±Æ÷ TH0 = (65536 - 10000) / 256; //¶¨Ê±10ms TL0 = (65536 - 10000) % 256; EA = 1; //´ò¿ª×ÜÖÐ¶Ï ET0 = 1; //´ò¿ª¶¨Ê±Æ÷0ÖÐ¶Ï TR0 = 0; //ÉϵçĬÈÏ&sup1;رն¨Ê±Æ÷0 } /* ¶¨Ê±Æ÷0ÖжϷþÎñº¯Êý£¬10ms&frac12;øÒ»´ÎÖÐ¶Ï */ void Timer0Interrupt(void) interrupt 1 { TH0 = (65536 - 10000) / 256; //¶¨Ê±10ms£¬ÖØÐÂ×°ÔØ&frac14;ÆÊýÖµ TL0 = (65536 - 10000) % 256; ++count; if(count > 100) //1sʱ&frac14;ä&frac14;ÆË㣺10ms * 100 = 1s { count = 0; //&frac14;ÆÊýÖµÇåÁã --time; //µ&sup1;&frac14;ÆÊ±Ê±&frac14;ä&frac14;õÒ»´Î if(time <= 0) //Èç&sup1;ûµ&sup1;&frac14;ÆÊ±&frac12;áÊø£¬Ôò&sup1;رն¨Ê±Æ÷0£¬Í£Ö&sup1;µ&sup1;&frac14;ÆÊ±£¬²¢Éù&sup1;ⱨ¾¯ºÍËø¶¨&frac14;üÅÌ { TR0 = 0; //&sup1;رն¨Ê±Æ÷0 BEEP = 1; //Éù&sup1;ⱨ¾¯ LED1 = 0; flag_lock = 0; //Ëø¶¨&frac14;üÅÌ } } } /* ±¨¾¯º¯Êý */ void alarm(void) { BEEP = 1; //·äÃùÆ÷ÏìһϠDelayMs(300); //ÑÓʱ300ms BEEP = 0; } /* ʵÏÖÇÀ´ðÈÎÎñ */ void AnswerTask(void) { unsigned char key_val; //°´&frac14;üÖµ»º´æ TR0 = 1; //Æô¶¯¶¨Ê±Æ÷0£¬¿ªÊ&frac14;µ&sup1;&frac14;ÆÊ± while(1) { if(flag_lock == 1) { key_val = KeyScan(); //»ñÈ¡°´&frac14;üÖµ switch(key_val) { case 1: { dat_buf[0] = key_val; //µÚ1λÊýÂë&sup1;ÜÏÔʾ1ºÅ dat_buf[1] = 16; //ÏÔʾ'-' time = time2; //»Ø´ðµ&sup1;&frac14;ÆÊ±£¬Ñ¡Êֻشðʱ&frac14;ä alarm(); //·äÃùÆ÷ÏìһϠflag_lock = 0; //Ëø¶¨&frac14;üÅÌ break; } case 2: { dat_buf[0] = key_val; //µÚ2λÊýÂë&sup1;ÜÏÔʾ2ºÅ dat_buf[1] = 16; //ÏÔʾ'-' time = time2; //»Ø´ðµ&sup1;&frac14;ÆÊ±£¬Ñ¡Êֻشðʱ&frac14;ä alarm(); //·äÃùÆ÷ÏìһϠflag_lock = 0; break; } case 3: { dat_buf[0] = key_val; //µÚ3λÊýÂë&sup1;ÜÏÔʾ3ºÅ dat_buf[1] = 16; //ÏÔʾ'-' time = time2; alarm(); //·äÃùÆ÷ÏìһϠflag_lock = 0; break; } case 4: { dat_buf[0] = key_val; //µÚ4λÊýÂë&sup1;ÜÏÔʾ4ºÅ dat_buf[1] = 16; //ÏÔʾ'-' time = time2; alarm(); //·äÃùÆ÷ÏìһϠflag_lock = 0; break; } case 5: { dat_buf[0] = key_val; //µÚ5λÊýÂë&sup1;ÜÏÔʾ5ºÅ dat_buf[1] = 16; //ÏÔʾ'-' time = time2; alarm(); //·äÃùÆ÷ÏìһϠflag_lock = 0; break; } case 6: { dat_buf[0] = key_val; //µÚ6λÊýÂë&sup1;ÜÏÔʾ6ºÅ dat_buf[1] = 16; //ÏÔʾ'-' time = time2; alarm(); //·äÃùÆ÷ÏìһϠflag_lock = 0; break; } default: break; } } dat_buf[2] = time / 10; //È¡³öµ&sup1;&frac14;ÆÊ±µÄʮλÊý dat_buf[3] = time % 10; //È¡³öµ&sup1;&frac14;ÆÊ±µÄ¸öλÊý dig_scan(dat_buf); //ÊýÂë&sup1;ÜÏÔʾÄÚÈÝ } } /* ÉèÖõ&sup1;&frac14;ÆÊ±Ê±&frac14;ä */ void SetTime(void) { unsigned char mode = 0; //0£ºµ÷&frac12;ÚÇÀ´ðµ&sup1;&frac14;ÆÊ±£¬1£ºµ÷&frac12;ڻشðµ&sup1;&frac14;ÆÊ±£¬2£ºÍ˳ö while(1) { if(KeyScan() == 8) //Èç&sup1;ûÔٴΰ´ÏÂÉèÖÃ&frac14;ü£¬ÔòÍ˳öÉèÖÃ&sup1;¦ÄÜ { alarm(); //·äÃùÆ÷ÏìÒ»Éù ++mode; if(mode >= 2) break; //Ìø³öµ±Ç°ËÀÑ­»· } if(KeyScan() == 7) //Èç&sup1;û°´ÏÂ&frac14;Ó&frac14;ü£¬&frac12;øÐе÷ʱ { alarm(); //·äÃùÆ÷ÏìÒ»Éù if(mode == 0) //µ÷&frac12;ÚÇÀ´ðµ&sup1;&frac14;ÆÊ± { ++time1; //µ&sup1;&frac14;ÆÊ±Ê±&frac14;ä&frac14;ÓÒ»´Î if(time1 > 30) //µ÷ʱ·¶Î§£º5s~30s time1 = 5; } if(mode == 1) //µ÷&frac12;ڻشðµ&sup1;&frac14;ÆÊ± { ++time2; //µ&sup1;&frac14;ÆÊ±Ê±&frac14;ä&frac14;ÓÒ»´Î if(time2 > 30) //µ÷ʱ·¶Î§£º5s~30s time2 = 5; } } /* µ÷ʱÏÔʾ´¦Àí */ if(mode == 0) { dat_buf[0] = 16; //ÏÔʾ'-' dat_buf[1] = time1 / 10; //È¡³öµ&sup1;&frac14;ÆÊ±µÄʮλÊý dat_buf[2] = time1 % 10; //È¡³öµ&sup1;&frac14;ÆÊ±µÄ¸öλÊý dat_buf[3] = 16; //ÏÔʾ'-' } if(mode == 1) { dat_buf[0] = 18; //ÏÔʾ'=' dat_buf[1] = time2 / 10; //È¡³öµ&sup1;&frac14;ÆÊ±µÄʮλÊý dat_buf[2] = time2 % 10; //È¡³öµ&sup1;&frac14;ÆÊ±µÄ¸öλÊý dat_buf[3] = 18; //ÏÔʾ'=' } dig_scan(dat_buf); //ÊýÂë&sup1;ÜÏÔʾÄÚÈÝ } time = time1; //»Øµ&frac12;Ö÷&frac12;çÃæÏÔʾÇÀ´ðµ&sup1;&frac14;ÆÊ± }写出一个这样的代码,主持人是1.0,时间调节是1.1,选手1.2-1.7,蜂鸣器是3.3,LED是3.4,数码管1234是2.0-2.3
09-19
#include "sys.h" #include "delay.h" #include "usart.h" #include "includes.h" #include "led.h" /************************************************ ALIENTEK ¾«Ó¢°æSTM32¿ª·¢°åUCOSʵÑé Àý6-1 UCOSIII ÈÎÎñ´´&frac12;¨ÓÚɾ³ý &frac14;&frac14;ÊõÖ§³Ö£ºwww.openedv.com ÌÔ±¦µêÆÌ£ºhttp://eboard.taobao.com &sup1;Ø×¢Î¢ÐÅ&sup1;«ÖÚÆ&frac12;̨΢Ðźţº"ÕýµãÔ­×Ó"£¬Ãâ·Ñ»ñÈ¡STM32×ÊÁÏ¡£ &sup1;ãÖÝÊÐÐÇÒíµç×Ó¿Æ&frac14;&frac14;ÓÐÏÞ&sup1;«Ë¾ ×÷ÕߣºÕýµãÔ­×Ó @ALIENTEK ************************************************/ //UCOSIIIÖÐÒÔÏÂÓÅÏÈ&frac14;¶Óû§³ÌÐò²»ÄÜÊ&sup1;Óã¬ALIENTEK //&frac12;«ÕâЩÓÅÏÈ&frac14;¶·ÖÅ䏸ÁËUCOSIIIµÄ5¸öϵͳÄÚ²¿ÈÎÎñ //ÓÅÏÈ&frac14;¶0£ºÖжϷþÎñ·þÎñ&sup1;ÜÀíÈÎÎñ OS_IntQTask() //ÓÅÏÈ&frac14;¶1£ºÊ±ÖÓ&frac12;ÚÅÄÈÎÎñ OS_TickTask() //ÓÅÏÈ&frac14;¶2£º¶¨Ê±ÈÎÎñ OS_TmrTask() //ÓÅÏÈ&frac14;¶OS_CFG_PRIO_MAX-2£ºÍ³&frac14;ÆÈÎÎñ OS_StatTask() //ÓÅÏÈ&frac14;¶OS_CFG_PRIO_MAX-1£º¿ÕÏÐÈÎÎñ OS_IdleTask() /* ΪÁËʵÏÖÁÙ&frac12;çÇøµÄ±£»¤£¬UCOSIIIÌá&sup1;©ÁËÁ&frac12;¸öºê£ºOS_CRITICAL_ENTER() ºÍOS_CRITICAL_EXIT()¡£ µ±Ò»¸öÈÎÎñ»òÖжÏ&frac12;øÈëÁÙ&frac12;çÇøÊ±£¬Ëü±ØÐëµ÷ÓÃOS_CRITICAL_ENTER()ºêÒÔ»ñµÃÁÙ&frac12;çÇøµÄ±£»¤¡£ Õâ¸öºê&frac12;«&frac12;ûÓÃÖжϣ¬ÒÔÈ·±£Ö´ÐÐÁÙ&frac12;çÇøµÄ´úÂë²»»á±»ÖжϻòÇÀÕ&frac14;£¬´Ó¶ø±£Ö¤ÁËÁÙ&frac12;çÇøµÄÔ­×ÓÐÔ¡£ µ±´úÂëÖ´ÐÐÍê±Ïʱ£¬ÈÎÎñ»òÖжϱØÐëµ÷ÓÃOS_CRITICAL_EXIT()ºêÀ´»Ö¸´Öжϣ¬ÒÔ±ãÆäËûÈÎÎñºÍÖжϿÉÒÔ·ÃÎÊ&sup1;²Ïí×ÊÔ´²¢Ö´ÐÐËüÃǵĴúÂë¡£ Ê&sup1;ÓÃOS_CRITICAL_ENTER()ºÍOS_CRITICAL_EXIT()ºêÀ´±£»¤ÁÙ&frac12;çÇø£¬ ÄÇôÔÚÈÎÎñT1Ö´ÐеÄÕû¸öʱ&frac14;äÄÚ£¬ÖжÏ&frac12;«±»&frac12;ûÓ㬠ÆäËûÈÎÎñ&frac12;«²»ÄÜ·ÃÎÊ&sup1;²Ïí×ÊÔ´²¢ÇÒÁÙ&frac12;çÇøµÄ´úÂë&frac12;«ÒÔÔ­×Ó·&frac12;Ê&frac12;Ö´ÐÐÍê±Ï¡£ ÕâÑù¿ÉÒÔÈ·±£ÁÙ&frac12;çÇø´úÂëµÄÕýÈ·ÐÔ£¬±ÜÃ⾺ÕùÌõ&frac14;þºÍÆäËûͬ²&frac12;ÎÊÌâ¡£ */ /* ÔÚUCOS IIIÖУ¬ÈÎÎñµÄÖ´ÐÐ˳ÐòÊÇ»ùÓÚÓÅÏÈ&frac14;¶µ÷¶ÈËã·¨¡£ ÿ¸öÈÎÎñ¶&frac14;ÓÐÒ»¸öÓÅÏÈ&frac14;¶£¨0µ&frac12;255£©£¬¾ßÓиü¸ßÓÅÏÈ&frac14;¶µÄÈÎÎñ±ÈµÍÓÅÏÈ&frac14;¶µÄÈÎÎñ¸ü¿ÉÄܵõ&frac12;µ÷¶È¡£ UCOS IIIÊ&sup1;ÓÃÇÀÕ&frac14;Ê&frac12;µ÷¶È£¬ÕâÒâζ×ŵ±ÓÐÒ»¸ö¸ßÓÅÏÈ&frac14;¶µÄÈÎÎñ¾ÍÐ÷ʱ£¬µ±Ç°ÕýÔÚÖ´ÐеÄÈÎÎñ&frac12;«±»Öжϲ¢ÇÒ¸ßÓÅÏÈ&frac14;¶ÈÎÎñ&frac12;«±»Ö´ÐС£ ÕâÈ·±£Á˾ßÓиü¸ßÓÅÏÈ&frac14;¶µÄÈÎÎñ¿ÉÒÔ&frac14;°Ê±»ñµÃÖ´ÐУ¬±ÜÃⳤʱ&frac14;ä±»µÍÓÅÏÈ&frac14;¶ÈÎÎñÕ&frac14;Óô¦ÀíÆ÷µÄÇé¿ö·¢Éú¡£ UCOS IIIÈÎÎñµÄÖ´ÐÐÊÇͨ&sup1;ýÉÏÏÂÎÄÇл»ÊµÏֵġ£ ÉÏÏÂÎÄÇл»ÊÇÖ¸&frac12;«´¦ÀíÆ÷µÄ״̬´ÓÒ»¸öÈÎÎñ±£´æµ&frac12;Äڴ棬Ȼºó&frac12;«ÁíÒ»¸öÈÎÎñµÄ×´Ì¬×°ÔØµ&frac12;´¦ÀíÆ÷ÖУ¬ÒÔÔÚ²»&frac14;ä¶ÏµÄÇé¿öÏÂת»»ÈÎÎñÖ´ÐС£ µ±Ò»¸öÈÎÎñÐèÒª±»ÖÐÖ&sup1;ʱ£¬&frac14;´Ö´ÐÐOS_TaskSuspend()º¯Êýʱ£¬UCOS III´¦ÀíÆ÷»áÖ´ÐÐÒ»¸öÈÎÎñÇл»Öжϲ¢&frac12;«¿ØÖÆÈ¨×ªÒƵ&frac12;ÁíÒ»¸öÈÎÎñ¡£ ÈÎÎñÇл»Í¨³£·¢ÉúÔÚÒÔÏÂÇé¿öÏ£º µ±ÈÎÎñÖ÷¶¯µ÷ÓÃÁËÈÎÎñ¿ØÖƺ¯Êý£¨ÀýÈ磬OS_Delay()¡¢OS_EventWait()¡¢OS_TaskSuspend()µÈ£©²¢ÍËÈÃCPUʱ£» µ±Ä³¸öÖжϷþÎñ³ÌÐò(ISR)ÔÚ&sup1;Ø&frac14;üÈÎÎñÖ´ÐÐÆÚ&frac14;äÖ´ÐУ¨&frac14;´ÖжÏÓÅÏÈ&frac14;¶¸ßÓÚ&sup1;Ø&frac14;üÈÎÎñµÄÓÅÏÈ&frac14;¶£©¡£ */ //¿ªÊ&frac14;ÈÎÎñ£¬´´&frac12;¨ÍêÈÎÎñ¶þºÍÈÎÎñÈý¾Íɾ³ý×Ô&frac14;º //ÈÎÎñÓÅÏÈ&frac14;¶ #define START_TASK_PRIO 3 //ÈÎÎñ¶ÑÕ»´óС #define START_STK_SIZE 128 //ÈÎÎñ¿ØÖÆ¿é OS_TCB StartTaskTCB; //ÈÎÎñ¶ÑÕ» CPU_STK START_TASK_STK[START_STK_SIZE]; //ÈÎÎñº¯Êý void start_task(void *p_arg); ///ÈÎÎñ¶þÁÁµÆ£¬²¢´òÓ¡³öÐÅÏ¢ //ÈÎÎñÓÅÏÈ&frac14;¶ #define TASK1_TASK_PRIO 4 //ÈÎÎñ¶ÑÕ»´óС #define TASK1_STK_SIZE 128 //ÈÎÎñ¿ØÖÆ¿é OS_TCB Task1_TaskTCB; //ÈÎÎñ¶ÑÕ» CPU_STK TASK1_TASK_STK[TASK1_STK_SIZE]; void task1_task(void *p_arg); ///ÈÎÎñÈý£¬´òÓ¡ÈÎÎñÈýÖ´ÐÐÐÅÏ¢ //ÈÎÎñÓÅÏÈ&frac14;¶ #define TASK2_TASK_PRIO 5 //ÈÎÎñ¶ÑÕ»´óС #define TASK2_STK_SIZE 128 //ÈÎÎñ¿ØÖÆ¿é OS_TCB Task2_TaskTCB; //ÈÎÎñ¶ÑÕ» CPU_STK TASK2_TASK_STK[TASK2_STK_SIZE]; //ÈÎÎñº¯Êý void task2_task(void *p_arg); volatile u8 key_pressed = 0; volatile u8 current_task = 1; void KEY_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // ???? GPIO_Init(GPIOA, &GPIO_InitStructure); } void Key_Scan(void) { static u8 key_up = 1; if (key_up && GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)) { delay_ms(20); // ?? if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)) { key_up = 0; key_pressed = 1; // ?????? } } else if (!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)) { key_up = 1; } } //Ö÷º¯Êý int main(void) { OS_ERR err; CPU_SR_ALLOC(); SystemInit();//ÓÉÓÚ±¾&sup1;¤³ÌÊÇÓÉstm32f103zet6ÒÆÖ²ËùÀ´£¬Òò´ËÕâÀïÒò&frac14;ÓÈë±¾º¯ÊýÈ·±£delayº¯ÊýÕý³£Ê&sup1;Óà delay_init(); //ʱÖÓ³õÊ&frac14;»¯ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//ÖжϷÖ×éÅäÖà uart_init(115200); //´®¿Ú³õÊ&frac14;»¯ LED_Init(); KEY_Init(); // ??????? OSInit(&err); //³õÊ&frac14;»¯UCOSIII OS_CRITICAL_ENTER(); //&frac12;øÈëÁÙ&frac12;çÇø //´´&frac12;¨¿ªÊ&frac14;ÈÎÎñ OSTaskCreate((OS_TCB * )&StartTaskTCB, //ÈÎÎñ¿ØÖÆ¿é (CPU_CHAR * )"start task", //ÈÎÎñÃû×Ö (OS_TASK_PTR )start_task, //ÈÎÎñº¯Êý (void * )0, //´«µÝ¸øÈÎÎñº¯ÊýµÄ²ÎÊý (OS_PRIO )START_TASK_PRIO, //ÈÎÎñÓÅÏÈ&frac14;¶ (CPU_STK * )&START_TASK_STK[0], //ÈÎÎñ¶ÑÕ»»ùµØÖ· (CPU_STK_SIZE)START_STK_SIZE/10, //ÈÎÎñ¶ÑÕ»Éî¶ÈÏÞλ (CPU_STK_SIZE)START_STK_SIZE, //ÈÎÎñ¶ÑÕ»´óС (OS_MSG_QTY )0, //ÈÎÎñÄÚ²¿ÏûÏ¢¶ÓÁÐÄÜ&sup1;»&frac12;ÓÊÕµÄ×î´óÏûÏ¢ÊýÄ¿,Ϊ0ʱ&frac12;ûÖ&sup1;&frac12;ÓÊÕÏûÏ¢ (OS_TICK )0, //µ±Ê&sup1;ÄÜʱ&frac14;䯬ÂÖתʱµÄʱ&frac14;䯬³¤¶È£¬Îª0ʱΪĬÈϳ¤¶È£¬ (void * )0, //Óû§²&sup1;³äµÄ´æ´¢Çø (OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, //ÈÎÎñÑ¡Ïî (OS_ERR * )&err); //´æ·Å¸Ãº¯Êý´íÎóʱµÄ·µ»ØÖµ OS_CRITICAL_EXIT(); //Í˳öÁÙ&frac12;çÇø OSStart(&err); //¿ªÆôUCOSIII } //¿ªÊ&frac14;ÈÎÎñÈÎÎñº¯Êý void start_task(void *p_arg) { OS_ERR err; CPU_SR_ALLOC(); p_arg = p_arg; CPU_Init(); #if OS_CFG_STAT_TASK_EN > 0u OSStatTaskCPUUsageInit(&err); //ͳ&frac14;ÆÈÎÎñ #endif #ifdef CPU_CFG_INT_DIS_MEAS_EN //Èç&sup1;ûÊ&sup1;ÄÜÁ˲âÁ¿ÖжÏ&sup1;رÕʱ&frac14;ä CPU_IntDisMeasMaxCurReset(); #endif #if OS_CFG_SCHED_ROUND_ROBIN_EN //µ±Ê&sup1;ÓÃʱ&frac14;䯬ÂÖתµÄʱºò //Ê&sup1;ÄÜʱ&frac14;䯬ÂÖתµ÷¶È&sup1;¦ÄÜ,ʱ&frac14;䯬³¤¶ÈΪ1¸öϵͳʱÖÓ&frac12;ÚÅÄ£¬&frac14;È1*5=5ms OSSchedRoundRobinCfg(DEF_ENABLED,1,&err); #endif OS_CRITICAL_ENTER(); //&frac12;øÈëÁÙ&frac12;çÇø //´´&frac12;¨TASK1ÈÎÎñ OSTaskCreate((OS_TCB * )&Task1_TaskTCB, (CPU_CHAR * )"Task1 task", (OS_TASK_PTR )task1_task, (void * )0, (OS_PRIO )TASK1_TASK_PRIO, (CPU_STK * )&TASK1_TASK_STK[0], (CPU_STK_SIZE)TASK1_STK_SIZE/10, (CPU_STK_SIZE)TASK1_STK_SIZE, (OS_MSG_QTY )0, (OS_TICK )0, (void * )0, (OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, (OS_ERR * )&err); //´´&frac12;¨TASK2ÈÎÎñ OSTaskCreate((OS_TCB * )&Task2_TaskTCB, (CPU_CHAR * )"task2 task", (OS_TASK_PTR )task2_task, (void * )0, (OS_PRIO )TASK2_TASK_PRIO, (CPU_STK * )&TASK2_TASK_STK[0], (CPU_STK_SIZE)TASK2_STK_SIZE/10, (CPU_STK_SIZE)TASK2_STK_SIZE, (OS_MSG_QTY )0, (OS_TICK )0, (void * )0, (OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, (OS_ERR * )&err); OS_CRITICAL_EXIT(); //Í˳öÁÙ&frac12;çÇø OSTaskDel((OS_TCB*)0,&err); //ɾ³ýstart_taskÈÎÎñ×ÔÉí } // ??1:??PB0(LED0) void task1_task(void *p_arg) { OS_ERR err; while (1) { Key_Scan(); if (key_pressed) { current_task = 2; // ?????2 key_pressed = 0; printf("Switch to Task2\n"); } else { // LED0?? GPIO_SetBits(GPIOB, GPIO_Pin_0); // LED0? OSTimeDlyHMSM(0, 0, 0, 5000, OS_OPT_TIME_HMSM_STRICT, &err); // 500ms GPIO_ResetBits(GPIOB, GPIO_Pin_0); // LED0? OSTimeDlyHMSM(0, 0, 0, 5000, OS_OPT_TIME_HMSM_STRICT, &err); // 500ms } } } void task2_task(void *p_arg) { OS_ERR err; while (1) { Key_Scan(); if (key_pressed) { current_task = 1; // ?????1 key_pressed = 0; printf("Switch back to Task1\n"); } else { // ????2??? // ??:LED1?? GPIO_SetBits(GPIOB, GPIO_Pin_1); // LED1? OSTimeDlyHMSM(0, 0, 0, 5000, OS_OPT_TIME_HMSM_STRICT, &err); // 500ms GPIO_ResetBits(GPIOB, GPIO_Pin_1); // LED1? OSTimeDlyHMSM(0, 0, 0, 5000, OS_OPT_TIME_HMSM_STRICT, &err); // 500ms } } }我现在需要刚开始时B0(任务一)LED闪烁,当按下按键后(A0)给予信息量,使得代码进入(任务二),再次摁下按键,两个任务均不执行
06-06
#include "delay.h" static uint32_t fam_nus = 0; static uint32_t fam_nms = 0; /* &sup1;¦ ÄÜ£º ÑÓʱ³õÊ&frac14;»¯ ²Î Êý£º ÎÞ ·µ»ØÖµ£º ÎÞ */ void Delay_Init(void) { //&sup1;رÕ&frac14;ÆÊ±¡¢²»´¥·¢Öжϡ¢&frac14;ÆÊýʱÖÓΪAHB/8 SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; //΢Ãë¡¢ºÁÃë&frac14;¶³õÖµ fam_nus = SystemCoreClock / 8000000; fam_nms = fam_nus * 1000; //&frac14;ÆÊýÆ÷ÇåÁã SysTick->VAL = 0; } /* &sup1;¦ ÄÜ£º ΢Ãë&frac14;¶ÑÓʱ ²Î Êý£º ctr ΢ÃëÊý ·µ»ØÖµ£º ÎÞ Ëµ Ã÷£º ÓÉÓÚSysTick->LOADΪ24λµÄ&frac14;Ä´æÆ÷£¬ ¸³ÖµÊ±²»Òª´óÓÚ0xffffff/(SystemCoreClock/8000000), ¶ÔÓÚSystemCoreClock=168MµÄÇé¿öÏ£¬ctrӦСÓÚ798915us */ void Delay_us(uint32_t ctr) { uint32_t tick_flag = 0; //¶¨Ê±Æ÷³õÖµ(SysTick->LOADΪ24bit) SysTick->LOAD = ctr * fam_nus - 1; //&frac14;ÆÊýÆ÷ÇåÁã SysTick->VAL = 0x00; //¿ªÆô¶¨Ê±Æ÷ SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; do { //»ñÈ¡¶¨Ê±Æ÷״̬ tick_flag = SysTick->CTRL; } while (!(tick_flag & (1 << 16)) && (tick_flag & 0x01)); //״̬ÅÐ¶Ï //&sup1;رÕ&frac14;ÆÊ± SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; SysTick->VAL = 0x00; } /* &sup1;¦ ÄÜ£º ºÁÃë&frac14;¶ÑÓʱ ²Î Êý£º ctr ºÁÃëÊý ·µ»ØÖµ£º ÎÞ Ëµ Ã÷£º ÓÉÓÚSysTick->LOADΪ24λµÄ&frac14;Ä´æÆ÷£¬ ¸³ÖµÊ±²»Òª´óÓÚ0xffffff/(SystemCoreClock/8000000*1000), ¶ÔÓÚSystemCoreClock=168MµÄÇé¿öÏ£¬ctrӦСÓÚ798ms. ¶ÔÓÚ´óÓÚ798msµÄÇé¿ö£¬¿ÉÒÔ¶à´Îµ÷Óñ¾º¯Êý&frac12;øÐÐÊýÖµµþ&frac14;Ó£¬ Ò²¿É&frac12;«±¾º¯ÊýµÄÄÚÈÝÈ«²¿×¢ÊÍ£¬²ÉÓú¯ÊýÄ©¶ËËùÌá&sup1;©µÄwhileÑ­»·&frac14;´¿É£¨Ëæ×Åʱ&frac14;äµÄµþ&frac14;Ó£¬¿ÉÄÜ»áÓÐ&frac12;Ï´óÎó²î£© */ void Delay_ms(uint32_t ctr) { uint32_t tick_flag = 0; //¶¨Ê±Æ÷³õÖµ(SysTick->LOADΪ24bit) SysTick->LOAD = (uint32_t)ctr * fam_nms - 1; //&frac14;ÆÊýÆ÷ÇåÁã SysTick->VAL = 0x00; //¿ªÆô¶¨Ê±Æ÷ SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; do { //»ñÈ¡¶¨Ê±Æ÷״̬ tick_flag = SysTick->CTRL; } while ((tick_flag & 0x01) && !(tick_flag & (1 << 16))); //״̬ÅÐ¶Ï //&sup1;رÕ&frac14;ÆÊ± SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; SysTick->VAL = 0X00; /* while(ctr--) { Delay_us(1000); } */ } #include "usart1.h" uint16_t usart1_length = 0; //´¢´æ´®¿ÚÒ»&frac12;ÓÊÕÊý¾ÝÊý×éµÄ³¤¶È uint8_t usart1_buffer[USART1_RX_SIZE] = { 0 }; //´¢´æ´®¿ÚÒ»&frac12;ÓÊÕÊý¾ÝµÄÊý×é uint8_t usart1_tc = 0; //´®¿Ú&frac12;ÓÊÕÊý¾ÝʱµÄ&frac14;ÆÊýÆ÷ uint8_t usart1_flag = 0; //´®¿Ú±ê־λ,1 ±íʾ&frac12;ÓÊÕÍê³É,0 ±íʾ¿ÉÒÔ&frac12;ÓÊÕÊý¾Ý /* &sup1;¦ ÄÜ£º ´®¿ÚµÄ³õÊ&frac14;»¯º¯Êý ²Î Êý£º baudrate ´®¿ÚµÄ²¨ÌØÂÊ ·µ»ØÖµ£º ÎÞ */ void USART1_Init(uint32_t baudrate) { GPIO_InitTypeDef GPIO_InitStructure; //¶¨ÒåGPIO³õÊ&frac14;»¯&frac12;á&sup1;&sup1;Ìå±äÁ¿ USART_InitTypeDef USART_InitStructure; //¶¨Òå´®¿Ú³õÊ&frac14;»¯&frac12;á&sup1;&sup1;Ìå±äÁ¿ NVIC_InitTypeDef NVIC_InitStructure; //¶¨ÒåNVIC³õÊ&frac14;»¯&frac12;á&sup1;&sup1;Ìå±äÁ¿ USART1_GPIO_CLK_INIT(USART1_GPIO_CLOCK, ENABLE); //¿ªÆôÍâÉèGPIOʱÖÓ USART1_CLK_INIT(USART1_CLOCK, ENABLE); //¿ªÆôÍâÉèʱÖÓUSART //GPIOÒý&frac12;Ÿ´Óõ&frac12;´®¿ÚÉÏ GPIO_PinAFConfig(USART1_TX_PORT, USART1_TX_GPIO_PinSource, GPIO_AF_USART1); GPIO_PinAFConfig(USART1_RX_PORT, USART1_RX_GPIO_PinSource, GPIO_AF_USART1); //GPIOÅäÖà GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //¸´ÓÃÄ£Ê&frac12; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //ÍÆÍìÊä³ö GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //Êä³öËÙ¶È //USART Tx ³õÊ&frac14;»¯ GPIO_InitStructure.GPIO_Pin = USART1_TX_PIN; //Ñ¡ÔñÒý&frac12;Å GPIO_Init(USART1_TX_PORT, &GPIO_InitStructure); //³õÊ&frac14;»¯ÅäÖà //USART Rx ³õÊ&frac14;»¯ GPIO_InitStructure.GPIO_Pin = USART1_RX_PIN; //Ñ¡ÔñÒý&frac12;Å GPIO_Init(USART1_RX_PORT, &GPIO_InitStructure); //³õÊ&frac14;»¯ÅäÖà //´®¿Ú²ÎÊýÉèÖà USART_InitStructure.USART_BaudRate = baudrate; //ÉèÖò¨ÌØÂÊ USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //ÉèÖô®¿ÚÄ£Ê&frac12; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //ÉèÖÃÎÞÓ²&frac14;þÁ÷¿ØÖÆ USART_InitStructure.USART_WordLength = USART_WordLength_8b; //8bitÊý¾Ýλ USART_InitStructure.USART_Parity = USART_Parity_No; //ÎÞУÑéλ USART_InitStructure.USART_StopBits = USART_StopBits_1; //1Í£Ö&sup1;λ USART_Init(USART1, &USART_InitStructure); //³õÊ&frac14;»¯ÅäÖô®¿Ú //´®¿ÚÖжÏÏìÓ¦ÓÅÏÈ&frac14;¶ÉèÖà NVIC_InitStructure.NVIC_IRQChannel = USART1_INT_IRQn; //Ñ¡ÔñÖжÏͨµÀ NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //ÉèÖÃÏÈÕ&frac14;ÓÅÏÈ&frac14;¶ NVIC_InitStructure.NVIC_IRQChannelSubPriority = 8; //ÉèÖôÓÓÅÏÈ&frac14;¶ NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //ÉèÖÃÖжÏͨµÀ¿ªÆô NVIC_Init(&NVIC_InitStructure); //³õÊ&frac14;»¯ÅäÖÃÖжÏÓÅÏÈ&frac14;¶ USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //¿ªÆô´®¿Ú&frac12;ÓÊÕÖжÏÊ&sup1;ÄÜ USART_Cmd(USART1, ENABLE); //¿ªÆô´®¿Ú } /* &sup1;¦ ÄÜ£º ´®¿Ú·¢Ë͵¥×Ö&frac12;ÚÊý¾Ý ²Î Êý£º src ·¢Ë͵ĵ¥×Ö&frac12;ÚÊý¾Ý ·µ»ØÖµ£º ÎÞ */ void USART1_Send_Byte(uint8_t src) { USART_SendData(USART1, src); //·¢ËÍÊý¾Ý while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); //µÈ´ý´®¿Ú·¢ËÍÍê³É } /* &sup1;¦ ÄÜ£º ´®¿Ú·¢ËÍÒ»¶¨³¤¶ÈµÄ×Ö&frac12;ÚÊý¾Ý ²Î Êý£º src ·¢Ë͵Ä×Ö·û´®Êý¾Ý length ·¢ËÍ×Ö&frac12;Ú/×Ö·ûµÄ³¤¶È ·µ»ØÖµ£º ÎÞ */ void USART1_Send_Length_String(uint8_t* src, uint16_t length) { uint16_t Tx_cut = 0; uint16_t Tx_length = 0; Tx_length = length; while (Tx_cut != Tx_length) //Ñ­»··¢ËÍÖ¸¶¨³¤¶ÈµÄÊý¾Ý { USART1_Send_Byte(*(src + Tx_cut)); //·¢ËÍÒ»¸ö×Ö&frac12;ÚÐÅÏ¢ Tx_cut++; //Ö¸Õë×ÔÔö } } /* &sup1;¦ ÄÜ£º ´®¿Ú·¢ËÍ×Ö·û´®Êý¾Ý ²Î Êý£º src ·¢Ë͵Ä×Ö·û´®Êý¾Ý,ÒÔ'\0'&frac14;´0x00±êʶ&frac12;áÊø·¢ËÍÊý¾Ý ·µ»ØÖµ£º ÎÞ */ void USART1_Send_String(char* src) { uint16_t Tx_cut = 0; while (*(src + Tx_cut) != '\0') //&frac14;ì²âµ&frac12;ÏÂÒ»¸ö·¢ËÍ×Ö&frac12;ÚΪ'\0'ʱͣÖ&sup1;·¢ËÍ { USART1_Send_Byte(*(src + Tx_cut)); //·¢ËÍÒ»¸ö×Ö&frac12;ÚÐÅÏ¢ Tx_cut++; //Ö¸Õë×ÔÔö } } /* &sup1;¦ ÄÜ£º ´®¿ÚÇå³ý´¢´æÊý×éµÄÊý¾Ý ²Î Êý£º ÎÞ ·µ»ØÖµ£º ÎÞ */ void USART1_Clear_Buffer(void) { while (usart1_length) //Çå¿Õ&frac12;ÓÊÕµ&frac12;µÄÊý¾Ý { usart1_length--; //Ö¸Õë×Ô&frac14;õ usart1_buffer[usart1_length] = 0; //Êý¾ÝÇåÁã } } /* &sup1;¦ ÄÜ£º ´®¿ÚµÄ&frac12;ÓÊÕÖжϷþÎñº¯Êý ²Î Êý£º ÎÞ ·µ»ØÖµ£º ÎÞ */ void USART1_INT_IRQHandler(void) { if (USART_GetITStatus(USART1, USART_IT_RXNE) == SET) //Åжϴ®¿Ú&frac12;ÓÊÕÖжϱê־λ { usart1_buffer[usart1_length++] = USART_ReceiveData(USART1); //¶ÁÈ¡´®¿ÚÊý¾Ý if (usart1_length >= USART1_RX_SIZE) //Èç&sup1;û´¢´æ³¬³ö³¤¶È { usart1_length = 0; //ÖØÐ´ÓÊý×é0¿ªÊ&frac14;´¢´æ×Ö&frac12;Ú } } USART_ClearITPendingBit(USART1, USART_IT_RXNE); //Çå³ý´®¿ÚÖжÏ&frac12;ÓÊÕ±ê־λ } /********************printfÖØ¶¨ÏòΪ´®¿ÚÊä³ö********************/ #ifdef __GNUC__ /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf set to 'Yes') calls __io_putchar() */ #define PUTCHAR_PROTOTYPE int __io_putchar(int ch) #else #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) #endif /* __GNUC__ */ int fputc(int ch, FILE *f) { USART_SendData(USART1, (uint16_t)ch); //·¢ËÍÊý¾Ý while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);//µÈ´ý´®¿Ú·¢ËÍÍê³É return ch; }#include "stm32f4xx.h" #include "delay.h" #include "led.h" #include "timer3.h" #include "usart1.h" int main(void) { }定时器:结合串口通信实验,使用定时器中断和串口接收中断完成串口通信实验。系统上电后,STM32发送“ready!”字符串字符给PC,设定1-100数值,开始倒计时,例如设置初始数值为30,就进行30s倒计时,每倒计时1s就给PC串口发送一个数值,例如:30、29、28...;倒计时结束后停止发送。
最新发布
11-08
#include "bsp_esp8266.h" #include "common.h" #include "stdio.h" #include "string.h" #include "stdbool.h" #include "bsp_SysTick.h" static void ESP8266_GPIO_Config ( void ); static void ESP8266_USART_Config ( void ); static void ESP8266_USART_NVIC_Configuration ( void ); struct STRUCT_USARTx_Fram strEsp8266_Fram_Record = { 0 }; /** * @brief ESP8266³õÊ&frac14;»¯º¯Êý * @param ÎÞ * @retval ÎÞ */ void ESP8266_Init ( void ) { ESP8266_GPIO_Config (); ESP8266_USART_Config (); macESP8266_RST_HIGH_LEVEL(); macESP8266_CH_DISABLE(); } /** * @brief ³õÊ&frac14;»¯ESP8266Óõ&frac12;µÄGPIOÒý&frac12;Å * @param ÎÞ * @retval ÎÞ */ static void ESP8266_GPIO_Config ( void ) { /*¶¨ÒåÒ»¸öGPIO_InitTypeDefÀàÐ͵Ä&frac12;á&sup1;&sup1;Ìå*/ GPIO_InitTypeDef GPIO_InitStructure; /* ÅäÖà CH_PD Òý&frac12;Å*/ macESP8266_CH_PD_APBxClock_FUN ( macESP8266_CH_PD_CLK, ENABLE ); GPIO_InitStructure.GPIO_Pin = macESP8266_CH_PD_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init ( macESP8266_CH_PD_PORT, & GPIO_InitStructure ); /* ÅäÖà RST Òý&frac12;Å*/ macESP8266_RST_APBxClock_FUN ( macESP8266_RST_CLK, ENABLE ); GPIO_InitStructure.GPIO_Pin = macESP8266_RST_PIN; GPIO_Init ( macESP8266_RST_PORT, & GPIO_InitStructure ); } /** * @brief ³õÊ&frac14;»¯ESP8266Óõ&frac12;µÄ USART * @param ÎÞ * @retval ÎÞ */ static void ESP8266_USART_Config ( void ) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; /* config USART clock */ macESP8266_USART_APBxClock_FUN ( macESP8266_USART_CLK, ENABLE ); macESP8266_USART_GPIO_APBxClock_FUN ( macESP8266_USART_GPIO_CLK, ENABLE ); /* USART GPIO config */ /* Configure USART Tx as alternate function push-pull */ GPIO_InitStructure.GPIO_Pin = macESP8266_USART_TX_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(macESP8266_USART_TX_PORT, &GPIO_InitStructure); /* Configure USART Rx as input floating */ GPIO_InitStructure.GPIO_Pin = macESP8266_USART_RX_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(macESP8266_USART_RX_PORT, &GPIO_InitStructure); /* USART1 mode config */ USART_InitStructure.USART_BaudRate = macESP8266_USART_BAUD_RATE; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No ; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(macESP8266_USARTx, &USART_InitStructure); /* ÖжÏÅäÖà */ USART_ITConfig ( macESP8266_USARTx, USART_IT_RXNE, ENABLE ); //Ê&sup1;ÄÜ´®¿Ú&frac12;ÓÊÕÖÐ¶Ï USART_ITConfig ( macESP8266_USARTx, USART_IT_IDLE, ENABLE ); //Ê&sup1;ÄÜ´®¿Ú×ÜÏß¿ÕÏÐÖÐ¶Ï ESP8266_USART_NVIC_Configuration (); USART_Cmd(macESP8266_USARTx, ENABLE); } /** * @brief ÅäÖà ESP8266 USART µÄ NVIC ÖÐ¶Ï * @param ÎÞ * @retval ÎÞ */ static void ESP8266_USART_NVIC_Configuration ( void ) { NVIC_InitTypeDef NVIC_InitStructure; /* Configure the NVIC Preemption Priority Bits */ NVIC_PriorityGroupConfig ( macNVIC_PriorityGroup_x ); /* Enable the USART2 Interrupt */ NVIC_InitStructure.NVIC_IRQChannel = macESP8266_USART_IRQ; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } /* * º¯ÊýÃû£ºESP8266_Rst * ÃèÊö £ºÖØÆôWF-ESP8266Ä£¿é * ÊäÈë £ºÎÞ * ·µ»Ø : ÎÞ * µ÷Óà £º±» ESP8266_AT_Test µ÷Óà */ void ESP8266_Rst ( void ) { #if 0 ESP8266_Cmd ( "AT+RST", "OK", "ready", 2500 ); #else macESP8266_RST_LOW_LEVEL(); Delay_ms ( 500 ); macESP8266_RST_HIGH_LEVEL(); #endif } /* * º¯ÊýÃû£ºESP8266_Cmd * ÃèÊö £º¶ÔWF-ESP8266Ä£¿é·¢ËÍATÖ¸Áî * ÊäÈë £ºcmd£¬´ý·¢Ë͵ÄÖ¸Áî * reply1£¬reply2£¬ÆÚ´ýµÄÏìÓ¦£¬ÎªNULL±í²»ÐèÏìÓ¦£¬Á&frac12;ÕßΪ»òÂß&frac14;­&sup1;ØÏµ * waittime£¬µÈ´ýÏìÓ¦µÄʱ&frac14;ä * ·µ»Ø : 1£¬Ö¸Áî·¢ËͳÉ&sup1;¦ * 0£¬Ö¸Áî·¢ËÍʧ°Ü * µ÷Óà £º±»Íⲿµ÷Óà */ bool ESP8266_Cmd ( char * cmd, char * reply1, char * reply2, u32 waittime ) { strEsp8266_Fram_Record .InfBit .FramLength = 0; //´ÓпªÊ&frac14;&frac12;ÓÊÕеÄÊý¾Ý°ü macESP8266_Usart ( "%s\r\n", cmd ); if ( ( reply1 == 0 ) && ( reply2 == 0 ) ) //²»ÐèÒª&frac12;ÓÊÕÊý¾Ý return true; Delay_ms ( waittime ); //ÑÓʱ strEsp8266_Fram_Record .Data_RX_BUF [ strEsp8266_Fram_Record .InfBit .FramLength ] = '\0'; macPC_Usart ( "%s", strEsp8266_Fram_Record .Data_RX_BUF ); if ( ( reply1 != 0 ) && ( reply2 != 0 ) ) return ( ( bool ) strstr ( strEsp8266_Fram_Record .Data_RX_BUF, reply1 ) || ( bool ) strstr ( strEsp8266_Fram_Record .Data_RX_BUF, reply2 ) ); else if ( reply1 != 0 ) return ( ( bool ) strstr ( strEsp8266_Fram_Record .Data_RX_BUF, reply1 ) ); else return ( ( bool ) strstr ( strEsp8266_Fram_Record .Data_RX_BUF, reply2 ) ); } /* * º¯ÊýÃû£ºESP8266_AT_Test * ÃèÊö £º¶ÔWF-ESP8266Ä£¿é&frac12;øÐÐAT²âÊÔÆô¶¯ * ÊäÈë £ºÎÞ * ·µ»Ø : ÎÞ * µ÷Óà £º±»Íⲿµ÷Óà */ //void ESP8266_AT_Test ( void ) //{ // macESP8266_RST_HIGH_LEVEL(); // // Delay_ms ( 1000 ); // // while ( ! ESP8266_Cmd ( "AT", "OK", NULL, 500 ) ) ESP8266_Rst (); //} void ESP8266_AT_Test ( void ) { char count=0; macESP8266_RST_HIGH_LEVEL(); Delay_ms ( 1000 ); while ( count < 10 ) { if( ESP8266_Cmd ( "AT", "OK", NULL, 500 ) ) return; ESP8266_Rst(); ++ count; } } /* * º¯ÊýÃû£ºESP8266_Net_Mode_Choose * ÃèÊö £ºÑ¡ÔñWF-ESP8266Ä£¿éµÄ&sup1;¤×÷Ä£Ê&frac12; * ÊäÈë £ºenumMode£¬&sup1;¤×÷Ä£Ê&frac12; * ·µ»Ø : 1£¬Ñ¡Ôñ³É&sup1;¦ * 0£¬Ñ¡Ôñʧ°Ü * µ÷Óà £º±»Íⲿµ÷Óà */ bool ESP8266_Net_Mode_Choose ( ENUM_Net_ModeTypeDef enumMode ) { switch ( enumMode ) { case STA: return ESP8266_Cmd ( "AT+CWMODE=1", "OK", "no change", 2500 ); case AP: return ESP8266_Cmd ( "AT+CWMODE=2", "OK", "no change", 2500 ); case STA_AP: return ESP8266_Cmd ( "AT+CWMODE=3", "OK", "no change", 2500 ); default: return false; } } /* * º¯ÊýÃû£ºESP8266_JoinAP * ÃèÊö £ºWF-ESP8266Ä£¿éÁ¬&frac12;ÓÍⲿWiFi * ÊäÈë £ºpSSID£¬WiFiÃû³Æ×Ö·û´® * £ºpPassWord£¬WiFiÃÜÂë×Ö·û´® * ·µ»Ø : 1£¬Á¬&frac12;Ó³É&sup1;¦ * 0£¬Á¬&frac12;Óʧ°Ü * µ÷Óà £º±»Íⲿµ÷Óà */ bool ESP8266_JoinAP ( char * pSSID, char * pPassWord ) { char cCmd [120]; sprintf ( cCmd, "AT+CWJAP=\"%s\",\"%s\"", pSSID, pPassWord ); return ESP8266_Cmd ( cCmd, "OK", NULL, 5000 ); } /* * º¯ÊýÃû£ºESP8266_BuildAP * ÃèÊö £ºWF-ESP8266Ä£¿é´´&frac12;¨WiFiÈȵã * ÊäÈë £ºpSSID£¬WiFiÃû³Æ×Ö·û´® * £ºpPassWord£¬WiFiÃÜÂë×Ö·û´® * £ºenunPsdMode£¬WiFi&frac14;ÓÃÜ·&frac12;Ê&frac12;´úºÅ×Ö·û´® * ·µ»Ø : 1£¬´´&frac12;¨³É&sup1;¦ * 0£¬´´&frac12;¨Ê§°Ü * µ÷Óà £º±»Íⲿµ÷Óà */ bool ESP8266_BuildAP ( char * pSSID, char * pPassWord, ENUM_AP_PsdMode_TypeDef enunPsdMode ) { char cCmd [120]; sprintf ( cCmd, "AT+CWSAP=\"%s\",\"%s\",1,%d", pSSID, pPassWord, enunPsdMode ); return ESP8266_Cmd ( cCmd, "OK", 0, 1000 ); } /* * º¯ÊýÃû£ºESP8266_Enable_MultipleId * ÃèÊö £ºWF-ESP8266Ä£¿éÆô¶¯¶àÁ¬&frac12;Ó * ÊäÈë £ºenumEnUnvarnishTx£¬ÅäÖÃÊÇ·ñ¶àÁ¬&frac12;Ó * ·µ»Ø : 1£¬ÅäÖóÉ&sup1;¦ * 0£¬ÅäÖÃʧ°Ü * µ÷Óà £º±»Íⲿµ÷Óà */ bool ESP8266_Enable_MultipleId ( FunctionalState enumEnUnvarnishTx ) { char cStr [20]; sprintf ( cStr, "AT+CIPMUX=%d", ( enumEnUnvarnishTx ? 1 : 0 ) ); return ESP8266_Cmd ( cStr, "OK", 0, 500 ); } /* * º¯ÊýÃû£ºESP8266_Link_Server * ÃèÊö £ºWF-ESP8266Ä£¿éÁ¬&frac12;ÓÍⲿ·þÎñÆ÷ * ÊäÈë £ºenumE£¬ÍøÂçЭÒé * £ºip£¬·þÎñÆ÷IP×Ö·û´® * £ºComNum£¬·þÎñÆ÷¶Ë¿Ú×Ö·û´® * £ºid£¬Ä£¿éÁ¬&frac12;Ó·þÎñÆ÷µÄID * ·µ»Ø : 1£¬Á¬&frac12;Ó³É&sup1;¦ * 0£¬Á¬&frac12;Óʧ°Ü * µ÷Óà £º±»Íⲿµ÷Óà */ bool ESP8266_Link_Server ( ENUM_NetPro_TypeDef enumE, char * ip, char * ComNum, ENUM_ID_NO_TypeDef id) { char cStr [100] = { 0 }, cCmd [120]; switch ( enumE ) { case enumTCP: sprintf ( cStr, "\"%s\",\"%s\",%s", "TCP", ip, ComNum ); break; case enumUDP: sprintf ( cStr, "\"%s\",\"%s\",%s", "UDP", ip, ComNum ); break; default: break; } if ( id < 5 ) sprintf ( cCmd, "AT+CIPSTART=%d,%s", id, cStr); else sprintf ( cCmd, "AT+CIPSTART=%s", cStr ); return ESP8266_Cmd ( cCmd, "OK", "ALREAY CONNECT", 4000 ); } /* * º¯ÊýÃû£ºESP8266_StartOrShutServer * ÃèÊö £ºWF-ESP8266Ä£¿é¿ªÆô»ò&sup1;رշþÎñÆ÷Ä£Ê&frac12; * ÊäÈë £ºenumMode£¬¿ªÆô/&sup1;Ø±Õ * £ºpPortNum£¬·þÎñÆ÷¶Ë¿ÚºÅ×Ö·û´® * £ºpTimeOver£¬·þÎñÆ÷³¬Ê±Ê±&frac14;ä×Ö·û´®£¬µ¥Î»£ºÃë * ·µ»Ø : 1£¬²Ù×÷³É&sup1;¦ * 0£¬²Ù×÷ʧ°Ü * µ÷Óà £º±»Íⲿµ÷Óà */ bool ESP8266_StartOrShutServer ( FunctionalState enumMode, char * pPortNum, char * pTimeOver ) { char cCmd1 [120], cCmd2 [120]; if ( enumMode ) { sprintf ( cCmd1, "AT+CIPSERVER=%d,%s", 1, pPortNum ); sprintf ( cCmd2, "AT+CIPSTO=%s", pTimeOver ); return ( ESP8266_Cmd ( cCmd1, "OK", 0, 500 ) && ESP8266_Cmd ( cCmd2, "OK", 0, 500 ) ); } else { sprintf ( cCmd1, "AT+CIPSERVER=%d,%s", 0, pPortNum ); return ESP8266_Cmd ( cCmd1, "OK", 0, 500 ); } } /* * º¯ÊýÃû£ºESP8266_Get_LinkStatus * ÃèÊö £º»ñÈ¡ WF-ESP8266 µÄÁ¬&frac12;Ó״̬£¬&frac12;ÏÊʺϵ¥¶Ë¿ÚʱÊ&sup1;Óà * ÊäÈë £ºÎÞ * ·µ»Ø : 2£¬»ñµÃip * 3£¬&frac12;¨Á¢Á¬&frac12;Ó * 3£¬Ê§È¥Á¬&frac12;Ó * 0£¬»ñȡ״̬ʧ°Ü * µ÷Óà £º±»Íⲿµ÷Óà */ uint8_t ESP8266_Get_LinkStatus ( void ) { if ( ESP8266_Cmd ( "AT+CIPSTATUS", "OK", 0, 500 ) ) { if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "STATUS:2\r\n" ) ) return 2; else if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "STATUS:3\r\n" ) ) return 3; else if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "STATUS:4\r\n" ) ) return 4; } return 0; } /* * º¯ÊýÃû£ºESP8266_Get_IdLinkStatus * ÃèÊö £º»ñÈ¡ WF-ESP8266 µÄ¶Ë¿Ú£¨Id£©Á¬&frac12;Ó״̬£¬&frac12;ÏÊʺ϶à¶Ë¿ÚʱÊ&sup1;Óà * ÊäÈë £ºÎÞ * ·µ»Ø : ¶Ë¿Ú£¨Id£©µÄÁ¬&frac12;Ó״̬£¬µÍ5λΪÓÐЧ룬·Ö±ð¶ÔÓ¦Id5~0£¬Ä³Î»ÈôÖÃ1±í¸ÃId&frac12;¨Á¢ÁËÁ¬&frac12;Ó£¬Èô±»Çå0±í¸ÃIdδ&frac12;¨Á¢Á¬&frac12;Ó * µ÷Óà £º±»Íⲿµ÷Óà */ uint8_t ESP8266_Get_IdLinkStatus ( void ) { uint8_t ucIdLinkStatus = 0x00; if ( ESP8266_Cmd ( "AT+CIPSTATUS", "OK", 0, 500 ) ) { if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "+CIPSTATUS:0," ) ) ucIdLinkStatus |= 0x01; else ucIdLinkStatus &= ~ 0x01; if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "+CIPSTATUS:1," ) ) ucIdLinkStatus |= 0x02; else ucIdLinkStatus &= ~ 0x02; if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "+CIPSTATUS:2," ) ) ucIdLinkStatus |= 0x04; else ucIdLinkStatus &= ~ 0x04; if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "+CIPSTATUS:3," ) ) ucIdLinkStatus |= 0x08; else ucIdLinkStatus &= ~ 0x08; if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "+CIPSTATUS:4," ) ) ucIdLinkStatus |= 0x10; else ucIdLinkStatus &= ~ 0x10; } return ucIdLinkStatus; } /* * º¯ÊýÃû£ºESP8266_Inquire_ApIp * ÃèÊö £º»ñÈ¡ F-ESP8266 µÄ AP IP * ÊäÈë £ºpApIp£¬´æ·Å AP IP µÄÊý×éµÄÊ×µØÖ· * ucArrayLength£¬´æ·Å AP IP µÄÊý×éµÄ³¤¶È * ·µ»Ø : 0£¬»ñȡʧ°Ü * 1£¬»ñÈ¡³É&sup1;¦ * µ÷Óà £º±»Íⲿµ÷Óà */ uint8_t ESP8266_Inquire_ApIp ( char * pApIp, uint8_t ucArrayLength ) { char uc; char * pCh; ESP8266_Cmd ( "AT+CIFSR", "OK", 0, 500 ); pCh = strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "APIP,\"" ); if ( pCh ) pCh += 6; else return 0; for ( uc = 0; uc < ucArrayLength; uc ++ ) { pApIp [ uc ] = * ( pCh + uc); if ( pApIp [ uc ] == '\"' ) { pApIp [ uc ] = '\0'; break; } } return 1; } /* * º¯ÊýÃû£ºESP8266_UnvarnishSend * ÃèÊö £ºÅäÖÃWF-ESP8266Ä£¿é&frac12;øÈë͸´«·¢ËÍ * ÊäÈë £ºÎÞ * ·µ»Ø : 1£¬ÅäÖóÉ&sup1;¦ * 0£¬ÅäÖÃʧ°Ü * µ÷Óà £º±»Íⲿµ÷Óà */ bool ESP8266_UnvarnishSend ( void ) { if ( ! ESP8266_Cmd ( "AT+CIPMODE=1", "OK", 0, 500 ) ) return false; return ESP8266_Cmd ( "AT+CIPSEND", "OK", ">", 500 ); } /* * º¯ÊýÃû£ºESP8266_ExitUnvarnishSend * ÃèÊö £ºÅäÖÃWF-ESP8266Ä£¿éÍ˳ö͸´«Ä£Ê&frac12; * ÊäÈë £ºÎÞ * ·µ»Ø : ÎÞ * µ÷Óà £º±»Íⲿµ÷Óà */ void ESP8266_ExitUnvarnishSend ( void ) { Delay_ms ( 1000 ); macESP8266_Usart ( "+++" ); Delay_ms ( 500 ); } /* * º¯ÊýÃû£ºESP8266_SendString * ÃèÊö £ºWF-ESP8266Ä£¿é·¢ËÍ×Ö·û´® * ÊäÈë £ºenumEnUnvarnishTx£¬ÉùÃ÷ÊÇ·ñÒÑÊ&sup1;ÄÜÁË͸´«Ä£Ê&frac12; * £ºpStr£¬Òª·¢Ë͵Ä×Ö·û´® * £ºulStrLength£¬Òª·¢Ë͵Ä×Ö·û´®µÄ×Ö&frac12;ÚÊý * £ºucId£¬ÄĸöID·¢Ë͵Ä×Ö·û´® * ·µ»Ø : 1£¬·¢ËͳÉ&sup1;¦ * 0£¬·¢ËÍʧ°Ü * µ÷Óà £º±»Íⲿµ÷Óà */ bool ESP8266_SendString ( FunctionalState enumEnUnvarnishTx, char * pStr, u32 ulStrLength, ENUM_ID_NO_TypeDef ucId ) { char cStr [20]; bool bRet = false; if ( enumEnUnvarnishTx ) { macESP8266_Usart ( "%s", pStr ); bRet = true; } else { if ( ucId < 5 ) sprintf ( cStr, "AT+CIPSEND=%d,%d", ucId, ulStrLength + 2 ); else sprintf ( cStr, "AT+CIPSEND=%d", ulStrLength + 2 ); ESP8266_Cmd ( cStr, "> ", 0, 1000 ); bRet = ESP8266_Cmd ( pStr, "SEND OK", 0, 1000 ); } return bRet; } /* * º¯ÊýÃû£ºESP8266_ReceiveString * ÃèÊö £ºWF-ESP8266Ä£¿é&frac12;ÓÊÕ×Ö·û´® * ÊäÈë £ºenumEnUnvarnishTx£¬ÉùÃ÷ÊÇ·ñÒÑÊ&sup1;ÄÜÁË͸´«Ä£Ê&frac12; * ·µ»Ø : &frac12;ÓÊÕµ&frac12;µÄ×Ö·û´®Ê×µØÖ· * µ÷Óà £º±»Íⲿµ÷Óà */ char * ESP8266_ReceiveString ( FunctionalState enumEnUnvarnishTx ) { char * pRecStr = 0; strEsp8266_Fram_Record .InfBit .FramLength = 0; strEsp8266_Fram_Record .InfBit .FramFinishFlag = 0; while ( ! strEsp8266_Fram_Record .InfBit .FramFinishFlag ); strEsp8266_Fram_Record .Data_RX_BUF [ strEsp8266_Fram_Record .InfBit .FramLength ] = '\0'; if ( enumEnUnvarnishTx ) pRecStr = strEsp8266_Fram_Record .Data_RX_BUF; else { if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "+IPD" ) ) pRecStr = strEsp8266_Fram_Record .Data_RX_BUF; } return pRecStr; } 对每一行加上注释
06-24
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值