stm32cubeMX学习三、串口打印Hello world

2020-04-27来源: eefocus关键字:stm32cubeMX  串口  打印

上一节入门了stm32cubeMX按键的配置,这节我们来学习下编写一个串口打印hello world的程序。


本程序编写基于秉火霸道STM32F103ZET6开发板进行。

在这里插入图片描述

一、打开stm32cubeMX软件

在这里插入图片描述

二、选择芯片型号

在这里插入图片描述

首先点击File,然后选择New Project,在弹出的页面中搜索您要配置的芯片型号,然后鼠标双击选择stm32f103ZETx

这时候会弹出另外一个页面如下,开始做芯片的硬件资源配置工作。


三、配置时钟频率

在这里插入图片描述

选择Clock Configuration,然后在如下图所示的方框中配置好时钟频率,stm32cubeMX会自动把分频系统等配置好,不用人为一个一个去设置。


四、查看串口相关的引脚并配置

4.1 打开电路图,找相关的IO

在这里插入图片描述

我们用板上的USART2来配置为打印串口。


4.2 在stm32cubeMx中对PA2、PA3两个GPIO进行配置

在这里插入图片描述
在这里插入图片描述

分别对PA2配置为TX,PA3配置为RX。

接下来分别对两个IO进行详细配置,点击左边的Connectivity,然后选择USART2,这时候在右边要把Mode的Disable改成Asynchronous(异步),因为串口是属于异步通信的,然后下边的一项硬件流控默认失能。

在这里插入图片描述

接下来对串口进行详细配置。

基本参数配置如下:

在这里插入图片描述

打开USART2全局中断

在这里插入图片描述

接下来配置GPIO选项。

在这里插入图片描述
在这里插入图片描述

五、生成代码并添加业务逻辑

在这里插入图片描述

然后定义printf的重定向函数fputc


/* USER CODE BEGIN 0 */


//定义printf的重定向函数fputc,满足串口调试打印

int fputc(int ch, FILE* file)

{

    return HAL_UART_Transmit(&huart2, (uint8_t*)&ch, 1, 100);

}


/* USER CODE END 0 */


接下来就可以在主程序里放肆的用printf来调试了。

主程序代码


/* USER CODE BEGIN Header */

/**

  ******************************************************************************

  * @file           : main.c

  * @brief          : Main program body

  ******************************************************************************

  * @attention

  *

  *

© Copyright (c) 2019 STMicroelectronics.

  * All rights reserved.

  *

  * This software component is licensed by ST under BSD 3-Clause license,

  * the "License"; You may not use this file except in compliance with the

  * License. You may obtain a copy of the License at:

  *                        opensource.org/licenses/BSD-3-Clause

  *

  ******************************************************************************

  */

/* USER CODE END Header */


/* Includes ------------------------------------------------------------------*/

#include "main.h"


/* Private includes ----------------------------------------------------------*/

/* USER CODE BEGIN Includes */


/* USER CODE END Includes */


/* Private typedef -----------------------------------------------------------*/

/* USER CODE BEGIN PTD */


/* USER CODE END PTD */


/* Private define ------------------------------------------------------------*/

/* USER CODE BEGIN PD */


/* USER CODE END PD */


/* Private macro -------------------------------------------------------------*/

/* USER CODE BEGIN PM */


/* USER CODE END PM */


/* Private variables ---------------------------------------------------------*/

UART_HandleTypeDef huart2;


/* USER CODE BEGIN PV */


/* USER CODE END PV */


/* Private function prototypes -----------------------------------------------*/

void SystemClock_Config(void);

static void MX_GPIO_Init(void);

static void MX_USART2_UART_Init(void);

/* USER CODE BEGIN PFP */


/* USER CODE END PFP */


/* Private user code ---------------------------------------------------------*/

/* USER CODE BEGIN 0 */


//定义printf的重定向函数fputc,满足串口调试打印

int fputc(int ch, FILE* file)

{

    return HAL_UART_Transmit(&huart2, (uint8_t*)&ch, 1, 100);

}


/* USER CODE END 0 */


/**

  * @brief  The application entry point.

  * @retval int

  */

int main(void)

