¡°ÊÓÌýÕ¹¹Ý¡±Ã÷ÍøÉÏ¿ªÍ¨ÊÐÃñ×ã²»³ö»§³©ÓÎÖØÇì

½ñÈÕÏÂÎç,¼ÇÕß´ÓÖ¤ÇìÊй滮չÀÀ¹Ý»ñϤ,´ÓÃ÷ÈÕÆð,ÊÐÃñ¿ÉµÇÂ½ÍøÕ¾(www.cqghzlg.gov.cn),ÔÚÍøÉÏ¡°ÊÓÌýÕ¹¹Ý¡±ÀïÃâ·ÑÓÎÀÀ¡£
»ªÁúÍøÑ¶(¼ÇÕßÐìÐËÓå2ÈÕ17ʱ±¨µÀ)½ñÈÕÏÂÎç,¼ÇÕß´ÓÖØÇìÊй滮չÀÀ¹Ý»ñϤ£¬´ÓÃ÷ÈÕÆð,ÊÐÃñ¿ÉµÇÂ½ÍøÕ¾(www.cqghzlg.gov.cn)£¬ÔÚÍøÉÏ¡°ÊÓÌýÕ¹¹Ý¡±ÀïÃâ·ÑÓÎÀÀ¡£½ìʱ£¬ÊÐÃñ×ã²»³ö»§Ò²¿ÉÒÔ¹ÛÉ͵½ÖØÇìȫòÁË¡£ ¾Ý½é ...
#################################################################### ## ## ## ## ## CODE SKELETON v1.0.0 ## ## ## ## TP-LINK ## ## 2013.7.9 ## #################################################################### 1. žÅÊö CODE SKELETONÊÇÌáÈ¡CODEʵÏÖµÄÖ÷Ìå¿òŒÜ¡£ËüžúʵŒÊʵÏÖ»¹ÓзÇ&sup3;£ŽóµÄ&sup2;î Ÿà¡£·œ±ãŽóŒÒÊìÏ€CODEµÄ¹ŠÄÜ»®·ÖÒÔŒ°ŽóžÅÁËœâÓïÒô¹ŠÄÜÉæŒ°µÄһЩ±à&sup3;ÌŒŒÊõ¡£ ËüÖ÷Òª°üº¬menuconfigµÄ»ùŽ¡Ê¹Óá¢MakefileŽîœš¹€&sup3;Ì¡¢¶¯Ì¬¿âµÄʹÓᢟ&sup2;̬¿â µÄʹÓᢌòµ¥ÖÕ¶ËI/O¡¢»Øµ÷º¯Êý¡¢¶àÏß&sup3;̱à&sup3;Ì¡¢socket±à&sup3;Ì¡¢Œòµ¥Çý¶¯±à&sup3;ÌµÈ ÄÚÈÝ¡£¹ŠÄÜʵÏֱȜώÖ&sup2;Ú£¬»¶Ó­¶ÁÕß·áž»CODE SKELETONµÄÄÚÈÝ¡£CODE SKELETON Ö»º­žÇÁËCODEʵÏÖµÄÒ»&sup2;¿·ÖÄÚÈÝ£¬Èç¹û¶ÁÕß¶ÔÓïÒôÄÚÈÝÓÐÐËÈ€¿ÉÒÔœøÒ»&sup2;œÑ§Ï° ºÍÉºóÎÄ&sup2;οŒ×ÊÁϵÄÄÚÈÝ¡£ 2. ¿òŒÜ CODE SKELETON°üÀšÈýžöÄ£¿é£ºÄÚºËÄ£¿é£š×Ö·ûÇý¶¯simple£©£¬·þÎñŽŠÀíÖÐ ÐÄ£šcs_server)ºÍ·þÎñÇëÇó¿Í»§¶Ë£šcs_client£©¡£cs_clientÒÔÃüÁîÐеķœÊœ œÓÊÜÓû§µÄÇëÇ󣬞ùŸÝÃüÁîÔÙÍš¹ýsocket°ÑÃüÁË͵œcs_server, cs_server ŽŠÀíºó·µ»ØÖŽÐМá¹ûžøcs_client¡£Œòµ¥œá¹¹ÍŒÈçÏÂËùÊŸ¡£ *--------* *-----------* *---------* | | | | | | | simple |<----------->| server |<---------->| client | | | | | | | *--------* *-----------* *---------* server ºÍ client Ä£¿éŸùʹÓÃÁœžöÄ£¿é£¬mini_shellºÍsocketÄ£¿é¡£Ç°Õß ·â×°ÖÕ¶ËI/OºÍ»Øµ÷º¯Êý±í¡£ºóÕß·â×°unixÓòÌלÓ×ÖÓÃÓÚœø&sup3;ÌŒäÍšÐÅ¡£ 3. ĿŒœá¹¹ TOP [code skeleton¶¥&sup2;ãĿŒ] | *---> readme [±ŸÎĵµ *-*] | *---> build [¹€&sup3;̱àÒë»·Ÿ&sup3;] | *---> config [ÅäÖÃĿŒ£¬µ±Ç°Ö»ÓÐmenuconfig] | *---> install [¹€&sup3;̱àÒëºóÉú&sup3;ɵÄʹÓÃÎÄŒþ] | *---> code [ÔŽŽúÂë] | *---> modules [ÄÚºËÄ£¿é] | | | *---> simple [Œòµ¥×Ö·ûÇý¶¯ÊµÏÖ] | *---> apps [Óû§&sup2;ãŽúÂë] | *---> inc [¹«ÓÃÍ·ÎÄŒþ] | *---> cs_libs [¿âÎÄŒþ] | | | *---> mini_shell | | | *---> socket | *---> cs_server | *---> cs_client 4. ʹÓÃ&sup2;œÖè 4.1 ÅäÖù€&sup3;Ì œøÈëTOP/buildĿŒ£¬ÊäÈëÏÂÃæÃüÁî¡£#ÊÇlinux shellÌáÊŸ·û£¬&sup2;»ÊôÓÚÃüÁî&sup2;¿·Ö£¬ ºóÐøŸùÏàͬº¬Òå¡£Èç¹û&sup2;»ÊäÈëMODEL=xxx, ĬÈÏʹÓÃMODEL=TEST¡£ÅäÖÃÍê&sup3;ɺ󱣎æÅä ÖÃÐÅÏ¢¡£ # make MODEL=xxx menuconfig 4.2 ±àÒë¹€&sup3;Ì ŒÌÐøÍ£ÁôÔÚbuildĿŒ£¬ÊäÈëÏÂÃæÃüÁî¡£ # make MODEL=xxx /* MODEL=xxx¿ÉÒÔ&sup2;»ÊäÈ룬ĬÈÏʹÓÃMODEL=TEST */ ÁíÍ⣬±àÒëʱ¿ÉÒÔÊäÈë&sup2;ÎÊýÀŽŸö¶šÊÇ·ñÆô¶¯µ÷ÊÔ¿ª¹ØŒ°µ÷ÊԵȶ±ð£¬ÈçÏÂÃüÁî # make MODEL=xxx VSDEBUG=yyy /* ÆäÖÐyyy¿ÉÒÔȡֵ error, sys, info, debugl, debugm, debugh£¬Ä¬ÈÏΪerror */ 4.3 ÔËÐÐ&sup3;ÌÐò ÏÂÃæµÄ&sup2;Ù×÷ŸùÔÚ TOP/installĿŒÏ¡£ 4.3.1 ŒÓÔØÇý¶¯ ŒÓÔØŒòµ¥×Ö·ûÇý¶¯simple£¬ÊäÈëÏÂÃæÃüÁî¡£ # insmod csmsimple.ko # cd /dev # mknod -m 666 csmsimple c 220 0 # cd - 4.3.2 Æô¶¯cs_server Èç¹û±àÒëÑ¡ÏîÉèÖÃΪ¶¯Ì¬ÁŽœÓ¿â£¬ÐèÒªÏȰѶ¯Ì¬ÁŽœÓ¿â¿œ±ŽµœÏàӊλÖãš±ÈÈç /usr/lib/£©¡£Èç¹û±àÒëÑ¡ÏîÉèÖÃΪŸ&sup2;̬¿â£¬Ö±œÓÊäÈëÏÂÃæÃüÁî¡£ # ./cs_server & 4.3.3 Æô¶¯cs_client Èç¹û±àÒëÑ¡ÏîÉèÖÃΪ¶¯Ì¬ÁŽœÓ¿â£¬ÐèÒªÏȰѶ¯Ì¬ÁŽœÓ¿â¿œ±ŽµœÏàӊλÖãš±ÈÈç /usr/lib/£©¡£Èç¹û±àÒëÑ¡ÏîÉèÖÃΪŸ&sup2;̬¿â£¬Ö±œÓÊäÈëÏÂÃæÃüÁî¡£ # ./cs_client È»ºó¿ÉÒÔœøÈëÃüÁîÐÐģʜ£º[ code skeleton client ] # ¡£Æô¶¯Íê&sup3;É¡£ 5. ÍØÕ¹ µ±Ç°°æ±ŸÏµÍ&sup3;±ÈœÏŽÖ&sup2;Ú£¬»¶Ó­¶ÁÕßÍêÉÆ±ŸÏµÍ&sup3;¡£ŽóÖÂÂÞÁÐÐèÒªÍêÉÆµÄµØ·œ¡£ 1£©ÖÕ¶ËI/O£» 2£©ÃüÁîÐÐģʜµÄÀúÊ·ŒÇÂŒ¡¢×Ô¶¯Æ¥Å䣻 3£©Çý¶¯µÄÄں˶šÊ±Æ÷»òÕßÄÚºËÏß&sup3;Ì&sup2;úÉúÊÂŒþʵÏÖclientµÄ׎̬Çл»£¬Íê&sup3;ÉÒ»žö СÐ͵Ä׎̬»ú£» 4£©Ïß&sup3;Ìͬ&sup2;œÊµÏÖ£» 5£©ÓŠÓÃ&sup2;ãŽúÂëºÍÄںˎúÂëµ÷ÊÔŒŒÊõ£» 6£©clientÌíŒÓžüÓÐÈ€µÄÃüÁî¡£ 6. &sup2;οŒ×ÊÁÏ [1] rfc3261, J. RosenbergµÈ, 2002 [2] Understanding the Session Initiation Protocol (Third Edition), Alan B.Johnston, 2009 [3] LinuxÉ豞Çý¶¯&sup3;ÌÐò [4] LinuxÍøÂç°&sup2;È«ŒŒÊõÓëʵÏÖ(µÚ¶þ°æ), &sup3;ÂÓÂÑ«, Ç廪Žóѧ&sup3;ö°æÉç [5] Unix»·Ÿ&sup3;žßŒ¶±à&sup3;Ì [6] pjsip¹ÙÍø [7] netfilter¹ÙÍø 7. ·ŽÀ¡ÐÅÏ¢ »¶Ó­ŽóŒÒ·ŽÀ¡ÐÅÏ¢µœ zhonglianbo@tp-link.net¡£ 为什么我的readme是这杨的
08-14
/** **************************************************************************************************** * @file usart.c * @author ÕýµãÔ­×ÓÍŶÓ(ALIENTEK) * @version V1.1 * @date 2023-06-05 * @brief ´®¿Ú&sup3;õʼ»¯´úÂë(Ò»°ãÊÇ´®¿Ú1)£¬Ö§&sup3;Öprintf * @license Copyright (c) 2020-2032, ¹ãÖÝÊÐÐÇÒíµç×ӿƼ¼ÓÐÏÞ¹«Ë&frac34; **************************************************************************************************** * @attention * * ʵÑéÆ&frac12;̨:ÕýµãÔ­×Ó Ì&frac12;Ë÷Õß F407¿ª·¢°å * ÔÚÏßÊÓÆµ:www.yuanzige.com * ¼¼ÊõÂÛÌ&sup3;:www.openedv.com * ¹«Ë&frac34;ÍøÖ·:www.alientek.com * ¹ºÂòµØÖ·:openedv.taobao.com * * ÐÞ¸Ä˵Ã÷ * V1.0 20211014 * µÚÒ»´Î·¢&sup2;¼ * V1.1 20230605 * É&frac34;&sup3;ýUSART_UX_IRQHandler()º¯ÊýµÄ&sup3;¬Ê±´¦ÀíºÍÐÞ¸ÄHAL_UART_RxCpltCallback() **************************************************************************************************** */ #include "./SYSTEM/sys/sys.h" #include "./SYSTEM/usart/usart.h" /* Èç¹ûʹÓÃos,Ôò°üÀ¨ÏÂÃæµÄÍ·Îļþ¼´¿É */ #if SYS_SUPPORT_OS #include "os.h" /* os ʹÓà */ #endif /******************************************************************************************/ /* ¼ÓÈëÒÔÏ´úÂë, Ö§&sup3;Öprintfº¯Êý, ¶ø&sup2;»ÐèҪѡÔñuse MicroLIB */ #if 1 #if (__ARMCC_VERSION >= 6010050) /* ʹÓÃAC6±àÒëÆ÷ʱ */ __asm(".global __use_no_semihosting\n\t"); /* ÉùÃ÷&sup2;»Ê¹ÓðëÖ÷»úÄ£Ê&frac12; */ __asm(".global __ARM_use_no_argv \n\t"); /* AC6ÏÂÐèÒªÉùÃ÷mainº¯ÊýΪÎÞ&sup2;ÎÊý¸ñÊ&frac12;£¬·ñÔò&sup2;¿·ÖÀý&sup3;Ì¿ÉÄÜ&sup3;öÏÖ°ëÖ÷»úÄ£Ê&frac12; */ #else /* ʹÓÃAC5±àÒëÆ÷ʱ, ÒªÔÚÕâÀﶨÒå__FILE ºÍ &sup2;»Ê¹ÓðëÖ÷»úÄ£Ê&frac12; */ #pragma import(__use_no_semihosting) struct __FILE { int handle; /* Whatever you require here. If the only file you are using is */ /* standard output using printf() for debugging, no file handling */ /* is required. */ }; #endif /* &sup2;»Ê¹ÓðëÖ÷»úÄ£Ê&frac12;£¬ÖÁÉÙÐèÒªÖØ¶¨Òå_ttywrch\_sys_exit\_sys_command_stringº¯Êý,ÒÔͬʱ¼æÈÝAC6ºÍAC5Ä£Ê&frac12; */ int _ttywrch(int ch) { ch = ch; return ch; } /* ¶¨Òå_sys_exit()ÒÔ±ÜÃâʹÓðëÖ÷»úÄ£Ê&frac12; */ void _sys_exit(int x) { x = x; } char *_sys_command_string(char *cmd, int len) { return NULL; } /* FILE ÔÚ stdio.hÀïÃæ¶¨Òå. */ FILE __stdout; /* ÖØ¶¨Òåfputcº¯Êý, printfº¯Êý×îÖÕ»áͨ¹ýµ÷ÓÃfputcÊä&sup3;ö×Ö·û´®µ&frac12;´®¿Ú */ int fputc(int ch, FILE *f) { while ((USART1->SR & 0X40) == 0); /* µÈ´ýÉÏÒ»¸ö×Ö·û·¢ËÍÍê&sup3;É */ USART1->DR = (uint8_t)ch; /* &frac12;«Òª·¢Ë͵Ä×Ö·û ch дÈëµ&frac12;DR¼Ä´æÆ÷ */ return ch; } #endif /***********************************************END*******************************************/ #if USART_EN_RX /* Èç¹ûʹÄÜÁË&frac12;ÓÊÕ */ /* &frac12;ÓÊÕ»º&sup3;å, ×î´óUSART_REC_LEN¸ö×Ö&frac12;Ú. */ uint8_t g_usart_rx_buf[USART_REC_LEN]; /* &frac12;ÓÊÕ״̬ * bit15£¬ &frac12;ÓÊÕÍê&sup3;ɱêÖ&frac34; * bit14£¬ &frac12;ÓÊÕµ&frac12;0x0d * bit13~0£¬ &frac12;ÓÊÕµ&frac12;µÄÓÐЧ×Ö&frac12;ÚÊýÄ¿ */ uint16_t g_usart_rx_sta = 0; uint8_t g_rx_buffer[RXBUFFERSIZE]; /* HAL¿âʹÓõĴ®¿Ú&frac12;ÓÊÕ»º&sup3;å */ UART_HandleTypeDef g_uart1_handle; /* UART&frac34;ä±ú */ /** * @brief ´®¿ÚX&sup3;õʼ»¯º¯Êý * @param baudrate: &sup2;¨ÌØÂÊ, ¸ù&frac34;Ý×Ô¼ºÐèÒªÉèÖÃ&sup2;¨ÌØÂÊÖµ * @note ×¢Òâ: ±ØÐëÉèÖÃÕýÈ·µÄʱÖÓÔ´, ·ñÔò´®¿Ú&sup2;¨ÌØÂÊ&frac34;Í»áÉèÖÃÒì&sup3;£. * ÕâÀïµÄUSARTµÄʱÖÓÔ´ÔÚsys_stm32_clock_init()º¯ÊýÖÐÒÑ&frac34;­ÉèÖùýÁË. * @retval ÎÞ */ void usart_init(uint32_t baudrate) { g_uart1_handle.Instance = USART_UX; /* USART1 */ g_uart1_handle.Init.BaudRate = baudrate; /* &sup2;¨ÌØÂÊ */ g_uart1_handle.Init.WordLength = UART_WORDLENGTH_8B; /* ×Ö&sup3;¤Îª8λÊý&frac34;ݸñÊ&frac12; */ g_uart1_handle.Init.StopBits = UART_STOPBITS_1; /* Ò»¸öֹͣλ */ g_uart1_handle.Init.Parity = UART_PARITY_NONE; /* ÎÞÆæÅ¼Ð£Ñéλ */ g_uart1_handle.Init.HwFlowCtl = UART_HWCONTROL_NONE; /* ÎÞÓ&sup2;¼þÁ÷¿Ø */ g_uart1_handle.Init.Mode = UART_MODE_TX_RX; /* ÊÕ·¢Ä£Ê&frac12; */ HAL_UART_Init(&g_uart1_handle); /* HAL_UART_Init()»áʹÄÜUART1 */ /* ¸Ãº¯Êý»á¿ªÆô&frac12;ÓÊÕÖжϣº±êÖ&frac34;λUART_IT_RXNE£¬&sup2;¢ÇÒÉèÖÃ&frac12;ÓÊÕ»º&sup3;åÒÔ¼°&frac12;ÓÊÕ»º&sup3;å&frac12;ÓÊÕ×î´óÊý&frac34;ÝÁ¿ */ HAL_UART_Receive_IT(&g_uart1_handle, (uint8_t *)g_rx_buffer, RXBUFFERSIZE); } /** * @brief UARTµ×&sup2;ã&sup3;õʼ»¯º¯Êý * @param huart: UART&frac34;ä±úÀàÐÍÖ¸Õë * @note ´Ëº¯Êý»á±»HAL_UART_Init()µ÷Óà * Íê&sup3;ÉʱÖÓʹÄÜ£¬Òý&frac12;ÅÅäÖã¬ÖжÏÅäÖà * @retval ÎÞ */ void HAL_UART_MspInit(UART_HandleTypeDef *huart) { GPIO_InitTypeDef gpio_init_struct; if(huart->Instance == USART_UX) /* Èç¹ûÊÇ´®¿Ú1£¬&frac12;øÐд®¿Ú1 MSP&sup3;õʼ»¯ */ { USART_UX_CLK_ENABLE(); /* USART1 ʱÖÓʹÄÜ */ USART_TX_GPIO_CLK_ENABLE(); /* ·¢ËÍÒý&frac12;ÅʱÖÓʹÄÜ */ USART_RX_GPIO_CLK_ENABLE(); /* &frac12;ÓÊÕÒý&frac12;ÅʱÖÓʹÄÜ */ gpio_init_struct.Pin = USART_TX_GPIO_PIN; /* TXÒý&frac12;Å */ gpio_init_struct.Mode = GPIO_MODE_AF_PP; /* ¸´ÓÃÍÆÍìÊä&sup3;ö */ gpio_init_struct.Pull = GPIO_PULLUP; /* ÉÏÀ­ */ gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH; /* ¸ßËÙ */ gpio_init_struct.Alternate = USART_TX_GPIO_AF; /* ¸´ÓÃΪUSART1 */ HAL_GPIO_Init(USART_TX_GPIO_PORT, &gpio_init_struct); /* &sup3;õʼ»¯·¢ËÍÒý&frac12;Å */ gpio_init_struct.Pin = USART_RX_GPIO_PIN; /* RXÒý&frac12;Å */ gpio_init_struct.Alternate = USART_RX_GPIO_AF; /* ¸´ÓÃΪUSART1 */ HAL_GPIO_Init(USART_RX_GPIO_PORT, &gpio_init_struct); /* &sup3;õʼ»¯&frac12;ÓÊÕÒý&frac12;Å */ #if USART_EN_RX HAL_NVIC_EnableIRQ(USART_UX_IRQn); /* ʹÄÜUSART1ÖжÏͨµÀ */ HAL_NVIC_SetPriority(USART_UX_IRQn, 3, 3); /* ÇÀÕ¼ÓÅÏȼ¶3£¬×ÓÓÅÏȼ¶3 */ #endif } } /** * @brief Rx´«Ê仨µ÷º¯Êý * @param huart: UART&frac34;ä±úÀàÐÍÖ¸Õë * @retval ÎÞ */ void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if(huart->Instance == USART_UX) /* Èç¹ûÊÇ´®¿Ú1 */ { if((g_usart_rx_sta & 0x8000) == 0) /* &frac12;ÓÊÕδÍê&sup3;É */ { if(g_usart_rx_sta & 0x4000) /* &frac12;ÓÊÕµ&frac12;ÁË0x0d */ { if(g_rx_buffer[0] != 0x0a) { g_usart_rx_sta = 0; /* &frac12;ÓÊÕ´íÎó,ÖØÐ¿ªÊ¼ */ } else { g_usart_rx_sta |= 0x8000; /* &frac12;ÓÊÕÍê&sup3;ÉÁË */ } } else /* »¹Ã»ÊÕµ&frac12;0X0D */ { if(g_rx_buffer[0] == 0x0d) { g_usart_rx_sta |= 0x4000; } else { g_usart_rx_buf[g_usart_rx_sta & 0X3FFF] = g_rx_buffer[0] ; g_usart_rx_sta++; if(g_usart_rx_sta > (USART_REC_LEN - 1)) { g_usart_rx_sta = 0; /* &frac12;ÓÊÕÊý&frac34;Ý´íÎó,ÖØÐ¿ªÊ¼&frac12;ÓÊÕ */ } } } } HAL_UART_Receive_IT(&g_uart1_handle, (uint8_t *)g_rx_buffer, RXBUFFERSIZE); } } /** * @brief ´®¿Ú1ÖжϷþÎñº¯Êý * @param ÎÞ * @retval ÎÞ */ void USART_UX_IRQHandler(void) { #if SYS_SUPPORT_OS /* ʹÓÃOS */ OSIntEnter(); #endif HAL_UART_IRQHandler(&g_uart1_handle); /* µ÷ÓÃHAL¿âÖжϴ¦Àí¹«Óú¯Êý */ #if SYS_SUPPORT_OS /* ʹÓÃOS */ OSIntExit(); #endif } #endif /** **************************************************************************************************** * @file usart.c * @author ÕýµãÔ­×ÓÍŶÓ(ALIENTEK) * @version V1.1 * @date 2023-06-05 * @brief ´®¿Ú&sup3;õʼ»¯´úÂë(Ò»°ãÊÇ´®¿Ú1)£¬Ö§&sup3;Öprintf * @license Copyright (c) 2020-2032, ¹ãÖÝÊÐÐÇÒíµç×ӿƼ¼ÓÐÏÞ¹«Ë&frac34; **************************************************************************************************** * @attention * * ʵÑéÆ&frac12;̨:ÕýµãÔ­×Ó Ì&frac12;Ë÷Õß F407¿ª·¢°å * ÔÚÏßÊÓÆµ:www.yuanzige.com * ¼¼ÊõÂÛÌ&sup3;:www.openedv.com * ¹«Ë&frac34;ÍøÖ·:www.alientek.com * ¹ºÂòµØÖ·:openedv.taobao.com * * ÐÞ¸Ä˵Ã÷ * V1.0 20211014 * µÚÒ»´Î·¢&sup2;¼ * V1.1 20230605 * É&frac34;&sup3;ýUSART_UX_IRQHandler()º¯ÊýµÄ&sup3;¬Ê±´¦ÀíºÍÐÞ¸ÄHAL_UART_RxCpltCallback() **************************************************************************************************** */ #include "./SYSTEM/sys/sys.h" #include "./SYSTEM/usart/usart.h" /* Èç¹ûʹÓÃos,Ôò°üÀ¨ÏÂÃæµÄÍ·Îļþ¼´¿É */ #if SYS_SUPPORT_OS #include "os.h" /* os ʹÓà */ #endif /******************************************************************************************/ /* ¼ÓÈëÒÔÏ´úÂë, Ö§&sup3;Öprintfº¯Êý, ¶ø&sup2;»ÐèҪѡÔñuse MicroLIB */ #if 1 #if (__ARMCC_VERSION >= 6010050) /* ʹÓÃAC6±àÒëÆ÷ʱ */ __asm(".global __use_no_semihosting\n\t"); /* ÉùÃ÷&sup2;»Ê¹ÓðëÖ÷»úÄ£Ê&frac12; */ __asm(".global __ARM_use_no_argv \n\t"); /* AC6ÏÂÐèÒªÉùÃ÷mainº¯ÊýΪÎÞ&sup2;ÎÊý¸ñÊ&frac12;£¬·ñÔò&sup2;¿·ÖÀý&sup3;Ì¿ÉÄÜ&sup3;öÏÖ°ëÖ÷»úÄ£Ê&frac12; */ #else /* ʹÓÃAC5±àÒëÆ÷ʱ, ÒªÔÚÕâÀﶨÒå__FILE ºÍ &sup2;»Ê¹ÓðëÖ÷»úÄ£Ê&frac12; */ #pragma import(__use_no_semihosting) struct __FILE { int handle; /* Whatever you require here. If the only file you are using is */ /* standard output using printf() for debugging, no file handling */ /* is required. */ }; #endif /* &sup2;»Ê¹ÓðëÖ÷»úÄ£Ê&frac12;£¬ÖÁÉÙÐèÒªÖØ¶¨Òå_ttywrch\_sys_exit\_sys_command_stringº¯Êý,ÒÔͬʱ¼æÈÝAC6ºÍAC5Ä£Ê&frac12; */ int _ttywrch(int ch) { ch = ch; return ch; } /* ¶¨Òå_sys_exit()ÒÔ±ÜÃâʹÓðëÖ÷»úÄ£Ê&frac12; */ void _sys_exit(int x) { x = x; } char *_sys_command_string(char *cmd, int len) { return NULL; } /* FILE ÔÚ stdio.hÀïÃæ¶¨Òå. */ FILE __stdout; /* ÖØ¶¨Òåfputcº¯Êý, printfº¯Êý×îÖÕ»áͨ¹ýµ÷ÓÃfputcÊä&sup3;ö×Ö·û´®µ&frac12;´®¿Ú */ int fputc(int ch, FILE *f) { while ((USART1->SR & 0X40) == 0); /* µÈ´ýÉÏÒ»¸ö×Ö·û·¢ËÍÍê&sup3;É */ USART1->DR = (uint8_t)ch; /* &frac12;«Òª·¢Ë͵Ä×Ö·û ch дÈëµ&frac12;DR¼Ä´æÆ÷ */ return ch; } #endif /***********************************************END*******************************************/ #if USART_EN_RX /* Èç¹ûʹÄÜÁË&frac12;ÓÊÕ */ /* &frac12;ÓÊÕ»º&sup3;å, ×î´óUSART_REC_LEN¸ö×Ö&frac12;Ú. */ uint8_t g_usart_rx_buf[USART_REC_LEN]; /* &frac12;ÓÊÕ״̬ * bit15£¬ &frac12;ÓÊÕÍê&sup3;ɱêÖ&frac34; * bit14£¬ &frac12;ÓÊÕµ&frac12;0x0d * bit13~0£¬ &frac12;ÓÊÕµ&frac12;µÄÓÐЧ×Ö&frac12;ÚÊýÄ¿ */ uint16_t g_usart_rx_sta = 0; uint8_t g_rx_buffer[RXBUFFERSIZE]; /* HAL¿âʹÓõĴ®¿Ú&frac12;ÓÊÕ»º&sup3;å */ UART_HandleTypeDef g_uart1_handle; /* UART&frac34;ä±ú */ /** * @brief ´®¿ÚX&sup3;õʼ»¯º¯Êý * @param baudrate: &sup2;¨ÌØÂÊ, ¸ù&frac34;Ý×Ô¼ºÐèÒªÉèÖÃ&sup2;¨ÌØÂÊÖµ * @note ×¢Òâ: ±ØÐëÉèÖÃÕýÈ·µÄʱÖÓÔ´, ·ñÔò´®¿Ú&sup2;¨ÌØÂÊ&frac34;Í»áÉèÖÃÒì&sup3;£. * ÕâÀïµÄUSARTµÄʱÖÓÔ´ÔÚsys_stm32_clock_init()º¯ÊýÖÐÒÑ&frac34;­ÉèÖùýÁË. * @retval ÎÞ */ void usart_init(uint32_t baudrate) { g_uart1_handle.Instance = USART_UX; /* USART1 */ g_uart1_handle.Init.BaudRate = baudrate; /* &sup2;¨ÌØÂÊ */ g_uart1_handle.Init.WordLength = UART_WORDLENGTH_8B; /* ×Ö&sup3;¤Îª8λÊý&frac34;ݸñÊ&frac12; */ g_uart1_handle.Init.StopBits = UART_STOPBITS_1; /* Ò»¸öֹͣλ */ g_uart1_handle.Init.Parity = UART_PARITY_NONE; /* ÎÞÆæÅ¼Ð£Ñéλ */ g_uart1_handle.Init.HwFlowCtl = UART_HWCONTROL_NONE; /* ÎÞÓ&sup2;¼þÁ÷¿Ø */ g_uart1_handle.Init.Mode = UART_MODE_TX_RX; /* ÊÕ·¢Ä£Ê&frac12; */ HAL_UART_Init(&g_uart1_handle); /* HAL_UART_Init()»áʹÄÜUART1 */ /* ¸Ãº¯Êý»á¿ªÆô&frac12;ÓÊÕÖжϣº±êÖ&frac34;λUART_IT_RXNE£¬&sup2;¢ÇÒÉèÖÃ&frac12;ÓÊÕ»º&sup3;åÒÔ¼°&frac12;ÓÊÕ»º&sup3;å&frac12;ÓÊÕ×î´óÊý&frac34;ÝÁ¿ */ HAL_UART_Receive_IT(&g_uart1_handle, (uint8_t *)g_rx_buffer, RXBUFFERSIZE); } /** * @brief UARTµ×&sup2;ã&sup3;õʼ»¯º¯Êý * @param huart: UART&frac34;ä±úÀàÐÍÖ¸Õë * @note ´Ëº¯Êý»á±»HAL_UART_Init()µ÷Óà * Íê&sup3;ÉʱÖÓʹÄÜ£¬Òý&frac12;ÅÅäÖã¬ÖжÏÅäÖà * @retval ÎÞ */ void HAL_UART_MspInit(UART_HandleTypeDef *huart) { GPIO_InitTypeDef gpio_init_struct; if(huart->Instance == USART_UX) /* Èç¹ûÊÇ´®¿Ú1£¬&frac12;øÐд®¿Ú1 MSP&sup3;õʼ»¯ */ { USART_UX_CLK_ENABLE(); /* USART1 ʱÖÓʹÄÜ */ USART_TX_GPIO_CLK_ENABLE(); /* ·¢ËÍÒý&frac12;ÅʱÖÓʹÄÜ */ USART_RX_GPIO_CLK_ENABLE(); /* &frac12;ÓÊÕÒý&frac12;ÅʱÖÓʹÄÜ */ gpio_init_struct.Pin = USART_TX_GPIO_PIN; /* TXÒý&frac12;Å */ gpio_init_struct.Mode = GPIO_MODE_AF_PP; /* ¸´ÓÃÍÆÍìÊä&sup3;ö */ gpio_init_struct.Pull = GPIO_PULLUP; /* ÉÏÀ­ */ gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH; /* ¸ßËÙ */ gpio_init_struct.Alternate = USART_TX_GPIO_AF; /* ¸´ÓÃΪUSART1 */ HAL_GPIO_Init(USART_TX_GPIO_PORT, &gpio_init_struct); /* &sup3;õʼ»¯·¢ËÍÒý&frac12;Å */ gpio_init_struct.Pin = USART_RX_GPIO_PIN; /* RXÒý&frac12;Å */ gpio_init_struct.Alternate = USART_RX_GPIO_AF; /* ¸´ÓÃΪUSART1 */ HAL_GPIO_Init(USART_RX_GPIO_PORT, &gpio_init_struct); /* &sup3;õʼ»¯&frac12;ÓÊÕÒý&frac12;Å */ #if USART_EN_RX HAL_NVIC_EnableIRQ(USART_UX_IRQn); /* ʹÄÜUSART1ÖжÏͨµÀ */ HAL_NVIC_SetPriority(USART_UX_IRQn, 3, 3); /* ÇÀÕ¼ÓÅÏȼ¶3£¬×ÓÓÅÏȼ¶3 */ #endif } } /** * @brief Rx´«Ê仨µ÷º¯Êý * @param huart: UART&frac34;ä±úÀàÐÍÖ¸Õë * @retval ÎÞ */ void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if(huart->Instance == USART_UX) /* Èç¹ûÊÇ´®¿Ú1 */ { if((g_usart_rx_sta & 0x8000) == 0) /* &frac12;ÓÊÕδÍê&sup3;É */ { if(g_usart_rx_sta & 0x4000) /* &frac12;ÓÊÕµ&frac12;ÁË0x0d */ { if(g_rx_buffer[0] != 0x0a) { g_usart_rx_sta = 0; /* &frac12;ÓÊÕ´íÎó,ÖØÐ¿ªÊ¼ */ } else { g_usart_rx_sta |= 0x8000; /* &frac12;ÓÊÕÍê&sup3;ÉÁË */ } } else /* »¹Ã»ÊÕµ&frac12;0X0D */ { if(g_rx_buffer[0] == 0x0d) { g_usart_rx_sta |= 0x4000; } else { g_usart_rx_buf[g_usart_rx_sta & 0X3FFF] = g_rx_buffer[0] ; g_usart_rx_sta++; if(g_usart_rx_sta > (USART_REC_LEN - 1)) { g_usart_rx_sta = 0; /* &frac12;ÓÊÕÊý&frac34;Ý´íÎó,ÖØÐ¿ªÊ¼&frac12;ÓÊÕ */ } } } } HAL_UART_Receive_IT(&g_uart1_handle, (uint8_t *)g_rx_buffer, RXBUFFERSIZE); } } /** * @brief ´®¿Ú1ÖжϷþÎñº¯Êý * @param ÎÞ * @retval ÎÞ */ void USART_UX_IRQHandler(void) { #if SYS_SUPPORT_OS /* ʹÓÃOS */ OSIntEnter(); #endif HAL_UART_IRQHandler(&g_uart1_handle); /* µ÷ÓÃHAL¿âÖжϴ¦Àí¹«Óú¯Êý */ #if SYS_SUPPORT_OS /* ʹÓÃOS */ OSIntExit(); #endif } #endif /** **************************************************************************************************** * @file usart.c * @author ÕýµãÔ­×ÓÍŶÓ(ALIENTEK) * @version V1.1 * @date 2023-06-05 * @brief ´®¿Ú&sup3;õʼ»¯´úÂë(Ò»°ãÊÇ´®¿Ú1)£¬Ö§&sup3;Öprintf * @license Copyright (c) 2020-2032, ¹ãÖÝÊÐÐÇÒíµç×ӿƼ¼ÓÐÏÞ¹«Ë&frac34; **************************************************************************************************** * @attention * * ʵÑéÆ&frac12;̨:ÕýµãÔ­×Ó Ì&frac12;Ë÷Õß F407¿ª·¢°å * ÔÚÏßÊÓÆµ:www.yuanzige.com * ¼¼ÊõÂÛÌ&sup3;:www.openedv.com * ¹«Ë&frac34;ÍøÖ·:www.alientek.com * ¹ºÂòµØÖ·:openedv.taobao.com * * ÐÞ¸Ä˵Ã÷ * V1.0 20211014 * µÚÒ»´Î·¢&sup2;¼ * V1.1 20230605 * É&frac34;&sup3;ýUSART_UX_IRQHandler()º¯ÊýµÄ&sup3;¬Ê±´¦ÀíºÍÐÞ¸ÄHAL_UART_RxCpltCallback() **************************************************************************************************** */ #include "./SYSTEM/sys/sys.h" #include "./SYSTEM/usart/usart.h" /* Èç¹ûʹÓÃos,Ôò°üÀ¨ÏÂÃæµÄÍ·Îļþ¼´¿É */ #if SYS_SUPPORT_OS #include "os.h" /* os ʹÓà */ #endif /******************************************************************************************/ /* ¼ÓÈëÒÔÏ´úÂë, Ö§&sup3;Öprintfº¯Êý, ¶ø&sup2;»ÐèҪѡÔñuse MicroLIB */ #if 1 #if (__ARMCC_VERSION >= 6010050) /* ʹÓÃAC6±àÒëÆ÷ʱ */ __asm(".global __use_no_semihosting\n\t"); /* ÉùÃ÷&sup2;»Ê¹ÓðëÖ÷»úÄ£Ê&frac12; */ __asm(".global __ARM_use_no_argv \n\t"); /* AC6ÏÂÐèÒªÉùÃ÷mainº¯ÊýΪÎÞ&sup2;ÎÊý¸ñÊ&frac12;£¬·ñÔò&sup2;¿·ÖÀý&sup3;Ì¿ÉÄÜ&sup3;öÏÖ°ëÖ÷»úÄ£Ê&frac12; */ #else /* ʹÓÃAC5±àÒëÆ÷ʱ, ÒªÔÚÕâÀﶨÒå__FILE ºÍ &sup2;»Ê¹ÓðëÖ÷»úÄ£Ê&frac12; */ #pragma import(__use_no_semihosting) struct __FILE { int handle; /* Whatever you require here. If the only file you are using is */ /* standard output using printf() for debugging, no file handling */ /* is required. */ }; #endif /* &sup2;»Ê¹ÓðëÖ÷»úÄ£Ê&frac12;£¬ÖÁÉÙÐèÒªÖØ¶¨Òå_ttywrch\_sys_exit\_sys_command_stringº¯Êý,ÒÔͬʱ¼æÈÝAC6ºÍAC5Ä£Ê&frac12; */ int _ttywrch(int ch) { ch = ch; return ch; } /* ¶¨Òå_sys_exit()ÒÔ±ÜÃâʹÓðëÖ÷»úÄ£Ê&frac12; */ void _sys_exit(int x) { x = x; } char *_sys_command_string(char *cmd, int len) { return NULL; } /* FILE ÔÚ stdio.hÀïÃæ¶¨Òå. */ FILE __stdout; /* ÖØ¶¨Òåfputcº¯Êý, printfº¯Êý×îÖÕ»áͨ¹ýµ÷ÓÃfputcÊä&sup3;ö×Ö·û´®µ&frac12;´®¿Ú */ int fputc(int ch, FILE *f) { while ((USART1->SR & 0X40) == 0); /* µÈ´ýÉÏÒ»¸ö×Ö·û·¢ËÍÍê&sup3;É */ USART1->DR = (uint8_t)ch; /* &frac12;«Òª·¢Ë͵Ä×Ö·û ch дÈëµ&frac12;DR¼Ä´æÆ÷ */ return ch; } #endif /***********************************************END*******************************************/ #if USART_EN_RX /* Èç¹ûʹÄÜÁË&frac12;ÓÊÕ */ /* &frac12;ÓÊÕ»º&sup3;å, ×î´óUSART_REC_LEN¸ö×Ö&frac12;Ú. */ uint8_t g_usart_rx_buf[USART_REC_LEN]; /* &frac12;ÓÊÕ״̬ * bit15£¬ &frac12;ÓÊÕÍê&sup3;ɱêÖ&frac34; * bit14£¬ &frac12;ÓÊÕµ&frac12;0x0d * bit13~0£¬ &frac12;ÓÊÕµ&frac12;µÄÓÐЧ×Ö&frac12;ÚÊýÄ¿ */ uint16_t g_usart_rx_sta = 0; uint8_t g_rx_buffer[RXBUFFERSIZE]; /* HAL¿âʹÓõĴ®¿Ú&frac12;ÓÊÕ»º&sup3;å */ UART_HandleTypeDef g_uart1_handle; /* UART&frac34;ä±ú */ /** * @brief ´®¿ÚX&sup3;õʼ»¯º¯Êý * @param baudrate: &sup2;¨ÌØÂÊ, ¸ù&frac34;Ý×Ô¼ºÐèÒªÉèÖÃ&sup2;¨ÌØÂÊÖµ * @note ×¢Òâ: ±ØÐëÉèÖÃÕýÈ·µÄʱÖÓÔ´, ·ñÔò´®¿Ú&sup2;¨ÌØÂÊ&frac34;Í»áÉèÖÃÒì&sup3;£. * ÕâÀïµÄUSARTµÄʱÖÓÔ´ÔÚsys_stm32_clock_init()º¯ÊýÖÐÒÑ&frac34;­ÉèÖùýÁË. * @retval ÎÞ */ void usart_init(uint32_t baudrate) { g_uart1_handle.Instance = USART_UX; /* USART1 */ g_uart1_handle.Init.BaudRate = baudrate; /* &sup2;¨ÌØÂÊ */ g_uart1_handle.Init.WordLength = UART_WORDLENGTH_8B; /* ×Ö&sup3;¤Îª8λÊý&frac34;ݸñÊ&frac12; */ g_uart1_handle.Init.StopBits = UART_STOPBITS_1; /* Ò»¸öֹͣλ */ g_uart1_handle.Init.Parity = UART_PARITY_NONE; /* ÎÞÆæÅ¼Ð£Ñéλ */ g_uart1_handle.Init.HwFlowCtl = UART_HWCONTROL_NONE; /* ÎÞÓ&sup2;¼þÁ÷¿Ø */ g_uart1_handle.Init.Mode = UART_MODE_TX_RX; /* ÊÕ·¢Ä£Ê&frac12; */ HAL_UART_Init(&g_uart1_handle); /* HAL_UART_Init()»áʹÄÜUART1 */ /* ¸Ãº¯Êý»á¿ªÆô&frac12;ÓÊÕÖжϣº±êÖ&frac34;λUART_IT_RXNE£¬&sup2;¢ÇÒÉèÖÃ&frac12;ÓÊÕ»º&sup3;åÒÔ¼°&frac12;ÓÊÕ»º&sup3;å&frac12;ÓÊÕ×î´óÊý&frac34;ÝÁ¿ */ HAL_UART_Receive_IT(&g_uart1_handle, (uint8_t *)g_rx_buffer, RXBUFFERSIZE); } /** * @brief UARTµ×&sup2;ã&sup3;õʼ»¯º¯Êý * @param huart: UART&frac34;ä±úÀàÐÍÖ¸Õë * @note ´Ëº¯Êý»á±»HAL_UART_Init()µ÷Óà * Íê&sup3;ÉʱÖÓʹÄÜ£¬Òý&frac12;ÅÅäÖã¬ÖжÏÅäÖà * @retval ÎÞ */ void HAL_UART_MspInit(UART_HandleTypeDef *huart) { GPIO_InitTypeDef gpio_init_struct; if(huart->Instance == USART_UX) /* Èç¹ûÊÇ´®¿Ú1£¬&frac12;øÐд®¿Ú1 MSP&sup3;õʼ»¯ */ { USART_UX_CLK_ENABLE(); /* USART1 ʱÖÓʹÄÜ */ USART_TX_GPIO_CLK_ENABLE(); /* ·¢ËÍÒý&frac12;ÅʱÖÓʹÄÜ */ USART_RX_GPIO_CLK_ENABLE(); /* &frac12;ÓÊÕÒý&frac12;ÅʱÖÓʹÄÜ */ gpio_init_struct.Pin = USART_TX_GPIO_PIN; /* TXÒý&frac12;Å */ gpio_init_struct.Mode = GPIO_MODE_AF_PP; /* ¸´ÓÃÍÆÍìÊä&sup3;ö */ gpio_init_struct.Pull = GPIO_PULLUP; /* ÉÏÀ­ */ gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH; /* ¸ßËÙ */ gpio_init_struct.Alternate = USART_TX_GPIO_AF; /* ¸´ÓÃΪUSART1 */ HAL_GPIO_Init(USART_TX_GPIO_PORT, &gpio_init_struct); /* &sup3;õʼ»¯·¢ËÍÒý&frac12;Å */ gpio_init_struct.Pin = USART_RX_GPIO_PIN; /* RXÒý&frac12;Å */ gpio_init_struct.Alternate = USART_RX_GPIO_AF; /* ¸´ÓÃΪUSART1 */ HAL_GPIO_Init(USART_RX_GPIO_PORT, &gpio_init_struct); /* &sup3;õʼ»¯&frac12;ÓÊÕÒý&frac12;Å */ #if USART_EN_RX HAL_NVIC_EnableIRQ(USART_UX_IRQn); /* ʹÄÜUSART1ÖжÏͨµÀ */ HAL_NVIC_SetPriority(USART_UX_IRQn, 3, 3); /* ÇÀÕ¼ÓÅÏȼ¶3£¬×ÓÓÅÏȼ¶3 */ #endif } } /** * @brief Rx´«Ê仨µ÷º¯Êý * @param huart: UART&frac34;ä±úÀàÐÍÖ¸Õë * @retval ÎÞ */ void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if(huart->Instance == USART_UX) /* Èç¹ûÊÇ´®¿Ú1 */ { if((g_usart_rx_sta & 0x8000) == 0) /* &frac12;ÓÊÕδÍê&sup3;É */ { if(g_usart_rx_sta & 0x4000) /* &frac12;ÓÊÕµ&frac12;ÁË0x0d */ { if(g_rx_buffer[0] != 0x0a) { g_usart_rx_sta = 0; /* &frac12;ÓÊÕ´íÎó,ÖØÐ¿ªÊ¼ */ } else { g_usart_rx_sta |= 0x8000; /* &frac12;ÓÊÕÍê&sup3;ÉÁË */ } } else /* »¹Ã»ÊÕµ&frac12;0X0D */ { if(g_rx_buffer[0] == 0x0d) { g_usart_rx_sta |= 0x4000; } else { g_usart_rx_buf[g_usart_rx_sta & 0X3FFF] = g_rx_buffer[0] ; g_usart_rx_sta++; if(g_usart_rx_sta > (USART_REC_LEN - 1)) { g_usart_rx_sta = 0; /* &frac12;ÓÊÕÊý&frac34;Ý´íÎó,ÖØÐ¿ªÊ¼&frac12;ÓÊÕ */ } } } } HAL_UART_Receive_IT(&g_uart1_handle, (uint8_t *)g_rx_buffer, RXBUFFERSIZE); } } /** * @brief ´®¿Ú1ÖжϷþÎñº¯Êý * @param ÎÞ * @retval ÎÞ */ void USART_UX_IRQHandler(void) { #if SYS_SUPPORT_OS /* ʹÓÃOS */ OSIntEnter(); #endif HAL_UART_IRQHandler(&g_uart1_handle); /* µ÷ÓÃHAL¿âÖжϴ¦Àí¹«Óú¯Êý */ #if SYS_SUPPORT_OS /* ʹÓÃOS */ OSIntExit(); #endif } #endif /** **************************************************************************************************** * @file usart.c * @author ÕýµãÔ­×ÓÍŶÓ(ALIENTEK) * @version V1.1 * @date 2023-06-05 * @brief ´®¿Ú&sup3;õʼ»¯´úÂë(Ò»°ãÊÇ´®¿Ú1)£¬Ö§&sup3;Öprintf * @license Copyright (c) 2020-2032, ¹ãÖÝÊÐÐÇÒíµç×ӿƼ¼ÓÐÏÞ¹«Ë&frac34; **************************************************************************************************** * @attention * * ʵÑéÆ&frac12;̨:ÕýµãÔ­×Ó Ì&frac12;Ë÷Õß F407¿ª·¢°å * ÔÚÏßÊÓÆµ:www.yuanzige.com * ¼¼ÊõÂÛÌ&sup3;:www.openedv.com * ¹«Ë&frac34;ÍøÖ·:www.alientek.com * ¹ºÂòµØÖ·:openedv.taobao.com * * ÐÞ¸Ä˵Ã÷ * V1.0 20211014 * µÚÒ»´Î·¢&sup2;¼ * V1.1 20230605 * É&frac34;&sup3;ýUSART_UX_IRQHandler()º¯ÊýµÄ&sup3;¬Ê±´¦ÀíºÍÐÞ¸ÄHAL_UART_RxCpltCallback() **************************************************************************************************** */ #include "./SYSTEM/sys/sys.h" #include "./SYSTEM/usart/usart.h" /* Èç¹ûʹÓÃos,Ôò°üÀ¨ÏÂÃæµÄÍ·Îļþ¼´¿É */ #if SYS_SUPPORT_OS #include "os.h" /* os ʹÓà */ #endif /******************************************************************************************/ /* ¼ÓÈëÒÔÏ´úÂë, Ö§&sup3;Öprintfº¯Êý, ¶ø&sup2;»ÐèҪѡÔñuse MicroLIB */ #if 1 #if (__ARMCC_VERSION >= 6010050) /* ʹÓÃAC6±àÒëÆ÷ʱ */ __asm(".global __use_no_semihosting\n\t"); /* ÉùÃ÷&sup2;»Ê¹ÓðëÖ÷»úÄ£Ê&frac12; */ __asm(".global __ARM_use_no_argv \n\t"); /* AC6ÏÂÐèÒªÉùÃ÷mainº¯ÊýΪÎÞ&sup2;ÎÊý¸ñÊ&frac12;£¬·ñÔò&sup2;¿·ÖÀý&sup3;Ì¿ÉÄÜ&sup3;öÏÖ°ëÖ÷»úÄ£Ê&frac12; */ #else /* ʹÓÃAC5±àÒëÆ÷ʱ, ÒªÔÚÕâÀﶨÒå__FILE ºÍ &sup2;»Ê¹ÓðëÖ÷»úÄ£Ê&frac12; */ #pragma import(__use_no_semihosting) struct __FILE { int handle; /* Whatever you require here. If the only file you are using is */ /* standard output using printf() for debugging, no file handling */ /* is required. */ }; #endif /* &sup2;»Ê¹ÓðëÖ÷»úÄ£Ê&frac12;£¬ÖÁÉÙÐèÒªÖØ¶¨Òå_ttywrch\_sys_exit\_sys_command_stringº¯Êý,ÒÔͬʱ¼æÈÝAC6ºÍAC5Ä£Ê&frac12; */ int _ttywrch(int ch) { ch = ch; return ch; } /* ¶¨Òå_sys_exit()ÒÔ±ÜÃâʹÓðëÖ÷»úÄ£Ê&frac12; */ void _sys_exit(int x) { x = x; } char *_sys_command_string(char *cmd, int len) { return NULL; } /* FILE ÔÚ stdio.hÀïÃæ¶¨Òå. */ FILE __stdout; /* ÖØ¶¨Òåfputcº¯Êý, printfº¯Êý×îÖÕ»áͨ¹ýµ÷ÓÃfputcÊä&sup3;ö×Ö·û´®µ&frac12;´®¿Ú */ int fputc(int ch, FILE *f) { while ((USART1->SR & 0X40) == 0); /* µÈ´ýÉÏÒ»¸ö×Ö·û·¢ËÍÍê&sup3;É */ USART1->DR = (uint8_t)ch; /* &frac12;«Òª·¢Ë͵Ä×Ö·û ch дÈëµ&frac12;DR¼Ä´æÆ÷ */ return ch; } #endif /***********************************************END*******************************************/ #if USART_EN_RX /* Èç¹ûʹÄÜÁË&frac12;ÓÊÕ */ /* &frac12;ÓÊÕ»º&sup3;å, ×î´óUSART_REC_LEN¸ö×Ö&frac12;Ú. */ uint8_t g_usart_rx_buf[USART_REC_LEN]; /* &frac12;ÓÊÕ״̬ * bit15£¬ &frac12;ÓÊÕÍê&sup3;ɱêÖ&frac34; * bit14£¬ &frac12;ÓÊÕµ&frac12;0x0d * bit13~0£¬ &frac12;ÓÊÕµ&frac12;µÄÓÐЧ×Ö&frac12;ÚÊýÄ¿ */ uint16_t g_usart_rx_sta = 0; uint8_t g_rx_buffer[RXBUFFERSIZE]; /* HAL¿âʹÓõĴ®¿Ú&frac12;ÓÊÕ»º&sup3;å */ UART_HandleTypeDef g_uart1_handle; /* UART&frac34;ä±ú */ /** * @brief ´®¿ÚX&sup3;õʼ»¯º¯Êý * @param baudrate: &sup2;¨ÌØÂÊ, ¸ù&frac34;Ý×Ô¼ºÐèÒªÉèÖÃ&sup2;¨ÌØÂÊÖµ * @note ×¢Òâ: ±ØÐëÉèÖÃÕýÈ·µÄʱÖÓÔ´, ·ñÔò´®¿Ú&sup2;¨ÌØÂÊ&frac34;Í»áÉèÖÃÒì&sup3;£. * ÕâÀïµÄUSARTµÄʱÖÓÔ´ÔÚsys_stm32_clock_init()º¯ÊýÖÐÒÑ&frac34;­ÉèÖùýÁË. * @retval ÎÞ */ void usart_init(uint32_t baudrate) { g_uart1_handle.Instance = USART_UX; /* USART1 */ g_uart1_handle.Init.BaudRate = baudrate; /* &sup2;¨ÌØÂÊ */ g_uart1_handle.Init.WordLength = UART_WORDLENGTH_8B; /* ×Ö&sup3;¤Îª8λÊý&frac34;ݸñÊ&frac12; */ g_uart1_handle.Init.StopBits = UART_STOPBITS_1; /* Ò»¸öֹͣλ */ g_uart1_handle.Init.Parity = UART_PARITY_NONE; /* ÎÞÆæÅ¼Ð£Ñéλ */ g_uart1_handle.Init.HwFlowCtl = UART_HWCONTROL_NONE; /* ÎÞÓ&sup2;¼þÁ÷¿Ø */ g_uart1_handle.Init.Mode = UART_MODE_TX_RX; /* ÊÕ·¢Ä£Ê&frac12; */ HAL_UART_Init(&g_uart1_handle); /* HAL_UART_Init()»áʹÄÜUART1 */ /* ¸Ãº¯Êý»á¿ªÆô&frac12;ÓÊÕÖжϣº±êÖ&frac34;λUART_IT_RXNE£¬&sup2;¢ÇÒÉèÖÃ&frac12;ÓÊÕ»º&sup3;åÒÔ¼°&frac12;ÓÊÕ»º&sup3;å&frac12;ÓÊÕ×î´óÊý&frac34;ÝÁ¿ */ HAL_UART_Receive_IT(&g_uart1_handle, (uint8_t *)g_rx_buffer, RXBUFFERSIZE); } /** * @brief UARTµ×&sup2;ã&sup3;õʼ»¯º¯Êý * @param huart: UART&frac34;ä±úÀàÐÍÖ¸Õë * @note ´Ëº¯Êý»á±»HAL_UART_Init()µ÷Óà * Íê&sup3;ÉʱÖÓʹÄÜ£¬Òý&frac12;ÅÅäÖã¬ÖжÏÅäÖà * @retval ÎÞ */ void HAL_UART_MspInit(UART_HandleTypeDef *huart) { GPIO_InitTypeDef gpio_init_struct; if(huart->Instance == USART_UX) /* Èç¹ûÊÇ´®¿Ú1£¬&frac12;øÐд®¿Ú1 MSP&sup3;õʼ»¯ */ { USART_UX_CLK_ENABLE(); /* USART1 ʱÖÓʹÄÜ */ USART_TX_GPIO_CLK_ENABLE(); /* ·¢ËÍÒý&frac12;ÅʱÖÓʹÄÜ */ USART_RX_GPIO_CLK_ENABLE(); /* &frac12;ÓÊÕÒý&frac12;ÅʱÖÓʹÄÜ */ gpio_init_struct.Pin = USART_TX_GPIO_PIN; /* TXÒý&frac12;Å */ gpio_init_struct.Mode = GPIO_MODE_AF_PP; /* ¸´ÓÃÍÆÍìÊä&sup3;ö */ gpio_init_struct.Pull = GPIO_PULLUP; /* ÉÏÀ­ */ gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH; /* ¸ßËÙ */ gpio_init_struct.Alternate = USART_TX_GPIO_AF; /* ¸´ÓÃΪUSART1 */ HAL_GPIO_Init(USART_TX_GPIO_PORT, &gpio_init_struct); /* &sup3;õʼ»¯·¢ËÍÒý&frac12;Å */ gpio_init_struct.Pin = USART_RX_GPIO_PIN; /* RXÒý&frac12;Å */ gpio_init_struct.Alternate = USART_RX_GPIO_AF; /* ¸´ÓÃΪUSART1 */ HAL_GPIO_Init(USART_RX_GPIO_PORT, &gpio_init_struct); /* &sup3;õʼ»¯&frac12;ÓÊÕÒý&frac12;Å */ #if USART_EN_RX HAL_NVIC_EnableIRQ(USART_UX_IRQn); /* ʹÄÜUSART1ÖжÏͨµÀ */ HAL_NVIC_SetPriority(USART_UX_IRQn, 3, 3); /* ÇÀÕ¼ÓÅÏȼ¶3£¬×ÓÓÅÏȼ¶3 */ #endif } } /** * @brief Rx´«Ê仨µ÷º¯Êý * @param huart: UART&frac34;ä±úÀàÐÍÖ¸Õë * @retval ÎÞ */ void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if(huart->Instance == USART_UX) /* Èç¹ûÊÇ´®¿Ú1 */ { if((g_usart_rx_sta & 0x8000) == 0) /* &frac12;ÓÊÕδÍê&sup3;É */ { if(g_usart_rx_sta & 0x4000) /* &frac12;ÓÊÕµ&frac12;ÁË0x0d */ { if(g_rx_buffer[0] != 0x0a) { g_usart_rx_sta = 0; /* &frac12;ÓÊÕ´íÎó,ÖØÐ¿ªÊ¼ */ } else { g_usart_rx_sta |= 0x8000; /* &frac12;ÓÊÕÍê&sup3;ÉÁË */ } } else /* »¹Ã»ÊÕµ&frac12;0X0D */ { if(g_rx_buffer[0] == 0x0d) { g_usart_rx_sta |= 0x4000; } else { g_usart_rx_buf[g_usart_rx_sta & 0X3FFF] = g_rx_buffer[0] ; g_usart_rx_sta++; if(g_usart_rx_sta > (USART_REC_LEN - 1)) { g_usart_rx_sta = 0; /* &frac12;ÓÊÕÊý&frac34;Ý´íÎó,ÖØÐ¿ªÊ¼&frac12;ÓÊÕ */ } } } } HAL_UART_Receive_IT(&g_uart1_handle, (uint8_t *)g_rx_buffer, RXBUFFERSIZE); } } /** * @brief ´®¿Ú1ÖжϷþÎñº¯Êý * @param ÎÞ * @retval ÎÞ */ void USART_UX_IRQHandler(void) { #if SYS_SUPPORT_OS /* ʹÓÃOS */ OSIntEnter(); #endif HAL_UART_IRQHandler(&g_uart1_handle); /* µ÷ÓÃHAL¿âÖжϴ¦Àí¹«Óú¯Êý */ #if SYS_SUPPORT_OS /* ʹÓÃOS */ OSIntExit(); #endif } #endif /** **************************************************************************************************** * @file usart.c * @author ÕýµãÔ­×ÓÍŶÓ(ALIENTEK) * @version V1.1 * @date 2023-06-05 * @brief ´®¿Ú&sup3;õʼ»¯´úÂë(Ò»°ãÊÇ´®¿Ú1)£¬Ö§&sup3;Öprintf * @license Copyright (c) 2020-2032, ¹ãÖÝÊÐÐÇÒíµç×ӿƼ¼ÓÐÏÞ¹«Ë&frac34; **************************************************************************************************** * @attention * * ʵÑéÆ&frac12;̨:ÕýµãÔ­×Ó Ì&frac12;Ë÷Õß F407¿ª·¢°å * ÔÚÏßÊÓÆµ:www.yuanzige.com * ¼¼ÊõÂÛÌ&sup3;:www.openedv.com * ¹«Ë&frac34;ÍøÖ·:www.alientek.com * ¹ºÂòµØÖ·:openedv.taobao.com * * ÐÞ¸Ä˵Ã÷ * V1.0 20211014 * µÚÒ»´Î·¢&sup2;¼ * V1.1 20230605 * É&frac34;&sup3;ýUSART_UX_IRQHandler()º¯ÊýµÄ&sup3;¬Ê±´¦ÀíºÍÐÞ¸ÄHAL_UART_RxCpltCallback() **************************************************************************************************** */ #include "./SYSTEM/sys/sys.h" #include "./SYSTEM/usart/usart.h" /* Èç¹ûʹÓÃos,Ôò°üÀ¨ÏÂÃæµÄÍ·Îļþ¼´¿É */ #if SYS_SUPPORT_OS #include "os.h" /* os ʹÓà */ #endif /******************************************************************************************/ /* ¼ÓÈëÒÔÏ´úÂë, Ö§&sup3;Öprintfº¯Êý, ¶ø&sup2;»ÐèҪѡÔñuse MicroLIB */ #if 1 #if (__ARMCC_VERSION >= 6010050) /* ʹÓÃAC6±àÒëÆ÷ʱ */ __asm(".global __use_no_semihosting\n\t"); /* ÉùÃ÷&sup2;»Ê¹ÓðëÖ÷»úÄ£Ê&frac12; */ __asm(".global __ARM_use_no_argv \n\t"); /* AC6ÏÂÐèÒªÉùÃ÷mainº¯ÊýΪÎÞ&sup2;ÎÊý¸ñÊ&frac12;£¬·ñÔò&sup2;¿·ÖÀý&sup3;Ì¿ÉÄÜ&sup3;öÏÖ°ëÖ÷»úÄ£Ê&frac12; */ #else /* ʹÓÃAC5±àÒëÆ÷ʱ, ÒªÔÚÕâÀﶨÒå__FILE ºÍ &sup2;»Ê¹ÓðëÖ÷»úÄ£Ê&frac12; */ #pragma import(__use_no_semihosting) struct __FILE { int handle; /* Whatever you require here. If the only file you are using is */ /* standard output using printf() for debugging, no file handling */ /* is required. */ }; #endif /* &sup2;»Ê¹ÓðëÖ÷»úÄ£Ê&frac12;£¬ÖÁÉÙÐèÒªÖØ¶¨Òå_ttywrch\_sys_exit\_sys_command_stringº¯Êý,ÒÔͬʱ¼æÈÝAC6ºÍAC5Ä£Ê&frac12; */ int _ttywrch(int ch) { ch = ch; return ch; } /* ¶¨Òå_sys_exit()ÒÔ±ÜÃâʹÓðëÖ÷»úÄ£Ê&frac12; */ void _sys_exit(int x) { x = x; } char *_sys_command_string(char *cmd, int len) { return NULL; } /* FILE ÔÚ stdio.hÀïÃæ¶¨Òå. */ FILE __stdout; /* ÖØ¶¨Òåfputcº¯Êý, printfº¯Êý×îÖÕ»áͨ¹ýµ÷ÓÃfputcÊä&sup3;ö×Ö·û´®µ&frac12;´®¿Ú */ int fputc(int ch, FILE *f) { while ((USART1->SR & 0X40) == 0); /* µÈ´ýÉÏÒ»¸ö×Ö·û·¢ËÍÍê&sup3;É */ USART1->DR = (uint8_t)ch; /* &frac12;«Òª·¢Ë͵Ä×Ö·û ch дÈëµ&frac12;DR¼Ä´æÆ÷ */ return ch; } #endif /***********************************************END*******************************************/ #if USART_EN_RX /* Èç¹ûʹÄÜÁË&frac12;ÓÊÕ */ /* &frac12;ÓÊÕ»º&sup3;å, ×î´óUSART_REC_LEN¸ö×Ö&frac12;Ú. */ uint8_t g_usart_rx_buf[USART_REC_LEN]; /* &frac12;ÓÊÕ״̬ * bit15£¬ &frac12;ÓÊÕÍê&sup3;ɱêÖ&frac34; * bit14£¬ &frac12;ÓÊÕµ&frac12;0x0d * bit13~0£¬ &frac12;ÓÊÕµ&frac12;µÄÓÐЧ×Ö&frac12;ÚÊýÄ¿ */ uint16_t g_usart_rx_sta = 0; uint8_t g_rx_buffer[RXBUFFERSIZE]; /* HAL¿âʹÓõĴ®¿Ú&frac12;ÓÊÕ»º&sup3;å */ UART_HandleTypeDef g_uart1_handle; /* UART&frac34;ä±ú */ /** * @brief ´®¿ÚX&sup3;õʼ»¯º¯Êý * @param baudrate: &sup2;¨ÌØÂÊ, ¸ù&frac34;Ý×Ô¼ºÐèÒªÉèÖÃ&sup2;¨ÌØÂÊÖµ * @note ×¢Òâ: ±ØÐëÉèÖÃÕýÈ·µÄʱÖÓÔ´, ·ñÔò´®¿Ú&sup2;¨ÌØÂÊ&frac34;Í»áÉèÖÃÒì&sup3;£. * ÕâÀïµÄUSARTµÄʱÖÓÔ´ÔÚsys_stm32_clock_init()º¯ÊýÖÐÒÑ&frac34;­ÉèÖùýÁË. * @retval ÎÞ */ void usart_init(uint32_t baudrate) { g_uart1_handle.Instance = USART_UX; /* USART1 */ g_uart1_handle.Init.BaudRate = baudrate; /* &sup2;¨ÌØÂÊ */ g_uart1_handle.Init.WordLength = UART_WORDLENGTH_8B; /* ×Ö&sup3;¤Îª8λÊý&frac34;ݸñÊ&frac12; */ g_uart1_handle.Init.StopBits = UART_STOPBITS_1; /* Ò»¸öֹͣλ */ g_uart1_handle.Init.Parity = UART_PARITY_NONE; /* ÎÞÆæÅ¼Ð£Ñéλ */ g_uart1_handle.Init.HwFlowCtl = UART_HWCONTROL_NONE; /* ÎÞÓ&sup2;¼þÁ÷¿Ø */ g_uart1_handle.Init.Mode = UART_MODE_TX_RX; /* ÊÕ·¢Ä£Ê&frac12; */ HAL_UART_Init(&g_uart1_handle); /* HAL_UART_Init()»áʹÄÜUART1 */ /* ¸Ãº¯Êý»á¿ªÆô&frac12;ÓÊÕÖжϣº±êÖ&frac34;λUART_IT_RXNE£¬&sup2;¢ÇÒÉèÖÃ&frac12;ÓÊÕ»º&sup3;åÒÔ¼°&frac12;ÓÊÕ»º&sup3;å&frac12;ÓÊÕ×î´óÊý&frac34;ÝÁ¿ */ HAL_UART_Receive_IT(&g_uart1_handle, (uint8_t *)g_rx_buffer, RXBUFFERSIZE); } /** * @brief UARTµ×&sup2;ã&sup3;õʼ»¯º¯Êý * @param huart: UART&frac34;ä±úÀàÐÍÖ¸Õë * @note ´Ëº¯Êý»á±»HAL_UART_Init()µ÷Óà * Íê&sup3;ÉʱÖÓʹÄÜ£¬Òý&frac12;ÅÅäÖã¬ÖжÏÅäÖà * @retval ÎÞ */ void HAL_UART_MspInit(UART_HandleTypeDef *huart) { GPIO_InitTypeDef gpio_init_struct; if(huart->Instance == USART_UX) /* Èç¹ûÊÇ´®¿Ú1£¬&frac12;øÐд®¿Ú1 MSP&sup3;õʼ»¯ */ { USART_UX_CLK_ENABLE(); /* USART1 ʱÖÓʹÄÜ */ USART_TX_GPIO_CLK_ENABLE(); /* ·¢ËÍÒý&frac12;ÅʱÖÓʹÄÜ */ USART_RX_GPIO_CLK_ENABLE(); /* &frac12;ÓÊÕÒý&frac12;ÅʱÖÓʹÄÜ */ gpio_init_struct.Pin = USART_TX_GPIO_PIN; /* TXÒý&frac12;Å */ gpio_init_struct.Mode = GPIO_MODE_AF_PP; /* ¸´ÓÃÍÆÍìÊä&sup3;ö */ gpio_init_struct.Pull = GPIO_PULLUP; /* ÉÏÀ­ */ gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH; /* ¸ßËÙ */ gpio_init_struct.Alternate = USART_TX_GPIO_AF; /* ¸´ÓÃΪUSART1 */ HAL_GPIO_Init(USART_TX_GPIO_PORT, &gpio_init_struct); /* &sup3;õʼ»¯·¢ËÍÒý&frac12;Å */ gpio_init_struct.Pin = USART_RX_GPIO_PIN; /* RXÒý&frac12;Å */ gpio_init_struct.Alternate = USART_RX_GPIO_AF; /* ¸´ÓÃΪUSART1 */ HAL_GPIO_Init(USART_RX_GPIO_PORT, &gpio_init_struct); /* &sup3;õʼ»¯&frac12;ÓÊÕÒý&frac12;Å */ #if USART_EN_RX HAL_NVIC_EnableIRQ(USART_UX_IRQn); /* ʹÄÜUSART1ÖжÏͨµÀ */ HAL_NVIC_SetPriority(USART_UX_IRQn, 3, 3); /* ÇÀÕ¼ÓÅÏȼ¶3£¬×ÓÓÅÏȼ¶3 */ #endif } } /** * @brief Rx´«Ê仨µ÷º¯Êý * @param huart: UART&frac34;ä±úÀàÐÍÖ¸Õë * @retval ÎÞ */ void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if(huart->Instance == USART_UX) /* Èç¹ûÊÇ´®¿Ú1 */ { if((g_usart_rx_sta & 0x8000) == 0) /* &frac12;ÓÊÕδÍê&sup3;É */ { if(g_usart_rx_sta & 0x4000) /* &frac12;ÓÊÕµ&frac12;ÁË0x0d */ { if(g_rx_buffer[0] != 0x0a) { g_usart_rx_sta = 0; /* &frac12;ÓÊÕ´íÎó,ÖØÐ¿ªÊ¼ */ } else { g_usart_rx_sta |= 0x8000; /* &frac12;ÓÊÕÍê&sup3;ÉÁË */ } } else /* »¹Ã»ÊÕµ&frac12;0X0D */ { if(g_rx_buffer[0] == 0x0d) { g_usart_rx_sta |= 0x4000; } else { g_usart_rx_buf[g_usart_rx_sta & 0X3FFF] = g_rx_buffer[0] ; g_usart_rx_sta++; if(g_usart_rx_sta > (USART_REC_LEN - 1)) { g_usart_rx_sta = 0; /* &frac12;ÓÊÕÊý&frac34;Ý´íÎó,ÖØÐ¿ªÊ¼&frac12;ÓÊÕ */ } } } } HAL_UART_Receive_IT(&g_uart1_handle, (uint8_t *)g_rx_buffer, RXBUFFERSIZE); } } /** * @brief ´®¿Ú1ÖжϷþÎñº¯Êý * @param ÎÞ * @retval ÎÞ */ void USART_UX_IRQHandler(void) { #if SYS_SUPPORT_OS /* ʹÓÃOS */ OSIntEnter(); #endif HAL_UART_IRQHandler(&g_uart1_handle); /* µ÷ÓÃHAL¿âÖжϴ¦Àí¹«Óú¯Êý */ #if SYS_SUPPORT_OS /* ʹÓÃOS */ OSIntExit(); #endif } #endif /** **************************************************************************************************** * @file usart.c * @author ÕýµãÔ­×ÓÍŶÓ(ALIENTEK) * @version V1.1 * @date 2023-06-05 * @brief ´®¿Ú&sup3;õʼ»¯´úÂë(Ò»°ãÊÇ´®¿Ú1)£¬Ö§&sup3;Öprintf * @license Copyright (c) 2020-2032, ¹ãÖÝÊÐÐÇÒíµç×ӿƼ¼ÓÐÏÞ¹«Ë&frac34; **************************************************************************************************** * @attention * * ʵÑéÆ&frac12;̨:ÕýµãÔ­×Ó Ì&frac12;Ë÷Õß F407¿ª·¢°å * ÔÚÏßÊÓÆµ:www.yuanzige.com * ¼¼ÊõÂÛÌ&sup3;:www.openedv.com * ¹«Ë&frac34;ÍøÖ·:www.alientek.com * ¹ºÂòµØÖ·:openedv.taobao.com * * ÐÞ¸Ä˵Ã÷ * V1.0 20211014 * µÚÒ»´Î·¢&sup2;¼ * V1.1 20230605 * É&frac34;&sup3;ýUSART_UX_IRQHandler()º¯ÊýµÄ&sup3;¬Ê±´¦ÀíºÍÐÞ¸ÄHAL_UART_RxCpltCallback() **************************************************************************************************** */ #include "./SYSTEM/sys/sys.h" #include "./SYSTEM/usart/usart.h" /* Èç¹ûʹÓÃos,Ôò°üÀ¨ÏÂÃæµÄÍ·Îļþ¼´¿É */ #if SYS_SUPPORT_OS #include "os.h" /* os ʹÓà */ #endif /******************************************************************************************/ /* ¼ÓÈëÒÔÏ´úÂë, Ö§&sup3;Öprintfº¯Êý, ¶ø&sup2;»ÐèҪѡÔñuse MicroLIB */ #if 1 #if (__ARMCC_VERSION >= 6010050) /* ʹÓÃAC6±àÒëÆ÷ʱ */ __asm(".global __use_no_semihosting\n\t"); /* ÉùÃ÷&sup2;»Ê¹ÓðëÖ÷»úÄ£Ê&frac12; */ __asm(".global __ARM_use_no_argv \n\t"); /* AC6ÏÂÐèÒªÉùÃ÷mainº¯ÊýΪÎÞ&sup2;ÎÊý¸ñÊ&frac12;£¬·ñÔò&sup2;¿·ÖÀý&sup3;Ì¿ÉÄÜ&sup3;öÏÖ°ëÖ÷»úÄ£Ê&frac12; */ #else /* ʹÓÃAC5±àÒëÆ÷ʱ, ÒªÔÚÕâÀﶨÒå__FILE ºÍ &sup2;»Ê¹ÓðëÖ÷»úÄ£Ê&frac12; */ #pragma import(__use_no_semihosting) struct __FILE { int handle; /* Whatever you require here. If the only file you are using is */ /* standard output using printf() for debugging, no file handling */ /* is required. */ }; #endif /* &sup2;»Ê¹ÓðëÖ÷»úÄ£Ê&frac12;£¬ÖÁÉÙÐèÒªÖØ¶¨Òå_ttywrch\_sys_exit\_sys_command_stringº¯Êý,ÒÔͬʱ¼æÈÝAC6ºÍAC5Ä£Ê&frac12; */ int _ttywrch(int ch) { ch = ch; return ch; } /* ¶¨Òå_sys_exit()ÒÔ±ÜÃâʹÓðëÖ÷»úÄ£Ê&frac12; */ void _sys_exit(int x) { x = x; } char *_sys_command_string(char *cmd, int len) { return NULL; } /* FILE ÔÚ stdio.hÀïÃæ¶¨Òå. */ FILE __stdout; /* ÖØ¶¨Òåfputcº¯Êý, printfº¯Êý×îÖÕ»áͨ¹ýµ÷ÓÃfputcÊä&sup3;ö×Ö·û´®µ&frac12;´®¿Ú */ int fputc(int ch, FILE *f) { while ((USART1->SR & 0X40) == 0); /* µÈ´ýÉÏÒ»¸ö×Ö·û·¢ËÍÍê&sup3;É */ USART1->DR = (uint8_t)ch; /* &frac12;«Òª·¢Ë͵Ä×Ö·û ch дÈëµ&frac12;DR¼Ä´æÆ÷ */ return ch; } #endif /***********************************************END*******************************************/ #if USART_EN_RX /* Èç¹ûʹÄÜÁË&frac12;ÓÊÕ */ /* &frac12;ÓÊÕ»º&sup3;å, ×î´óUSART_REC_LEN¸ö×Ö&frac12;Ú. */ uint8_t g_usart_rx_buf[USART_REC_LEN]; /* &frac12;ÓÊÕ״̬ * bit15£¬ &frac12;ÓÊÕÍê&sup3;ɱêÖ&frac34; * bit14£¬ &frac12;ÓÊÕµ&frac12;0x0d * bit13~0£¬ &frac12;ÓÊÕµ&frac12;µÄÓÐЧ×Ö&frac12;ÚÊýÄ¿ */ uint16_t g_usart_rx_sta = 0; uint8_t g_rx_buffer[RXBUFFERSIZE]; /* HAL¿âʹÓõĴ®¿Ú&frac12;ÓÊÕ»º&sup3;å */ UART_HandleTypeDef g_uart1_handle; /* UART&frac34;ä±ú */ /** * @brief ´®¿ÚX&sup3;õʼ»¯º¯Êý * @param baudrate: &sup2;¨ÌØÂÊ, ¸ù&frac34;Ý×Ô¼ºÐèÒªÉèÖÃ&sup2;¨ÌØÂÊÖµ * @note ×¢Òâ: ±ØÐëÉèÖÃÕýÈ·µÄʱÖÓÔ´, ·ñÔò´®¿Ú&sup2;¨ÌØÂÊ&frac34;Í»áÉèÖÃÒì&sup3;£. * ÕâÀïµÄUSARTµÄʱÖÓÔ´ÔÚsys_stm32_clock_init()º¯ÊýÖÐÒÑ&frac34;­ÉèÖùýÁË. * @retval ÎÞ */ void usart_init(uint32_t baudrate) { g_uart1_handle.Instance = USART_UX; /* USART1 */ g_uart1_handle.Init.BaudRate = baudrate; /* &sup2;¨ÌØÂÊ */ g_uart1_handle.Init.WordLength = UART_WORDLENGTH_8B; /* ×Ö&sup3;¤Îª8λÊý&frac34;ݸñÊ&frac12; */ g_uart1_handle.Init.StopBits = UART_STOPBITS_1; /* Ò»¸öֹͣλ */ g_uart1_handle.Init.Parity = UART_PARITY_NONE; /* ÎÞÆæÅ¼Ð£Ñéλ */ g_uart1_handle.Init.HwFlowCtl = UART_HWCONTROL_NONE; /* ÎÞÓ&sup2;¼þÁ÷¿Ø */ g_uart1_handle.Init.Mode = UART_MODE_TX_RX; /* ÊÕ·¢Ä£Ê&frac12; */ HAL_UART_Init(&g_uart1_handle); /* HAL_UART_Init()»áʹÄÜUART1 */ /* ¸Ãº¯Êý»á¿ªÆô&frac12;ÓÊÕÖжϣº±êÖ&frac34;λUART_IT_RXNE£¬&sup2;¢ÇÒÉèÖÃ&frac12;ÓÊÕ»º&sup3;åÒÔ¼°&frac12;ÓÊÕ»º&sup3;å&frac12;ÓÊÕ×î´óÊý&frac34;ÝÁ¿ */ HAL_UART_Receive_IT(&g_uart1_handle, (uint8_t *)g_rx_buffer, RXBUFFERSIZE); } /** * @brief UARTµ×&sup2;ã&sup3;õʼ»¯º¯Êý * @param huart: UART&frac34;ä±úÀàÐÍÖ¸Õë * @note ´Ëº¯Êý»á±»HAL_UART_Init()µ÷Óà * Íê&sup3;ÉʱÖÓʹÄÜ£¬Òý&frac12;ÅÅäÖã¬ÖжÏÅäÖà * @retval ÎÞ */ void HAL_UART_MspInit(UART_HandleTypeDef *huart) { GPIO_InitTypeDef gpio_init_struct; if(huart->Instance == USART_UX) /* Èç¹ûÊÇ´®¿Ú1£¬&frac12;øÐд®¿Ú1 MSP&sup3;õʼ»¯ */ { USART_UX_CLK_ENABLE(); /* USART1 ʱÖÓʹÄÜ */ USART_TX_GPIO_CLK_ENABLE(); /* ·¢ËÍÒý&frac12;ÅʱÖÓʹÄÜ */ USART_RX_GPIO_CLK_ENABLE(); /* &frac12;ÓÊÕÒý&frac12;ÅʱÖÓʹÄÜ */ gpio_init_struct.Pin = USART_TX_GPIO_PIN; /* TXÒý&frac12;Å */ gpio_init_struct.Mode = GPIO_MODE_AF_PP; /* ¸´ÓÃÍÆÍìÊä&sup3;ö */ gpio_init_struct.Pull = GPIO_PULLUP; /* ÉÏÀ­ */ gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH; /* ¸ßËÙ */ gpio_init_struct.Alternate = USART_TX_GPIO_AF; /* ¸´ÓÃΪUSART1 */ HAL_GPIO_Init(USART_TX_GPIO_PORT, &gpio_init_struct); /* &sup3;õʼ»¯·¢ËÍÒý&frac12;Å */ gpio_init_struct.Pin = USART_RX_GPIO_PIN; /* RXÒý&frac12;Å */ gpio_init_struct.Alternate = USART_RX_GPIO_AF; /* ¸´ÓÃΪUSART1 */ HAL_GPIO_Init(USART_RX_GPIO_PORT, &gpio_init_struct); /* &sup3;õʼ»¯&frac12;ÓÊÕÒý&frac12;Å */ #if USART_EN_RX HAL_NVIC_EnableIRQ(USART_UX_IRQn); /* ʹÄÜUSART1ÖжÏͨµÀ */ HAL_NVIC_SetPriority(USART_UX_IRQn, 3, 3); /* ÇÀÕ¼ÓÅÏȼ¶3£¬×ÓÓÅÏȼ¶3 */ #endif } } /** * @brief Rx´«Ê仨µ÷º¯Êý * @param huart: UART&frac34;ä±úÀàÐÍÖ¸Õë * @retval ÎÞ */ void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if(huart->Instance == USART_UX) /* Èç¹ûÊÇ´®¿Ú1 */ { if((g_usart_rx_sta & 0x8000) == 0) /* &frac12;ÓÊÕδÍê&sup3;É */ { if(g_usart_rx_sta & 0x4000) /* &frac12;ÓÊÕµ&frac12;ÁË0x0d */ { if(g_rx_buffer[0] != 0x0a) { g_usart_rx_sta = 0; /* &frac12;ÓÊÕ´íÎó,ÖØÐ¿ªÊ¼ */ } else { g_usart_rx_sta |= 0x8000; /* &frac12;ÓÊÕÍê&sup3;ÉÁË */ } } else /* »¹Ã»ÊÕµ&frac12;0X0D */ { if(g_rx_buffer[0] == 0x0d) { g_usart_rx_sta |= 0x4000; } else { g_usart_rx_buf[g_usart_rx_sta & 0X3FFF] = g_rx_buffer[0] ; g_usart_rx_sta++; if(g_usart_rx_sta > (USART_REC_LEN - 1)) { g_usart_rx_sta = 0; /* &frac12;ÓÊÕÊý&frac34;Ý´íÎó,ÖØÐ¿ªÊ¼&frac12;ÓÊÕ */ } } } } HAL_UART_Receive_IT(&g_uart1_handle, (uint8_t *)g_rx_buffer, RXBUFFERSIZE); } } /** * @brief ´®¿Ú1ÖжϷþÎñº¯Êý * @param ÎÞ * @retval ÎÞ */ void USART_UX_IRQHandler(void) { #if SYS_SUPPORT_OS /* ʹÓÃOS */ OSIntEnter(); #endif HAL_UART_IRQHandler(&g_uart1_handle); /* µ÷ÓÃHAL¿âÖжϴ¦Àí¹«Óú¯Êý */ #if SYS_SUPPORT_OS /* ʹÓÃOS */ OSIntExit(); #endif } #endif (我要使输入的在LCD上面显示应该怎么做)
05-21
#include <reg52.h> //°üº¬51µ¥Æ¬»úÏà¹ØµÄÍ·Îļþ #include <intrins.h> #define uint unsigned int //ÖØ¶¨ÒåÎÞ·ûºÅÕûÊýÀàÐÍ #define uchar unsigned char //ÖØ¶¨ÒåÎÞ·ûºÅ×Ö·ûÀàÐÍ uchar code LedShowData[]={0x03,0x9F,0x25,0x0D,0x99, //¶¨ÒåÊýÂë¹ÜÏÔÊ&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; //¶¨ÒåÉÁ¶¯ÆµÂʼÆÊý±äÁ¿ unsigned char RunFlag=0; //¶¨ÒåÔËÐбêÖ&frac34;λ bit EnableLight=0; //¶¨ÒåÖ¸Ê&frac34;µÆÊ¹ÄÜλ /*************Íê&sup3;É״ָ̬Ê&frac34;µÆ¶¨Òå*************/ sbit S1=P3^2; //¶¨ÒåS1°´¼ü¶Ë¿Ú /*************Íê&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 //¶¨ÒåÊýÂë¹ÜÏÔÊ&frac34;¶Ë¿Ú extern void ControlCar(uchar CarType); //ÉùÃ÷С&sup3;µ¿ØÖÆ×Ó&sup3;ÌÐò void delayms(unsigned char x) //0.14mSÑÓʱ&sup3;ÌÐò { unsigned char i; //¶¨ÒåÁÙʱ±äÁ¿ while(x--) //ÑÓʱʱ¼äÑ­»· { 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; //¶¨ÒåÑÓʱʱ¼ä±äÁ¿ while(DelayTime--); //¿ªÊ¼&frac12;øÐÐÑÓʱѭ»· return; //×Ó&sup3;ÌÐò·µ»Ø } void tingzhi() { M1A=0; //&frac12;«M1µç»úA¶Ë&sup3;õʼ»¯Îª0 M1B=0; //&frac12;«M1µç»úB¶Ë&sup3;õʼ»¯Îª0 M2A=0; //&frac12;«M2µç»úA¶Ë&sup3;õʼ»¯Îª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;øÖ®Ç° ÏÈÍ£Ö¹Ò»¶Îʱ¼ä ·ÀÖ¹µç»ú·´Ïòµçѹ&sup3;å»÷Ö÷°å µ¼ÖÂϵÍ&sup3;¸´Î» Delay1ms(240); qianjin(); ShowPort=LedShowData[1]; break; } case 2: //ºóÍË //ÅжÏÓû§ÊÇ·ñÑ¡ÔñÐÎÊ&frac12;2 { tingzhi(); //&frac12;øÈëºóÍË֮ǰ ÏÈÍ£Ö¹Ò»¶Îʱ¼ä ·ÀÖ¹µç»ú·´Ïòµçѹ&sup3;å»÷Ö÷°å µ¼ÖÂϵÍ&sup3;¸´Î» Delay1ms(240); // LeftLed = 1 ; houtui(); ShowPort=LedShowData[2]; //M2µç»ú·´×ª break; } case 3: //×óת //ÅжÏÓû§ÊÇ·ñÑ¡ÔñÐÎÊ&frac12;3 { tingzhi(); //&frac12;øÈë×óת֮ǰ ÏÈÍ£Ö¹Ò»¶Îʱ¼ä ·ÀÖ¹µç»ú·´Ïòµçѹ&sup3;å»÷Ö÷°å µ¼ÖÂϵÍ&sup3;¸´Î» Delay1ms(240); zuozhuan(); ShowPort=LedShowData[3]; //M2µç»úÕýת break; } case 4: //ÓÒת //ÅжÏÓû§ÊÇ·ñÑ¡ÔñÐÎÊ&frac12;4 { tingzhi(); //&frac12;øÈëÓÒת֮ǰ ÏÈÍ£Ö¹Ò»¶Îʱ¼ä ·ÀÖ¹µç»ú·´Ïòµçѹ&sup3;å»÷Ö÷°å µ¼ÖÂϵÍ&sup3;¸´Î» Delay1ms(240); youzhuan(); //M1µç»úÕýת ShowPort=LedShowData[4]; //M2µç»ú·´×ª break; } case 5: //Í£Ö¹ //ÅжÏÓû§ÊÇ·ñÑ¡ÔñÐÎÊ&frac12;8 { tingzhi(); ShowPort=LedShowData[0]; break; //ÍË&sup3;öµ±Ç°Ñ¡Ôñ } } } void IR_IN() interrupt 2 using 0 //¶¨ÒåINT2Íâ&sup2;¿ÖжϺ¯Êý { unsigned char j,k,N=0; //¶¨ÒåÁÙʱ&frac12;ÓÊÕ±äÁ¿ EX1 = 0; //¹Ø±ÕÍâ&sup2;¿ÖжÏ,·ÀÖ¹ÔÙÓÐÐźŵ&frac12;´ï delayms(15); //ÑÓʱʱ¼ä£¬&frac12;øÐкìÍâÏû¶¶ if (IRIN==1) //ÅжϺìÍâÐźÅÊÇ·ñÏûʧ { EX1 =1; //Íâ&sup2;¿ÖжϿª return; //·µ»Ø } while (!IRIN) //µÈIR±äΪ¸ßµçÆ&frac12;£¬Ìø¹ý9msµÄǰµ¼µÍµçÆ&frac12;Ðźš£ { delayms(1); //ÑÓʱµÈ´ý } for (j=0;j<4;j++) //&sup2;ɼ¯ºìÍâÒ£¿ØÆ÷Êý&frac34;Ý { for (k=0;k<8;k++) //·Ö´Î&sup2;ɼ¯8λÊý&frac34;Ý { while (IRIN) //µÈ IR ±äΪµÍµçÆ&frac12;£¬Ìø¹ý4.5msµÄǰµ¼¸ßµçÆ&frac12;Ðźš£ { delayms(1); //ÑÓʱµÈ´ý } while (!IRIN) //µÈ IR ±äΪ¸ßµçÆ&frac12; { delayms(1); //ÑÓʱµÈ´ý } while (IRIN) //¼ÆËãIR¸ßµçÆ&frac12;ʱ&sup3;¤ { delayms(1); //ÑÓʱµÈ´ý N++; //¼ÆÊýÆ÷¼Ó¼Ó if (N>=30) //ÅжϼÆÊýÆ÷ÀÛ¼ÓÖµ { EX1=1; //´ò¿ªÍâ&sup2;¿ÖжϹ¦ÄÜ return; //·µ»Ø } } IRCOM[j]=IRCOM[j] >> 1; //&frac12;øÐÐÊý&frac34;ÝÎ»ÒÆ&sup2;Ù×÷&sup2;¢×Ô¶¯&sup2;¹Áã if (N>=8) //ÅжÏÊý&frac34;Ý&sup3;¤¶È { IRCOM[j] = IRCOM[j] | 0x80; //Êý&frac34;Ý×î¸ßλ&sup2;¹1 } N=0; //ÇåÁãλÊý¼ÆÂ¼Æ÷ } } if (IRCOM[2]!=~IRCOM[3]) //ÅжϵØÖ·ÂëÊÇ·ñÏàͬ { EX1=1; //´ò¿ªÍâ&sup2;¿ÖÐ¶Ï return; //·µ»Ø } for(j=0;j<10;j++) //Ñ­»·&frac12;øÐмüÂë&frac12;âÎö { if(IRCOM[2]==RecvData[j]) //&frac12;øÐмüλ¶ÔÓ¦ { ControlCar(j); //ÊýÂë¹ÜÏÔÊ&frac34;ÏàÓ¦ÊýÂë } } EX1 = 1; //Íâ&sup2;¿ÖжϿª } void main(void) //Ö÷&sup3;ÌÐòÈë¿Ú { bit ExeFlag=0; //¶¨Òå¿ÉÖ´ÐÐλ±äÁ¿ LedFlash=3000; //¶ÔÉÁµÆÊý&frac34;Ý&frac12;øÐÐ&sup3;õʼ»¯ EX1=1; //ͬÒ⿪ÆôÍâ&sup2;¿ÖжÏ1 IT1=1; //É趨Íâ&sup2;¿ÖжÏ1ΪµÍ±ßÔµ´¥·¢ÀàÐÍ EA=1; //×ÜÖжϿªÆô ShowPort=LedShowData[0]; //ÊýÂë¹ÜÏÔÊ&frac34;Êý×Ö0 while(1) //&sup3;ÌÐòÖ÷Ñ­»· { Delay(); //ÑÓʱ // RunStopState=~RunStopState; //ÔËÐÐÖ¸Ê&frac34;µÆ×´Ì¬×ª±ä } }详细解释
06-01
#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;ÓÐЧ //ÊýÂë¹ÜÒý&frac12;Ŷ¨Òå #define duanPore P0 //ÊýÂë¹Ü¶Î¿ØÖƶ˿ڣ¬¸ßµçÆ&frac12;ÓÐЧ sbit DIG1 = P2^4; //ÊýÂë¹ÜµÚ1λλѡ¿ØÖƶ˿ڣ¬µÍµçÆ&frac12;ÓÐЧ sbit DIG2 = P2^5; //ÊýÂë¹ÜµÚ2λλѡ¿ØÖƶ˿ڣ¬µÍµçÆ&frac12;ÓÐЧ sbit DIG3 = P2^6; //ÊýÂë¹ÜµÚ3λλѡ¿ØÖƶ˿ڣ¬µÍµçÆ&frac12;ÓÐЧ sbit DIG4 = P2^7; //ÊýÂë¹ÜµÚ4λλѡ¿ØÖƶ˿ڣ¬µÍµçÆ&frac12;ÓÐЧ //°´¼üÒý&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; //Ö÷&sup3;ÖÈ˼ü sbit KEY8 = P3^3; //ÉèÖüü //---------------------- È«&frac34;Ö±äÁ¿¶¨Òå --------------------// //ÊýÂë¹Ü¶ÎÂë±í£¬ÊÊÓÃÓÚ¹&sup2;ÒõÊýÂë¹Ü 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 //&#39;-&#39;£¬¹Ø±ÕÏÔÊ&frac34;£¬&#39;=&#39; }; unsigned char dat_buf[4] = {17, 17, 0, 5}; //ÏÔÊ&frac34;Êý&frac34;Ý»º´æÇø£¬Ä¬ÈÏÉϵçÏÔÊ&frac34;" 05" int time = 5, time1 = 5, time2 = 20; //µ¹¼ÆÊ±Ê±¼ä£¬time1£ºÇÀ´ðµ¹¼ÆÊ±Ê±¼ä£¬time2£º»Ø´ðµ¹¼ÆÊ±Ê±¼ä unsigned char i = 0; unsigned int count = 0; //¼ÆÊý»º´æ±äÁ¿ bit flag_lock = 1; //¼üÅÌËø¶¨±êÖ&frac34;£¬1£º&sup2;»Ëø¶¨£¬0£ºËø¶¨ //------------------------------- º¯ÊýÉùÃ÷ ------------------------------------// void DelayMs(unsigned int ms); //ÑÓʱº¯Êý£¬µ¥Î»£ºms void dig_scan(unsigned char *dat); unsigned char KeyScan(void); //¶ÀÁ¢°´¼üɨÃè void InitTimer0(void); //¶¨Ê±Æ÷0&sup3;õʼ»¯ void alarm(void); //±¨&frac34;¯º¯Êý void AnswerTask(void); //ÇÀ´ðÈÎÎñ void SetTime(void); //ÉèÖõ¹¼ÆÊ±Ê±¼ä /* Ö÷º¯Êý */ void main(void) { BEEP = 0; //ÉϵçĬÈϹرշäÃùÆ÷ LED1 = 1; InitTimer0(); //¶¨Ê±Æ÷0&sup3;õʼ»¯ time = time1; //ÉϵçĬÈÏÇÀ´ðµ¹¼ÆÊ± while(1) { if(KeyScan() == 7) //Èç¹ûÖ÷&sup3;ÖÈ˼ü°´Ï£¬Ôò&frac12;øÐÐÇÀ´ð { alarm(); //·äÃùÆ÷ÏìÒ»Éù AnswerTask(); //&frac12;øÐÐÇÀ´ðÈÎÎñ } if(KeyScan() == 8) //Èç¹ûÉèÖüü°´Ï£¬&frac12;øÈëÉèÖõ¹¼ÆÊ±Ê±¼ä { alarm(); //·äÃùÆ÷ÏìÒ»Éù SetTime(); //&frac12;øÈëÉè¼Æµ¹¼ÆÊ±Ê±¼ä } dat_buf[0] = 17; dat_buf[1] = 17; dat_buf[2] = time / 10; //È¡&sup3;öµ¹¼ÆÊ±µÄʮλÊý dat_buf[3] = time % 10; //È¡&sup3;öµ¹¼ÆÊ±µÄ¸öλÊý dig_scan(dat_buf); //&sup2;âÊÔÊýÂë¹ÜÏÔÊ&frac34; } } /* ÑÓʱº¯Êý£¬µ¥Î»£º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--); } } /* ÊýÂë¹ÜÏÔÊ&frac34;ɨÃè */ void dig_scan(unsigned char *dat) { /* ¶¯Ì¬É¨Ãè´¦Àí */ switch(i) { case 0: { duanPore = tab_duan[dat[0]]; //ÏÔÊ&frac34;µÚ1λÊýÂë¹ÜÄÚÈÝ DIG1 = 0; break; } case 1: { duanPore = tab_duan[dat[1]]; //ÏÔÊ&frac34;µÚ2λÊýÂë¹ÜÄÚÈÝ DIG2 = 0; //ѡͨµÚ2λÊýÂë¹Ü break; } case 2: { duanPore = tab_duan[dat[2]]; //ÏÔÊ&frac34;µÚ3λÊýÂë¹ÜÄÚÈÝ DIG3 = 0; //ѡͨµÚ3λÊýÂë¹Ü break; } case 3: { duanPore = tab_duan[dat[3]]; //ÏÔÊ&frac34;µÚ4λÊýÂë¹ÜÄÚÈÝ DIG4 = 0; //ѡͨµÚ4λÊýÂë¹Ü break; } default: break; } DelayMs(5); //ɨÃèÑÓʱ10ms£¬¸ù&frac34;Ýʵ¼ÊÇé¿öÊʵ±Ð޸ĸÄÑÓʱʱ¼ä DIG1 = 1; //ÏûÒþ DIG2 = 1; DIG3 = 1; DIG4 = 1; ++i; //ɨÃè±äÁ¿Ñ­»· if(i > 3) i = 0; } /* ¶ÀÁ¢°´¼üɨÃè */ unsigned char KeyScan(void) { if(KEY1 == 0) //Èç¹û°´¼ü1°´Ï { DelayMs(10); //ÑÓʱ10msÈ¥&sup3;ý°´¼ü¶¶¶¯ if(KEY1 == 0) //ÔÙÈ·ÈÏÒ»´Î°´¼ü°´Ï£¬±íÊ&frac34;µ&frac12;Õâ°´¼üÒÑ&frac34;­Îȶ¨ÁË return 1; //Êä&sup3;ö°´¼üÖµ1 } if(KEY2 == 0) //Èç¹û°´¼ü2°´Ï { DelayMs(10); //ÑÓʱ10msÈ¥&sup3;ý°´¼ü¶¶¶¯ if(KEY2 == 0) //ÔÙÈ·ÈÏÒ»´Î°´¼ü°´Ï£¬±íÊ&frac34;µ&frac12;Õâ°´¼üÒÑ&frac34;­Îȶ¨ÁË return 2; //Êä&sup3;ö°´¼üÖµ2 } if(KEY3 == 0) //Èç¹û°´¼ü3°´Ï { DelayMs(10); //ÑÓʱ10msÈ¥&sup3;ý°´¼ü¶¶¶¯ if(KEY3 == 0) //ÔÙÈ·ÈÏÒ»´Î°´¼ü°´Ï£¬±íÊ&frac34;µ&frac12;Õâ°´¼üÒÑ&frac34;­Îȶ¨ÁË return 3; //Êä&sup3;ö°´¼üÖµ3 } if(KEY4 == 0) //Èç¹û°´¼ü4°´Ï { DelayMs(10); //ÑÓʱ10msÈ¥&sup3;ý°´¼ü¶¶¶¯ if(KEY4 == 0) //ÔÙÈ·ÈÏÒ»´Î°´¼ü°´Ï£¬±íÊ&frac34;µ&frac12;Õâ°´¼üÒÑ&frac34;­Îȶ¨ÁË return 4; //Êä&sup3;ö°´¼üÖµ4 } if(KEY5 == 0) //Èç¹û°´¼ü5°´Ï { DelayMs(10); //ÑÓʱ10msÈ¥&sup3;ý°´¼ü¶¶¶¯ if(KEY5 == 0) //ÔÙÈ·ÈÏÒ»´Î°´¼ü°´Ï£¬±íÊ&frac34;µ&frac12;Õâ°´¼üÒÑ&frac34;­Îȶ¨ÁË return 5; //Êä&sup3;ö°´¼üÖµ5 } if(KEY6 == 0) //Èç¹û°´¼ü6°´Ï { DelayMs(10); //ÑÓʱ10msÈ¥&sup3;ý°´¼ü¶¶¶¯ if(KEY6 == 0) //ÔÙÈ·ÈÏÒ»´Î°´¼ü°´Ï£¬±íÊ&frac34;µ&frac12;Õâ°´¼üÒÑ&frac34;­Îȶ¨ÁË return 6; //Êä&sup3;ö°´¼üÖµ6 } if(KEY7 == 0) //Èç¹û°´¼ü7°´Ï { DelayMs(10); //ÑÓʱ10msÈ¥&sup3;ý°´¼ü¶¶¶¯ if(KEY7 == 0) //ÔÙÈ·ÈÏÒ»´Î°´¼ü°´Ï£¬±íÊ&frac34;µ&frac12;Õâ°´¼üÒÑ&frac34;­Îȶ¨ÁË return 7; //Êä&sup3;ö°´¼üÖµ7 } if(KEY8 == 0) //Èç¹û°´¼ü8°´Ï { DelayMs(10); //ÑÓʱ10msÈ¥&sup3;ý°´¼ü¶¶¶¯ if(KEY8 == 0) //ÔÙÈ·ÈÏÒ»´Î°´¼ü°´Ï£¬±íÊ&frac34;µ&frac12;Õâ°´¼üÒÑ&frac34;­Îȶ¨ÁË return 8; //Êä&sup3;ö°´¼üÖµ8 } return 0; //ÎÞ°´¼ü°´ÏÂÊä&sup3;ö0 } /* ¶¨Ê±Æ÷0&sup3;õʼ»¯ */ void InitTimer0(void) { TMOD = 0x01; //ÅäÖö¨Ê±Æ÷0Ϊ¹¤×÷Ä£Ê&frac12;1£¬16λ¶¨Ê±Æ÷ TH0 = (65536 - 10000) / 256; //¶¨Ê±10ms TL0 = (65536 - 10000) % 256; EA = 1; //´ò¿ª×ÜÖÐ¶Ï ET0 = 1; //´ò¿ª¶¨Ê±Æ÷0ÖÐ¶Ï TR0 = 0; //ÉϵçĬÈϹرն¨Ê±Æ÷0 } /* ¶¨Ê±Æ÷0ÖжϷþÎñº¯Êý£¬10ms&frac12;øÒ»´ÎÖÐ¶Ï */ void Timer0Interrupt(void) interrupt 1 { TH0 = (65536 - 10000) / 256; //¶¨Ê±10ms£¬ÖØÐÂ×°ÔØ¼ÆÊýÖµ TL0 = (65536 - 10000) % 256; ++count; if(count > 100) //1sʱ¼ä¼ÆË㣺10ms * 100 = 1s { count = 0; //¼ÆÊýÖµÇåÁã --time; //µ¹¼ÆÊ±Ê±¼ä¼õÒ»´Î if(time <= 0) //Èç¹ûµ¹¼ÆÊ±&frac12;áÊø£¬Ôò¹Ø±Õ¶¨Ê±Æ÷0£¬Í£Ö¹µ¹¼ÆÊ±£¬&sup2;¢Éù¹â±¨&frac34;¯ºÍËø¶¨¼üÅÌ { TR0 = 0; //¹Ø±Õ¶¨Ê±Æ÷0 BEEP = 1; //Éù¹â±¨&frac34;¯ LED1 = 0; flag_lock = 0; //Ëø¶¨¼üÅÌ } } } /* ±¨&frac34;¯º¯Êý */ void alarm(void) { BEEP = 1; //·äÃùÆ÷ÏìһϠDelayMs(300); //ÑÓʱ300ms BEEP = 0; } /* ʵÏÖÇÀ´ðÈÎÎñ */ void AnswerTask(void) { unsigned char key_val; //°´¼üÖµ»º´æ TR0 = 1; //Æô¶¯¶¨Ê±Æ÷0£¬¿ªÊ¼µ¹¼ÆÊ± while(1) { if(flag_lock == 1) { key_val = KeyScan(); //»ñÈ¡°´¼üÖµ switch(key_val) { case 1: { dat_buf[0] = key_val; //µÚ1λÊýÂë¹ÜÏÔÊ&frac34;1ºÅ dat_buf[1] = 16; //ÏÔÊ&frac34;&#39;-&#39; time = time2; //»Ø´ðµ¹¼ÆÊ±£¬Ñ¡Êֻشðʱ¼ä alarm(); //·äÃùÆ÷ÏìһϠflag_lock = 0; //Ëø¶¨¼üÅÌ break; } case 2: { dat_buf[0] = key_val; //µÚ2λÊýÂë¹ÜÏÔÊ&frac34;2ºÅ dat_buf[1] = 16; //ÏÔÊ&frac34;&#39;-&#39; time = time2; //»Ø´ðµ¹¼ÆÊ±£¬Ñ¡Êֻشðʱ¼ä alarm(); //·äÃùÆ÷ÏìһϠflag_lock = 0; break; } case 3: { dat_buf[0] = key_val; //µÚ3λÊýÂë¹ÜÏÔÊ&frac34;3ºÅ dat_buf[1] = 16; //ÏÔÊ&frac34;&#39;-&#39; time = time2; alarm(); //·äÃùÆ÷ÏìһϠflag_lock = 0; break; } case 4: { dat_buf[0] = key_val; //µÚ4λÊýÂë¹ÜÏÔÊ&frac34;4ºÅ dat_buf[1] = 16; //ÏÔÊ&frac34;&#39;-&#39; time = time2; alarm(); //·äÃùÆ÷ÏìһϠflag_lock = 0; break; } case 5: { dat_buf[0] = key_val; //µÚ5λÊýÂë¹ÜÏÔÊ&frac34;5ºÅ dat_buf[1] = 16; //ÏÔÊ&frac34;&#39;-&#39; time = time2; alarm(); //·äÃùÆ÷ÏìһϠflag_lock = 0; break; } case 6: { dat_buf[0] = key_val; //µÚ6λÊýÂë¹ÜÏÔÊ&frac34;6ºÅ dat_buf[1] = 16; //ÏÔÊ&frac34;&#39;-&#39; time = time2; alarm(); //·äÃùÆ÷ÏìһϠflag_lock = 0; break; } default: break; } } dat_buf[2] = time / 10; //È¡&sup3;öµ¹¼ÆÊ±µÄʮλÊý dat_buf[3] = time % 10; //È¡&sup3;öµ¹¼ÆÊ±µÄ¸öλÊý dig_scan(dat_buf); //ÊýÂë¹ÜÏÔÊ&frac34;ÄÚÈÝ } } /* ÉèÖõ¹¼ÆÊ±Ê±¼ä */ void SetTime(void) { unsigned char mode = 0; //0£ºµ÷&frac12;ÚÇÀ´ðµ¹¼ÆÊ±£¬1£ºµ÷&frac12;ڻش𵹼ÆÊ±£¬2£ºÍË&sup3;ö while(1) { if(KeyScan() == 8) //Èç¹ûÔٴΰ´ÏÂÉèÖüü£¬ÔòÍË&sup3;öÉèÖù¦ÄÜ { alarm(); //·äÃùÆ÷ÏìÒ»Éù ++mode; if(mode >= 2) break; //Ìø&sup3;öµ±Ç°ËÀÑ­»· } if(KeyScan() == 7) //Èç¹û°´Ï¼Ӽü£¬&frac12;øÐе÷ʱ { alarm(); //·äÃùÆ÷ÏìÒ»Éù if(mode == 0) //µ÷&frac12;ÚÇÀ´ðµ¹¼ÆÊ± { ++time1; //µ¹¼ÆÊ±Ê±¼ä¼ÓÒ»´Î if(time1 > 30) //µ÷ʱ·¶Î§£º5s~30s time1 = 5; } if(mode == 1) //µ÷&frac12;ڻش𵹼ÆÊ± { ++time2; //µ¹¼ÆÊ±Ê±¼ä¼ÓÒ»´Î if(time2 > 30) //µ÷ʱ·¶Î§£º5s~30s time2 = 5; } } /* µ÷ʱÏÔÊ&frac34;´¦Àí */ if(mode == 0) { dat_buf[0] = 16; //ÏÔÊ&frac34;&#39;-&#39; dat_buf[1] = time1 / 10; //È¡&sup3;öµ¹¼ÆÊ±µÄʮλÊý dat_buf[2] = time1 % 10; //È¡&sup3;öµ¹¼ÆÊ±µÄ¸öλÊý dat_buf[3] = 16; //ÏÔÊ&frac34;&#39;-&#39; } if(mode == 1) { dat_buf[0] = 18; //ÏÔÊ&frac34;&#39;=&#39; dat_buf[1] = time2 / 10; //È¡&sup3;öµ¹¼ÆÊ±µÄʮλÊý dat_buf[2] = time2 % 10; //È¡&sup3;öµ¹¼ÆÊ±µÄ¸öλÊý dat_buf[3] = 18; //ÏÔÊ&frac34;&#39;=&#39; } dig_scan(dat_buf); //ÊýÂë¹ÜÏÔÊ&frac34;ÄÚÈÝ } time = time1; //»Øµ&frac12;Ö÷&frac12;çÃæÏÔÊ&frac34;ÇÀ´ðµ¹¼ÆÊ± }写出一个这样的代码,主持人是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 &frac34;«Ó¢°æSTM32¿ª·¢°åUCOSʵÑé Àý6-1 UCOSIII ÈÎÎñ´´&frac12;¨ÓÚÉ&frac34;&sup3;ý ¼¼ÊõÖ§&sup3;Ö£ºwww.openedv.com ÌÔ±¦µêÆÌ£ºhttp://eboard.taobao.com ¹Ø×¢Î¢ÐŹ«ÖÚÆ&frac12;̨΢Ðźţº"ÕýµãÔ­×Ó"£¬Ãâ·Ñ»ñÈ¡STM32×ÊÁÏ¡£ ¹ãÖÝÊÐÐÇÒíµç×ӿƼ¼ÓÐÏÞ¹«Ë&frac34; ×÷ÕߣºÕýµãÔ­×Ó @ALIENTEK ************************************************/ //UCOSIIIÖÐÒÔÏÂÓÅÏȼ¶Óû§&sup3;ÌÐò&sup2;»ÄÜʹÓã¬ALIENTEK //&frac12;«ÕâЩÓÅÏȼ¶·ÖÅ䏸ÁËUCOSIIIµÄ5¸öϵÍ&sup3;ÄÚ&sup2;¿ÈÎÎñ //ÓÅÏȼ¶0£ºÖжϷþÎñ·þÎñ¹ÜÀíÈÎÎñ OS_IntQTask() //ÓÅÏȼ¶1£ºÊ±ÖÓ&frac12;ÚÅÄÈÎÎñ OS_TickTask() //ÓÅÏȼ¶2£º¶¨Ê±ÈÎÎñ OS_TmrTask() //ÓÅÏȼ¶OS_CFG_PRIO_MAX-2£ºÍ&sup3;¼ÆÈÎÎñ OS_StatTask() //ÓÅÏȼ¶OS_CFG_PRIO_MAX-1£º¿ÕÏÐÈÎÎñ OS_IdleTask() /* ΪÁËʵÏÖÁÙ&frac12;çÇøµÄ±£»¤£¬UCOSIIIÌṩÁËÁ&frac12;¸öºê£ºOS_CRITICAL_ENTER() ºÍOS_CRITICAL_EXIT()¡£ µ±Ò»¸öÈÎÎñ»òÖжÏ&frac12;øÈëÁÙ&frac12;çÇøÊ±£¬Ëü±ØÐëµ÷ÓÃOS_CRITICAL_ENTER()ºêÒÔ»ñµÃÁÙ&frac12;çÇøµÄ±£»¤¡£ Õâ¸öºê&frac12;«&frac12;ûÓÃÖжϣ¬ÒÔÈ·±£Ö´ÐÐÁÙ&frac12;çÇøµÄ´úÂë&sup2;»»á±»ÖжϻòÇÀÕ¼£¬´Ó¶ø±£Ö¤ÁËÁÙ&frac12;çÇøµÄÔ­×ÓÐÔ¡£ µ±´úÂëÖ´ÐÐÍê±Ïʱ£¬ÈÎÎñ»òÖжϱØÐëµ÷ÓÃOS_CRITICAL_EXIT()ºêÀ´»Ö¸´Öжϣ¬ÒÔ±ãÆäËûÈÎÎñºÍÖжϿÉÒÔ·ÃÎʹ&sup2;Ïí×ÊÔ´&sup2;¢Ö´ÐÐËüÃǵĴúÂë¡£ ʹÓÃOS_CRITICAL_ENTER()ºÍOS_CRITICAL_EXIT()ºêÀ´±£»¤ÁÙ&frac12;çÇø£¬ ÄÇôÔÚÈÎÎñT1Ö´ÐеÄÕû¸öʱ¼äÄÚ£¬ÖжÏ&frac12;«±»&frac12;ûÓ㬠ÆäËûÈÎÎñ&frac12;«&sup2;»ÄÜ·ÃÎʹ&sup2;Ïí×ÊÔ´&sup2;¢ÇÒÁÙ&frac12;çÇøµÄ´úÂë&frac12;«ÒÔÔ­×Ó·&frac12;Ê&frac12;Ö´ÐÐÍê±Ï¡£ ÕâÑù¿ÉÒÔÈ·±£ÁÙ&frac12;çÇø´úÂëµÄÕýÈ·ÐÔ£¬±ÜÃâ&frac34;ºÕùÌõ¼þºÍÆäËûͬ&sup2;&frac12;ÎÊÌâ¡£ */ /* ÔÚUCOS IIIÖУ¬ÈÎÎñµÄÖ´ÐÐË&sup3;ÐòÊÇ»ùÓÚÓÅÏȼ¶µ÷¶ÈËã·¨¡£ ÿ¸öÈÎÎñ¶¼ÓÐÒ»¸öÓÅÏȼ¶£¨0µ&frac12;255£©£¬&frac34;ßÓиü¸ßÓÅÏȼ¶µÄÈÎÎñ±ÈµÍÓÅÏȼ¶µÄÈÎÎñ¸ü¿ÉÄܵõ&frac12;µ÷¶È¡£ UCOS IIIʹÓÃÇÀÕ¼Ê&frac12;µ÷¶È£¬ÕâÒâζ×ŵ±ÓÐÒ»¸ö¸ßÓÅÏȼ¶µÄÈÎÎñ&frac34;ÍÐ÷ʱ£¬µ±Ç°ÕýÔÚÖ´ÐеÄÈÎÎñ&frac12;«±»ÖжÏ&sup2;¢ÇÒ¸ßÓÅÏȼ¶ÈÎÎñ&frac12;«±»Ö´ÐС£ ÕâÈ·±£ÁË&frac34;ßÓиü¸ßÓÅÏȼ¶µÄÈÎÎñ¿ÉÒÔ¼°Ê±»ñµÃÖ´ÐУ¬±ÜÃâ&sup3;¤Ê±¼ä±»µÍÓÅÏȼ¶ÈÎÎñÕ¼Óô¦ÀíÆ÷µÄÇé¿ö·¢Éú¡£ UCOS IIIÈÎÎñµÄÖ´ÐÐÊÇͨ¹ýÉÏÏÂÎÄÇл»ÊµÏֵġ£ ÉÏÏÂÎÄÇл»ÊÇÖ¸&frac12;«´¦ÀíÆ÷µÄ״̬´ÓÒ»¸öÈÎÎñ±£´æµ&frac12;Äڴ棬Ȼºó&frac12;«ÁíÒ»¸öÈÎÎñµÄ×´Ì¬×°ÔØµ&frac12;´¦ÀíÆ÷ÖУ¬ÒÔÔÚ&sup2;»¼ä¶ÏµÄÇé¿öÏÂת»»ÈÎÎñÖ´ÐС£ µ±Ò»¸öÈÎÎñÐèÒª±»ÖÐֹʱ£¬¼´Ö´ÐÐOS_TaskSuspend()º¯Êýʱ£¬UCOS III´¦ÀíÆ÷»áÖ´ÐÐÒ»¸öÈÎÎñÇл»ÖжÏ&sup2;¢&frac12;«¿ØÖÆÈ¨×ªÒƵ&frac12;ÁíÒ»¸öÈÎÎñ¡£ ÈÎÎñÇл»Í¨&sup3;£·¢ÉúÔÚÒÔÏÂÇé¿öÏ£º µ±ÈÎÎñÖ÷¶¯µ÷ÓÃÁËÈÎÎñ¿ØÖƺ¯Êý£¨ÀýÈ磬OS_Delay()¡¢OS_EventWait()¡¢OS_TaskSuspend()µÈ£©&sup2;¢ÍËÈÃCPUʱ£» µ±Ä&sup3;¸öÖжϷþÎñ&sup3;ÌÐò(ISR)ÔڹؼüÈÎÎñÖ´ÐÐÆÚ¼äÖ´ÐУ¨¼´ÖжÏÓÅÏȼ¶¸ßÓڹؼüÈÎÎñµÄÓÅÏȼ¶£©¡£ */ //¿ªÊ¼ÈÎÎñ£¬´´&frac12;¨ÍêÈÎÎñ¶þºÍÈÎÎñÈý&frac34;ÍÉ&frac34;&sup3;ý×Ô¼º //ÈÎÎñÓÅÏȼ¶ #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); ///ÈÎÎñ¶þÁÁµÆ£¬&sup2;¢´òÓ¡&sup3;öÐÅÏ¢ //ÈÎÎñÓÅÏȼ¶ #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); ///ÈÎÎñÈý£¬´òÓ¡ÈÎÎñÈýÖ´ÐÐÐÅÏ¢ //ÈÎÎñÓÅÏȼ¶ #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;¹¤&sup3;ÌÊÇÓÉstm32f103zet6ÒÆÖ&sup2;ËùÀ´£¬Òò´ËÕâÀïÒò¼ÓÈë±&frac34;º¯ÊýÈ·±£delayº¯ÊýÕý&sup3;£Ê¹Óà delay_init(); //ʱÖÓ&sup3;õʼ»¯ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//ÖжϷÖ×éÅäÖà uart_init(115200); //´®¿Ú&sup3;õʼ»¯ LED_Init(); KEY_Init(); // ??????? OSInit(&err); //&sup3;õʼ»¯UCOSIII OS_CRITICAL_ENTER(); //&frac12;øÈëÁÙ&frac12;çÇø //´´&frac12;¨¿ªÊ¼ÈÎÎñ OSTaskCreate((OS_TCB * )&StartTaskTCB, //ÈÎÎñ¿ØÖÆ¿é (CPU_CHAR * )"start task", //ÈÎÎñÃû×Ö (OS_TASK_PTR )start_task, //ÈÎÎñº¯Êý (void * )0, //´«µÝ¸øÈÎÎñº¯ÊýµÄ&sup2;ÎÊý (OS_PRIO )START_TASK_PRIO, //ÈÎÎñÓÅÏȼ¶ (CPU_STK * )&START_TASK_STK[0], //ÈÎÎñ¶ÑÕ»»ùµØÖ· (CPU_STK_SIZE)START_STK_SIZE/10, //ÈÎÎñ¶ÑÕ»Éî¶ÈÏÞλ (CPU_STK_SIZE)START_STK_SIZE, //ÈÎÎñ¶ÑÕ»´óС (OS_MSG_QTY )0, //ÈÎÎñÄÚ&sup2;¿ÏûÏ¢¶ÓÁÐÄܹ»&frac12;ÓÊÕµÄ×î´óÏûÏ¢ÊýÄ¿,Ϊ0ʱ&frac12;ûÖ¹&frac12;ÓÊÕÏûÏ¢ (OS_TICK )0, //µ±Ê¹ÄÜʱ¼äƬÂÖתʱµÄʱ¼äƬ&sup3;¤¶È£¬Îª0ʱΪĬÈÏ&sup3;¤¶È£¬ (void * )0, //Óû§&sup2;¹&sup3;äµÄ´æ´¢Çø (OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, //ÈÎÎñÑ¡Ïî (OS_ERR * )&err); //´æ·Å¸Ãº¯Êý´íÎóʱµÄ·µ»ØÖµ OS_CRITICAL_EXIT(); //ÍË&sup3;öÁÙ&frac12;çÇø OSStart(&err); //¿ªÆôUCOSIII } //¿ªÊ¼ÈÎÎñÈÎÎñº¯Êý 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;¼ÆÈÎÎñ #endif #ifdef CPU_CFG_INT_DIS_MEAS_EN //Èç¹ûʹÄÜÁË&sup2;âÁ¿ÖжϹرÕʱ¼ä CPU_IntDisMeasMaxCurReset(); #endif #if OS_CFG_SCHED_ROUND_ROBIN_EN //µ±Ê¹ÓÃʱ¼äƬÂÖתµÄʱºò //ʹÄÜʱ¼äƬÂÖתµ÷¶È¹¦ÄÜ,ʱ¼äƬ&sup3;¤¶ÈΪ1¸öϵÍ&sup3;ʱÖÓ&frac12;ÚÅÄ£¬¼È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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值