在写单片机程序时我们一般喜欢使用printf来通过串口打印调试信息,但这个函数是不能够直接使用的。必须做点对库函数的修改。

具体project下载地址: http://download.csdn.net/detail/liucheng5037/8847961

STM32M CUBE是ST官方提供的库以及初始化工具,非常好非常强大,可是在UART方面值提供了例如以下函数:

  1. HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);
  2. HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);
  3. HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
  4. HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
  5. HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
  6. HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);

分别实现普通收发。中断收发,DMA收发。问题是全部函数要求发送和接收的buf必需要事先知道长度,也没有提供对单字节的收发,无法直接实现printf以及单字节接收。

事实上要实现这些还是非常easy的。首先是实现printf

在main.c 加入例如以下信息

  1. #include <stdio.h>
  2.  
  3. #ifdef __GNUC__
  4. /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
  5. set to 'Yes') calls __io_putchar() */
  6. #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
  7. #else
  8. #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
  9. #endif /* __GNUC__ */
  10.  
  11. /**
  12. * @brief Retargets the C library printf function to the USART.
  13. * @param None
  14. * @retval None
  15. */
  16. PUTCHAR_PROTOTYPE
  17. {
  18. /* Place your implementation of fputc here */
  19. /* e.g. write a character to the USART */
  20. huart1.Instance->DR = (uint8_t) ch;
  21.  
  22. /* Loop until the end of transmission */
  23. while(__HAL_UART_GET_FLAG(&huart1, UART_FLAG_TC) == RESET){}
  24.  
  25. return ch;
  26. }

在这里我们实现了单字节发送函数,注意实现这样的发送方式的前提是单字节发送的相关中断不能打开。否则会进入无限等待,做好之后就能够使用printf了。

  1. void LED_Task2(void const * argument)
  2. {
  3. while(1)
  4. {
  5. HAL_GPIO_TogglePin(GPIOG,GPIO_PIN_14);
  6. printf("LED_Task2\r\n");
  7. osDelay(2000);
  8. }
  9. }

然后是中断单字节接收,改动中断接收函数例如以下:

  1. void USART1_IRQHandler(void)
  2. {
  3. /* USER CODE BEGIN USART1_IRQn 0 */
  4. static int count=0;
  5. /* USER CODE END USART1_IRQn 0 */
  6. // HAL_UART_IRQHandler(&huart1);
  7. /* USER CODE BEGIN USART1_IRQn 1 */
  8. if(__HAL_UART_GET_FLAG(&huart1, UART_FLAG_RXNE) == SET)//有接受到字符串
  9. {
  10. uart_recbuf[count++] = (uint8_t)(huart1.Instance->DR & (uint8_t)0x00FF);//接收
  11. huart1.Instance->DR = uart_recbuf[count-1];//发送接收的数据
  12. if(count == 100) count = 0;
  13. }
  14. /* USER CODE END USART1_IRQn 1 */
  15. }

注意使用cube生成的代码默认是没有打开接收中断使能的。要在这里打开:

  1. void HAL_UART_MspInit(UART_HandleTypeDef* huart)
  2. {
  3.  
  4. GPIO_InitTypeDef GPIO_InitStruct;
  5. if(huart->Instance==USART1)
  6. {
  7. /* USER CODE BEGIN USART1_MspInit 0 */
  8.  
  9. /* USER CODE END USART1_MspInit 0 */
  10. /* Peripheral clock enable */
  11. __USART1_CLK_ENABLE();
  12.  
  13. /**USART1 GPIO Configuration
  14. PA9 ------> USART1_TX
  15. PA10 ------> USART1_RX
  16. */
  17. GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10;
  18. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  19. GPIO_InitStruct.Pull = GPIO_PULLUP;
  20. GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
  21. GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
  22. HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  23.  
  24. /* Peripheral interrupt init*/
  25. HAL_NVIC_SetPriority(USART1_IRQn, 5, 0);
  26. HAL_NVIC_EnableIRQ(USART1_IRQn);
  27. /* USER CODE BEGIN USART1_MspInit 1 */
  28. huart->Instance->CR1 |= USART_CR1_RXNEIE;//使能接收中断
  29. /* USER CODE END USART1_MspInit 1 */
  30. }
  31.  
  32. }

这样就实现了这些功能,可是之前cube的默认功能,中断收发已经不能用了。

