找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5586|回复: 4
打印 上一主题 下一主题
收起左侧

STM8L151串口通信程序

[复制链接]
跳转到指定楼层
楼主
ID:478387 发表于 2019-2-20 10:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

最近学习开发STM8 MCU,,刚入手这颗MCU,对很多功能不太了解,只能一边开发一边学习,记录一下学习过程,如有错误的地方,敬请指正。

MCU:STM8L151K4
环境: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);       //复位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 ); //关闭传输完成中断
  15.         USART_Cmd(USART1, ENABLE );
  16.                
  17. }

  18. /*
  19. * 函数介绍: 发送一个字节
  20. * 输入参数: 需要发送的数据
  21. * 返回值:   无
  22. */
  23. void UARTSendData(u8 data){
  24.   
  25.         USART_SendData8(USART1, data);
  26.          /* 等待传输结束 */
  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. * 函数介绍: 发送任意字符串
  36. * 输入参数: 变参
  37. * 返回值:   无
  38. */
  39. void UARTSendString(char *format, ...)
  40. {
  41.         char strBuf[64];
  42.         va_list ap;   //初始化指向可变参数列表的指针  
  43.         va_start(ap, format);  //将第一个可变参数的地址赋给ap,即ap指向可变参数列表的开始
  44.         vsprintf(strBuf, format, ap); //将参数ap和format进行转化形成格式化字符串,即可以显示的字符串
  45.         strBuf[63] = 0;
  46.         UARTSendBuf(strBuf, strlen(strBuf));
  47.         va_end(ap);
  48. }


  49. /*
  50. * 函数介绍: 接收一个字节
  51. * 输入参数: 无
  52. * 返回值:   USART1_RX_BUF,接收的数据
  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. * 函数名:itoa
  69. * 描述  :将整形数据转换成字符串
  70. * 输入  :-radix =10 表示10进制,其他结果为0
  71. *         -value 要转换的整形数
  72. *         -buf 转换后的字符串
  73. *         -radix = 10
  74. * 输出  :无
  75. * 返回  :无
  76. * 调用  :被USART1_printf()调用
  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. * 函数名:UART1_printf
  118. * 描述  :格式化输出,类似于C库中的printf,但这里没有用到C库
  119. * 输入  :-UARTx 串口通道,这里只用到了串口1,即UART1
  120. *           -Data   要发送到串口的内容的指针
  121. *             -...    其他参数
  122. * 输出  :无
  123. * 返回  :无
  124. * 调用  :外部调用
  125. *         典型应用  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)     // 判断是否到达字符串结束符
  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':   //十进制
  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. }

复制代码
全部资料51hei下载地址:
USBDongle-Lock.7z (1.24 MB, 下载次数: 102)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:445069 发表于 2019-3-12 13:58 | 只看该作者
STM8L151串口通信程序,非常实用。串口通讯,确实少不了。
回复

使用道具 举报

板凳
ID:537357 发表于 2019-5-13 20:21 | 只看该作者
STM8L151串口通信程序,非常实用。串口通讯,确实少不了,Niex
回复

使用道具 举报

地板
ID:495929 发表于 2019-9-16 16:52 | 只看该作者
好资料,下载学习
回复

使用道具 举报

5#
ID:228755 发表于 2019-12-22 16:56 | 只看该作者
您好,这个压缩包损坏了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表