»Æ³ÎÇ壺ÎÒ¹ú»¥ÁªÍøÁìÓòµÄз¢Õ¹ºÍÐÂÇ÷ÊÆ

本文回顾了2007年中国IT行业的双会盛况,提及了由中国互联网协会主办的第三届计算机会议,强调了高翔参会,并对上午大会的良好氛围进行了描述。
ÉùÃ÷£ºÌÚѶ¿Æ¼¼¿¯µÇ´ËÎÄÕÂΪ¡¶2007ÖйúITÁ½»á¡·»Ø¹Ë£¬¸ÃÎÄÕÂʱ¼äΪ07Äê12ÔÂ2ÈÕ¡£ ×𾴵ĸ÷λÀ´±ö£¬¸÷λÅóÓÑ£¬´ó¼ÒÉÏÎçºÃ¡£ºÜ¸ßÐ˲μӽñÌìµÄÊ¢»á¡£Ê×ÏÈÎÒ´ú±íÖйú»¥ÁªÍøÐ­»á£¬¶ÔÓɼÆÊÀÍøÖ÷°ìµÄµÚÈý½ì¼ÆËã»ú ...
#################################################################### ## ## ## ## ## CODE SKELETON v1.0.0 ## ## ## ## TP-LINK ## ## 2013.7.9 ## #################################################################### 1. žÅÊö CODE SKELETONÊÇÌáÈ¡CODEʵÏÖµÄÖ÷Ìå¿òŒÜ¡£ËüžúʵŒÊʵÏÖ»&sup1;ÓзÇ&sup3;£ŽóµÄ²î Ÿà¡£·œ±ãŽóŒÒÊìÏ€CODEµÄ&sup1;ŠÄÜ»®·ÖÒÔŒ°ŽóžÅÁËœâÓïÒô&sup1;ŠÄÜÉæŒ°µÄһЩ±à&sup3;ÌŒŒÊõ¡£ ËüÖ÷Òª°üº¬menuconfigµÄ»ùŽ¡Ê&sup1;Óá¢MakefileŽîœš&sup1;€&sup3;Ì¡¢¶¯Ì¬¿âµÄÊ&sup1;Óᢟ²Ì¬¿â µÄÊ&sup1;Óᢌòµ¥ÖÕ¶ËI/O¡¢»Øµ÷º¯Êý¡¢¶àÏß&sup3;̱à&sup3;Ì¡¢socket±à&sup3;Ì¡¢Œòµ¥Çý¶¯±à&sup3;ÌµÈ ÄÚÈÝ¡£&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ÓòÌלÓ×ÖÓÃÓÚœø&sup3;ÌŒäÍšÐÅ¡£ 3. ĿŒœá&sup1;&sup1; TOP [code skeleton¶¥²ãĿŒ] | *---> readme [±ŸÎĵµ *-*] | *---> build [&sup1;€&sup3;̱àÒë»·Ÿ&sup3;] | *---> config [ÅäÖÃĿŒ£¬µ±Ç°Ö»ÓÐmenuconfig] | *---> install [&sup1;€&sup3;̱àÒëºóÉú&sup3;ɵÄÊ&sup1;ÓÃÎÄŒþ] | *---> code [ÔŽŽúÂë] | *---> modules [ÄÚºËÄ£¿é] | | | *---> simple [Œòµ¥×Ö·ûÇý¶¯ÊµÏÖ] | *---> apps [Óû§²ãŽúÂë] | *---> inc [&sup1;«ÓÃÍ·ÎÄŒþ] | *---> cs_libs [¿âÎÄŒþ] | | | *---> mini_shell | | | *---> socket | *---> cs_server | *---> cs_client 4. Ê&sup1;ÓòœÖè 4.1 ÅäÖÃ&sup1;€&sup3;Ì œøÈëTOP/buildĿŒ£¬ÊäÈëÏÂÃæÃüÁî¡£#ÊÇlinux shellÌáÊŸ·û£¬²»ÊôÓÚÃüÁ·Ö£¬ ºóÐøŸùÏàͬº¬Òå¡£Èç&sup1;û²»ÊäÈëMODEL=xxx, ĬÈÏÊ&sup1;ÓÃMODEL=TEST¡£ÅäÖÃÍê&sup3;ɺ󱣎æÅä ÖÃÐÅÏ¢¡£ # make MODEL=xxx menuconfig 4.2 ±àÒë&sup1;€&sup3;Ì ŒÌÐøÍ£ÁôÔÚ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 ÔËÐÐ&sup3;ÌÐò ÏÂÃæµÄ²Ù×÷ŸùÔÚ 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 ] # ¡£Æô¶¯Íê&sup3;É¡£ 5. ÍØÕ&sup1; µ±Ç°°æ±ŸÏµÍ&sup3;±ÈœÏŽÖ²Ú£¬»¶Ó­¶ÁÕßÍêÉÆ±ŸÏµÍ&sup3;¡£ŽóÖÂÂÞÁÐÐèÒªÍêÉÆµÄµØ·œ¡£ 1£©ÖÕ¶ËI/O£» 2£©ÃüÁîÐÐģʜµÄÀúÊ·ŒÇÂŒ¡¢×Ô¶¯Æ¥Å䣻 3£©Çý¶¯µÄÄں˶šÊ±Æ÷»òÕßÄÚºËÏß&sup3;̲úÉúÊÂŒþʵÏÖclientµÄ׎̬Çл»£¬Íê&sup3;ÉÒ»žö СÐ͵Ä׎̬»ú£» 4£©Ïß&sup3;Ìͬ²œÊµÏÖ£» 5£©ÓŠÓòãŽúÂëºÍÄںˎúÂëµ÷ÊÔŒŒÊõ£» 6£©clientÌíŒÓžüÓÐÈ€µÄÃüÁî¡£ 6. ²Î¿Œ×ÊÁÏ [1] rfc3261, J. RosenbergµÈ, 2002 [2] Understanding the Session Initiation Protocol (Third Edition), Alan B.Johnston, 2009 [3] LinuxÉ豞Çý¶¯&sup3;ÌÐò [4] LinuxÍøÂ簲ȫŒŒÊõÓëʵÏÖ(µÚ¶þ°æ), &sup3;ÂÓÂÑ«, Ç廪Žóѧ&sup3;ö°æÉç [5] Unix»·Ÿ&sup3;žßŒ¶±à&sup3;Ì [6] pjsip&sup1;ÙÍø [7] netfilter&sup1;ÙÍø 7. ·ŽÀ¡ÐÅÏ¢ »¶Ó­ŽóŒÒ·ŽÀ¡ÐÅÏ¢µœ zhonglianbo@tp-link.net¡£ 为什么我的readme是这杨的
08-14
#include "sys.h" #include "delay.h" #include "usart.h" #include "includes.h" #include "led.h" /************************************************ ALIENTEK &frac34;«Ó¢°æSTM32¿ª·¢°åUCOSʵÑé Àý6-1 UCOSIII ÈÎÎñ´´&frac12;¨ÓÚÉ&frac34;&sup3;ý &frac14;&frac14;ÊõÖ§&sup3;Ö£ºwww.openedv.com ÌÔ±¦µêÆÌ£ºhttp://eboard.taobao.com &sup1;Ø×¢Î¢ÐÅ&sup1;«ÖÚÆ&frac12;̨΢Ðźţº"ÕýµãÔ­×Ó"£¬Ãâ·Ñ»ñÈ¡STM32×ÊÁÏ¡£ &sup1;ãÖÝÊÐÐÇÒíµç×Ó¿Æ&frac14;&frac14;ÓÐÏÞ&sup1;«Ë&frac34; ×÷ÕߣºÕýµãÔ­×Ó @ALIENTEK ************************************************/ //UCOSIIIÖÐÒÔÏÂÓÅÏÈ&frac14;¶Óû§&sup3;ÌÐò²»ÄÜÊ&sup1;Óã¬ALIENTEK //&frac12;«ÕâЩÓÅÏÈ&frac14;¶·ÖÅ䏸ÁËUCOSIIIµÄ5¸öϵÍ&sup3;ÄÚ²¿ÈÎÎñ //ÓÅÏÈ&frac14;¶0£ºÖжϷþÎñ·þÎñ&sup1;ÜÀíÈÎÎñ OS_IntQTask() //ÓÅÏÈ&frac14;¶1£ºÊ±ÖÓ&frac12;ÚÅÄÈÎÎñ OS_TickTask() //ÓÅÏÈ&frac14;¶2£º¶¨Ê±ÈÎÎñ OS_TmrTask() //ÓÅÏÈ&frac14;¶OS_CFG_PRIO_MAX-2£ºÍ&sup3;&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;çÇø´úÂëµÄÕýÈ·ÐÔ£¬±ÜÃâ&frac34;ºÕùÌõ&frac14;þºÍÆäËûͬ²&frac12;ÎÊÌâ¡£ */ /* ÔÚUCOS IIIÖУ¬ÈÎÎñµÄÖ´ÐÐË&sup3;ÐòÊÇ»ùÓÚÓÅÏÈ&frac14;¶µ÷¶ÈËã·¨¡£ ÿ¸öÈÎÎñ¶&frac14;ÓÐÒ»¸öÓÅÏÈ&frac14;¶£¨0µ&frac12;255£©£¬&frac34;ßÓиü¸ßÓÅÏÈ&frac14;¶µÄÈÎÎñ±ÈµÍÓÅÏÈ&frac14;¶µÄÈÎÎñ¸ü¿ÉÄܵõ&frac12;µ÷¶È¡£ UCOS IIIÊ&sup1;ÓÃÇÀÕ&frac14;Ê&frac12;µ÷¶È£¬ÕâÒâζ×ŵ±ÓÐÒ»¸ö¸ßÓÅÏÈ&frac14;¶µÄÈÎÎñ&frac34;ÍÐ÷ʱ£¬µ±Ç°ÕýÔÚÖ´ÐеÄÈÎÎñ&frac12;«±»Öжϲ¢ÇÒ¸ßÓÅÏÈ&frac14;¶ÈÎÎñ&frac12;«±»Ö´ÐС£ ÕâÈ·±£ÁË&frac34;ßÓиü¸ßÓÅÏÈ&frac14;¶µÄÈÎÎñ¿ÉÒÔ&frac14;°Ê±»ñµÃÖ´ÐУ¬±ÜÃâ&sup3;¤Ê±&frac14;ä±»µÍÓÅÏÈ&frac14;¶ÈÎÎñÕ&frac14;Óô¦ÀíÆ÷µÄÇé¿ö·¢Éú¡£ UCOS IIIÈÎÎñµÄÖ´ÐÐÊÇͨ&sup1;ýÉÏÏÂÎÄÇл»ÊµÏֵġ£ ÉÏÏÂÎÄÇл»ÊÇÖ¸&frac12;«´¦ÀíÆ÷µÄ״̬´ÓÒ»¸öÈÎÎñ±£´æµ&frac12;Äڴ棬Ȼºó&frac12;«ÁíÒ»¸öÈÎÎñµÄ×´Ì¬×°ÔØµ&frac12;´¦ÀíÆ÷ÖУ¬ÒÔÔÚ²»&frac14;ä¶ÏµÄÇé¿öÏÂת»»ÈÎÎñÖ´ÐС£ µ±Ò»¸öÈÎÎñÐèÒª±»ÖÐÖ&sup1;ʱ£¬&frac14;´Ö´ÐÐOS_TaskSuspend()º¯Êýʱ£¬UCOS III´¦ÀíÆ÷»áÖ´ÐÐÒ»¸öÈÎÎñÇл»Öжϲ¢&frac12;«¿ØÖÆÈ¨×ªÒƵ&frac12;ÁíÒ»¸öÈÎÎñ¡£ ÈÎÎñÇл»Í¨&sup3;£·¢ÉúÔÚÒÔÏÂÇé¿öÏ£º µ±ÈÎÎñÖ÷¶¯µ÷ÓÃÁËÈÎÎñ¿ØÖƺ¯Êý£¨ÀýÈ磬OS_Delay()¡¢OS_EventWait()¡¢OS_TaskSuspend()µÈ£©²¢ÍËÈÃCPUʱ£» µ±Ä&sup3;¸öÖжϷþÎñ&sup3;ÌÐò(ISR)ÔÚ&sup1;Ø&frac14;üÈÎÎñÖ´ÐÐÆÚ&frac14;äÖ´ÐУ¨&frac14;´ÖжÏÓÅÏÈ&frac14;¶¸ßÓÚ&sup1;Ø&frac14;üÈÎÎñµÄÓÅÏÈ&frac14;¶£©¡£ */ //¿ªÊ&frac14;ÈÎÎñ£¬´´&frac12;¨ÍêÈÎÎñ¶þºÍÈÎÎñÈý&frac34;ÍÉ&frac34;&sup3;ý×Ô&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); ///ÈÎÎñ¶þÁÁµÆ£¬²¢´òÓ¡&sup3;öÐÅÏ¢ //ÈÎÎñÓÅÏÈ&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();//ÓÉÓÚ±&frac34;&sup1;¤&sup3;ÌÊÇÓÉstm32f103zet6ÒÆÖ²ËùÀ´£¬Òò´ËÕâÀïÒò&frac14;ÓÈë±&frac34;º¯ÊýÈ·±£delayº¯ÊýÕý&sup3;£Ê&sup1;Óà delay_init(); //ʱÖÓ&sup3;õÊ&frac14;»¯ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//ÖжϷÖ×éÅäÖà uart_init(115200); //´®¿Ú&sup3;õÊ&frac14;»¯ LED_Init(); KEY_Init(); // ??????? OSInit(&err); //&sup3;õÊ&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;䯬&sup3;¤¶È£¬Îª0ʱΪĬÈÏ&sup3;¤¶È£¬ (void * )0, //Óû§²&sup1;&sup3;äµÄ´æ´¢Çø (OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, //ÈÎÎñÑ¡Ïî (OS_ERR * )&err); //´æ·Å¸Ãº¯Êý´íÎóʱµÄ·µ»ØÖµ OS_CRITICAL_EXIT(); //ÍË&sup3;öÁÙ&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); //Í&sup3;&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;䯬&sup3;¤¶ÈΪ1¸öϵÍ&sup3;ʱÖÓ&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(); //ÍË&sup3;öÁÙ&frac12;çÇø OSTaskDel((OS_TCB*)0,&err); //É&frac34;&sup3;ý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 <reg52.h> //°üº¬51µ¥Æ¬»úÏà&sup1;صÄÍ·ÎÄ&frac14;þ #include <intrins.h> #define uint unsigned int //ÖØ¶¨ÒåÎÞ·ûºÅÕûÊýÀàÐÍ #define uchar unsigned char //ÖØ¶¨ÒåÎÞ·ûºÅ×Ö·ûÀàÐÍ uchar code LedShowData[]={0x03,0x9F,0x25,0x0D,0x99, //¶¨ÒåÊýÂë&sup1;ÜÏÔÊ&frac34;Êý&frac34;Ý 0x49,0x41,0x1F,0x01,0x19};//0,1,2,3,4,5,6,7,8,9 uchar code RecvData[]={0x19,0x46,0x15,0x44,0x43,0x40,0x0D,0x0E,0x00,0x0F}; uchar IRCOM[7]; static unsigned int LedFlash; //¶¨ÒåÉÁ¶¯ÆµÂÊ&frac14;ÆÊý±äÁ¿ unsigned char RunFlag=0; //¶¨ÒåÔËÐбêÖ&frac34;λ bit EnableLight=0; //¶¨ÒåÖ¸Ê&frac34;µÆÊ&sup1;ÄÜλ /*************Íê&sup3;É״ָ̬Ê&frac34;µÆ¶¨Òå*************/ sbit S1=P3^2; //¶¨ÒåS1°´&frac14;ü¶Ë¿Ú /*************Íê&sup3;ɵç»ú¿ØÖƶ˿ڶ¨Òå***********/ sbit M1A=P1^2; //¶¨Òåµç»ú1ÕýÏò¶Ë¿Ú sbit M1B=P1^3; //¶¨Òåµç»ú1·´Ïò¶Ë¿Ú sbit M2A=P1^4; //¶¨Òåµç»ú2ÕýÏò¶Ë¿Ú sbit M2B=P1^5; //¶¨Òåµç»ú2·´Ïò¶Ë¿Ú sbit IRIN=P3^3; //¶¨ÒåºìÍâ&frac12;ÓÊÕ¶Ë¿Ú /*********Íê&sup3;ɺìÍâ&frac12;ÓÊն˿ڵ͍Òå*************/ #define ShowPort P0 //¶¨ÒåÊýÂë&sup1;ÜÏÔÊ&frac34;¶Ë¿Ú extern void ControlCar(uchar CarType); //ÉùÃ÷С&sup3;µ¿ØÖÆ×Ó&sup3;ÌÐò void delayms(unsigned char x) //0.14mSÑÓʱ&sup3;ÌÐò { unsigned char i; //¶¨ÒåÁÙʱ±äÁ¿ while(x--) //ÑÓʱʱ&frac14;äÑ­»· { for (i = 0; i<13; i++) {} //14mSÑÓʱ } } void Delay1ms(unsigned int i) { unsigned char j,k; do{ j = 10; do{ k = 50; do{ _nop_(); }while(--k); }while(--j); }while(--i); } void Delay() //¶¨ÒåÑÓʱ×Ó&sup3;ÌÐò { uint DelayTime=30000; //¶¨ÒåÑÓʱʱ&frac14;ä±äÁ¿ while(DelayTime--); //¿ªÊ&frac14;&frac12;øÐÐÑÓʱѭ»· return; //×Ó&sup3;ÌÐò·µ»Ø } void tingzhi() { M1A=0; //&frac12;«M1µç»úA¶Ë&sup3;õÊ&frac14;»¯Îª0 M1B=0; //&frac12;«M1µç»úB¶Ë&sup3;õÊ&frac14;»¯Îª0 M2A=0; //&frac12;«M2µç»úA¶Ë&sup3;õÊ&frac14;»¯Îª0 M2B=0; } void qianjin() { M1A=1; M1B=0; M2A=1; M2B=0; } void houtui() { M1A=0; M1B=1; M2A=0; M2B=1; } void youzhuan() { M1A=1; M1B=0; M2A=0; M2B=1; } void zuozhuan() { M1A=0; M1B=1; M2A=1; M2B=0; } void ControlCar(unsigned char ConType) //¶¨Òåµç»ú¿ØÖÆ×Ó&sup3;ÌÐò { tingzhi(); switch(ConType) //ÅжÏÓû§É趨µç»úÐÎÊ&frac12; { case 1: //ǰ&frac12;ø //ÅжÏÓû§ÊÇ·ñÑ¡ÔñÐÎÊ&frac12;1 { tingzhi(); //&frac12;øÈëǰ&frac12;øÖ®Ç° ÏÈÍ£Ö&sup1;Ò»¶Îʱ&frac14;ä ·ÀÖ&sup1;µç»ú·´ÏòµçÑ&sup1;&sup3;å»÷Ö÷°å µ&frac14;ÖÂϵÍ&sup3;¸´Î» Delay1ms(240); qianjin(); ShowPort=LedShowData[1]; break; } case 2: //ºóÍË //ÅжÏÓû§ÊÇ·ñÑ¡ÔñÐÎÊ&frac12;2 { tingzhi(); //&frac12;øÈëºóÍË֮ǰ ÏÈÍ£Ö&sup1;Ò»¶Îʱ&frac14;ä ·ÀÖ&sup1;µç»ú·´ÏòµçÑ&sup1;&sup3;å»÷Ö÷°å µ&frac14;ÖÂϵÍ&sup3;¸´Î» Delay1ms(240); // LeftLed = 1 ; houtui(); ShowPort=LedShowData[2]; //M2µç»ú·´×ª break; } case 3: //×óת //ÅжÏÓû§ÊÇ·ñÑ¡ÔñÐÎÊ&frac12;3 { tingzhi(); //&frac12;øÈë×óת֮ǰ ÏÈÍ£Ö&sup1;Ò»¶Îʱ&frac14;ä ·ÀÖ&sup1;µç»ú·´ÏòµçÑ&sup1;&sup3;å»÷Ö÷°å µ&frac14;ÖÂϵÍ&sup3;¸´Î» Delay1ms(240); zuozhuan(); ShowPort=LedShowData[3]; //M2µç»úÕýת break; } case 4: //ÓÒת //ÅжÏÓû§ÊÇ·ñÑ¡ÔñÐÎÊ&frac12;4 { tingzhi(); //&frac12;øÈëÓÒת֮ǰ ÏÈÍ£Ö&sup1;Ò»¶Îʱ&frac14;ä ·ÀÖ&sup1;µç»ú·´ÏòµçÑ&sup1;&sup3;å»÷Ö÷°å µ&frac14;ÖÂϵÍ&sup3;¸´Î» Delay1ms(240); youzhuan(); //M1µç»úÕýת ShowPort=LedShowData[4]; //M2µç»ú·´×ª break; } case 5: //Í£Ö&sup1; //ÅжÏÓû§ÊÇ·ñÑ¡ÔñÐÎÊ&frac12;8 { tingzhi(); ShowPort=LedShowData[0]; break; //ÍË&sup3;öµ±Ç°Ñ¡Ôñ } } } void IR_IN() interrupt 2 using 0 //¶¨ÒåINT2ÍⲿÖжϺ¯Êý { unsigned char j,k,N=0; //¶¨ÒåÁÙʱ&frac12;ÓÊÕ±äÁ¿ EX1 = 0; //&sup1;رÕÍⲿÖжÏ,·ÀÖ&sup1;ÔÙÓÐÐźŵ&frac12;´ï delayms(15); //ÑÓʱʱ&frac14;䣬&frac12;øÐкìÍâÏû¶¶ if (IRIN==1) //ÅжϺìÍâÐźÅÊÇ·ñÏûʧ { EX1 =1; //ÍⲿÖжϿª return; //·µ»Ø } while (!IRIN) //µÈIR±äΪ¸ßµçÆ&frac12;£¬Ìø&sup1;ý9msµÄǰµ&frac14;µÍµçÆ&frac12;Ðźš£ { delayms(1); //ÑÓʱµÈ´ý } for (j=0;j<4;j++) //²É&frac14;¯ºìÍâÒ£¿ØÆ÷Êý&frac34;Ý { for (k=0;k<8;k++) //·Ö´Î²É&frac14;¯8λÊý&frac34;Ý { while (IRIN) //µÈ IR ±äΪµÍµçÆ&frac12;£¬Ìø&sup1;ý4.5msµÄǰµ&frac14;¸ßµçÆ&frac12;Ðźš£ { delayms(1); //ÑÓʱµÈ´ý } while (!IRIN) //µÈ IR ±äΪ¸ßµçÆ&frac12; { delayms(1); //ÑÓʱµÈ´ý } while (IRIN) //&frac14;ÆËãIR¸ßµçÆ&frac12;ʱ&sup3;¤ { delayms(1); //ÑÓʱµÈ´ý N++; //&frac14;ÆÊýÆ÷&frac14;Ó&frac14;Ó if (N>=30) //ÅжÏ&frac14;ÆÊýÆ÷ÀÛ&frac14;ÓÖµ { EX1=1; //´ò¿ªÍⲿÖжÏ&sup1;¦ÄÜ return; //·µ»Ø } } IRCOM[j]=IRCOM[j] >> 1; //&frac12;øÐÐÊý&frac34;ÝÎ»ÒÆ²Ù×÷²¢×Ô¶¯²&sup1;Áã if (N>=8) //ÅжÏÊý&frac34;Ý&sup3;¤¶È { IRCOM[j] = IRCOM[j] | 0x80; //Êý&frac34;Ý×î¸ßλ²&sup1;1 } N=0; //ÇåÁãλÊý&frac14;ÆÂ&frac14;Æ÷ } } if (IRCOM[2]!=~IRCOM[3]) //ÅжϵØÖ·ÂëÊÇ·ñÏàͬ { EX1=1; //´ò¿ªÍⲿÖÐ¶Ï return; //·µ»Ø } for(j=0;j<10;j++) //Ñ­»·&frac12;øÐÐ&frac14;üÂë&frac12;âÎö { if(IRCOM[2]==RecvData[j]) //&frac12;øÐÐ&frac14;üλ¶ÔÓ¦ { ControlCar(j); //ÊýÂë&sup1;ÜÏÔÊ&frac34;ÏàÓ¦ÊýÂë } } EX1 = 1; //ÍⲿÖжϿª } void main(void) //Ö÷&sup3;ÌÐòÈë¿Ú { bit ExeFlag=0; //¶¨Òå¿ÉÖ´ÐÐλ±äÁ¿ LedFlash=3000; //¶ÔÉÁµÆÊý&frac34;Ý&frac12;øÐÐ&sup3;õÊ&frac14;»¯ EX1=1; //ͬÒ⿪ÆôÍⲿÖжÏ1 IT1=1; //É趨ÍⲿÖжÏ1ΪµÍ±ßÔµ´¥·¢ÀàÐÍ EA=1; //×ÜÖжϿªÆô ShowPort=LedShowData[0]; //ÊýÂë&sup1;ÜÏÔÊ&frac34;Êý×Ö0 while(1) //&sup3;ÌÐòÖ÷Ñ­»· { Delay(); //ÑÓʱ // RunStopState=~RunStopState; //ÔËÐÐÖ¸Ê&frac34;µÆ×´Ì¬×ª±ä } }详细解释
06-01
#include "delay.h" static uint32_t fam_nus = 0; static uint32_t fam_nms = 0; /* &sup1;¦ ÄÜ£º ÑÓʱ&sup3;õÊ&frac14;»¯ ²Î Êý£º ÎÞ ·µ»ØÖµ£º ÎÞ */ void Delay_Init(void) { //&sup1;رÕ&frac14;ÆÊ±¡¢²»´¥·¢Öжϡ¢&frac14;ÆÊýʱÖÓΪAHB/8 SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; //΢Ãë¡¢ºÁÃë&frac14;¶&sup3;õÖµ fam_nus = SystemCoreClock / 8000000; fam_nms = fam_nus * 1000; //&frac14;ÆÊýÆ÷ÇåÁã SysTick->VAL = 0; } /* &sup1;¦ ÄÜ£º ΢Ãë&frac14;¶ÑÓʱ ²Î Êý£º ctr ΢ÃëÊý ·µ»ØÖµ£º ÎÞ Ëµ Ã÷£º ÓÉÓÚSysTick->LOADΪ24λµÄ&frac14;Ä´æÆ÷£¬ ¸&sup3;ֵʱ²»Òª´óÓÚ0xffffff/(SystemCoreClock/8000000), ¶ÔÓÚSystemCoreClock=168MµÄÇé¿öÏ£¬ctrӦСÓÚ798915us */ void Delay_us(uint32_t ctr) { uint32_t tick_flag = 0; //¶¨Ê±Æ÷&sup3;õÖµ(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;Ä´æÆ÷£¬ ¸&sup3;ֵʱ²»Òª´óÓÚ0xffffff/(SystemCoreClock/8000000*1000), ¶ÔÓÚSystemCoreClock=168MµÄÇé¿öÏ£¬ctrӦСÓÚ798ms. ¶ÔÓÚ´óÓÚ798msµÄÇé¿ö£¬¿ÉÒÔ¶à´Îµ÷Óñ&frac34;º¯Êý&frac12;øÐÐÊýÖµµþ&frac14;Ó£¬ Ò²¿É&frac12;«±&frac34;º¯ÊýµÄÄÚÈÝÈ«²¿×¢ÊÍ£¬²ÉÓú¯ÊýÄ©¶ËËùÌá&sup1;©µÄwhileÑ­»·&frac14;´¿É£¨Ëæ×Åʱ&frac14;äµÄµþ&frac14;Ó£¬¿ÉÄÜ»áÓÐ&frac12;Ï´óÎó²î£© */ void Delay_ms(uint32_t ctr) { uint32_t tick_flag = 0; //¶¨Ê±Æ÷&sup3;õÖµ(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;ÓÊÕÊý&frac34;ÝÊý×éµÄ&sup3;¤¶È uint8_t usart1_buffer[USART1_RX_SIZE] = { 0 }; //´¢´æ´®¿ÚÒ»&frac12;ÓÊÕÊý&frac34;ݵÄÊý×é uint8_t usart1_tc = 0; //´®¿Ú&frac12;ÓÊÕÊý&frac34;ÝʱµÄ&frac14;ÆÊýÆ÷ uint8_t usart1_flag = 0; //´®¿Ú±êÖ&frac34;λ,1 ±íÊ&frac34;&frac12;ÓÊÕÍê&sup3;É,0 ±íÊ&frac34;¿ÉÒÔ&frac12;ÓÊÕÊý&frac34;Ý /* &sup1;¦ ÄÜ£º ´®¿ÚµÄ&sup3;õÊ&frac14;»¯º¯Êý ²Î Êý£º baudrate ´®¿ÚµÄ²¨ÌØÂÊ ·µ»ØÖµ£º ÎÞ */ void USART1_Init(uint32_t baudrate) { GPIO_InitTypeDef GPIO_InitStructure; //¶¨ÒåGPIO&sup3;õÊ&frac14;»¯&frac12;á&sup1;&sup1;Ìå±äÁ¿ USART_InitTypeDef USART_InitStructure; //¶¨Òå´®¿Ú&sup3;õÊ&frac14;»¯&frac12;á&sup1;&sup1;Ìå±äÁ¿ NVIC_InitTypeDef NVIC_InitStructure; //¶¨ÒåNVIC&sup3;õÊ&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; //ÍÆÍìÊä&sup3;ö GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //Êä&sup3;öËÙ¶È //USART Tx &sup3;õÊ&frac14;»¯ GPIO_InitStructure.GPIO_Pin = USART1_TX_PIN; //Ñ¡ÔñÒý&frac12;Å GPIO_Init(USART1_TX_PORT, &GPIO_InitStructure); //&sup3;õÊ&frac14;»¯ÅäÖà //USART Rx &sup3;õÊ&frac14;»¯ GPIO_InitStructure.GPIO_Pin = USART1_RX_PIN; //Ñ¡ÔñÒý&frac12;Å GPIO_Init(USART1_RX_PORT, &GPIO_InitStructure); //&sup3;õÊ&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Êý&frac34;Ýλ USART_InitStructure.USART_Parity = USART_Parity_No; //ÎÞУÑéλ USART_InitStructure.USART_StopBits = USART_StopBits_1; //1Í£Ö&sup1;λ USART_Init(USART1, &USART_InitStructure); //&sup3;õÊ&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); //&sup3;õÊ&frac14;»¯ÅäÖÃÖжÏÓÅÏÈ&frac14;¶ USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //¿ªÆô´®¿Ú&frac12;ÓÊÕÖжÏÊ&sup1;ÄÜ USART_Cmd(USART1, ENABLE); //¿ªÆô´®¿Ú } /* &sup1;¦ ÄÜ£º ´®¿Ú·¢Ë͵¥×Ö&frac12;ÚÊý&frac34;Ý ²Î Êý£º src ·¢Ë͵ĵ¥×Ö&frac12;ÚÊý&frac34;Ý ·µ»ØÖµ£º ÎÞ */ void USART1_Send_Byte(uint8_t src) { USART_SendData(USART1, src); //·¢ËÍÊý&frac34;Ý while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); //µÈ´ý´®¿Ú·¢ËÍÍê&sup3;É } /* &sup1;¦ ÄÜ£º ´®¿Ú·¢ËÍÒ»¶¨&sup3;¤¶ÈµÄ×Ö&frac12;ÚÊý&frac34;Ý ²Î Êý£º src ·¢Ë͵Ä×Ö·û´®Êý&frac34;Ý length ·¢ËÍ×Ö&frac12;Ú/×Ö·ûµÄ&sup3;¤¶È ·µ»ØÖµ£º ÎÞ */ 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) //Ñ­»··¢ËÍÖ¸¶¨&sup3;¤¶ÈµÄÊý&frac34;Ý { USART1_Send_Byte(*(src + Tx_cut)); //·¢ËÍÒ»¸ö×Ö&frac12;ÚÐÅÏ¢ Tx_cut++; //Ö¸Õë×ÔÔö } } /* &sup1;¦ ÄÜ£º ´®¿Ú·¢ËÍ×Ö·û´®Êý&frac34;Ý ²Î Êý£º src ·¢Ë͵Ä×Ö·û´®Êý&frac34;Ý,ÒÔ&#39;\0&#39;&frac14;´0x00±êʶ&frac12;áÊø·¢ËÍÊý&frac34;Ý ·µ»ØÖµ£º ÎÞ */ void USART1_Send_String(char* src) { uint16_t Tx_cut = 0; while (*(src + Tx_cut) != &#39;\0&#39;) //&frac14;ì²âµ&frac12;ÏÂÒ»¸ö·¢ËÍ×Ö&frac12;ÚΪ&#39;\0&#39;ʱͣÖ&sup1;·¢ËÍ { USART1_Send_Byte(*(src + Tx_cut)); //·¢ËÍÒ»¸ö×Ö&frac12;ÚÐÅÏ¢ Tx_cut++; //Ö¸Õë×ÔÔö } } /* &sup1;¦ ÄÜ£º ´®¿ÚÇå&sup3;ý´¢´æÊý×éµÄÊý&frac34;Ý ²Î Êý£º ÎÞ ·µ»ØÖµ£º ÎÞ */ void USART1_Clear_Buffer(void) { while (usart1_length) //Çå¿Õ&frac12;ÓÊÕµ&frac12;µÄÊý&frac34;Ý { usart1_length--; //Ö¸Õë×Ô&frac14;õ usart1_buffer[usart1_length] = 0; //Êý&frac34;ÝÇåÁã } } /* &sup1;¦ ÄÜ£º ´®¿ÚµÄ&frac12;ÓÊÕÖжϷþÎñº¯Êý ²Î Êý£º ÎÞ ·µ»ØÖµ£º ÎÞ */ void USART1_INT_IRQHandler(void) { if (USART_GetITStatus(USART1, USART_IT_RXNE) == SET) //Åжϴ®¿Ú&frac12;ÓÊÕÖжϱêÖ&frac34;λ { usart1_buffer[usart1_length++] = USART_ReceiveData(USART1); //¶ÁÈ¡´®¿ÚÊý&frac34;Ý if (usart1_length >= USART1_RX_SIZE) //Èç&sup1;û´¢´æ&sup3;¬&sup3;ö&sup3;¤¶È { usart1_length = 0; //ÖØÐ´ÓÊý×é0¿ªÊ&frac14;´¢´æ×Ö&frac12;Ú } } USART_ClearITPendingBit(USART1, USART_IT_RXNE); //Çå&sup3;ý´®¿ÚÖжÏ&frac12;ÓÊÕ±êÖ&frac34;λ } /********************printfÖØ¶¨ÏòΪ´®¿ÚÊä&sup3;ö********************/ #ifdef __GNUC__ /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf set to &#39;Yes&#39;) 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); //·¢ËÍÊý&frac34;Ý while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);//µÈ´ý´®¿Ú·¢ËÍÍê&sup3;É 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值