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

STM8S005K6串口重定向到printf

[复制链接]
haifeng-388081 发布时间:2018-4-1 21:51
最近在学习STM8,和大家分享一个将串口重定向到printf的程序,在程序中可以直接使用pfintf打印注释,在不使用串口的情况下可以使用。开发环境是IAR FOR STM8 使用的库函数,代码有点粗糙,大家可以在此基础是进行优化,我只是做个例子。首先使内部高速16M时钟
  1. CLK_HSICmd(ENABLE);
  2.     CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);
复制代码

串口2初始化
  1. /*1位起始位 8位数据位 结束位由CR3设置 不使用奇偶校验 不使能奇偶校验中断*/
  2. /*使能发送和接收 接收中断使能 禁止发送中断*/
  3. /*设置1位停止位 不使能SCLK,波特率115200*/  
  4. void uart2Init()
  5. {
  6.     UART2_DeInit();
  7.     UART2_Init((uint32_t)115200, UART2_WORDLENGTH_8D, UART2_STOPBITS_1, \
  8.     UART2_PARITY_NO , UART2_SYNCMODE_CLOCK_DISABLE , UART2_MODE_TXRX_ENABLE);
  9.     UART2_ITConfig(UART2_IT_RXNE_OR,ENABLE  );
  10.     UART2_Cmd(ENABLE );
  11. }
复制代码

全能中断
  1. enableInterrupts();
复制代码
关于串口发送与接收的一些函数
  1. //串口发送一个字节
  2. void uart2SendByte(uint8_t data)
  3. {
  4.     UART2->DR=data;
  5.    /* Loop until the end of transmission */
  6.    while (!(UART2->SR & UART2_FLAG_TXE));
  7. }
  8. //串口改善字符串
  9. void uart2SendString(uint8_t* Data,uint16_t len)
  10. {
  11.   uint16_t i=0;
  12.   for(;i<len;i++)
  13.     uart2SendByte(Data[i]);
  14. }
  15. //串口接收一个字节
  16. uint8_t uart2ReceiveByte(void)
  17. {
  18.      uint8_t USART2_RX_BUF;
  19.      while (!(UART2->SR & UART2_FLAG_RXNE));
  20.      USART2_RX_BUF=(uint8_t)UART2->DR;
  21.      return  USART2_RX_BUF;
  22. }
  23. /*将Printf内容发往串口*/
  24. int fputc(int ch, FILE *f)
  25. {  
  26.   UART2->DR=(unsigned char)ch;
  27.   while (!(UART2->SR & UART2_FLAG_TXE));
  28.   return (ch);
  29. }
复制代码
UART2接收中断处理函数
  1. INTERRUPT_HANDLER(UART2_RX_IRQHandler, 21)
  2. {
  3.     /* In order to detect unexpected events during development,
  4.        it is recommended to set a breakpoint on the following instruction.
  5.     */
  6.         uint8_t Res;
  7.     if(UART2->SR & UART2_FLAG_RXNE)  
  8.     {/*接收中断(接收到的数据必须是0x0d 0x0a结尾)*/
  9.         Res =(uint8_t)UART2->DR;
  10.         /*(USART1->DR);读取接收到的数据,当读完数据后自动取消RXNE的中断标志位*/
  11.         if(( UART_RX_NUM&0x80)==0)/*接收未完成*/
  12.         {
  13.             if( UART_RX_NUM&0x40)/*接收到了0x0d*/
  14.                 {
  15.                   if(Res!=0x0a) UART_RX_NUM=0;/*接收错误,重新开始*/
  16.                   else  UART_RX_NUM|=0x80;        /*接收完成了 */
  17.                 }
  18.             else /*还没收到0X0D*/
  19.               {       
  20.                 if(Res==0x0d) UART_RX_NUM|=0x40;
  21.                 else
  22.                   {
  23.                     RxBuffer[ UART_RX_NUM&0X3F]=Res ;
  24.                      UART_RX_NUM++;
  25.                       if( UART_RX_NUM>63) UART_RX_NUM=0;/*接收数据错误,重新开始接收*/  
  26.                   }                 
  27.               }
  28.          }                   
  29.       }
  30. }
复制代码
然后包涵相应的头文件,
再将IAR设置一下
设置1.png
设置2.png
这样就可以使用printf函数了
  1.     while(1)
  2.     {
  3.         /*
  4.         GPIO_WriteLow(GPIOD,GPIO_PIN_2);
  5.         if(++ii>250)
  6.                 ii=0;
  7.         printf("\r\n ii=%3d",ii);

  8.         delay(9000);
  9.         GPIO_WriteReverse(GPIOA,GPIO_PIN_1);
  10.         delay(9000);
  11.         */
  12.         if(UART_RX_NUM&0x80)
  13.         {
  14.             len=UART_RX_NUM&0x3f;/*得到此次接收到的数据长度*/
  15.             uart2SendString("You sent the messages is:",sizeof("You sent the messages is"));
  16.             uart2SendString(RxBuffer,len);
  17.             printf("\r\n得到此次接收到的数据长度:%dByte\r\n",len);
  18.             UART_RX_NUM=0;
  19.         }
  20.     }
复制代码
另外记得要使用printf的文件中包含头文件#include "user_uart.h" 要么会出现一些问题,比如:输出的数字不正确。我就在这儿花费了好长时间,1秒钟加1 然后输出,可输出的数字一直是3。后来才发现没有包含头文件。
下面附上工程代码。
STM8S005K_printf.zip (5.11 MB, 下载次数: 76)
收藏 1 评论4 发布时间:2018-4-1 21:51

举报

4个回答
lisingch 回答时间:2018-4-2 09:39:57
不错,谢谢分享!
zero99 回答时间:2018-4-17 14:48:33
感谢分享,请汇总到4月技术原创
https://www.stmcu.org.cn/module/forum/thread-615497-1-1.html
jonecolu 回答时间:2018-4-28 17:29:03
不错不错
watershade 回答时间:2018-11-23 19:51:45
建议看一下stm8标准库附带的example。里面的printf代码比较简洁优雅
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版