STM32M CUBE实现printf打印调试信息以及实现单字节接收的更多相关文章

  1. debug.js在手机上打印调试信息

    在做移动端开发的时候大家应该都遇到过这么一个问题:如何在手机上打印调试信息? 在pc端我们通常会用console.log 或者 alert,但大家知道console.log在手机上是看不到打印信息的: ...

  2. rpm命令如何打印调试信息?

    问题描述: 今天在做rpm相关操作的时候,发现报错,并且还不知道如何入手来解决问题,就左查右查的问题还是没有解决,后来就想,rpm能否打印debug信息,然后也百度了,也没有找到,后来想我为啥不看看r ...

  3. Android Studio 打印调试信息

    转自:https://www.2cto.com/kf/201611/569468.html 之前开发单片机软件还是上位机都习惯使用printf(),相信很多很会有和我一样的习惯.开始学习安卓了,当然也 ...

  4. NDK编程中如何在C文件中打印调试信息

      1,在Android.mk文件中加上 LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog LOCAL_PATH := $(call my-dir)include ...

  5. VC++6.0 打印调试信息

    1.在MFC中加入TRACE语句 2.在TOOLS->MFC TRACER中选择 “ENABLE TRACING”点击OK 3.进行调试运行,GO(F5)(特别注意:不是执行‘!’以前之所以不能 ...

  6. Keil ARM-CM3 printf输出调试信息到Debug (printf) Viewer

    参考资料:http://www.keil.com/support/man/docs/jlink/jlink_trace_itm_viewer.htm 1.Target Options -> De ...

  7. QT+VS中使用qDebug()打印调试信息无法显示

    首先右键点击项目名称,找到最后一项属性 然后依次设置为如图所示即可 再次编译后,会弹出CMD窗口,出现qDebug的调试信息.

  8. Logcat打印调试信息

    Android Logcat调试中的V.D.I.W.E的分别代表什么? Log.v -- 黑色 -- verbose infoLog.d -- 蓝色 -- debug infoLog.i -- 绿色 ...

  9. VS IDE环境下,windows GUI(Qt MFC,win32)使用控制台实时打印调试信息

    在工程属性的页面下,点击Build Events,在Build Events下点击Post-Build Event. 然后再Command Line里面输入以下命令: editbin /SUBSYST ...

随机推荐

  1. HDU - 5036 Explosion

    Problem Description Everyone knows Matt enjoys playing games very much. Now, he is playing such a ga ...

  2. C语言中的enum(枚举)使用方法

    近期在写数据结构的广义表时候用到了这个概念,在学习C语言的时候没有太注意们这里学一下. 我在网上结合了非常多资料,这里自己总结一下. 首先说.JAVA和C++中都有枚举类型. 假设一个变量你须要几种可 ...

  3. leetcode——Search a 2D Matrix 二维有序数组查找(AC)

    Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the follo ...

  4. Swift - 初始化方法返回nil表示初始化失败

    自Swift1.1开始,初始化init方法便有返回nil的能力.我们可以在init声明的时候在其后面加上一个 ? 或者 ! 来表示初始化失败时可能返回nil. 比如,给Int类添加一个将字符串初始化成 ...

  5. NX-bridge,可以实现无线XBee控制的Arduino板

    ”今天Elecfreaks Studio给你介绍一个新的.很实用的朋友:带有一些奇幻色彩的神秘设备.它是什么呢?它可以完成什么功能呢?它对我们的生活有哪些促进呢?非常感兴趣吧?别着急,我们这就给您详细 ...

  6. Android中获取电池电量

    /** * * @author chrp * *显示当前电池电量 */ public class MainActivity extends Activity { private TextView tv ...

  7. 一个关于native sql的程序

    *&---------------------------------------------------------------------* *& Report ZHR_BPM11 ...

  8. DWZ (JUI) 教程(二):处理信息回馈的通用规范

    在开发过程中,抽象成模型,定义规范是非常有必要的,不仅可以简化代码,提高开发效率,也为自己减少了不少麻烦. 在开发中,因为DWZ这块是我负责,由于代码琐碎,重复度高,没有抽象封装,没有定义规范,别人不 ...

  9. Appium TestNg Maven Android Eclipse java简单启动实例

    环境准备 Eclipse + maven + appium + TestNg 确保已经在Eclipse 上面安装maven TestNg的插件 打开Eclipse,新建一个java项目,把项目转换成m ...

  10. 改变TPageControl的活动标签颜色

    设置PageControl的owndraw属性为TRUE. procedure TForm1.pgc1DrawTab(Control: TCustomTabControl; TabIndex: Int ...