使用stm32cubemx开发四:串口标准化输出

发布者:iota19最新更新时间:2017-11-08 来源: eefocus关键字:stm32cubemx  串口标准化输出 手机看文章 扫描二维码
随时随地手机看文章

硬件平台:stm32F407Zet6

软件平台:stm32cubeMX 4.7+MDK5.14

电路连接:PA9,PA10

第一步、通过Stm32CubeMX图形界面创建Keil工程

需要配置的地方是



在这里可以修改串口工作的一下参数,软件就可以生成配置好的工程,不需要亲自去配置这些了。

第二步。打开工程,编写代码,验证

  1.   

  2. #include "stdio.h"  

  3. #ifdef __GNUC__  

  4. #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)  

  5. #else  

  6. #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)  

  7. #endif   

  8. PUTCHAR_PROTOTYPE  

  9. {  

  10.     HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF);  

  11.     return ch;  

  12. }  

  13.   

这段程序为了可以使用printf()函数,对字符输出函数进行了重定向,这样我们就可以在程序中使用printf函数进行输出了,这里使用的是查询发送方式,有超时控制的。接下来来看中断方式的。

  1.   

  2. void HAL_UART_IRQHandler(UART_HandleTypeDef *huart)  

  3. {  

  4.   uint32_t tmp1 = 0, tmp2 = 0;  

  5.   

  6.   tmp1 = __HAL_UART_GET_FLAG(huart, UART_FLAG_PE);  

  7.   tmp2 = __HAL_UART_GET_IT_SOURCE(huart, UART_IT_PE);    

  8.     

  9.   if((tmp1 != RESET) && (tmp2 != RESET))  

  10.   {   

  11.     __HAL_UART_CLEAR_PEFLAG(huart);  

  12.       

  13.     huart->ErrorCode |= HAL_UART_ERROR_PE;  

  14.   }  

  15.     

  16.   tmp1 = __HAL_UART_GET_FLAG(huart, UART_FLAG_FE);  

  17.   tmp2 = __HAL_UART_GET_IT_SOURCE(huart, UART_IT_ERR);  

  18.     

  19.   if((tmp1 != RESET) && (tmp2 != RESET))  

  20.   {   

  21.     __HAL_UART_CLEAR_FEFLAG(huart);  

  22.       

  23.     huart->ErrorCode |= HAL_UART_ERROR_FE;  

  24.   }  

  25.     

  26.   tmp1 = __HAL_UART_GET_FLAG(huart, UART_FLAG_NE);  

  27.   tmp2 = __HAL_UART_GET_IT_SOURCE(huart, UART_IT_ERR);  

  28.     

  29.   if((tmp1 != RESET) && (tmp2 != RESET))  

  30.   {   

  31.     __HAL_UART_CLEAR_NEFLAG(huart);  

  32.       

  33.     huart->ErrorCode |= HAL_UART_ERROR_NE;  

  34.   }  

  35.     

  36.   tmp1 = __HAL_UART_GET_FLAG(huart, UART_FLAG_ORE);  

  37.   tmp2 = __HAL_UART_GET_IT_SOURCE(huart, UART_IT_ERR);  

  38.     

  39.   if((tmp1 != RESET) && (tmp2 != RESET))  

  40.   {   

  41.     __HAL_UART_CLEAR_OREFLAG(huart);  

  42.       

  43.     huart->ErrorCode |= HAL_UART_ERROR_ORE;  

  44.   }  

  45.     

  46.   tmp1 = __HAL_UART_GET_FLAG(huart, UART_FLAG_RXNE);  

  47.   tmp2 = __HAL_UART_GET_IT_SOURCE(huart, UART_IT_RXNE);  

  48.     

  49.   if((tmp1 != RESET) && (tmp2 != RESET))  

  50.   {   

  51.     UART_Receive_IT(huart);  

  52.   }  

  53.     

  54.   tmp1 = __HAL_UART_GET_FLAG(huart, UART_FLAG_TXE);  

  55.   tmp2 = __HAL_UART_GET_IT_SOURCE(huart, UART_IT_TXE);  

  56.     

  57.   if((tmp1 != RESET) && (tmp2 != RESET))  

  58.   {  

  59.     UART_Transmit_IT(huart);  

  60.   }  

  61.     

  62.   tmp1 = __HAL_UART_GET_FLAG(huart, UART_FLAG_TC);  

  63.   tmp2 = __HAL_UART_GET_IT_SOURCE(huart, UART_IT_TC);  

  64.     

  65.   if((tmp1 != RESET) && (tmp2 != RESET))  

  66.   {  

  67.     UART_EndTransmit_IT(huart);  

  68.   }  

  69.   

  70.   if(huart->ErrorCode != HAL_UART_ERROR_NONE)  

  71.   {  

  72.       

  73.     huart->State = HAL_UART_STATE_READY;  

  74.       

  75.     HAL_UART_ErrorCallback(huart);  

  76.   }    

  77. }  