{

  /* USER CODE BEGIN 1 */


  /* USER CODE END 1 */

  


  /* MCU Configuration--------------------------------------------------------*/


  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */

  HAL_Init();


  /* USER CODE BEGIN Init */


  /* USER CODE END Init */


  /* Configure the system clock */

  SystemClock_Config();


  /* USER CODE BEGIN SysInit */


  /* USER CODE END SysInit */


  /* Initialize all configured peripherals */

  MX_GPIO_Init();

  MX_USART2_UART_Init();

  /* USER CODE BEGIN 2 */


  /* USER CODE END 2 */


  /* Infinite loop */

  /* USER CODE BEGIN WHILE */

  while (1)

  {

    /* USER CODE END WHILE */

printf("Hello Worldn");

HAL_Delay(2000);

    /* USER CODE BEGIN 3 */

  }

  /* USER CODE END 3 */

}


/**

  * @brief System Clock Configuration

  * @retval None

  */

void SystemClock_Config(void)

{

  RCC_OscInitTypeDef RCC_OscInitStruct = {0};

  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};


  /** Initializes the CPU, AHB and APB busses clocks 

  */

  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;

  RCC_OscInitStruct.HSIState = RCC_HSI_ON;

  RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;

  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;

  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI_DIV2;

  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL16;

  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)

  {

    Error_Handler();

  }

  /** Initializes the CPU, AHB and APB busses clocks 

  */

  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK

                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;

  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;

  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;

  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;

  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;


  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)

  {

    Error_Handler();

  }

}


/**

  * @brief USART2 Initialization Function

  * @param None

  * @retval None

  */

static void MX_USART2_UART_Init(void)

{


  /* USER CODE BEGIN USART2_Init 0 */


  /* USER CODE END USART2_Init 0 */


  /* USER CODE BEGIN USART2_Init 1 */


  /* USER CODE END USART2_Init 1 */

  huart2.Instance = USART2;

  huart2.Init.BaudRate = 115200;

  huart2.Init.WordLength = UART_WORDLENGTH_8B;

  huart2.Init.StopBits = UART_STOPBITS_1;

  huart2.Init.Parity = UART_PARITY_NONE;

  huart2.Init.Mode = UART_MODE_TX_RX;

  huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;

  huart2.Init.OverSampling = UART_OVERSAMPLING_16;

  if (HAL_UART_Init(&huart2) != HAL_OK)

  {

    Error_Handler();

  }

  /* USER CODE BEGIN USART2_Init 2 */


  /* USER CODE END USART2_Init 2 */


}


/**

  * @brief GPIO Initialization Function

  * @param None

  * @retval None

  */

static void MX_GPIO_Init(void)

{


  /* GPIO Ports Clock Enable */

  __HAL_RCC_GPIOA_CLK_ENABLE();


}


/* USER CODE BEGIN 4 */


/* USER CODE END 4 */


/**

  * @brief  This function is executed in case of error occurrence.

  * @retval None

  */

void Error_Handler(void)

{

  /* USER CODE BEGIN Error_Handler_Debug */

  /* User can add his own implementation to report the HAL error return state */


  /* USER CODE END Error_Handler_Debug */

}


#ifdef  USE_FULL_ASSERT

/**

  * @brief  Reports the name of the source file and the source line number

  *         where the assert_param error has occurred.

  * @param  file: pointer to the source file name

  * @param  line: assert_param error line source number

  * @retval None

  */

void assert_failed(uint8_t *file, uint32_t line)

  /* USER CODE BEGIN 6 */

  /* User can add his own implementation to report the file name and line number,

     tex: printf("Wrong parameters value: file %s on line %drn", file, line) */

  /* USER CODE END 6 */

}

#endif /* USE_FULL_ASSERT */


/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/


六、实现现象

在这里插入图片描述

关键字:stm32cubeMX  串口  打印 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic495604.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:【STM32】HAL库 STM32CubeMX教程四---UART串口通信详解
下一篇:STM32CubeMX学习教程之六:USART串口输出和printf( )重定向到串口

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

