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

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

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

HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);
HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);
HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);

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

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

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

#include <stdio.h>#ifdef __GNUC__/* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printfset to 'Yes') calls __io_putchar() */#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ *//*** @brief  Retargets the C library printf function to the USART.* @param  None* @retval None*/
PUTCHAR_PROTOTYPE
{/* Place your implementation of fputc here *//* e.g. write a character to the USART */huart1.Instance->DR = (uint8_t) ch;/* Loop until the end of transmission */while(__HAL_UART_GET_FLAG(&huart1, UART_FLAG_TC) == RESET){}return ch;
}

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

void LED_Task2(void const * argument)
{while(1){HAL_GPIO_TogglePin(GPIOG,GPIO_PIN_14);printf("LED_Task2\r\n");osDelay(2000);}
}

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

void USART1_IRQHandler(void)
{/* USER CODE BEGIN USART1_IRQn 0 */static int count=0;/* USER CODE END USART1_IRQn 0 */
//  HAL_UART_IRQHandler(&huart1);/* USER CODE BEGIN USART1_IRQn 1 */if(__HAL_UART_GET_FLAG(&huart1, UART_FLAG_RXNE) == SET)//有接受到字符串{uart_recbuf[count++] = (uint8_t)(huart1.Instance->DR & (uint8_t)0x00FF);//接收huart1.Instance->DR = uart_recbuf[count-1];//发送接收的数据if(count == 100) count = 0;}/* USER CODE END USART1_IRQn 1 */
}

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

void HAL_UART_MspInit(UART_HandleTypeDef* huart)
{GPIO_InitTypeDef GPIO_InitStruct;if(huart->Instance==USART1){/* USER CODE BEGIN USART1_MspInit 0 *//* USER CODE END USART1_MspInit 0 *//* Peripheral clock enable */__USART1_CLK_ENABLE();/**USART1 GPIO Configuration    PA9     ------> USART1_TXPA10     ------> USART1_RX */GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10;GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;GPIO_InitStruct.Pull = GPIO_PULLUP;GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;GPIO_InitStruct.Alternate = GPIO_AF7_USART1;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);/* Peripheral interrupt init*/HAL_NVIC_SetPriority(USART1_IRQn, 5, 0);HAL_NVIC_EnableIRQ(USART1_IRQn);/* USER CODE BEGIN USART1_MspInit 1 */huart->Instance->CR1 |= USART_CR1_RXNEIE;//使能接收中断/* USER CODE END USART1_MspInit 1 */}}

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

转载于:https://www.cnblogs.com/zfyouxi/p/5111054.html

STM32M CUBE实现printf打印调试信息以及实现单字节接收相关推荐

  1. MDK硬件调试打印调试信息的实现方式---ITM机制的实现

    时调试代码的时候大家都喜欢用printf函数来输出一些打印信息,来提示自己代码的执行情况.在刚开始接触这个调试方法的时候,我采用的方式就是浪费一个芯片的串口,然后利用TTL转USB模块,在PC端的串口 ...

  2. MFC 打印调试 信息 OutputDebugString

    MFC 打印调试 信息 OutputDebugString F5 调试 f:\mfc_work\mfc_code_jack\data_struct_app\cstring_app\cstringtes ...

  3. 如何在 SAP UI5 应用中集成第三方库 :一个在移动设备上查看 Web 应用打印调试信息的小技巧

    这是 Jerry 2021 年的第 43 篇文章,也是汪子熙公众号总共第 320 篇原创文章. 做 Web 开发的程序员,无论使用 SAP UI5,还是 Angular,React,Vue,每天都离不 ...

  4. 手机上调试html,在手机上打印调试信息 – debug.js

    debug.js 在手机上打印调试信息. 快速上手 debug.success("This is success message:)"); debug.error("Th ...

  5. NXP JN5169 JN-AN-1189-ZigBee-HA-Demo 使用UART0打印调试信息,UART1和其他设备收发数据

    NXP JN5169 JN-AN-1189-ZigBee-HA-Demo 使用UART0打印调试信息,UART1和其他设备收发数据 一.JN-AN-1189 介绍 二.导入工程 三.修改工程 1.典型 ...

  6. Android app:用Log方法打印调试信息 (Log.v,Log.d,Log.i,Log.w,Log.e)以及修改LogCat的颜色

    Android app:Log方法打印调试信息 (Log.v,Log.d,Log.i,Log.w,Log.e)和修改LogCat的颜色 一.包含Log类,import android.util.Log ...

  7. 51单片机通过串口打印调试信息

    1.实验目的 有时候单片机程序运行的时候我们不知道当前程序行某个变量的数据是多少,我们想像学习C语言的时候,打印出来信息,比如变量的值等等.这里就是起到这个调试作用.但是,要注意变量范围.是全局变量, ...

  8. 巧用可变参数宏、编译器内置宏和printf输出调试信息

    前言: 我们在写程序的时候,总是或多或少会加入一些printf之类的语句用于输出调试信息,但是printf语句有个很不方便的地方就是当我们需要发布程序的时候要一条一条的把这些语句删除,而一旦需要再次调 ...

  9. Win7 32位下DebugView和DriverMinitor不能打印调试信息的问题

    使用DebugView打印内核调试信息是开发驱动的非常重要的手段,但DebugView在VISTA/WINDOWS 7下却无法获取内核的调试日志,修改方法是: HKLM/SYSTEM/CurrentC ...

最新文章

  1. Mysql常用词汇_mysql 数据库常用单词
  2. ++i和i++效率谁高
  3. k8s/01开启云原生之门(Mooc)
  4. Linux的Qt编译出现:-1: error: cannot find -lGL问题的解决方法
  5. Mac:Split文件分割命令
  6. WMS智能仓储系统成长史?
  7. 严重: Exception sending context initialized event to listener instance of class
  8. sshd启动报错解决:sshd re-exec requires execution with an absolute path
  9. Extjs4.2里Grid显示日期类型数据
  10. post接口请求测试,通俗易懂
  11. 重启服务器iis网站400,重启IIS服务的几种方法小结
  12. 语音合成IC与语音IC的两三事
  13. 蒟蒻C语言入门篇(一)
  14. apache mediawiki 安装_mediawiki的安装
  15. oracle12C以逗号隔开怎么写,10g之后支持中文逗号作为查询分隔符
  16. 充电慢、掉电快、续航短?这份电动车过冬指南请查收!
  17. 深度学习需要多强的数学基础?
  18. Google及Facebook第三方登录问题,“将你登入到此应用时出错,请稍后再试”
  19. 远程连接阿里云服务器出现“远程桌面,身份验证错误:要求的函数不受支持“解决办法
  20. Linux部署IPFS(分布式存储系统)私有网络

热门文章

  1. 69道Spring面试题和答案
  2. HttpClient 使用
  3. Log4j配置文件解读和模板页收藏
  4. Sizzle系列之 选择元素
  5. 关于realarm210 realarmTest.apk不能直接安装问题解决方法
  6. 41 | 案例篇:如何优化 NAT 性能?(上)
  7. 虚拟化概念和KVM简述
  8. python拷贝文件夹目录和文件_Python 拷贝文件及文件夹到远程主机目录
  9. 单机mysql能支撑起10w的qps_高并发redis - 读写分离支撑qps10w+
  10. 传统程序员如何学习机器智能?阿里公开11个经典实战案例