这个函数中查询了所有可能发生的中断。用到的中断是发送完成中断,就找到了UART_EndTransmit_IT(huart);再跳进去看看,

 

  1.   

  2. static HAL_StatusTypeDef UART_EndTransmit_IT(UART_HandleTypeDef *huart)  

  3. {  

  4.         

  5.   __HAL_UART_DISABLE_IT(huart, UART_IT_TC);  

  6.     

  7.     

  8.   if(huart->State == HAL_UART_STATE_BUSY_TX_RX)   

  9.   {  

  10.     huart->State = HAL_UART_STATE_BUSY_RX;  

  11.   }  

  12.   else  

  13.   {  

  14.       

  15.     __HAL_UART_DISABLE_IT(huart, UART_IT_PE);  

  16.   

  17.       

  18.     __HAL_UART_DISABLE_IT(huart, UART_IT_ERR);  

  19.   

  20.     huart->State = HAL_UART_STATE_READY;  

  21.   }  

  22.     

  23.   HAL_UART_TxCpltCallback(huart);  

  24.     

  25.   return HAL_OK;  

  26. }  

这个函数在确定中断发生了之后调用了,HAL_UART_TxCpltCallback(huart);从函数名上可以看出,这是个回调函数,就是留给上层来实现的函数,由这个函数的实现不同,来实现不同的功能。这里来实现这个函数,让它在中断发生的时候吧USART1Ready置为SET;代码修改如下

  1.   

  2. #include "stdio.h"  

  3. #ifdef __GNUC__  

  4. #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)  

  5. #else  

  6. #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)  

  7. #endif   

  8. __IO ITStatus USART1Ready = RESET;  

  9.   

  10. PUTCHAR_PROTOTYPE  

  11. {  

  12.     HAL_UART_Transmit_IT(&huart1 , (uint8_t *)&ch, 1);  

  13.     while (USART1Ready != SET)  

  14.   {  

  15.   }  

  16.     USART1Ready = RESET;  

  17.     return ch;  

  18. }  

  19.   

  20.   

  21.   

这是重定向函数的修改,启动发送之后,等待发送完成。重新实现的回调函数如下图所示:

  1.   

  2. void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)  

  3. {  

  4.      

  5.     USART1Ready = SET;  

  6. }  


这样就可以了,下载验证。


关键字:stm32cubemx  串口标准化输出 引用地址:使用stm32cubemx开发四:串口标准化输出

上一篇:STM32单片机闪存存储器里存储的是哪些内容
下一篇:stm32cubemx生成的代码总是进入滴答定时器中断

推荐阅读最新更新时间:2024-03-16 15:43

