你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

分享一个STM8L152C6的串口调试程序

[复制链接]
黑夜之狼 发布时间:2016-3-23 13:58
来了社区蛮久,还没发过帖子,这次来分享一个串口调试程序,欢迎大家拍砖赐教
  1. #include "uart1.h"

  2. void Uart1_Init(void)
  3. {
  4.     CLK_PeripheralClockConfig(CLK_Peripheral_USART1, ENABLE);
  5.     GPIO_Init(GPIOC, GPIO_Pin_3, GPIO_Mode_Out_PP_High_Fast);//TXD
  6.     GPIO_Init(GPIOC, GPIO_Pin_2, GPIO_Mode_In_PU_No_IT);//RXD
  7.     USART_DeInit(USART1);       //复位UART1
  8.     /*
  9.      * 将UART1配置为:
  10.      * 波特率 = 115200
  11.      * 数据位 = 8
  12.      * 1位停止位
  13.      * 无校验位
  14.      * 使能接收和发送
  15.      */
  16.     USART_Init(USART1, (u32)115200, USART_WordLength_8b, USART_StopBits_1,
  17.                 USART_Parity_No, USART_Mode_Tx|USART_Mode_Rx);
  18.     USART_ClearITPendingBit(USART1, USART_IT_RXNE);
  19.     USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启接收中断
  20.     //USART_ITConfig(USART1, USART_IT_TC, ENABLE);//开启接收中断
  21.     USART_Cmd(USART1, ENABLE);  //使能UART2
  22. }

  23. /*******************************************************************************
  24. * 名称: UART1_SendByte
  25. * 功能: UART1发送一个字节
  26. * 形参: data -> 要发送的字节
  27. * 返回: 无
  28. * 说明: 无
  29. ******************************************************************************/
  30. void UART1_SendByte(u8 data)
  31. {
  32.     USART_SendData8(USART1, data);
  33.     /* 等待传输结束 */
  34.     while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
  35. }

  36. /*******************************************************************************
  37. * 名称: UART1_SendStr
  38. * 功能: UART1发送len个字符
  39. * 形参: data -> 指向要发送的字符串
  40. *       len -> 要发送的字节数
  41. * 返回: 无
  42. * 说明: 无
  43. ******************************************************************************/
  44. void UART1_SendStr(u8 *str)
  45. {
  46.     while(*str != '\0')
  47.     {
  48.         UART1_SendByte(*str++); /* 循环调用发送一个字符函数 */
  49.     }   
  50. }

  51. /*******************************************************************************
  52. * 名称: UART2_ReceiveByte
  53. * 功能: UART2接收一个字符
  54. * 形参: 无
  55. * 返回: 接收到的字符
  56. * 说明: 无
  57. ******************************************************************************/
  58. u8 UART1_ReceiveByte(void)
  59. {
  60.     u8 UART1_RX_BUF;
  61.      
  62.     /* 等待接收完成 */
  63.     while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);
  64.      
  65.     UART1_RX_BUF = USART_ReceiveData8(USART1);
  66.      
  67.     return  UART1_RX_BUF;
  68. }

  69. /*******************************************************************************
  70. * 名称: fputc
  71. * 功能: 重定向c库函数printf到UART1
  72. * 形参: 无
  73. * 返回: 要打印的字符
  74. * 说明: 由printf调用
  75. ******************************************************************************/
  76. #ifdef _IAR_
  77. int fputc(int ch, FILE *f)
  78. {  
  79.     /* 将Printf内容发往串口 */
  80.         UART1_SendByte(ch);
  81.      
  82.     return (ch);
  83. }
  84. #else
  85. PUTCHAR_PROTOTYPE
  86. {
  87.    /* Write a character to the UART1 */
  88.     UART1_SendByte(c);
  89.     return (c);
  90. }
  91. #endif

  92. GETCHAR_PROTOTYPE
  93. {
  94. #ifdef _COSMIC_
  95.    char c = 0;
  96. #else
  97.    int c = 0;
  98. #endif
  99.    /* Loop until the Read data register flag is SET */
  100.    while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);
  101.    c = USART_ReceiveData8(USART1);
  102.    return (c);
  103. }

  104. /********************************************************
  105. * 函数名:itoa
  106. * 描述  :将整形数据转换成字符串
  107. * 输入  :-radix =10 表示10进制,其他结果为0
  108. *         -value 要转换的整形数
  109. *         -buf 转换后的字符串
  110. *         -radix = 10
  111. * 输出  :无
  112. * 返回  :无
  113. * 调用  :被USART1_printf()调用
  114. *******************************************************/
  115. static char *itoa(int value, char *string, int radix)
  116. {
  117.     int     i, d;
  118.     int     flag = 0;
  119.     char    *ptr = string;

  120.     /* This implementation only works for decimal numbers. */
  121.     if (radix != 10)
  122.     {
  123.         *ptr = 0;
  124.         return string;
  125.     }

  126.     if (!value)
  127.     {
  128.         *ptr++ = 0x30;
  129.         *ptr = 0;
  130.         return string;
  131.     }

  132.     /* if this is a negative value insert the minus sign. */
  133.     if (value < 0)
  134.     {
  135.         *ptr++ = '-';
  136.         /* Make the value positive. */
  137.         value *= -1;
  138.     }

  139.     for (i = 10000; i > 0; i /= 10)
  140.     {
  141.         d = value / i;

  142.         if (d || flag)
  143.         {
  144.             *ptr++ = (char)(d + 0x30);
  145.             value -= (d * i);
  146.             flag = 1;
  147.         }
  148.     }

  149.     /* Null terminate the string. */
  150.     *ptr = 0;

  151.     return string;

  152. } /* NCL_Itoa */

  153. /************************************************************************
  154. * 函数名:UART1_printf
  155. * 描述  :格式化输出,类似于C库中的printf,但这里没有用到C库
  156. * 输入  :-UARTx 串口通道,这里只用到了串口1,即UART1
  157. *           -Data   要发送到串口的内容的指针
  158. *             -...    其他参数
  159. * 输出  :无
  160. * 返回  :无
  161. * 调用  :外部调用
  162. *         典型应用  UART1_printf( "\r\n this is a demo \r\n" );
  163. *                   UART1_printf(  "\r\n %d \r\n", i );
  164. *                   UART1_printf(  "\r\n %s \r\n", j );
  165. ***************************************************************************/
  166. void UART1_printf(uint8_t *Data,...)
  167. {
  168.     const char *s;
  169.     int d;   
  170.     char buf[16];
  171.     va_list ap;
  172.     va_start(ap, Data);
  173.      
  174.     while ( *Data != 0)     // 判断是否到达字符串结束符
  175.     {                                         
  176.         if ( *Data == 0x5c )  //'\'
  177.         {                                    
  178.             switch ( *++Data )
  179.             {
  180.                 case 'r':                                     //回车符
  181.                     USART_SendData8(USART1, 0x0d);
  182.                     Data ++;
  183.                 break;
  184.      
  185.                 case 'n':                                     //换行符
  186.                     USART_SendData8(USART1, 0x0a);  
  187.                     Data ++;
  188.                 break;
  189.      
  190.                 default:
  191.                     Data ++;
  192.                 break;
  193.             }            
  194.         }
  195.         else if ( *Data == '%')
  196.         {                   //
  197.             switch ( *++Data )
  198.             {               
  199.                 case 's':                       //字符串
  200.                 s = va_arg(ap, const char *);
  201.                 for ( ; *s; s++)
  202.                 {
  203.                     USART_SendData8(USART1, *s);
  204.                     while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
  205.                 }
  206.                 Data++;
  207.                 break;  
  208.                 case 'd':   //十进制
  209.                     d = va_arg(ap, int);
  210.                     itoa(d, buf, 10);
  211.                 for (s = buf; *s; s++)
  212.                 {
  213.                     USART_SendData8(USART1, *s);
  214.                     while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
  215.                 }
  216.                 Data++;
  217.                 break;         
  218.                 default: Data++;
  219.                 break;
  220.             }        
  221.         } /* end of else if */
  222.         else USART_SendData8(USART1, *Data++);
  223.         while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
  224.     }
  225. }
复制代码
附上工程文件

STM8L_UART1(基于库).zip

下载

741.95 KB, 下载次数: 1732

收藏 3 评论4 发布时间:2016-3-23 13:58

举报

4个回答
魔界黑城 回答时间:2016-3-23 15:36:10
支持!
zcl201207 回答时间:2016-3-23 22:28:24
youngyyzz 回答时间:2016-9-29 14:28:35

支持!
youngyyzz 回答时间:2016-10-19 22:35:16
主程序第一句就打开中断,不好。

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版