搜索
bottom↓
回复: 17

分享一个官方没有的stm32f4-Discovery的串口例程

[复制链接]

出0入0汤圆

发表于 2014-5-15 21:26:12 | 显示全部楼层 |阅读模式
(固件库V1.0.0+串口( printf重定向,格式输出)+LED+Kill.bat)
     对于我心爱的stm32f4-dicovery,一直没有时间来折腾你,这会有时间了,跑跑程序玩玩。
     首先,打开官方下载的固件库,打开project,居然没有串口的例程,汗,然后自己自琢磨着移植一个。一开始打算搞串口1,结果发现被占用,所以就先调试串口2了,嘿嘿!
这里吐槽一下,今天下午第一次尝试用STM32Cube,发现STM32Cube生成的代码并不怎么好,官方的串口例程也折腾了一下,发现各种宏定义各种封装,而且代码不好用,比如一个简单的串口发送函数搞的如此复杂:
HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
所以STM32Cube软件只是用来看看引脚分配,非常直观效率高,还有生成的初始化代码也值得参考哦~~嘻嘻
      先给大家扫盲一下:
STM32F407xx内嵌四个通用同步/异步接收器(USART1,USART2,USART3 和USART6)和两个通用异步收发器(UART4和UART5)。这6个接口提供异步通信的IrDASIR ENDEC支持,多机通信模式,单线半双工通信模式LIN主/从功能。 USART1和USART6接口能够速度高达10.5 Mbit / s的通信其他可用的接口通信高达5.25bit/s。USART1,USART2,USART3和USART6还提供硬件管理的CTS,RTS信号,智能卡的模式(ISO7816兼容)和类似的SPI通信能力。所有接口都可以通过DMA控制器。
    硬件环境:STM32F4-Discovery
    软件环境:MDK510,STM32Cube