STM32CubeMX系列教程
STM32cubeMX软件,点击New Project。选择对应开板MCU(STM32F103ZET6)。选择工程后进入工程界面,如下图所示。2.配置外设。RCC设置,选择HSE(外部高速时钟)为Crystal/Ceramic Resonator(晶振/陶瓷谐振器)GPIO口功能选择,PF6,PF7,PF8,PF9为LED1-LED4.找到对应管脚设置为GPIO_Output模式。(黄色引脚为该功能的GPIO已被用作其他功能,可以忽略。绿色表示管脚已使用)3. 时钟配置时钟配置采用图形配置,直观简单。各个外设时钟一目了然。STM32最高时钟为72M,此处只有在HCLK处输入72,软件即可自动配置。(RCC选择外部高速时钟
发表于 2020-06-27
<font color='red'>STM32CubeMX</font>系列教程
STM32CubeMX系列教程1:GPIO
打开STM32CubeMX新建工程,选择STMF746IGT6芯片。选择外部高速晶振(HSE).根据Open746I-C开发板原理图(原理图可在微雪电子网站上下载),选择按键和LED引脚PA0,PG2,PG3,PD4,PD5,PD11为按键输入管脚,选择GPIO_INPUT模式。PB6,PB7,PH4,PI8为LED输出控制管脚,选择GPIO_OUTPUT模式。点击Clock Configuration配置系统时钟为216M最高速度。点击Configuration->GPIO配置管脚。五向按键管脚配置为上拉输入模式,WakeUp按键已经为外部下拉,故不用配置(R6为下拉电阻,R5,C3为RC滤波去抖动)。LED管脚配置为低速
发表于 2020-06-27
<font color='red'>STM32CubeMX</font>系列教程1:GPIO
STM32CubeMX系列教程2:外部中断(EXIT)
这一章我们在前一章GPIO的工程修改。复制GPIO的工程,修改文件夹名。点击STM32F746I.ioc打开STM32cubeMX的工程文件重新配置。PA0管脚重新配置为GPIO_EXIT0模式。 WAKEUP按键已经外部下拉,按下是PA0为高电平。在GPIO配置中配置PA0为上升沿触发。内部既不上拉也不下拉,添加用户标签WAKEUP。在NVIC(嵌套向量中断控制器)中,勾选EXIT Line0 interrupt使能PA0中断。右边两个选项设置抢占优先级和响应优先级。此处我们选择默认的,不修改。在这里简单介绍一下NVIC(嵌套向量中断控制器)。NVIC就是控制中断响应的。主要由三个参数,一个是中断使能,一个是抢占
发表于 2020-06-27
<font color='red'>STM32CubeMX</font>系列教程2:外部中断(EXIT)
STM32CubeMX系列教程3:基本定时器
这一章我们在前一章GPIO的工程修改。复制GPIO的工程,修改文件夹名。点击打开STM32cubeMX的工程文件重新配置。开启定时器TIM3,选择内部时钟。定时器就相当于单片机的闹钟,下面我们以基本定时器为例简单介绍一下定时器。从上图我们可以看到,基本定时器主要由下面三个寄存器组成。计数器寄存器 (TIMx_CNT)预分频器寄存器 (TIMx_PSC)自动重载寄存器 (TIMx_ARR)计数器寄存器 (TIMx_CNT)存储的是当前的计数值。预分频器 (TIMx_PSC)为多少个SK_PSC脉冲计数一次,如图192 预分频器的值为1(预分频寄存器默认为0,为不分频),则为两个
发表于 2020-06-27
<font color='red'>STM32CubeMX</font>系列教程3:基本定时器
STM32CubeMX系列教程4:PWM
。2.stm32cube配置和说明打开STM32CubeMX新建工程,选择STMF746IGT6芯片,选择外部高速晶振(HSE)。LED1管脚PB6配置为定时器4的通道1输出。同时TIM4的通道1配置为PWM。 脉冲宽度调制模式可以生成一个信号,该信号频率由自动重载寄存器(TIMx_ARR)寄存器值决定,其占空比则由捕获/比较寄存器(TIMx_CCRx) 寄存器值决定。在 PWM 模式下,计数器寄存器(TIMx_CNT )总是与捕获/比较寄存器(TIMx_CCRx )进行比较,以确定是TIMx_CCRxTIMx_CNT 还是 TIMx_CNTTIMx_CCRx(取决于计数器计数
发表于 2020-06-23
<font color='red'>STM32CubeMX</font>系列教程4:PWM
STM32CubeMX系列教程5:串行通信(USART)
本章以串口为例讲解,HAL 库轮询,中断,DMA 三种编程模型。1.前情回顾在串行通信中,一个字符一个字符地传输,每个字符一位一位地传输,并且传输一个字符时,总是以“起始位”开始,以“停止位”结束。在进行传输之前,双方一定要使用同一个波特率设置。波特率就是每秒钟传输的数据位数。常用的两种基本串行通信方式包括同步通信和异步通信。我们通常使用的是异步通信.异步通信规定传输的数据格式由起始位(start bit)、数据位(data bit)、奇偶校验位(parity bit)和停止位(stop bit)组成。2.重定义printf函数。打开STM32CubeMX新建工程,选择STM
发表于 2020-06-23
<font color='red'>STM32CubeMX</font>系列教程5:串行通信(USART)
何立民专栏 单片机及嵌入式宝典

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

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