ººÄܳº꣺Öйú»¥ÁªÍø²úÒµ¼ÛÖµÓëͶ×Ê»·¾³

本文回顾了2007年中国IT行业的双会盛况,强调了会议的重要性和快速进行的特点,讨论了企业在行业中的角色。
ÉùÃ÷£ºÌÚѶ¿Æ¼¼¿¯µÇ´ËÎÄÕÂΪ¡¶2007ÖйúITÁ½»á¡·»Ø¹Ë£¬¸ÃÎÄÕÂʱ¼äΪ07Äê12ÔÂ2ÈÕ¡£ ¸÷λÖÐÎçºÃ£¬ÒѾ­¿ìµ½ÖÐÎçÁË£¬ÎÒ¾¡Á¿Ëõ¶Ìһϣ¬Ô½¿ìÔ½ºÃ£¬½²¼¸¸öµã¾Í¿ÉÒÔÁË¡£ ¸÷λÔÚ×ùµÄÅóÓÑ£¬²»¹ÜÊÇÆóҵͶ×ÊÕߣ¬ÔÚ¿´ÆóÒµ ...
#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Íâ&sup2;¿ÖжϺ¯Êý { unsigned char j,k,N=0; //¶¨ÒåÁÙʱ&frac12;ÓÊÕ±äÁ¿ EX1 = 0; //&sup1;رÕÍâ&sup2;¿ÖжÏ,·ÀÖ&sup1;ÔÙÓÐÐźŵ&frac12;´ï delayms(15); //ÑÓʱʱ&frac14;䣬&frac12;øÐкìÍâÏû¶¶ if (IRIN==1) //ÅжϺìÍâÐźÅÊÇ·ñÏûʧ { EX1 =1; //Íâ&sup2;¿ÖжϿª return; //·µ»Ø } while (!IRIN) //µÈIR±äΪ¸ßµçÆ&frac12;£¬Ìø&sup1;ý9msµÄǰµ&frac14;µÍµçÆ&frac12;Ðźš£ { delayms(1); //ÑÓʱµÈ´ý } for (j=0;j<4;j++) //&sup2;É&frac14;¯ºìÍâÒ£¿ØÆ÷Êý&frac34;Ý { for (k=0;k<8;k++) //·Ö´Î&sup2;É&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; //´ò¿ªÍâ&sup2;¿ÖжÏ&sup1;¦ÄÜ return; //·µ»Ø } } IRCOM[j]=IRCOM[j] >> 1; //&frac12;øÐÐÊý&frac34;ÝÎ»ÒÆ&sup2;Ù×÷&sup2;¢×Ô¶¯&sup2;&sup1;Áã if (N>=8) //ÅжÏÊý&frac34;Ý&sup3;¤¶È { IRCOM[j] = IRCOM[j] | 0x80; //Êý&frac34;Ý×î¸ßλ&sup2;&sup1;1 } N=0; //ÇåÁãλÊý&frac14;ÆÂ&frac14;Æ÷ } } if (IRCOM[2]!=~IRCOM[3]) //ÅжϵØÖ·ÂëÊÇ·ñÏàͬ { EX1=1; //´ò¿ªÍâ&sup2;¿ÖÐ¶Ï return; //·µ»Ø } for(j=0;j<10;j++) //Ñ­»·&frac12;øÐÐ&frac14;üÂë&frac12;âÎö { if(IRCOM[2]==RecvData[j]) //&frac12;øÐÐ&frac14;üλ¶ÔÓ¦ { ControlCar(j); //ÊýÂë&sup1;ÜÏÔÊ&frac34;ÏàÓ¦ÊýÂë } } EX1 = 1; //Íâ&sup2;¿ÖжϿª } void main(void) //Ö÷&sup3;ÌÐòÈë¿Ú { bit ExeFlag=0; //¶¨Òå¿ÉÖ´ÐÐλ±äÁ¿ LedFlash=3000; //¶ÔÉÁµÆÊý&frac34;Ý&frac12;øÐÐ&sup3;õÊ&frac14;»¯ EX1=1; //ͬÒ⿪ÆôÍâ&sup2;¿ÖжÏ1 IT1=1; //É趨Íâ&sup2;¿ÖжÏ1ΪµÍ±ßÔµ´¥·¢ÀàÐÍ EA=1; //×ÜÖжϿªÆô ShowPort=LedShowData[0]; //ÊýÂë&sup1;ÜÏÔÊ&frac34;Êý×Ö0 while(1) //&sup3;ÌÐòÖ÷Ñ­»· { Delay(); //ÑÓʱ // RunStopState=~RunStopState; //ÔËÐÐÖ¸Ê&frac34;µÆ×´Ì¬×ª±ä } }详细解释
06-01
/** **************************************************************************************************** * @file usart.c * @author ÕýµãÔ­×ÓÍŶÓ(ALIENTEK) * @version V1.1 * @date 2023-06-05 * @brief ´®¿Ú&sup3;õÊ&frac14;»¯´úÂë(Ò»°ãÊÇ´®¿Ú1)£¬Ö§&sup3;Öprintf * @license Copyright (c) 2020-2032, &sup1;ãÖÝÊÐÐÇÒíµç×Ó¿Æ&frac14;&frac14;ÓÐÏÞ&sup1;«Ë&frac34; **************************************************************************************************** * @attention * * ʵÑéÆ&frac12;̨:ÕýµãÔ­×Ó Ì&frac12;Ë÷Õß F407¿ª·¢°å * ÔÚÏßÊÓÆµ:www.yuanzige.com * &frac14;&frac14;ÊõÂÛÌ&sup3;:www.openedv.com * &sup1;«Ë&frac34;ÍøÖ·:www.alientek.com * &sup1;ºÂòµØÖ·:openedv.taobao.com * * ÐÞ¸Ä˵Ã÷ * V1.0 20211014 * µÚÒ»´Î·¢&sup2;&frac14; * V1.1 20230605 * É&frac34;&sup3;ýUSART_UX_IRQHandler()º¯ÊýµÄ&sup3;¬Ê±´¦ÀíºÍÐÞ¸ÄHAL_UART_RxCpltCallback() **************************************************************************************************** */ #include "./SYSTEM/sys/sys.h" #include "./SYSTEM/usart/usart.h" /* Èç&sup1;ûÊ&sup1;ÓÃos,Ôò°üÀ¨ÏÂÃæµÄÍ·ÎÄ&frac14;þ&frac14;´¿É */ #if SYS_SUPPORT_OS #include "os.h" /* os Ê&sup1;Óà */ #endif /******************************************************************************************/ /* &frac14;ÓÈëÒÔÏ´úÂë, Ö§&sup3;Öprintfº¯Êý, ¶ø&sup2;»ÐèҪѡÔñuse MicroLIB */ #if 1 #if (__ARMCC_VERSION >= 6010050) /* Ê&sup1;ÓÃAC6±àÒëÆ÷ʱ */ __asm(".global __use_no_semihosting\n\t"); /* ÉùÃ÷&sup2;»Ê&sup1;ÓðëÖ÷»úÄ£Ê&frac12; */ __asm(".global __ARM_use_no_argv \n\t"); /* AC6ÏÂÐèÒªÉùÃ÷mainº¯ÊýΪÎÞ&sup2;ÎÊý¸ñÊ&frac12;£¬·ñÔò&sup2;¿·ÖÀý&sup3;Ì¿ÉÄÜ&sup3;öÏÖ°ëÖ÷»úÄ£Ê&frac12; */ #else /* Ê&sup1;ÓÃAC5±àÒëÆ÷ʱ, ÒªÔÚÕâÀﶨÒå__FILE ºÍ &sup2;»Ê&sup1;ÓðëÖ÷»úÄ£Ê&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;»Ê&sup1;ÓðëÖ÷»úÄ£Ê&frac12;£¬ÖÁÉÙÐèÒªÖØ¶¨Òå_ttywrch\_sys_exit\_sys_command_stringº¯Êý,ÒÔͬʱ&frac14;æÈÝAC6ºÍAC5Ä£Ê&frac12; */ int _ttywrch(int ch) { ch = ch; return ch; } /* ¶¨Òå_sys_exit()ÒÔ±ÜÃâÊ&sup1;ÓðëÖ÷»úÄ£Ê&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º¯Êý×îÖÕ»áͨ&sup1;ýµ÷ÓÃfputcÊä&sup3;ö×Ö·û´®µ&frac12;´®¿Ú */ int fputc(int ch, FILE *f) { while ((USART1->SR & 0X40) == 0); /* µÈ´ýÉÏÒ»¸ö×Ö·û·¢ËÍÍê&sup3;É */ USART1->DR = (uint8_t)ch; /* &frac12;«Òª·¢Ë͵Ä×Ö·û ch дÈëµ&frac12;DR&frac14;Ä´æÆ÷ */ return ch; } #endif /***********************************************END*******************************************/ #if USART_EN_RX /* Èç&sup1;ûÊ&sup1;ÄÜÁË&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¿âÊ&sup1;ÓõĴ®¿Ú&frac12;ÓÊÕ»º&sup3;å */ UART_HandleTypeDef g_uart1_handle; /* UART&frac34;ä±ú */ /** * @brief ´®¿ÚX&sup3;õÊ&frac14;»¯º¯Êý * @param baudrate: &sup2;¨ÌØÂÊ, ¸ù&frac34;Ý×Ô&frac14;ºÐèÒªÉèÖÃ&sup2;¨ÌØÂÊÖµ * @note ×¢Òâ: ±ØÐëÉèÖÃÕýÈ·µÄʱÖÓÔ´, ·ñÔò´®¿Ú&sup2;¨ÌØÂÊ&frac34;Í»áÉèÖÃÒì&sup3;£. * ÕâÀïµÄUSARTµÄʱÖÓÔ´ÔÚsys_stm32_clock_init()º¯ÊýÖÐÒÑ&frac34;­ÉèÖÃ&sup1;ýÁË. * @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; /* Ò»¸öÍ£Ö&sup1;λ */ g_uart1_handle.Init.Parity = UART_PARITY_NONE; /* ÎÞÆæÅ&frac14;УÑéλ */ g_uart1_handle.Init.HwFlowCtl = UART_HWCONTROL_NONE; /* ÎÞÓ&sup2;&frac14;þÁ÷¿Ø */ g_uart1_handle.Init.Mode = UART_MODE_TX_RX; /* ÊÕ·¢Ä£Ê&frac12; */ HAL_UART_Init(&g_uart1_handle); /* HAL_UART_Init()»áÊ&sup1;ÄÜUART1 */ /* ¸Ãº¯Êý»á¿ªÆô&frac12;ÓÊÕÖжϣº±êÖ&frac34;λUART_IT_RXNE£¬&sup2;¢ÇÒÉèÖÃ&frac12;ÓÊÕ»º&sup3;åÒÔ&frac14;°&frac12;ÓÊÕ»º&sup3;å&frac12;ÓÊÕ×î´óÊý&frac34;ÝÁ¿ */ HAL_UART_Receive_IT(&g_uart1_handle, (uint8_t *)g_rx_buffer, RXBUFFERSIZE); } /** * @brief UARTµ×&sup2;ã&sup3;õÊ&frac14;»¯º¯Êý * @param huart: UART&frac34;ä±úÀàÐÍÖ¸Õë * @note ´Ëº¯Êý»á±»HAL_UART_Init()µ÷Óà * Íê&sup3;ÉʱÖÓÊ&sup1;ÄÜ£¬Òý&frac12;ÅÅäÖã¬ÖжÏÅäÖà * @retval ÎÞ */ void HAL_UART_MspInit(UART_HandleTypeDef *huart) { GPIO_InitTypeDef gpio_init_struct; if(huart->Instance == USART_UX) /* Èç&sup1;ûÊÇ´®¿Ú1£¬&frac12;øÐд®¿Ú1 MSP&sup3;õÊ&frac14;»¯ */ { USART_UX_CLK_ENABLE(); /* USART1 ʱÖÓÊ&sup1;ÄÜ */ USART_TX_GPIO_CLK_ENABLE(); /* ·¢ËÍÒý&frac12;ÅʱÖÓÊ&sup1;ÄÜ */ USART_RX_GPIO_CLK_ENABLE(); /* &frac12;ÓÊÕÒý&frac12;ÅʱÖÓÊ&sup1;ÄÜ */ 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;õÊ&frac14;»¯·¢ËÍÒý&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;õÊ&frac14;»¯&frac12;ÓÊÕÒý&frac12;Å */ #if USART_EN_RX HAL_NVIC_EnableIRQ(USART_UX_IRQn); /* Ê&sup1;ÄÜUSART1ÖжÏͨµÀ */ HAL_NVIC_SetPriority(USART_UX_IRQn, 3, 3); /* ÇÀÕ&frac14;ÓÅÏÈ&frac14;¶3£¬×ÓÓÅÏÈ&frac14;¶3 */ #endif } } /** * @brief Rx´«Ê仨µ÷º¯Êý * @param huart: UART&frac34;ä±úÀàÐÍÖ¸Õë * @retval ÎÞ */ void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if(huart->Instance == USART_UX) /* Èç&sup1;ûÊÇ´®¿Ú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;ÓÊÕ´íÎó,ÖØÐ¿ªÊ&frac14; */ } else { g_usart_rx_sta |= 0x8000; /* &frac12;ÓÊÕÍê&sup3;ÉÁË */ } } else /* »&sup1;ûÊÕµ&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;Ý´íÎó,ÖØÐ¿ªÊ&frac14;&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 /* Ê&sup1;ÓÃOS */ OSIntEnter(); #endif HAL_UART_IRQHandler(&g_uart1_handle); /* µ÷ÓÃHAL¿âÖжϴ¦Àí&sup1;«Óú¯Êý */ #if SYS_SUPPORT_OS /* Ê&sup1;ÓÃOS */ OSIntExit(); #endif } #endif /** **************************************************************************************************** * @file usart.c * @author ÕýµãÔ­×ÓÍŶÓ(ALIENTEK) * @version V1.1 * @date 2023-06-05 * @brief ´®¿Ú&sup3;õÊ&frac14;»¯´úÂë(Ò»°ãÊÇ´®¿Ú1)£¬Ö§&sup3;Öprintf * @license Copyright (c) 2020-2032, &sup1;ãÖÝÊÐÐÇÒíµç×Ó¿Æ&frac14;&frac14;ÓÐÏÞ&sup1;«Ë&frac34; **************************************************************************************************** * @attention * * ʵÑéÆ&frac12;̨:ÕýµãÔ­×Ó Ì&frac12;Ë÷Õß F407¿ª·¢°å * ÔÚÏßÊÓÆµ:www.yuanzige.com * &frac14;&frac14;ÊõÂÛÌ&sup3;:www.openedv.com * &sup1;«Ë&frac34;ÍøÖ·:www.alientek.com * &sup1;ºÂòµØÖ·:openedv.taobao.com * * ÐÞ¸Ä˵Ã÷ * V1.0 20211014 * µÚÒ»´Î·¢&sup2;&frac14; * V1.1 20230605 * É&frac34;&sup3;ýUSART_UX_IRQHandler()º¯ÊýµÄ&sup3;¬Ê±´¦ÀíºÍÐÞ¸ÄHAL_UART_RxCpltCallback() **************************************************************************************************** */ #include "./SYSTEM/sys/sys.h" #include "./SYSTEM/usart/usart.h" /* Èç&sup1;ûÊ&sup1;ÓÃos,Ôò°üÀ¨ÏÂÃæµÄÍ·ÎÄ&frac14;þ&frac14;´¿É */ #if SYS_SUPPORT_OS #include "os.h" /* os Ê&sup1;Óà */ #endif /******************************************************************************************/ /* &frac14;ÓÈëÒÔÏ´úÂë, Ö§&sup3;Öprintfº¯Êý, ¶ø&sup2;»ÐèҪѡÔñuse MicroLIB */ #if 1 #if (__ARMCC_VERSION >= 6010050) /* Ê&sup1;ÓÃAC6±àÒëÆ÷ʱ */ __asm(".global __use_no_semihosting\n\t"); /* ÉùÃ÷&sup2;»Ê&sup1;ÓðëÖ÷»úÄ£Ê&frac12; */ __asm(".global __ARM_use_no_argv \n\t"); /* AC6ÏÂÐèÒªÉùÃ÷mainº¯ÊýΪÎÞ&sup2;ÎÊý¸ñÊ&frac12;£¬·ñÔò&sup2;¿·ÖÀý&sup3;Ì¿ÉÄÜ&sup3;öÏÖ°ëÖ÷»úÄ£Ê&frac12; */ #else /* Ê&sup1;ÓÃAC5±àÒëÆ÷ʱ, ÒªÔÚÕâÀﶨÒå__FILE ºÍ &sup2;»Ê&sup1;ÓðëÖ÷»úÄ£Ê&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;»Ê&sup1;ÓðëÖ÷»úÄ£Ê&frac12;£¬ÖÁÉÙÐèÒªÖØ¶¨Òå_ttywrch\_sys_exit\_sys_command_stringº¯Êý,ÒÔͬʱ&frac14;æÈÝAC6ºÍAC5Ä£Ê&frac12; */ int _ttywrch(int ch) { ch = ch; return ch; } /* ¶¨Òå_sys_exit()ÒÔ±ÜÃâÊ&sup1;ÓðëÖ÷»úÄ£Ê&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º¯Êý×îÖÕ»áͨ&sup1;ýµ÷ÓÃfputcÊä&sup3;ö×Ö·û´®µ&frac12;´®¿Ú */ int fputc(int ch, FILE *f) { while ((USART1->SR & 0X40) == 0); /* µÈ´ýÉÏÒ»¸ö×Ö·û·¢ËÍÍê&sup3;É */ USART1->DR = (uint8_t)ch; /* &frac12;«Òª·¢Ë͵Ä×Ö·û ch дÈëµ&frac12;DR&frac14;Ä´æÆ÷ */ return ch; } #endif /***********************************************END*******************************************/ #if USART_EN_RX /* Èç&sup1;ûÊ&sup1;ÄÜÁË&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¿âÊ&sup1;ÓõĴ®¿Ú&frac12;ÓÊÕ»º&sup3;å */ UART_HandleTypeDef g_uart1_handle; /* UART&frac34;ä±ú */ /** * @brief ´®¿ÚX&sup3;õÊ&frac14;»¯º¯Êý * @param baudrate: &sup2;¨ÌØÂÊ, ¸ù&frac34;Ý×Ô&frac14;ºÐèÒªÉèÖÃ&sup2;¨ÌØÂÊÖµ * @note ×¢Òâ: ±ØÐëÉèÖÃÕýÈ·µÄʱÖÓÔ´, ·ñÔò´®¿Ú&sup2;¨ÌØÂÊ&frac34;Í»áÉèÖÃÒì&sup3;£. * ÕâÀïµÄUSARTµÄʱÖÓÔ´ÔÚsys_stm32_clock_init()º¯ÊýÖÐÒÑ&frac34;­ÉèÖÃ&sup1;ýÁË. * @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; /* Ò»¸öÍ£Ö&sup1;λ */ g_uart1_handle.Init.Parity = UART_PARITY_NONE; /* ÎÞÆæÅ&frac14;УÑéλ */ g_uart1_handle.Init.HwFlowCtl = UART_HWCONTROL_NONE; /* ÎÞÓ&sup2;&frac14;þÁ÷¿Ø */ g_uart1_handle.Init.Mode = UART_MODE_TX_RX; /* ÊÕ·¢Ä£Ê&frac12; */ HAL_UART_Init(&g_uart1_handle); /* HAL_UART_Init()»áÊ&sup1;ÄÜUART1 */ /* ¸Ãº¯Êý»á¿ªÆô&frac12;ÓÊÕÖжϣº±êÖ&frac34;λUART_IT_RXNE£¬&sup2;¢ÇÒÉèÖÃ&frac12;ÓÊÕ»º&sup3;åÒÔ&frac14;°&frac12;ÓÊÕ»º&sup3;å&frac12;ÓÊÕ×î´óÊý&frac34;ÝÁ¿ */ HAL_UART_Receive_IT(&g_uart1_handle, (uint8_t *)g_rx_buffer, RXBUFFERSIZE); } /** * @brief UARTµ×&sup2;ã&sup3;õÊ&frac14;»¯º¯Êý * @param huart: UART&frac34;ä±úÀàÐÍÖ¸Õë * @note ´Ëº¯Êý»á±»HAL_UART_Init()µ÷Óà * Íê&sup3;ÉʱÖÓÊ&sup1;ÄÜ£¬Òý&frac12;ÅÅäÖã¬ÖжÏÅäÖà * @retval ÎÞ */ void HAL_UART_MspInit(UART_HandleTypeDef *huart) { GPIO_InitTypeDef gpio_init_struct; if(huart->Instance == USART_UX) /* Èç&sup1;ûÊÇ´®¿Ú1£¬&frac12;øÐд®¿Ú1 MSP&sup3;õÊ&frac14;»¯ */ { USART_UX_CLK_ENABLE(); /* USART1 ʱÖÓÊ&sup1;ÄÜ */ USART_TX_GPIO_CLK_ENABLE(); /* ·¢ËÍÒý&frac12;ÅʱÖÓÊ&sup1;ÄÜ */ USART_RX_GPIO_CLK_ENABLE(); /* &frac12;ÓÊÕÒý&frac12;ÅʱÖÓÊ&sup1;ÄÜ */ 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;õÊ&frac14;»¯·¢ËÍÒý&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;õÊ&frac14;»¯&frac12;ÓÊÕÒý&frac12;Å */ #if USART_EN_RX HAL_NVIC_EnableIRQ(USART_UX_IRQn); /* Ê&sup1;ÄÜUSART1ÖжÏͨµÀ */ HAL_NVIC_SetPriority(USART_UX_IRQn, 3, 3); /* ÇÀÕ&frac14;ÓÅÏÈ&frac14;¶3£¬×ÓÓÅÏÈ&frac14;¶3 */ #endif } } /** * @brief Rx´«Ê仨µ÷º¯Êý * @param huart: UART&frac34;ä±úÀàÐÍÖ¸Õë * @retval ÎÞ */ void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if(huart->Instance == USART_UX) /* Èç&sup1;ûÊÇ´®¿Ú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;ÓÊÕ´íÎó,ÖØÐ¿ªÊ&frac14; */ } else { g_usart_rx_sta |= 0x8000; /* &frac12;ÓÊÕÍê&sup3;ÉÁË */ } } else /* »&sup1;ûÊÕµ&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;Ý´íÎó,ÖØÐ¿ªÊ&frac14;&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 /* Ê&sup1;ÓÃOS */ OSIntEnter(); #endif HAL_UART_IRQHandler(&g_uart1_handle); /* µ÷ÓÃHAL¿âÖжϴ¦Àí&sup1;«Óú¯Êý */ #if SYS_SUPPORT_OS /* Ê&sup1;ÓÃOS */ OSIntExit(); #endif } #endif /** **************************************************************************************************** * @file usart.c * @author ÕýµãÔ­×ÓÍŶÓ(ALIENTEK) * @version V1.1 * @date 2023-06-05 * @brief ´®¿Ú&sup3;õÊ&frac14;»¯´úÂë(Ò»°ãÊÇ´®¿Ú1)£¬Ö§&sup3;Öprintf * @license Copyright (c) 2020-2032, &sup1;ãÖÝÊÐÐÇÒíµç×Ó¿Æ&frac14;&frac14;ÓÐÏÞ&sup1;«Ë&frac34; **************************************************************************************************** * @attention * * ʵÑéÆ&frac12;̨:ÕýµãÔ­×Ó Ì&frac12;Ë÷Õß F407¿ª·¢°å * ÔÚÏßÊÓÆµ:www.yuanzige.com * &frac14;&frac14;ÊõÂÛÌ&sup3;:www.openedv.com * &sup1;«Ë&frac34;ÍøÖ·:www.alientek.com * &sup1;ºÂòµØÖ·:openedv.taobao.com * * ÐÞ¸Ä˵Ã÷ * V1.0 20211014 * µÚÒ»´Î·¢&sup2;&frac14; * V1.1 20230605 * É&frac34;&sup3;ýUSART_UX_IRQHandler()º¯ÊýµÄ&sup3;¬Ê±´¦ÀíºÍÐÞ¸ÄHAL_UART_RxCpltCallback() **************************************************************************************************** */ #include "./SYSTEM/sys/sys.h" #include "./SYSTEM/usart/usart.h" /* Èç&sup1;ûÊ&sup1;ÓÃos,Ôò°üÀ¨ÏÂÃæµÄÍ·ÎÄ&frac14;þ&frac14;´¿É */ #if SYS_SUPPORT_OS #include "os.h" /* os Ê&sup1;Óà */ #endif /******************************************************************************************/ /* &frac14;ÓÈëÒÔÏ´úÂë, Ö§&sup3;Öprintfº¯Êý, ¶ø&sup2;»ÐèҪѡÔñuse MicroLIB */ #if 1 #if (__ARMCC_VERSION >= 6010050) /* Ê&sup1;ÓÃAC6±àÒëÆ÷ʱ */ __asm(".global __use_no_semihosting\n\t"); /* ÉùÃ÷&sup2;»Ê&sup1;ÓðëÖ÷»úÄ£Ê&frac12; */ __asm(".global __ARM_use_no_argv \n\t"); /* AC6ÏÂÐèÒªÉùÃ÷mainº¯ÊýΪÎÞ&sup2;ÎÊý¸ñÊ&frac12;£¬·ñÔò&sup2;¿·ÖÀý&sup3;Ì¿ÉÄÜ&sup3;öÏÖ°ëÖ÷»úÄ£Ê&frac12; */ #else /* Ê&sup1;ÓÃAC5±àÒëÆ÷ʱ, ÒªÔÚÕâÀﶨÒå__FILE ºÍ &sup2;»Ê&sup1;ÓðëÖ÷»úÄ£Ê&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;»Ê&sup1;ÓðëÖ÷»úÄ£Ê&frac12;£¬ÖÁÉÙÐèÒªÖØ¶¨Òå_ttywrch\_sys_exit\_sys_command_stringº¯Êý,ÒÔͬʱ&frac14;æÈÝAC6ºÍAC5Ä£Ê&frac12; */ int _ttywrch(int ch) { ch = ch; return ch; } /* ¶¨Òå_sys_exit()ÒÔ±ÜÃâÊ&sup1;ÓðëÖ÷»úÄ£Ê&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º¯Êý×îÖÕ»áͨ&sup1;ýµ÷ÓÃfputcÊä&sup3;ö×Ö·û´®µ&frac12;´®¿Ú */ int fputc(int ch, FILE *f) { while ((USART1->SR & 0X40) == 0); /* µÈ´ýÉÏÒ»¸ö×Ö·û·¢ËÍÍê&sup3;É */ USART1->DR = (uint8_t)ch; /* &frac12;«Òª·¢Ë͵Ä×Ö·û ch дÈëµ&frac12;DR&frac14;Ä´æÆ÷ */ return ch; } #endif /***********************************************END*******************************************/ #if USART_EN_RX /* Èç&sup1;ûÊ&sup1;ÄÜÁË&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¿âÊ&sup1;ÓõĴ®¿Ú&frac12;ÓÊÕ»º&sup3;å */ UART_HandleTypeDef g_uart1_handle; /* UART&frac34;ä±ú */ /** * @brief ´®¿ÚX&sup3;õÊ&frac14;»¯º¯Êý * @param baudrate: &sup2;¨ÌØÂÊ, ¸ù&frac34;Ý×Ô&frac14;ºÐèÒªÉèÖÃ&sup2;¨ÌØÂÊÖµ * @note ×¢Òâ: ±ØÐëÉèÖÃÕýÈ·µÄʱÖÓÔ´, ·ñÔò´®¿Ú&sup2;¨ÌØÂÊ&frac34;Í»áÉèÖÃÒì&sup3;£. * ÕâÀïµÄUSARTµÄʱÖÓÔ´ÔÚsys_stm32_clock_init()º¯ÊýÖÐÒÑ&frac34;­ÉèÖÃ&sup1;ýÁË. * @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; /* Ò»¸öÍ£Ö&sup1;λ */ g_uart1_handle.Init.Parity = UART_PARITY_NONE; /* ÎÞÆæÅ&frac14;УÑéλ */ g_uart1_handle.Init.HwFlowCtl = UART_HWCONTROL_NONE; /* ÎÞÓ&sup2;&frac14;þÁ÷¿Ø */ g_uart1_handle.Init.Mode = UART_MODE_TX_RX; /* ÊÕ·¢Ä£Ê&frac12; */ HAL_UART_Init(&g_uart1_handle); /* HAL_UART_Init()»áÊ&sup1;ÄÜUART1 */ /* ¸Ãº¯Êý»á¿ªÆô&frac12;ÓÊÕÖжϣº±êÖ&frac34;λUART_IT_RXNE£¬&sup2;¢ÇÒÉèÖÃ&frac12;ÓÊÕ»º&sup3;åÒÔ&frac14;°&frac12;ÓÊÕ»º&sup3;å&frac12;ÓÊÕ×î´óÊý&frac34;ÝÁ¿ */ HAL_UART_Receive_IT(&g_uart1_handle, (uint8_t *)g_rx_buffer, RXBUFFERSIZE); } /** * @brief UARTµ×&sup2;ã&sup3;õÊ&frac14;»¯º¯Êý * @param huart: UART&frac34;ä±úÀàÐÍÖ¸Õë * @note ´Ëº¯Êý»á±»HAL_UART_Init()µ÷Óà * Íê&sup3;ÉʱÖÓÊ&sup1;ÄÜ£¬Òý&frac12;ÅÅäÖã¬ÖжÏÅäÖà * @retval ÎÞ */ void HAL_UART_MspInit(UART_HandleTypeDef *huart) { GPIO_InitTypeDef gpio_init_struct; if(huart->Instance == USART_UX) /* Èç&sup1;ûÊÇ´®¿Ú1£¬&frac12;øÐд®¿Ú1 MSP&sup3;õÊ&frac14;»¯ */ { USART_UX_CLK_ENABLE(); /* USART1 ʱÖÓÊ&sup1;ÄÜ */ USART_TX_GPIO_CLK_ENABLE(); /* ·¢ËÍÒý&frac12;ÅʱÖÓÊ&sup1;ÄÜ */ USART_RX_GPIO_CLK_ENABLE(); /* &frac12;ÓÊÕÒý&frac12;ÅʱÖÓÊ&sup1;ÄÜ */ 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;õÊ&frac14;»¯·¢ËÍÒý&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;õÊ&frac14;»¯&frac12;ÓÊÕÒý&frac12;Å */ #if USART_EN_RX HAL_NVIC_EnableIRQ(USART_UX_IRQn); /* Ê&sup1;ÄÜUSART1ÖжÏͨµÀ */ HAL_NVIC_SetPriority(USART_UX_IRQn, 3, 3); /* ÇÀÕ&frac14;ÓÅÏÈ&frac14;¶3£¬×ÓÓÅÏÈ&frac14;¶3 */ #endif } } /** * @brief Rx´«Ê仨µ÷º¯Êý * @param huart: UART&frac34;ä±úÀàÐÍÖ¸Õë * @retval ÎÞ */ void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if(huart->Instance == USART_UX) /* Èç&sup1;ûÊÇ´®¿Ú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;ÓÊÕ´íÎó,ÖØÐ¿ªÊ&frac14; */ } else { g_usart_rx_sta |= 0x8000; /* &frac12;ÓÊÕÍê&sup3;ÉÁË */ } } else /* »&sup1;ûÊÕµ&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;Ý´íÎó,ÖØÐ¿ªÊ&frac14;&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 /* Ê&sup1;ÓÃOS */ OSIntEnter(); #endif HAL_UART_IRQHandler(&g_uart1_handle); /* µ÷ÓÃHAL¿âÖжϴ¦Àí&sup1;«Óú¯Êý */ #if SYS_SUPPORT_OS /* Ê&sup1;ÓÃOS */ OSIntExit(); #endif } #endif /** **************************************************************************************************** * @file usart.c * @author ÕýµãÔ­×ÓÍŶÓ(ALIENTEK) * @version V1.1 * @date 2023-06-05 * @brief ´®¿Ú&sup3;õÊ&frac14;»¯´úÂë(Ò»°ãÊÇ´®¿Ú1)£¬Ö§&sup3;Öprintf * @license Copyright (c) 2020-2032, &sup1;ãÖÝÊÐÐÇÒíµç×Ó¿Æ&frac14;&frac14;ÓÐÏÞ&sup1;«Ë&frac34; **************************************************************************************************** * @attention * * ʵÑéÆ&frac12;̨:ÕýµãÔ­×Ó Ì&frac12;Ë÷Õß F407¿ª·¢°å * ÔÚÏßÊÓÆµ:www.yuanzige.com * &frac14;&frac14;ÊõÂÛÌ&sup3;:www.openedv.com * &sup1;«Ë&frac34;ÍøÖ·:www.alientek.com * &sup1;ºÂòµØÖ·:openedv.taobao.com * * ÐÞ¸Ä˵Ã÷ * V1.0 20211014 * µÚÒ»´Î·¢&sup2;&frac14; * V1.1 20230605 * É&frac34;&sup3;ýUSART_UX_IRQHandler()º¯ÊýµÄ&sup3;¬Ê±´¦ÀíºÍÐÞ¸ÄHAL_UART_RxCpltCallback() **************************************************************************************************** */ #include "./SYSTEM/sys/sys.h" #include "./SYSTEM/usart/usart.h" /* Èç&sup1;ûÊ&sup1;ÓÃos,Ôò°üÀ¨ÏÂÃæµÄÍ·ÎÄ&frac14;þ&frac14;´¿É */ #if SYS_SUPPORT_OS #include "os.h" /* os Ê&sup1;Óà */ #endif /******************************************************************************************/ /* &frac14;ÓÈëÒÔÏ´úÂë, Ö§&sup3;Öprintfº¯Êý, ¶ø&sup2;»ÐèҪѡÔñuse MicroLIB */ #if 1 #if (__ARMCC_VERSION >= 6010050) /* Ê&sup1;ÓÃAC6±àÒëÆ÷ʱ */ __asm(".global __use_no_semihosting\n\t"); /* ÉùÃ÷&sup2;»Ê&sup1;ÓðëÖ÷»úÄ£Ê&frac12; */ __asm(".global __ARM_use_no_argv \n\t"); /* AC6ÏÂÐèÒªÉùÃ÷mainº¯ÊýΪÎÞ&sup2;ÎÊý¸ñÊ&frac12;£¬·ñÔò&sup2;¿·ÖÀý&sup3;Ì¿ÉÄÜ&sup3;öÏÖ°ëÖ÷»úÄ£Ê&frac12; */ #else /* Ê&sup1;ÓÃAC5±àÒëÆ÷ʱ, ÒªÔÚÕâÀﶨÒå__FILE ºÍ &sup2;»Ê&sup1;ÓðëÖ÷»úÄ£Ê&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;»Ê&sup1;ÓðëÖ÷»úÄ£Ê&frac12;£¬ÖÁÉÙÐèÒªÖØ¶¨Òå_ttywrch\_sys_exit\_sys_command_stringº¯Êý,ÒÔͬʱ&frac14;æÈÝAC6ºÍAC5Ä£Ê&frac12; */ int _ttywrch(int ch) { ch = ch; return ch; } /* ¶¨Òå_sys_exit()ÒÔ±ÜÃâÊ&sup1;ÓðëÖ÷»úÄ£Ê&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º¯Êý×îÖÕ»áͨ&sup1;ýµ÷ÓÃfputcÊä&sup3;ö×Ö·û´®µ&frac12;´®¿Ú */ int fputc(int ch, FILE *f) { while ((USART1->SR & 0X40) == 0); /* µÈ´ýÉÏÒ»¸ö×Ö·û·¢ËÍÍê&sup3;É */ USART1->DR = (uint8_t)ch; /* &frac12;«Òª·¢Ë͵Ä×Ö·û ch дÈëµ&frac12;DR&frac14;Ä´æÆ÷ */ return ch; } #endif /***********************************************END*******************************************/ #if USART_EN_RX /* Èç&sup1;ûÊ&sup1;ÄÜÁË&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¿âÊ&sup1;ÓõĴ®¿Ú&frac12;ÓÊÕ»º&sup3;å */ UART_HandleTypeDef g_uart1_handle; /* UART&frac34;ä±ú */ /** * @brief ´®¿ÚX&sup3;õÊ&frac14;»¯º¯Êý * @param baudrate: &sup2;¨ÌØÂÊ, ¸ù&frac34;Ý×Ô&frac14;ºÐèÒªÉèÖÃ&sup2;¨ÌØÂÊÖµ * @note ×¢Òâ: ±ØÐëÉèÖÃÕýÈ·µÄʱÖÓÔ´, ·ñÔò´®¿Ú&sup2;¨ÌØÂÊ&frac34;Í»áÉèÖÃÒì&sup3;£. * ÕâÀïµÄUSARTµÄʱÖÓÔ´ÔÚsys_stm32_clock_init()º¯ÊýÖÐÒÑ&frac34;­ÉèÖÃ&sup1;ýÁË. * @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; /* Ò»¸öÍ£Ö&sup1;λ */ g_uart1_handle.Init.Parity = UART_PARITY_NONE; /* ÎÞÆæÅ&frac14;УÑéλ */ g_uart1_handle.Init.HwFlowCtl = UART_HWCONTROL_NONE; /* ÎÞÓ&sup2;&frac14;þÁ÷¿Ø */ g_uart1_handle.Init.Mode = UART_MODE_TX_RX; /* ÊÕ·¢Ä£Ê&frac12; */ HAL_UART_Init(&g_uart1_handle); /* HAL_UART_Init()»áÊ&sup1;ÄÜUART1 */ /* ¸Ãº¯Êý»á¿ªÆô&frac12;ÓÊÕÖжϣº±êÖ&frac34;λUART_IT_RXNE£¬&sup2;¢ÇÒÉèÖÃ&frac12;ÓÊÕ»º&sup3;åÒÔ&frac14;°&frac12;ÓÊÕ»º&sup3;å&frac12;ÓÊÕ×î´óÊý&frac34;ÝÁ¿ */ HAL_UART_Receive_IT(&g_uart1_handle, (uint8_t *)g_rx_buffer, RXBUFFERSIZE); } /** * @brief UARTµ×&sup2;ã&sup3;õÊ&frac14;»¯º¯Êý * @param huart: UART&frac34;ä±úÀàÐÍÖ¸Õë * @note ´Ëº¯Êý»á±»HAL_UART_Init()µ÷Óà * Íê&sup3;ÉʱÖÓÊ&sup1;ÄÜ£¬Òý&frac12;ÅÅäÖã¬ÖжÏÅäÖà * @retval ÎÞ */ void HAL_UART_MspInit(UART_HandleTypeDef *huart) { GPIO_InitTypeDef gpio_init_struct; if(huart->Instance == USART_UX) /* Èç&sup1;ûÊÇ´®¿Ú1£¬&frac12;øÐд®¿Ú1 MSP&sup3;õÊ&frac14;»¯ */ { USART_UX_CLK_ENABLE(); /* USART1 ʱÖÓÊ&sup1;ÄÜ */ USART_TX_GPIO_CLK_ENABLE(); /* ·¢ËÍÒý&frac12;ÅʱÖÓÊ&sup1;ÄÜ */ USART_RX_GPIO_CLK_ENABLE(); /* &frac12;ÓÊÕÒý&frac12;ÅʱÖÓÊ&sup1;ÄÜ */ 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;õÊ&frac14;»¯·¢ËÍÒý&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;õÊ&frac14;»¯&frac12;ÓÊÕÒý&frac12;Å */ #if USART_EN_RX HAL_NVIC_EnableIRQ(USART_UX_IRQn); /* Ê&sup1;ÄÜUSART1ÖжÏͨµÀ */ HAL_NVIC_SetPriority(USART_UX_IRQn, 3, 3); /* ÇÀÕ&frac14;ÓÅÏÈ&frac14;¶3£¬×ÓÓÅÏÈ&frac14;¶3 */ #endif } } /** * @brief Rx´«Ê仨µ÷º¯Êý * @param huart: UART&frac34;ä±úÀàÐÍÖ¸Õë * @retval ÎÞ */ void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if(huart->Instance == USART_UX) /* Èç&sup1;ûÊÇ´®¿Ú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;ÓÊÕ´íÎó,ÖØÐ¿ªÊ&frac14; */ } else { g_usart_rx_sta |= 0x8000; /* &frac12;ÓÊÕÍê&sup3;ÉÁË */ } } else /* »&sup1;ûÊÕµ&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;Ý´íÎó,ÖØÐ¿ªÊ&frac14;&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 /* Ê&sup1;ÓÃOS */ OSIntEnter(); #endif HAL_UART_IRQHandler(&g_uart1_handle); /* µ÷ÓÃHAL¿âÖжϴ¦Àí&sup1;«Óú¯Êý */ #if SYS_SUPPORT_OS /* Ê&sup1;ÓÃOS */ OSIntExit(); #endif } #endif /** **************************************************************************************************** * @file usart.c * @author ÕýµãÔ­×ÓÍŶÓ(ALIENTEK) * @version V1.1 * @date 2023-06-05 * @brief ´®¿Ú&sup3;õÊ&frac14;»¯´úÂë(Ò»°ãÊÇ´®¿Ú1)£¬Ö§&sup3;Öprintf * @license Copyright (c) 2020-2032, &sup1;ãÖÝÊÐÐÇÒíµç×Ó¿Æ&frac14;&frac14;ÓÐÏÞ&sup1;«Ë&frac34; **************************************************************************************************** * @attention * * ʵÑéÆ&frac12;̨:ÕýµãÔ­×Ó Ì&frac12;Ë÷Õß F407¿ª·¢°å * ÔÚÏßÊÓÆµ:www.yuanzige.com * &frac14;&frac14;ÊõÂÛÌ&sup3;:www.openedv.com * &sup1;«Ë&frac34;ÍøÖ·:www.alientek.com * &sup1;ºÂòµØÖ·:openedv.taobao.com * * ÐÞ¸Ä˵Ã÷ * V1.0 20211014 * µÚÒ»´Î·¢&sup2;&frac14; * V1.1 20230605 * É&frac34;&sup3;ýUSART_UX_IRQHandler()º¯ÊýµÄ&sup3;¬Ê±´¦ÀíºÍÐÞ¸ÄHAL_UART_RxCpltCallback() **************************************************************************************************** */ #include "./SYSTEM/sys/sys.h" #include "./SYSTEM/usart/usart.h" /* Èç&sup1;ûÊ&sup1;ÓÃos,Ôò°üÀ¨ÏÂÃæµÄÍ·ÎÄ&frac14;þ&frac14;´¿É */ #if SYS_SUPPORT_OS #include "os.h" /* os Ê&sup1;Óà */ #endif /******************************************************************************************/ /* &frac14;ÓÈëÒÔÏ´úÂë, Ö§&sup3;Öprintfº¯Êý, ¶ø&sup2;»ÐèҪѡÔñuse MicroLIB */ #if 1 #if (__ARMCC_VERSION >= 6010050) /* Ê&sup1;ÓÃAC6±àÒëÆ÷ʱ */ __asm(".global __use_no_semihosting\n\t"); /* ÉùÃ÷&sup2;»Ê&sup1;ÓðëÖ÷»úÄ£Ê&frac12; */ __asm(".global __ARM_use_no_argv \n\t"); /* AC6ÏÂÐèÒªÉùÃ÷mainº¯ÊýΪÎÞ&sup2;ÎÊý¸ñÊ&frac12;£¬·ñÔò&sup2;¿·ÖÀý&sup3;Ì¿ÉÄÜ&sup3;öÏÖ°ëÖ÷»úÄ£Ê&frac12; */ #else /* Ê&sup1;ÓÃAC5±àÒëÆ÷ʱ, ÒªÔÚÕâÀﶨÒå__FILE ºÍ &sup2;»Ê&sup1;ÓðëÖ÷»úÄ£Ê&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;»Ê&sup1;ÓðëÖ÷»úÄ£Ê&frac12;£¬ÖÁÉÙÐèÒªÖØ¶¨Òå_ttywrch\_sys_exit\_sys_command_stringº¯Êý,ÒÔͬʱ&frac14;æÈÝAC6ºÍAC5Ä£Ê&frac12; */ int _ttywrch(int ch) { ch = ch; return ch; } /* ¶¨Òå_sys_exit()ÒÔ±ÜÃâÊ&sup1;ÓðëÖ÷»úÄ£Ê&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º¯Êý×îÖÕ»áͨ&sup1;ýµ÷ÓÃfputcÊä&sup3;ö×Ö·û´®µ&frac12;´®¿Ú */ int fputc(int ch, FILE *f) { while ((USART1->SR & 0X40) == 0); /* µÈ´ýÉÏÒ»¸ö×Ö·û·¢ËÍÍê&sup3;É */ USART1->DR = (uint8_t)ch; /* &frac12;«Òª·¢Ë͵Ä×Ö·û ch дÈëµ&frac12;DR&frac14;Ä´æÆ÷ */ return ch; } #endif /***********************************************END*******************************************/ #if USART_EN_RX /* Èç&sup1;ûÊ&sup1;ÄÜÁË&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¿âÊ&sup1;ÓõĴ®¿Ú&frac12;ÓÊÕ»º&sup3;å */ UART_HandleTypeDef g_uart1_handle; /* UART&frac34;ä±ú */ /** * @brief ´®¿ÚX&sup3;õÊ&frac14;»¯º¯Êý * @param baudrate: &sup2;¨ÌØÂÊ, ¸ù&frac34;Ý×Ô&frac14;ºÐèÒªÉèÖÃ&sup2;¨ÌØÂÊÖµ * @note ×¢Òâ: ±ØÐëÉèÖÃÕýÈ·µÄʱÖÓÔ´, ·ñÔò´®¿Ú&sup2;¨ÌØÂÊ&frac34;Í»áÉèÖÃÒì&sup3;£. * ÕâÀïµÄUSARTµÄʱÖÓÔ´ÔÚsys_stm32_clock_init()º¯ÊýÖÐÒÑ&frac34;­ÉèÖÃ&sup1;ýÁË. * @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; /* Ò»¸öÍ£Ö&sup1;λ */ g_uart1_handle.Init.Parity = UART_PARITY_NONE; /* ÎÞÆæÅ&frac14;УÑéλ */ g_uart1_handle.Init.HwFlowCtl = UART_HWCONTROL_NONE; /* ÎÞÓ&sup2;&frac14;þÁ÷¿Ø */ g_uart1_handle.Init.Mode = UART_MODE_TX_RX; /* ÊÕ·¢Ä£Ê&frac12; */ HAL_UART_Init(&g_uart1_handle); /* HAL_UART_Init()»áÊ&sup1;ÄÜUART1 */ /* ¸Ãº¯Êý»á¿ªÆô&frac12;ÓÊÕÖжϣº±êÖ&frac34;λUART_IT_RXNE£¬&sup2;¢ÇÒÉèÖÃ&frac12;ÓÊÕ»º&sup3;åÒÔ&frac14;°&frac12;ÓÊÕ»º&sup3;å&frac12;ÓÊÕ×î´óÊý&frac34;ÝÁ¿ */ HAL_UART_Receive_IT(&g_uart1_handle, (uint8_t *)g_rx_buffer, RXBUFFERSIZE); } /** * @brief UARTµ×&sup2;ã&sup3;õÊ&frac14;»¯º¯Êý * @param huart: UART&frac34;ä±úÀàÐÍÖ¸Õë * @note ´Ëº¯Êý»á±»HAL_UART_Init()µ÷Óà * Íê&sup3;ÉʱÖÓÊ&sup1;ÄÜ£¬Òý&frac12;ÅÅäÖã¬ÖжÏÅäÖà * @retval ÎÞ */ void HAL_UART_MspInit(UART_HandleTypeDef *huart) { GPIO_InitTypeDef gpio_init_struct; if(huart->Instance == USART_UX) /* Èç&sup1;ûÊÇ´®¿Ú1£¬&frac12;øÐд®¿Ú1 MSP&sup3;õÊ&frac14;»¯ */ { USART_UX_CLK_ENABLE(); /* USART1 ʱÖÓÊ&sup1;ÄÜ */ USART_TX_GPIO_CLK_ENABLE(); /* ·¢ËÍÒý&frac12;ÅʱÖÓÊ&sup1;ÄÜ */ USART_RX_GPIO_CLK_ENABLE(); /* &frac12;ÓÊÕÒý&frac12;ÅʱÖÓÊ&sup1;ÄÜ */ 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;õÊ&frac14;»¯·¢ËÍÒý&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;õÊ&frac14;»¯&frac12;ÓÊÕÒý&frac12;Å */ #if USART_EN_RX HAL_NVIC_EnableIRQ(USART_UX_IRQn); /* Ê&sup1;ÄÜUSART1ÖжÏͨµÀ */ HAL_NVIC_SetPriority(USART_UX_IRQn, 3, 3); /* ÇÀÕ&frac14;ÓÅÏÈ&frac14;¶3£¬×ÓÓÅÏÈ&frac14;¶3 */ #endif } } /** * @brief Rx´«Ê仨µ÷º¯Êý * @param huart: UART&frac34;ä±úÀàÐÍÖ¸Õë * @retval ÎÞ */ void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if(huart->Instance == USART_UX) /* Èç&sup1;ûÊÇ´®¿Ú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;ÓÊÕ´íÎó,ÖØÐ¿ªÊ&frac14; */ } else { g_usart_rx_sta |= 0x8000; /* &frac12;ÓÊÕÍê&sup3;ÉÁË */ } } else /* »&sup1;ûÊÕµ&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;Ý´íÎó,ÖØÐ¿ªÊ&frac14;&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 /* Ê&sup1;ÓÃOS */ OSIntEnter(); #endif HAL_UART_IRQHandler(&g_uart1_handle); /* µ÷ÓÃHAL¿âÖжϴ¦Àí&sup1;«Óú¯Êý */ #if SYS_SUPPORT_OS /* Ê&sup1;ÓÃOS */ OSIntExit(); #endif } #endif /** **************************************************************************************************** * @file usart.c * @author ÕýµãÔ­×ÓÍŶÓ(ALIENTEK) * @version V1.1 * @date 2023-06-05 * @brief ´®¿Ú&sup3;õÊ&frac14;»¯´úÂë(Ò»°ãÊÇ´®¿Ú1)£¬Ö§&sup3;Öprintf * @license Copyright (c) 2020-2032, &sup1;ãÖÝÊÐÐÇÒíµç×Ó¿Æ&frac14;&frac14;ÓÐÏÞ&sup1;«Ë&frac34; **************************************************************************************************** * @attention * * ʵÑéÆ&frac12;̨:ÕýµãÔ­×Ó Ì&frac12;Ë÷Õß F407¿ª·¢°å * ÔÚÏßÊÓÆµ:www.yuanzige.com * &frac14;&frac14;ÊõÂÛÌ&sup3;:www.openedv.com * &sup1;«Ë&frac34;ÍøÖ·:www.alientek.com * &sup1;ºÂòµØÖ·:openedv.taobao.com * * ÐÞ¸Ä˵Ã÷ * V1.0 20211014 * µÚÒ»´Î·¢&sup2;&frac14; * V1.1 20230605 * É&frac34;&sup3;ýUSART_UX_IRQHandler()º¯ÊýµÄ&sup3;¬Ê±´¦ÀíºÍÐÞ¸ÄHAL_UART_RxCpltCallback() **************************************************************************************************** */ #include "./SYSTEM/sys/sys.h" #include "./SYSTEM/usart/usart.h" /* Èç&sup1;ûÊ&sup1;ÓÃos,Ôò°üÀ¨ÏÂÃæµÄÍ·ÎÄ&frac14;þ&frac14;´¿É */ #if SYS_SUPPORT_OS #include "os.h" /* os Ê&sup1;Óà */ #endif /******************************************************************************************/ /* &frac14;ÓÈëÒÔÏ´úÂë, Ö§&sup3;Öprintfº¯Êý, ¶ø&sup2;»ÐèҪѡÔñuse MicroLIB */ #if 1 #if (__ARMCC_VERSION >= 6010050) /* Ê&sup1;ÓÃAC6±àÒëÆ÷ʱ */ __asm(".global __use_no_semihosting\n\t"); /* ÉùÃ÷&sup2;»Ê&sup1;ÓðëÖ÷»úÄ£Ê&frac12; */ __asm(".global __ARM_use_no_argv \n\t"); /* AC6ÏÂÐèÒªÉùÃ÷mainº¯ÊýΪÎÞ&sup2;ÎÊý¸ñÊ&frac12;£¬·ñÔò&sup2;¿·ÖÀý&sup3;Ì¿ÉÄÜ&sup3;öÏÖ°ëÖ÷»úÄ£Ê&frac12; */ #else /* Ê&sup1;ÓÃAC5±àÒëÆ÷ʱ, ÒªÔÚÕâÀﶨÒå__FILE ºÍ &sup2;»Ê&sup1;ÓðëÖ÷»úÄ£Ê&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;»Ê&sup1;ÓðëÖ÷»úÄ£Ê&frac12;£¬ÖÁÉÙÐèÒªÖØ¶¨Òå_ttywrch\_sys_exit\_sys_command_stringº¯Êý,ÒÔͬʱ&frac14;æÈÝAC6ºÍAC5Ä£Ê&frac12; */ int _ttywrch(int ch) { ch = ch; return ch; } /* ¶¨Òå_sys_exit()ÒÔ±ÜÃâÊ&sup1;ÓðëÖ÷»úÄ£Ê&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º¯Êý×îÖÕ»áͨ&sup1;ýµ÷ÓÃfputcÊä&sup3;ö×Ö·û´®µ&frac12;´®¿Ú */ int fputc(int ch, FILE *f) { while ((USART1->SR & 0X40) == 0); /* µÈ´ýÉÏÒ»¸ö×Ö·û·¢ËÍÍê&sup3;É */ USART1->DR = (uint8_t)ch; /* &frac12;«Òª·¢Ë͵Ä×Ö·û ch дÈëµ&frac12;DR&frac14;Ä´æÆ÷ */ return ch; } #endif /***********************************************END*******************************************/ #if USART_EN_RX /* Èç&sup1;ûÊ&sup1;ÄÜÁË&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¿âÊ&sup1;ÓõĴ®¿Ú&frac12;ÓÊÕ»º&sup3;å */ UART_HandleTypeDef g_uart1_handle; /* UART&frac34;ä±ú */ /** * @brief ´®¿ÚX&sup3;õÊ&frac14;»¯º¯Êý * @param baudrate: &sup2;¨ÌØÂÊ, ¸ù&frac34;Ý×Ô&frac14;ºÐèÒªÉèÖÃ&sup2;¨ÌØÂÊÖµ * @note ×¢Òâ: ±ØÐëÉèÖÃÕýÈ·µÄʱÖÓÔ´, ·ñÔò´®¿Ú&sup2;¨ÌØÂÊ&frac34;Í»áÉèÖÃÒì&sup3;£. * ÕâÀïµÄUSARTµÄʱÖÓÔ´ÔÚsys_stm32_clock_init()º¯ÊýÖÐÒÑ&frac34;­ÉèÖÃ&sup1;ýÁË. * @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; /* Ò»¸öÍ£Ö&sup1;λ */ g_uart1_handle.Init.Parity = UART_PARITY_NONE; /* ÎÞÆæÅ&frac14;УÑéλ */ g_uart1_handle.Init.HwFlowCtl = UART_HWCONTROL_NONE; /* ÎÞÓ&sup2;&frac14;þÁ÷¿Ø */ g_uart1_handle.Init.Mode = UART_MODE_TX_RX; /* ÊÕ·¢Ä£Ê&frac12; */ HAL_UART_Init(&g_uart1_handle); /* HAL_UART_Init()»áÊ&sup1;ÄÜUART1 */ /* ¸Ãº¯Êý»á¿ªÆô&frac12;ÓÊÕÖжϣº±êÖ&frac34;λUART_IT_RXNE£¬&sup2;¢ÇÒÉèÖÃ&frac12;ÓÊÕ»º&sup3;åÒÔ&frac14;°&frac12;ÓÊÕ»º&sup3;å&frac12;ÓÊÕ×î´óÊý&frac34;ÝÁ¿ */ HAL_UART_Receive_IT(&g_uart1_handle, (uint8_t *)g_rx_buffer, RXBUFFERSIZE); } /** * @brief UARTµ×&sup2;ã&sup3;õÊ&frac14;»¯º¯Êý * @param huart: UART&frac34;ä±úÀàÐÍÖ¸Õë * @note ´Ëº¯Êý»á±»HAL_UART_Init()µ÷Óà * Íê&sup3;ÉʱÖÓÊ&sup1;ÄÜ£¬Òý&frac12;ÅÅäÖã¬ÖжÏÅäÖà * @retval ÎÞ */ void HAL_UART_MspInit(UART_HandleTypeDef *huart) { GPIO_InitTypeDef gpio_init_struct; if(huart->Instance == USART_UX) /* Èç&sup1;ûÊÇ´®¿Ú1£¬&frac12;øÐд®¿Ú1 MSP&sup3;õÊ&frac14;»¯ */ { USART_UX_CLK_ENABLE(); /* USART1 ʱÖÓÊ&sup1;ÄÜ */ USART_TX_GPIO_CLK_ENABLE(); /* ·¢ËÍÒý&frac12;ÅʱÖÓÊ&sup1;ÄÜ */ USART_RX_GPIO_CLK_ENABLE(); /* &frac12;ÓÊÕÒý&frac12;ÅʱÖÓÊ&sup1;ÄÜ */ 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;õÊ&frac14;»¯·¢ËÍÒý&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;õÊ&frac14;»¯&frac12;ÓÊÕÒý&frac12;Å */ #if USART_EN_RX HAL_NVIC_EnableIRQ(USART_UX_IRQn); /* Ê&sup1;ÄÜUSART1ÖжÏͨµÀ */ HAL_NVIC_SetPriority(USART_UX_IRQn, 3, 3); /* ÇÀÕ&frac14;ÓÅÏÈ&frac14;¶3£¬×ÓÓÅÏÈ&frac14;¶3 */ #endif } } /** * @brief Rx´«Ê仨µ÷º¯Êý * @param huart: UART&frac34;ä±úÀàÐÍÖ¸Õë * @retval ÎÞ */ void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if(huart->Instance == USART_UX) /* Èç&sup1;ûÊÇ´®¿Ú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;ÓÊÕ´íÎó,ÖØÐ¿ªÊ&frac14; */ } else { g_usart_rx_sta |= 0x8000; /* &frac12;ÓÊÕÍê&sup3;ÉÁË */ } } else /* »&sup1;ûÊÕµ&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;Ý´íÎó,ÖØÐ¿ªÊ&frac14;&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 /* Ê&sup1;ÓÃOS */ OSIntEnter(); #endif HAL_UART_IRQHandler(&g_uart1_handle); /* µ÷ÓÃHAL¿âÖжϴ¦Àí&sup1;«Óú¯Êý */ #if SYS_SUPPORT_OS /* Ê&sup1;ÓÃOS */ OSIntExit(); #endif } #endif (我要使输入的在LCD上面显示应该怎么做)
05-21
main.c文件代码: #include "sys.h" #include "delay.h" #include "usart.h" #include "led.h" #include "lcd.h" #include "adc.h" //ALIENTEK Ì&frac12;Ë÷ÕßSTM32F407¿ª·¢°å ʵÑé18 //ADCÄ£Êýת»»ÊµÑé-¿âº¯Êý°æ±&frac34; //&frac14;&frac14;ÊõÖ§&sup3;Ö£ºwww.openedv.com //ÌÔ±¦µêÆÌ£ºhttp://eboard.taobao.com //&sup1;ãÖÝÊÐÐÇÒíµç×Ó¿Æ&frac14;&frac14;ÓÐÏÞ&sup1;«Ë&frac34; //×÷ÕߣºÕýµãÔ­×Ó @ALIENTEK int main(void) { u16 adcx; float temp; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//ÉèÖÃϵÍ&sup3;ÖжÏÓÅÏÈ&frac14;¶·Ö×é2 delay_init(168); //&sup3;õÊ&frac14;»¯ÑÓʱº¯Êý uart_init(115200); //&sup3;õÊ&frac14;»¯´®¿Ú&sup2;¨ÌØÂÊΪ115200 LED_Init(); //&sup3;õÊ&frac14;»¯LED LCD_Init(); //&sup3;õÊ&frac14;»¯LCD&frac12;Ó¿Ú Adc_Init(); //&sup3;õÊ&frac14;»¯ADC POINT_COLOR=RED; LCD_ShowString(30,50,200,16,16,"Explorer STM32F4"); LCD_ShowString(30,70,200,16,16,"ADC TEST"); LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK"); LCD_ShowString(30,110,200,16,16,"2014/5/6"); POINT_COLOR=BLUE;//ÉèÖÃ×ÖÌåΪÀ¶É« LCD_ShowString(30,130,200,16,16,"ADC1_CH5_VAL:"); LCD_ShowString(30,150,200,16,16,"ADC1_CH5_VOL:0.000V"); //ÏÈÔÚ&sup1;̶¨Î»ÖÃÏÔÊ&frac34;СÊýµã while(1) { adcx=Get_Adc_Average(ADC_Channel_5,20);//»ñȡͨµÀ5µÄת»»Öµ£¬20´ÎÈ¡Æ&frac12;&frac34;ù LCD_ShowxNum(134,130,adcx,4,16,0); //ÏÔÊ&frac34;ADCC&sup2;ÉÑùºóµÄÔ­Ê&frac14;Öµ temp=(float)adcx*(3.3/4096); //»ñÈ¡&frac14;ÆËãºóµÄ´øÐ¡ÊýµÄʵ&frac14;ʵçÑ&sup1;Öµ£¬±ÈÈç3.1111 adcx=temp; //¸&sup3;ÖµÕûÊý&sup2;¿·Ö¸øadcx±äÁ¿£¬ÒòΪadcxΪu16ÕûÐÎ LCD_ShowxNum(134,150,adcx,1,16,0); //ÏÔÊ&frac34;µçÑ&sup1;ÖµµÄÕûÊý&sup2;¿·Ö£¬3.1111µÄ»°£¬ÕâÀï&frac34;ÍÊÇÏÔÊ&frac34;3 temp-=adcx; //°ÑÒÑ&frac34;­ÏÔÊ&frac34;µÄÕûÊý&sup2;¿·ÖÈ¥µô£¬ÁôÏÂСÊý&sup2;¿·Ö£¬±ÈÈç3.1111-3=0.1111 temp*=1000; //СÊý&sup2;¿·Ö&sup3;ËÒÔ1000£¬ÀýÈ磺0.1111&frac34;Íת»»Îª111.1£¬Ï൱ÓÚ±£ÁôÈýλСÊý¡£ LCD_ShowxNum(150,150,temp,3,16,0X80); //ÏÔÊ&frac34;СÊý&sup2;¿·Ö£¨Ç°Ãæ×ª»»ÎªÁËÕûÐÎÏÔÊ&frac34;£©£¬ÕâÀïÏÔÊ&frac34;µÄ&frac34;ÍÊÇ111. LED0=!LED0; delay_ms(250); } } adc.c文件代码: #include "adc.h" #include "delay.h" ////////////////////////////////////////////////////////////////////////////////// //±&frac34;&sup3;ÌÐòÖ»&sup1;©Ñ§Ï°Ê&sup1;Óã¬Î´&frac34;­×÷ÕßÐí¿É£¬&sup2;»µÃÓÃÓÚÆäËüÈκÎÓÃÍ&frac34; //ALIENTEK STM32F407¿ª·¢°å //ADC Çý¶¯´úÂë //ÕýµãÔ­×Ó@ALIENTEK //&frac14;&frac14;ÊõÂÛÌ&sup3;:www.openedv.com //´´&frac12;¨ÈÕÆÚ:2014/5/6 //°æ±&frac34;£ºV1.0 //°æÈ¨ËùÓУ¬µÁ°æ±Ø&frac34;¿¡£ //Copyright(C) &sup1;ãÖÝÊÐÐÇÒíµç×Ó¿Æ&frac14;&frac14;ÓÐÏÞ&sup1;«Ë&frac34; 2014-2024 //All rights reserved ////////////////////////////////////////////////////////////////////////////////// //&sup3;õÊ&frac14;»¯ADC void Adc_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; ADC_CommonInitTypeDef ADC_CommonInitStructure; ADC_InitTypeDef ADC_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//Ê&sup1;ÄÜGPIOAʱÖÓ RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); //Ê&sup1;ÄÜADC1ʱÖÓ //ÏÈ&sup3;õÊ&frac14;»¯ADC1ͨµÀ5 IO¿Ú GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;//PA5 ͨµÀ5 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;//Ä£ÄâÊäÈë GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;//&sup2;»´øÉÏÏÂÀ­ GPIO_Init(GPIOA, &GPIO_InitStructure);//&sup3;õÊ&frac14;»¯ RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,ENABLE); //ADC1¸´Î» RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,DISABLE); //¸´Î»&frac12;áÊø ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;//¶ÀÁ¢Ä£Ê&frac12; ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;//Á&frac12;¸ö&sup2;ÉÑù&frac12;×¶ÎÖ®&frac14;äµÄÑÓ&sup3;Ù5¸öʱÖÓ ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled; //DMAʧÄÜ ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4;//Ô¤·ÖƵ4·ÖƵ¡£ADCCLK=PCLK2/4=84/4=21Mhz,ADCʱÖÓ×îºÃ&sup2;»Òª&sup3;¬&sup136Mhz ADC_CommonInit(&ADC_CommonInitStructure);//&sup3;õÊ&frac14;»¯ ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;//12λģÊ&frac12; ADC_InitStructure.ADC_ScanConvMode = DISABLE;//·ÇɨÃèÄ£Ê&frac12; ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;//&sup1;رÕÁ¬Ðø×ª»» ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;//&frac12;ûÖ&sup1;´¥·¢&frac14;ì&sup2;⣬Ê&sup1;ÓÃÈí&frac14;þ´¥·¢ ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//ÓÒ¶ÔÆë ADC_InitStructure.ADC_NbrOfConversion = 1;//1¸öת»»ÔÚ&sup1;æÔòÐòÁÐÖÐ Ò&sup2;&frac34;ÍÊÇֻת»»&sup1;æÔòÐòÁÐ1 ADC_Init(ADC1, &ADC_InitStructure);//ADC&sup3;õÊ&frac14;»¯ ADC_Cmd(ADC1, ENABLE);//¿ªÆôADת»»Æ÷ } //»ñµÃADCÖµ //ch: @ref ADC_channels //ͨµÀÖµ 0~16ȡֵ·¶Î§Îª£ºADC_Channel_0~ADC_Channel_16 //·µ»ØÖµ:ת»»&frac12;á&sup1;û u16 Get_Adc(u8 ch) { //ÉèÖÃÖ¸¶¨ADCµÄ&sup1;æÔò×éͨµÀ£¬Ò»¸öÐòÁУ¬&sup2;ÉÑùʱ&frac14;ä ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_480Cycles ); //ADC1,ADCͨµÀ,480¸öÖÜÆÚ,Ìá¸ß&sup2;ÉÑùʱ&frac14;ä¿ÉÒÔÌá¸ß&frac34;«È·¶È ADC_SoftwareStartConv(ADC1); //Ê&sup1;ÄÜÖ¸¶¨µÄADC1µÄÈí&frac14;þת»»Æô¶¯&sup1;¦ÄÜ while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//µÈ´ýת»»&frac12;áÊø return ADC_GetConversionValue(ADC1); //·µ»Ø×î&frac12;üÒ»´ÎADC1&sup1;æÔò×éµÄת»»&frac12;á&sup1;û } //»ñȡͨµÀchµÄת»»Öµ£¬È¡times´Î,È»ºóÆ&frac12;&frac34;ù //ch:ͨµÀ±àºÅ //times:»ñÈ¡´ÎÊý //·µ»ØÖµ:ͨµÀchµÄtimes´Îת»»&frac12;á&sup1;ûÆ&frac12;&frac34;ùÖµ u16 Get_Adc_Average(u8 ch,u8 times) { u32 temp_val=0; u8 t; for(t=0;t<times;t++) { temp_val+=Get_Adc(ch); delay_ms(5); } return temp_val/times; } 以上是老师提供的有关ADC实验的示例keil代码,我想请你在这些代码的基础上进行修改完善来完成任务123,请分别给出两个文件中应该编译的代码
10-30
#include "timer.h" #include "led.h" #include "usart.h" ////////////////////////////////////////////////////////////////////////////////// //±&frac34;&sup3;ÌÐòÖ»&sup1;©Ñ§Ï°Ê&sup1;Óã¬Î´&frac34;­×÷ÕßÐí¿É£¬&sup2;»µÃÓÃÓÚÆäËüÈκÎÓÃÍ&frac34; //ALIENTEKÕ&frac12;&frac12;¢STM32¿ª·¢°å //¶¨Ê±Æ÷ Çý¶¯´úÂë //ÕýµãÔ­×Ó@ALIENTEK //&frac14;&frac14;ÊõÂÛÌ&sup3;:www.openedv.com //ÐÞ¸ÄÈÕÆÚ:2012/9/4 //°æ±&frac34;£ºV1.1 //°æÈ¨ËùÓУ¬µÁ°æ±Ø&frac34;¿¡£ //Copyright(C) &sup1;ãÖÝÊÐÐÇÒíµç×Ó¿Æ&frac14;&frac14;ÓÐÏÞ&sup1;«Ë&frac34; 2009-2019 //All rights reserved //******************************************************************************** //V1.1 20120904 //1,Ôö&frac14;ÓTIM3_PWM_Initº¯Êý¡£ //2,Ôö&frac14;ÓLED0_PWM_VALºê¶¨Ò壬¿ØÖÆTIM3_CH2Âö¿í ////////////////////////////////////////////////////////////////////////////////// //ͨÓö¨Ê±Æ÷3ÖжÏ&sup3;õÊ&frac14;»¯ //ÕâÀïʱÖÓÑ¡ÔñΪAPB1µÄ2±¶£¬¶øAPB1Ϊ36M //arr£º×Ô¶¯ÖØ×°Öµ¡£ //psc£ºÊ±ÖÓÔ¤·ÖƵÊý //ÕâÀïÊ&sup1;ÓõÄÊǶ¨Ê±Æ÷3! void TIM3_Int_Init(u16 arr,u16 psc) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //ʱÖÓÊ&sup1;ÄÜ TIM_TimeBaseStructure.TIM_Period = arr; //ÉèÖÃÔÚÏÂÒ»¸ö¸üÐÂÊÂ&frac14;þ×°Èë»î¶¯µÄ×Ô¶¯ÖØ×°ÔØ&frac14;Ä´æÆ÷ÖÜÆÚµÄÖµ &frac14;ÆÊýµ&frac12;5000Ϊ500ms TIM_TimeBaseStructure.TIM_Prescaler =psc; //ÉèÖÃÓÃÀ´×÷ΪTIMxʱÖÓÆµÂÊ&sup3;ýÊýµÄÔ¤·ÖƵֵ 10KhzµÄ&frac14;ÆÊýƵÂÊ TIM_TimeBaseStructure.TIM_ClockDivision = 0; //ÉèÖÃʱÖÓ·Ö¸î:TDTS = Tck_tim TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIMÏòÉÏ&frac14;ÆÊýÄ£Ê&frac12; TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //¸ù&frac34;ÝTIM_TimeBaseInitStructÖÐÖ¸¶¨µÄ&sup2;ÎÊý&sup3;õÊ&frac14;»¯TIMxµÄʱ&frac14;ä»ùÊýµ¥Î» TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //Ê&sup1;ÄÜÖ¸¶¨µÄTIM3ÖжÏ,ÔÊÐí¸üÐÂÖÐ¶Ï NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3ÖÐ¶Ï NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //ÏÈÕ&frac14;ÓÅÏÈ&frac14;¶0&frac14;¶ NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //´ÓÓÅÏÈ&frac14;¶3&frac14;¶ NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQͨµÀ±»Ê&sup1;ÄÜ NVIC_Init(&NVIC_InitStructure); //¸ù&frac34;ÝNVIC_InitStructÖÐÖ¸¶¨µÄ&sup2;ÎÊý&sup3;õÊ&frac14;»¯ÍâÉèNVIC&frac14;Ä´æÆ÷ TIM_Cmd(TIM3, ENABLE); //Ê&sup1;ÄÜTIMxÍâÉè } //¶¨Ê±Æ÷3ÖжϷþÎñ&sup3;ÌÐò void TIM3_IRQHandler(void) //TIM3ÖÐ¶Ï { if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //&frac14;ì&sup2;éÖ¸¶¨µÄTIMÖжϷ¢ÉúÓë·ñ:TIM ÖжÏÔ´ { TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //Çå&sup3;ýTIMxµÄÖжϴý´¦Àíλ:TIM ÖжÏÔ´ LED1=!LED1; } } //TIM3 PWM&sup2;¿·Ö&sup3;õÊ&frac14;»¯ //PWMÊä&sup3;ö&sup3;õÊ&frac14;»¯ //arr£º×Ô¶¯ÖØ×°Öµ //psc£ºÊ±ÖÓÔ¤·ÖƵÊý void TIM3_PWM_Init(u16 arr,u16 psc) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //Ê&sup1;Äܶ¨Ê±Æ÷3ʱÖÓ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE); //Ê&sup1;ÄÜGPIOÍâÉèºÍAFIO¸´ÓÃ&sup1;¦ÄÜÄ£¿éʱÖÓ GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //Timer3&sup2;¿·ÖÖØÓ&sup3;Éä TIM3_CH2->PB5 //ÉèÖøÃÒý&frac12;ÅΪ¸´ÓÃÊä&sup3;ö&sup1;¦ÄÜ,Êä&sup3;öTIM3 CH2µÄPWMÂö&sup3;å&sup2;¨ÐÎ GPIOB.5 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //TIM_CH2 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //¸´ÓÃÍÆÍìÊä&sup3;ö GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure);//&sup3;õÊ&frac14;»¯GPIO //&sup3;õÊ&frac14;»¯TIM3 TIM_TimeBaseStructure.TIM_Period = arr; //ÉèÖÃÔÚÏÂÒ»¸ö¸üÐÂÊÂ&frac14;þ×°Èë»î¶¯µÄ×Ô¶¯ÖØ×°ÔØ&frac14;Ä´æÆ÷ÖÜÆÚµÄÖµ TIM_TimeBaseStructure.TIM_Prescaler =psc; //ÉèÖÃÓÃÀ´×÷ΪTIMxʱÖÓÆµÂÊ&sup3;ýÊýµÄÔ¤·ÖƵֵ TIM_TimeBaseStructure.TIM_ClockDivision = 0; //ÉèÖÃʱÖÓ·Ö¸î:TDTS = Tck_tim TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIMÏòÉÏ&frac14;ÆÊýÄ£Ê&frac12; TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //¸ù&frac34;ÝTIM_TimeBaseInitStructÖÐÖ¸¶¨µÄ&sup2;ÎÊý&sup3;õÊ&frac14;»¯TIMxµÄʱ&frac14;ä»ùÊýµ¥Î» //&sup3;õÊ&frac14;»¯TIM3 Channel2 PWMÄ£Ê&frac12; TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //Ñ¡Ôñ¶¨Ê±Æ÷Ä£Ê&frac12;:TIMÂö&sup3;å¿í¶Èµ÷ÖÆÄ£Ê&frac12;2 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //±È&frac12;ÏÊä&sup3;öÊ&sup1;ÄÜ TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //Êä&sup3;ö&frac14;«ÐÔ:TIMÊä&sup3;ö±È&frac12;Ï&frac14;«ÐÔ¸ß TIM_OC2Init(TIM3, &TIM_OCInitStructure); //¸ù&frac34;ÝTÖ¸¶¨µÄ&sup2;ÎÊý&sup3;õÊ&frac14;»¯ÍâÉèTIM3 OC2 TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); //Ê&sup1;ÄÜTIM3ÔÚCCR2ÉϵÄÔ¤×°ÔØ&frac14;Ä´æÆ÷ TIM_Cmd(TIM3, ENABLE); //Ê&sup1;ÄÜTIM3 }
最新发布
11-13
#include "sys.h" #include "usart.h" ////////////////////////////////////////////////////////////////////////////////// //Èç&sup1;ûÊ&sup1;ÓÃucos,Ôò°üÀ¨ÏÂÃæµÄÍ·ÎÄ&frac14;þ&frac14;´¿É. #if SYSTEM_SUPPORT_OS #include "includes.h" //ucos Ê&sup1;Óà #endif ////////////////////////////////////////////////////////////////////////////////// //±&frac34;&sup3;ÌÐòÖ»&sup1;©Ñ§Ï°Ê&sup1;Óã¬Î´&frac34;­×÷ÕßÐí¿É£¬&sup2;»µÃÓÃÓÚÆäËüÈκÎÓÃÍ&frac34; //ALIENTEK STM32F4Ì&frac12;Ë÷Õß¿ª·¢°å //´®¿Ú1&sup3;õÊ&frac14;»¯ //ÕýµãÔ­×Ó@ALIENTEK //&frac14;&frac14;ÊõÂÛÌ&sup3;:www.openedv.com //ÐÞ¸ÄÈÕÆÚ:2014/6/10 //°æ±&frac34;£ºV1.5 //°æÈ¨ËùÓУ¬µÁ°æ±Ø&frac34;¿¡£ //Copyright(C) &sup1;ãÖÝÊÐÐÇÒíµç×Ó¿Æ&frac14;&frac14;ÓÐÏÞ&sup1;«Ë&frac34; 2009-2019 //All rights reserved //******************************************************************************** //V1.3ÐÞ¸Ä˵Ã÷ //Ö§&sup3;ÖÊÊÓ¦&sup2;»Í¬ÆµÂÊϵĴ®¿Ú&sup2;¨ÌØÂÊÉèÖÃ. //&frac14;ÓÈëÁ˶ÔprintfµÄÖ§&sup3;Ö //Ôö&frac14;ÓÁË´®¿Ú&frac12;ÓÊÕÃüÁî&sup1;¦ÄÜ. //ÐÞÕýÁËprintfµÚÒ»¸ö×Ö·û¶ªÊ§µÄbug //V1.4ÐÞ¸Ä˵Ã÷ //1,Ð޸Ĵ®¿Ú&sup3;õÊ&frac14;»¯IOµÄbug //2,ÐÞ¸ÄÁËUSART_RX_STA,Ê&sup1;µÃ´®¿Ú×î´ó&frac12;ÓÊÕ×Ö&frac12;ÚÊýΪ2µÄ14´Î·&frac12; //3,Ôö&frac14;ÓÁËUSART_REC_LEN,ÓÃÓÚ¶¨Òå´®¿Ú×î´óÔÊÐí&frac12;ÓÊÕµÄ×Ö&frac12;ÚÊý(&sup2;»´óÓÚ2µÄ14´Î·&frac12;) //4,ÐÞ¸ÄÁËEN_USART1_RXµÄÊ&sup1;ÄÜ·&frac12;Ê&frac12; //V1.5ÐÞ¸Ä˵Ã÷ //1,Ôö&frac14;ÓÁ˶ÔUCOSIIµÄÖ§&sup3;Ö ////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////// //&frac14;ÓÈëÒÔÏ´úÂë,Ö§&sup3;Öprintfº¯Êý,¶ø&sup2;»ÐèҪѡÔñuse MicroLIB #if 1 #pragma import(__use_no_semihosting) //±ê×&frac14;¿âÐèÒªµÄÖ§&sup3;Öº¯Êý struct __FILE { int handle; }; FILE __stdout; //¶¨Òå_sys_exit()ÒÔ±ÜÃâÊ&sup1;ÓðëÖ÷»úÄ£Ê&frac12; _sys_exit(int x) { x = x; } //ÖØ¶¨Òåfputcº¯Êý int fputc(int ch, FILE *f) { while((USART1->SR&0X40)==0);//Ñ­»··¢ËÍ,Ö±µ&frac12;·¢ËÍÍê±Ï USART1->DR = (u8) ch; return ch; } #endif #if EN_USART1_RX //Èç&sup1;ûÊ&sup1;ÄÜÁË&frac12;ÓÊÕ //´®¿Ú1ÖжϷþÎñ&sup3;ÌÐò //×¢Òâ,¶ÁÈ¡USARTx->SRÄܱÜÃâĪÃûÆäÃîµÄ´íÎó u8 USART_RX_BUF[USART_REC_LEN]; //&frac12;ÓÊÕ»º&sup3;å,×î´óUSART_REC_LEN¸ö×Ö&frac12;Ú. //&frac12;ÓÊÕ״̬ //bit15£¬ &frac12;ÓÊÕÍê&sup3;ɱêÖ&frac34; //bit14£¬ &frac12;ÓÊÕµ&frac12;0x0d //bit13~0£¬ &frac12;ÓÊÕµ&frac12;µÄÓÐЧ×Ö&frac12;ÚÊýÄ¿ u16 USART_RX_STA=0; //&frac12;ÓÊÕ״̬±ê&frac14;Ç //&sup3;õÊ&frac14;»¯IO ´®¿Ú1 //bound:&sup2;¨ÌØÂÊ void uart_init(u32 bound){ //GPIO¶Ë¿ÚÉèÖà GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); //Ê&sup1;ÄÜGPIOAʱÖÓ RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//Ê&sup1;ÄÜUSART1ʱÖÓ //´®¿Ú1¶ÔÓ¦Òý&frac12;Ÿ´ÓÃÓ&sup3;Éä GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1); //GPIOA9¸´ÓÃΪUSART1 GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1); //GPIOA10¸´ÓÃΪUSART1 //USART1¶Ë¿ÚÅäÖà GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; //GPIOA9ÓëGPIOA10 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//¸´ÓÃ&sup1;¦ÄÜ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //ËÙ¶È50MHz GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //ÍÆÍ츴ÓÃÊä&sup3;ö GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //ÉÏÀ­ GPIO_Init(GPIOA,&GPIO_InitStructure); //&sup3;õÊ&frac14;»¯PA9£¬PA10 //USART1 &sup3;õÊ&frac14;»¯ÉèÖà USART_InitStructure.USART_BaudRate = bound;//&sup2;¨ÌØÂÊÉèÖà USART_InitStructure.USART_WordLength = USART_WordLength_8b;//×Ö&sup3;¤Îª8λÊý&frac34;ݸñÊ&frac12; USART_InitStructure.USART_StopBits = USART_StopBits_1;//Ò»¸öÍ£Ö&sup1;λ USART_InitStructure.USART_Parity = USART_Parity_No;//ÎÞÆæÅ&frac14;УÑéλ USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//ÎÞÓ&sup2;&frac14;þÊý&frac34;ÝÁ÷¿ØÖÆ USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //ÊÕ·¢Ä£Ê&frac12; USART_Init(USART1, &USART_InitStructure); //&sup3;õÊ&frac14;»¯´®¿Ú1 USART_Cmd(USART1, ENABLE); //Ê&sup1;ÄÜ´®¿Ú1 //USART_ClearFlag(USART1, USART_FLAG_TC); #if EN_USART1_RX USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//¿ªÆôÏà&sup1;ØÖÐ¶Ï //Usart1 NVIC ÅäÖà NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//´®¿Ú1ÖжÏͨµÀ NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//ÇÀÕ&frac14;ÓÅÏÈ&frac14;¶3 NVIC_InitStructure.NVIC_IRQChannelSubPriority =3; //×ÓÓÅÏÈ&frac14;¶3 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQͨµÀÊ&sup1;ÄÜ NVIC_Init(&NVIC_InitStructure); //¸ù&frac34;ÝÖ¸¶¨µÄ&sup2;ÎÊý&sup3;õÊ&frac14;»¯VIC&frac14;Ä´æÆ÷¡¢ #endif } void USART1_IRQHandler(void) //´®¿Ú1ÖжϷþÎñ&sup3;ÌÐò { u8 Res; #if SYSTEM_SUPPORT_OS //Èç&sup1;ûSYSTEM_SUPPORT_OSÎªÕæ£¬ÔòÐèÒªÖ§&sup3;ÖOS. OSIntEnter(); #endif if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //&frac12;ÓÊÕÖжÏ(&frac12;ÓÊÕµ&frac12;µÄÊý&frac34;ݱØÐëÊÇ0x0d 0x0a&frac12;áÎ&sup2;) { Res =USART_ReceiveData(USART1);//(USART1->DR); //¶ÁÈ¡&frac12;ÓÊÕµ&frac12;µÄÊý&frac34;Ý if((USART_RX_STA&0x8000)==0)//&frac12;ÓÊÕδÍê&sup3;É { if(USART_RX_STA&0x4000)//&frac12;ÓÊÕµ&frac12;ÁË0x0d { if(Res!=0x0a)USART_RX_STA=0;//&frac12;ÓÊÕ´íÎó,ÖØÐ¿ªÊ&frac14; else USART_RX_STA|=0x8000; //&frac12;ÓÊÕÍê&sup3;ÉÁË } else //»&sup1;ûÊÕµ&frac12;0X0D { if(Res==0x0d)USART_RX_STA|=0x4000; else { USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ; USART_RX_STA++; if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//&frac12;ÓÊÕÊý&frac34;Ý´íÎó,ÖØÐ¿ªÊ&frac14;&frac12;ÓÊÕ } } } } #if SYSTEM_SUPPORT_OS //Èç&sup1;ûSYSTEM_SUPPORT_OSÎªÕæ£¬ÔòÐèÒªÖ§&sup3;ÖOS. OSIntExit(); #endif } #endif 这个是usart.c的代码,请根据之前的报错以及修复方法完善这份代码
10-30
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值