其他部分就不用介绍了吧,上个mdk的工程源代码:
(固件库V1.0.0+串口( printf重定向,格式输出)+LED+Kill.bat)
特别注意:在keil option 选项卡中,要选中Use MircoLib,否则编译后的代码将会很大,我试过差不多是原来的3倍。

  1. /**********************************************************************************************
  2. *函数名:USART_SentChar
  3. * 参 数:USART_TypeDef* USARTx,unsigned char c
  4. * 返回值:void
  5. * 功能:向某个串口发送一个字符
  6. **********************************************************************************************/
  7. void USART_SentChar(USART_TypeDef* USARTx,unsigned char c)
  8. {
  9.     USART_SendData(USARTx, c);
  10.     while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET );
  11. }

  12. /***********************************************************************************************
  13. *函数名:USART_SendString()
  14. * 参数:USART_TypeDef* USARTx 所要发送到的串口的指针,u8 *str 指向发送的字符串的指针
  15. * 返回值:void
  16. * 功能:向某个串口发送一个字符串
  17. ************************************************************************************************/
  18. void USART_SendString(USART_TypeDef* USARTx,u8 *str)
  19. {
  20.   while(*str)
  21.   {
  22.            USART_SendData(USARTx,*str);                                                                                                           //将*str从USARTx发送出去
  23.            while (USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET);         //等待发送完毕  
  24.            str++;        //str的地址增加1,到下一个字符
  25.   }
  26. }

  27. /**********************************************************************************************
  28. ** 函数名   : fputc()
  29. ** 功  能   :重定向C库函数printf到USART:重新定义stdio.h中的fputc()函数,使printf()输出到USART
  30. ** 输  入   :int ch,FILE *f
  31. ** 输  出   :int ch
  32. ** 使用说明 :
  33. **          Example:printf("i=%d,ch=%c\n",i,ch);
  34.                         printf("\r\n LCD驱动IC为:%x \r\n",0x55);
  35.   %d:按10进制有符号整数实际长度输出
  36.         %u:按10进制无符号整数实际长度输出
  37.         %o:按8进制数据实际长度输出
  38.         %x:按16进制数据实际长度输出
  39.         %c:输出一个字符
  40.         %s:输出一个字符串
  41. ************************************************************************************************/
  42. int fputc(int ch,FILE *f)
  43. {
  44.   USART_SendData(USART2,(u8)ch);                             //将ch从USART1发送出去
  45.   while (!(USART2->SR & USART_FLAG_TXE));                                       //等待发送完毕                                                                          
  46.   return ch;                                                                                                                                                 //返回 ch
  47. }       

  48. /***********************************************************************************************
  49. * Function Name  : int fgetc(FILE *f)
  50. * Description    : Retargets the C library printf function to the USART.fgetc重定向
  51. * Input          : None
  52. * Output         : None
  53. * Return         : 读取到的字符
  54. ************************************************************************************************/
  55. int fgetc(FILE *f)
  56.         {
  57.         /* Loop until received a char */
  58.         while(!(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == SET))
  59.                 {
  60.                 }       
  61.         /* Read a character from the USART1 and RETURN */
  62.         return (USART_ReceiveData(USART1));
  63.         }

  64. /***********************************************************************************************
  65. * 函数名:itoa
  66. * 描述  :将整形数据转换成字符串
  67. * 输入  :-radix =10 表示10进制,其他结果为0
  68. *         -value 要转换的整形数
  69. *         -buf 转换后的字符串
  70. *         -radix = 10
  71. * 输出  :无
  72. * 返回  :无
  73. * 调用  :被USART2_printf()调用
  74. ************************************************************************************************/
  75. static char *itoa(int value, char *string, int radix)
  76. {
  77.     int     i, d;
  78.     int     flag = 0;
  79.     char    *ptr = string;
  80.     /* This implementation only works for decimal numbers. */
  81.     if (radix != 10)
  82.     {
  83.         *ptr = 0;
  84.         return string;
  85.     }
  86.     if (!value)
  87.     {
  88.         *ptr++ = 0x30;
  89.         *ptr = 0;
  90.         return string;
  91.     }
  92.     /* if this is a negative value insert the minus sign. */
  93.     if (value < 0)
  94.     {
  95.         *ptr++ = '-';
  96.         /* Make the value positive. */
  97.         value *= -1;
  98.     }

  99.     for (i = 10000; i > 0; i /= 10)
  100.     {
  101.         d = value / i;

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

  109.     /* Null terminate the string. */
  110.     *ptr = 0;

  111.     return string;

  112. } /* NCL_Itoa */

  113. /***********************************************************************************************
  114. * 函数名:USART2_printf
  115. * 描述  :格式化输出,类似于C库中的printf,但这里没有用到C库
  116. * 输入  :-USARTx 串口通道,这里只用到了串口2,即USART2
  117. *                     -Data   要发送到串口的内容的指针
  118. *                           -...    其他参数
  119. * 输出  :无
  120. * 返回  :无
  121. * 调用  :外部调用
  122. *         典型应用USART2_printf( USART2, "\r\n this is a demo \r\n" );
  123. *                             USART2_printf( USART2, "\r\n %d \r\n", i );
  124. *                             USART2_printf( USART2, "\r\n %s \r\n", j );
  125. ************************************************************************************************/
  126. void USART2_printf(USART_TypeDef* USARTx, uint8_t *Data,...)
  127. {
  128.         const char *s;
  129.   int d;   
  130.   char buf[16];

  131.   va_list ap;
  132.   va_start(ap, Data);

  133.         while ( *Data != 0)     // 判断是否到达字符串结束符
  134.         {                                                          
  135.                 if ( *Data == 0x5c )  //'\'
  136.                 {                                                                          
  137.                         switch ( *++Data )
  138.                         {
  139.                                 case 'r':                                                                  //回车符
  140.                                         USART_SendData(USARTx, 0x0d);
  141.                                         Data ++;
  142.                                         break;

  143.                                 case 'n':                                                                  //换行符
  144.                                         USART_SendData(USARTx, 0x0a);       
  145.                                         Data ++;
  146.                                         break;
  147.                                
  148.                                 default:
  149.                                         Data ++;
  150.                                    break;
  151.                         }                         
  152.                 }
  153.                 else if ( *Data == '%')
  154.                 {                                                                          //
  155.                         switch ( *++Data )
  156.                         {                               
  157.                                 case 's':                                                                                  //字符串
  158.                                         s = va_arg(ap, const char *);
  159.           for ( ; *s; s++)
  160.                                         {
  161.                                                 USART_SendData(USARTx,*s);
  162.                                                 while( USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET );
  163.           }
  164.                                         Data++;
  165.           break;

  166.         case 'd':                                                                                //十进制
  167.           d = va_arg(ap, int);
  168.           itoa(d, buf, 10);
  169.           for (s = buf; *s; s++)
  170.                                         {
  171.                                                 USART_SendData(USARTx,*s);
  172.                                                 while( USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET );
  173.           }
  174.                                         Data++;
  175.           break;
  176.                                  default:
  177.                                                 Data++;
  178.                                     break;
  179.                         }                 
  180.                 } /* end of else if */
  181.                 else USART_SendData(USARTx, *Data++);
  182.                 while( USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET );
  183.         }
  184. }
复制代码

出0入0汤圆

 楼主| 发表于 2014-5-15 21:27:51 | 显示全部楼层

哈哈

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2014-5-15 21:31:12 | 显示全部楼层
以后会用上,现在先顶起,爪印!!~~~

出0入0汤圆

 楼主| 发表于 2014-6-2 18:22:07 | 显示全部楼层
代码今天更新了一下,以前的工程目录结构太难看,调整了!新版下载:


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2014-6-2 22:19:19 | 显示全部楼层
官方没有么?我怎么就在找到了

出0入0汤圆

 楼主| 发表于 2014-7-2 10:01:18 | 显示全部楼层
bygreencn 发表于 2014-6-2 22:19
官方没有么?我怎么就在找到了

嘿嘿,看看我这个是不是比官方的好得多咧???

出0入0汤圆

 楼主| 发表于 2014-7-2 10:08:10 | 显示全部楼层
bygreencn 发表于 2014-6-2 22:19
官方没有么?我怎么就在找到了

不过官方确实没有!!!差点被你迷惑了!!!

出0入0汤圆

发表于 2014-7-3 12:46:45 | 显示全部楼层
caizhiwei 发表于 2014-7-2 10:08
不过官方确实没有!!!差点被你迷惑了!!!

你真聪明,没人迷惑得了你!!!!!!!

MDK 添加RETARGET.C,自己写完fputc和fgetc另外两三个函数就出来了,不追求效率用不着连库一起写,对吧

咋样,迷惑不

出0入0汤圆

 楼主| 发表于 2014-7-3 22:50:12 | 显示全部楼层
bygreencn 发表于 2014-7-3 12:46
你真聪明,没人迷惑得了你!!!!!!!

MDK 添加RETARGET.C,自己写完fputc和fgetc另外两三个函数就出 ...

知道你牛逼,对你没用!但是我也贡献了代码,造福其他网友!你就别在这里说风凉话了,滚一边去~~~

出0入0汤圆

发表于 2014-7-3 22:55:59 | 显示全部楼层
本帖最后由 bygreencn 于 2014-7-3 22:59 编辑
caizhiwei 发表于 2014-7-3 22:50
知道你牛逼,对你没用!但是我也贡献了代码,造福其他网友!你就别在这里说风凉话了,滚一边去~~~ ...


你就一SB,一瓶子不满,半瓶子咣当

出0入0汤圆

 楼主| 发表于 2014-7-3 23:08:59 | 显示全部楼层
bygreencn 发表于 2014-7-3 22:55
你就一SB,一瓶子不满,半瓶子咣当

别骂人好不好?试问一下你分享过代码吗?自私的家伙!我分享有错吗?小心amo帮你号封掉~~

出0入0汤圆

发表于 2014-7-4 13:48:03 | 显示全部楼层
caizhiwei 发表于 2014-7-3 23:08
别骂人好不好?试问一下你分享过代码吗?自私的家伙!我分享有错吗?小心amo帮你号封掉~~
...

滚犊子,丫先满口损人话,这会儿跑来教训我,你丫什么玩意,扯JB蛋,滚远点。

出0入0汤圆

 楼主| 发表于 2014-7-4 16:10:16 | 显示全部楼层
bygreencn 发表于 2014-7-4 13:48
滚犊子,丫先满口损人话,这会儿跑来教训我,你丫什么玩意,扯JB蛋,滚远点。 ...

哎,和气生财,不想和你争了,就此打住吧,注意你研究生的素质!

出0入0汤圆

发表于 2014-7-21 23:32:05 | 显示全部楼层
淡定 和楼主一样的问题 但是这个库里面没有USART_SendData(USARTx, c);
    while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET ); 这些函数呀?

出0入0汤圆

发表于 2014-7-21 23:35:47 | 显示全部楼层
本帖最后由 zcan 于 2014-7-21 23:37 编辑

下载了你传的程序 你用的库和你说的HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout) 所在的库 不是一个版本库的吧  我用的是
  1.   
  2.   * @file    stm32f4xx_hal_uart.c
  3.   * @author  MCD Application Team
  4.   * @version V1.0.0
  5.   * @date    18-February-2014
  6.   * @brief   UART HAL module driver.
复制代码

出0入0汤圆

 楼主| 发表于 2014-7-22 12:08:22 | 显示全部楼层
zcan 发表于 2014-7-21 23:35
下载了你传的程序 你用的库和你说的HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint ...

工程用的是 普通库,不是cube里自带的库哦

出0入0汤圆

发表于 2014-7-23 11:05:11 | 显示全部楼层
caizhiwei 发表于 2014-7-22 12:08
工程用的是 普通库,不是cube里自带的库哦

嗯 普通库我也有 但是年份太久 用新库安心点

出0入0汤圆

发表于 2024-1-1 12:33:28 | 显示全部楼层
感谢楼主,请问原来开发板上没有串口(只是预留了UART IO),楼主是在另外接了串口外设吗?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-29 19:49

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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