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

分享一个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, 下载次数: 1738

收藏 4 评论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
主程序第一句就打开中断,不好。
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版