STM32CubeMX生成F1的工程中提示找不到 __HAL_TIM_SetCompare 问题
1. 问题描述 在用STM32CubeMX生成 STM32F103C8T6 的MDK工程后,在main.c中更改定时器占空比计数值的时候,报错: 总之就是HAL库内部API函数__HAL_TIM_SetCompare找不到。 2. 解决方案 经过搜索,该函数在stm32_hal_legacy.h文件中: 所以出错原因肯定是:调用此函数的时候没有包含进来这个头文件,再次通过文件名查找: 果然,包含此头文件需要定义宏USE_HAL_LEGACY。 在它前面define一下: 重新编译,问题解决成功! 这样添加之后,重新使用STM32CubeMX生成工程后,代码会被自动覆盖,需要重新添加!
[单片机]
<font color='red'>STM32CubeMX</font>生成F1的工程中提示找不到 __HAL_TIM_SetCompare 问题
什么是STM32CubeMX?(STM32代码生成器)
一、STM32CubeMX 介绍 STM32CubeMX 是 ST 意法半导体近几年来大力推荐的STM32 芯片图形化配置工具,通过自己对硬件的需要,进行选择,而后可以快速生成代码,减少开发人员的开发难度,时间和花销。STM32 覆盖整个STM32系列。 在我看来有如下优点: 大量的芯片(资源,价格介绍),方便对我们进行芯片选型 除了拥有芯片本身的外设选择外,还拥有一系列的中间件,如 RTOS, USB, TCP/IP等 对芯片的整体资源,以及时钟树有更深刻的认识 快速代码生成(对外设进行初始化),方便我们对我们的想法进行验证与开发 工程也可以进行更新(当增加外设时) 下面我们详细介绍一下以上优点:
[单片机]
什么是<font color='red'>STM32CubeMX</font>?(STM32代码生成器)
STM32CubeMX新建工程的过程及方法解析
Ⅰ、写在前面 关于STM32CubeMX新建工程的过程。最终通过STM32CubeMX工具配置完成一个驱动IO(点亮LED)的软件工程,也就是通过STM32CubeMX配置完成之后,打开工程直接下载就能点亮LED的工程。 Ⅱ、STM32CubeMX新建工程描述 这里结合实例来讲述新建工程的每一个步骤的细节。 1.打开STM32CubeMX软件,点击“新建工程” 2.选择MCU或选择(ST官方)开发板 A.如果是我们网上购买的,或者自己画的开发板,点击“MCU Selector”进入MCU选择器。选择器在网页上常见,根据自己需求进行选择(我们以STM32F103E为例)。 1.根据“系列”选择;如:F0、F1、F2.。..。
[单片机]
<font color='red'>STM32CubeMX</font>新建工程的过程及方法解析
STM32CubeMX串口接收数据(中断方式,HAL库)
系统:linux mint 18.3 xfce 64bit 软件: STM32CubeMX 4.24 SW4STM32 2.4 开发板芯片:STM32F103RCT6,STM32F407VET6 实现效果:打开两个串口助手窗口,一个是USART1的,一个是USART2的,任意一个串口(串口1或者串口2)发送数据过去就会马上通过该串口返回来。 开篇语: 使用STM32CubeMX和SW4STM32具有的优点: (1)跨平台开发的优势,win和linux系统都有现成的安装包,安装sw4stm32过程会提升自动安装STLINK驱动 (2)版本升级积极,我觉得这是一个好现象,说明开发者很重视 (3)最重要的是免费!!!不用到处找破解
[单片机]
<font color='red'>STM32CubeMX</font><font color='red'>串口</font>接收数据(中断方式,HAL库)
【STM32】HAL库 STM32CubeMX教程五----看门狗
前言: 今天我们来学习看门狗的配置与函数,看门狗可以有效解决程序的跑飞,在使用过程中比较常见,是防止芯片故障的有效外设,我们一起来学习下HAL库 STM32CubeMX的独立看门狗,窗口看门狗的使用。本系列教程将HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 所用工具: 1、芯片: STM32F407ZET6 2、STM32CubeMx软件 3、IDE: MDK-Keil软件 4、STM32F1xx/STM32F4xxHAL库 知识概括: 通过本篇博客您将学到: STM32CubeMX创建看门狗例程 独立看门狗,靠窗看门狗 工作原理 看门狗 在由单片机
[单片机]
【STM32】HAL库 <font color='red'>STM32CubeMX</font>教程五----看门狗
STM32CubeMX学习教程之六:USART串口输出和printf( )重定向到串口
软件: STM32CubeMX V4.25.0 System Workbench V2.4 固件库版本: STM32Cube FW_F1 V1.6.1 硬件: OneNet 麒麟座V2.3 在STM32CubeMX中新建项目,选择正确的MCU型号 首先设置RCC和SYS,如下图 然后根据板子实际情况设置时钟(麒麟座外部晶振是12M,STM32F103x的最高主频是72M),如下图 配置USART1为Asychronous模式 可以看到PA9和PA10被配置为了USART1_TX, USART1_RX。 UART1配置用默认的115200,8, None和1就好。 Project -
[单片机]
<font color='red'>STM32CubeMX</font>学习教程之六:USART<font color='red'>串口</font><font color='red'>输出</font>和printf( )重定向到<font color='red'>串口</font>
STM32cubeMX使用心得
使用STM32cubeMX创建工程 首先你需要下载STM32cubeMX软件版本,我使用的是——5.0.1.软件版本可以去官网下载。 其次你需要一个合适你工程的《STMcube_FW_F1_Vxx》库链接如下:提取码:uqbw https://pan.baidu.com/s/1x-tMOqPwUC0R9O2xAx2QfQ 当我们使用STM32cubeMX创建一个工程时选择MCU selector - core,series。 最后在选择具体什么型号的芯片。 工程配置说明: 系统核心- systeam core 数模转换- analog 定时器功能- timers 通讯功能- connectivity 音频- multi
[单片机]
<font color='red'>STM32cubeMX</font>使用心得
基于STM32CUBEMX驱动TMOS模块STHS34PF80(6)----获取状态数据
概述 STHS34PF80传感器项目种修改 Arduino 脚本,重新移植到STM32的MCU中。 该项目基于STHS34PF80 IR温度传感器,能够检测环境和物体温度,并且在最大4米范围内检测存在和运动。有一个Arduino脚本,显示如何为基本环境和物体温度测量配置传感器,并如何配置嵌入式功能算法,并使用它们检测存在和运动。脚本允许连续或一次性模式,允许更改低通滤波器和检测阈值以实现各种检测行为。脚本利用内嵌的中断引擎来检测温度数据的就绪状态,以及通知存在和运动事件。 本节将在上节代码中继续配置,通过获取模块的状态标志位来检测是否有人体存在。 最近在弄ST和瑞萨RA的课程,需要样片的可以加群申请:6_15061293 。 视
[单片机]
基于<font color='red'>STM32CUBEMX</font>驱动TMOS模块STHS34PF80(6)----获取状态数据
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved