標(biāo)題: STM8L151串口通信程序 [打印本頁(yè)]

作者: xbbb1    時(shí)間: 2019-2-20 10:36
標(biāo)題: STM8L151串口通信程序

最近學(xué)習(xí)開發(fā)STM8 MCU,,剛?cè)胧诌@顆MCU,對(duì)很多功能不太了解,只能一邊開發(fā)一邊學(xué)習(xí),記錄一下學(xué)習(xí)過程,如有錯(cuò)誤的地方,敬請(qǐng)指正。

MCU:STM8L151K4
環(huán)境:IAR FOR STM8


  1. #include "uart.h"
  2. #include <stdarg.h>
  3. #include <string.h>


  4. void UARTInit(void)
  5. {

  6.    
  7.     GPIO_Init(GPIOC, GPIO_Pin_3, GPIO_Mode_Out_PP_High_Fast);//TXD
  8.     GPIO_Init(GPIOC, GPIO_Pin_2, GPIO_Mode_In_PU_No_IT);//RXD
  9.         CLK_PeripheralClockConfig(CLK_Peripheral_USART1, ENABLE);
  10.     USART_DeInit(USART1);       //復(fù)位UART1

  11.         USART_Init(USART1, (u32)115200, USART_WordLength_8b, USART_StopBits_1, USART_Parity_No, USART_Mode_Rx|USART_Mode_Tx);
  12.         USART_ClearITPendingBit(USART1, USART_IT_RXNE);
  13.         USART_ITConfig( USART1,  USART_IT_RXNE, ENABLE ); //開啟接收中斷
  14. //        USART_ITConfig( USART1,  USART_IT_TC, DISABLE ); //關(guān)閉傳輸完成中斷
  15.         USART_Cmd(USART1, ENABLE );
  16.                
  17. }

  18. /*
  19. * 函數(shù)介紹: 發(fā)送一個(gè)字節(jié)
  20. * 輸入?yún)?shù): 需要發(fā)送的數(shù)據(jù)
  21. * 返回值:   無
  22. */
  23. void UARTSendData(u8 data){
  24.   
  25.         USART_SendData8(USART1, data);
  26.          /* 等待傳輸結(jié)束 */
  27.     while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
  28. }


  29. void UARTSendBuf(u8* Data, u16 len){
  30.         u16 i = 0;
  31.         for(; i<len ;i++)
  32.                 UARTSendData(Data[i]);
  33. }

  34. /*
  35. * 函數(shù)介紹: 發(fā)送任意字符串
  36. * 輸入?yún)?shù): 變參
  37. * 返回值:   無
  38. */
  39. void UARTSendString(char *format, ...)
  40. {
  41.         char strBuf[64];
  42.         va_list ap;   //初始化指向可變參數(shù)列表的指針  
  43.         va_start(ap, format);  //將第一個(gè)可變參數(shù)的地址賦給ap,即ap指向可變參數(shù)列表的開始
  44.         vsprintf(strBuf, format, ap); //將參數(shù)ap和format進(jìn)行轉(zhuǎn)化形成格式化字符串,即可以顯示的字符串
  45.         strBuf[63] = 0;
  46.         UARTSendBuf(strBuf, strlen(strBuf));
  47.         va_end(ap);
  48. }


  49. /*
  50. * 函數(shù)介紹: 接收一個(gè)字節(jié)
  51. * 輸入?yún)?shù): 無
  52. * 返回值:   USART1_RX_BUF,接收的數(shù)據(jù)
  53. */
  54. u8 UARTReceiveByte(void)
  55. {
  56.   
  57.      u8 USART1_RX_BUF;
  58.          
  59.       /* 等待接收完成 */
  60.     while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);
  61.         
  62.          USART1_RX_BUF = USART_ReceiveData8(USART1);
  63.          
  64.          return  USART1_RX_BUF;
  65.    
  66. }

  67. /*
  68. * 函數(shù)名:itoa
  69. * 描述  :將整形數(shù)據(jù)轉(zhuǎn)換成字符串
  70. * 輸入  :-radix =10 表示10進(jìn)制,其他結(jié)果為0
  71. *         -value 要轉(zhuǎn)換的整形數(shù)
  72. *         -buf 轉(zhuǎn)換后的字符串
  73. *         -radix = 10
  74. * 輸出  :無
  75. * 返回  :無
  76. * 調(diào)用  :被USART1_printf()調(diào)用
  77. */
  78. static char *itoa(int value, char *string, int radix)
  79. {
  80.     int     i, d;
  81.     int     flag = 0;
  82.     char    *ptr = string;

  83.     /* This implementation only works for decimal numbers. */
  84.     if (radix != 10)
  85.     {
  86.         *ptr = 0;
  87.         return string;
  88.     }

  89.     if (!value)
  90.     {
  91.         *ptr++ = 0x30;
  92.         *ptr = 0;
  93.         return string;
  94.     }

  95.     /* if this is a negative value insert the minus sign. */
  96.     if (value < 0)
  97.     {
  98.         *ptr++ = '-';
  99.         /* Make the value positive. */
  100.         value *= -1;
  101.     }

  102.     for (i = 10000; i > 0; i /= 10)
  103.     {
  104.         d = value / i;

  105.         if (d || flag)
  106.         {
  107.             *ptr++ = (char)(d + 0x30);
  108.             value -= (d * i);
  109.             flag = 1;
  110.         }
  111.     }

  112.     /* Null terminate the string. */
  113.     *ptr = 0;

  114.     return string;

  115. } /* NCL_Itoa */


  116. /*
  117. * 函數(shù)名:UART1_printf
  118. * 描述  :格式化輸出,類似于C庫(kù)中的printf,但這里沒有用到C庫(kù)
  119. * 輸入  :-UARTx 串口通道,這里只用到了串口1,即UART1
  120. *           -Data   要發(fā)送到串口的內(nèi)容的指針
  121. *             -...    其他參數(shù)
  122. * 輸出  :無
  123. * 返回  :無
  124. * 調(diào)用  :外部調(diào)用
  125. *         典型應(yīng)用  UART1_printf( \"\r\n this is a demo \r\n\" );
  126. *                   UART1_printf(  \"\r\n %d \r\n\", i );
  127. *                   UART1_printf(  \"\r\n %s \r\n\", j );
  128. */
  129. void UART1Printf(u8 *Data , ...)
  130. {
  131.     const char *s;
  132.     int d;   
  133.     char buf[16];
  134.     va_list ap;
  135.     va_start(ap, Data);
  136.      
  137.     while ( *Data != 0)     // 判斷是否到達(dá)字符串結(jié)束符
  138.     {                                         
  139.         if ( *Data == 0x5c )  //'\'
  140.         {                                    
  141.             switch ( *++Data )
  142.             {
  143.                 case 'r':                                     //回車符
  144.                     USART_SendData8(USART1, 0x0d);
  145.                     Data ++;
  146.                 break;
  147.      
  148.                 case 'n':                                     //換行符
  149.                     USART_SendData8(USART1, 0x0a);  
  150.                     Data ++;
  151.                 break;
  152.      
  153.                 default:
  154.                     Data ++;
  155.                 break;
  156.             }            
  157.         }
  158.         else if ( *Data == '%')
  159.         {                   //
  160.             switch ( *++Data )
  161.             {               
  162.                 case 's':                       //字符串
  163.                 s = va_arg(ap, const char *);
  164.                 for ( ; *s; s++)
  165.                 {
  166.                     USART_SendData8(USART1, *s);
  167.                     while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
  168.                 }
  169.                 Data++;
  170.                 break;  
  171.                 case 'd':   //十進(jìn)制
  172.                     d = va_arg(ap, int);
  173.                     itoa(d, buf, 10);
  174.                 for (s = buf; *s; s++)
  175.                 {
  176.                     USART_SendData8(USART1, *s);
  177.                     while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
  178.                 }
  179.                 Data++;
  180.                 break;         
  181.                 default: Data++;
  182.                 break;
  183.             }        
  184.         } /* end of else if */
  185.         else USART_SendData8(USART1, *Data++);
  186.         while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
  187.          }
  188. }

復(fù)制代碼
全部資料51hei下載地址:
USBDongle-Lock.7z (1.24 MB, 下載次數(shù): 104)


作者: ontheroad    時(shí)間: 2019-3-12 13:58
STM8L151串口通信程序,非常實(shí)用。串口通訊,確實(shí)少不了。
作者: NetFireQiu    時(shí)間: 2019-5-13 20:21
STM8L151串口通信程序,非常實(shí)用。串口通訊,確實(shí)少不了,Niex
作者: Mayday8888    時(shí)間: 2019-9-16 16:52
好資料,下載學(xué)習(xí)
作者: gy51xx    時(shí)間: 2019-12-22 16:56
您好,這個(gè)壓縮包損壞了





歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1