修改HAL标准库用printf函数发送数据直接输出

发布者:和谐共融最新更新时间:2024-08-14 来源: cnblogs关键字:printf函数  发送数据  直接输出 手机看文章 扫描二维码
随时随地手机看文章

主函数文件,请直接关注自己写上去的代码

直接看43行代码:#include 'stdio.h'//要添加这个头文件

还有97行到112行:实现用HAL库函数和printf函数发送数据

  1 /**

  2   ******************************************************************************

  3   * File Name          : main.c

  4   * Description        : Main program body

  5   ******************************************************************************

  6   ** This notice applies to any and all portions of this file

  7   * that are not between comment pairs USER CODE BEGIN and

  8   * USER CODE END. Other portions of this file, whether 

  9   * inserted by the user or by software development tools

 10   * are owned by their respective copyright owners.

 11   *

 12   * COPYRIGHT(c) 2017 STMicroelectronics

 13   *

 14   * Redistribution and use in source and binary forms, with or without modification,

 15   * are permitted provided that the following conditions are met:

 16   *   1. Redistributions of source code must retain the above copyright notice,

 17   *      this list of conditions and the following disclaimer.

 18   *   2. Redistributions in binary form must reproduce the above copyright notice,

 19   *      this list of conditions and the following disclaimer in the documentation

 20   *      and/or other materials provided with the distribution.

 21   *   3. Neither the name of STMicroelectronics nor the names of its contributors

 22   *      may be used to endorse or promote products derived from this software

 23   *      without specific prior written permission.

 24   *

 25   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS'

 26   * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE

 27   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE

 28   * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE

 29   * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL

 30   * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR

 31   * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER

 32   * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,

 33   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE

 34   * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

 35   *

 36   ******************************************************************************

 37   */

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

 39 #include 'main.h'

 40 #include 'stm32f1xx_hal.h'

 41 

 42 /* USER CODE BEGIN Includes */

 43 #include 'stdio.h'//添加这个头文件

 44 /* USER CODE END Includes */

 45 

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

 47 UART_HandleTypeDef huart1;

 48 

 49 /* USER CODE BEGIN PV */

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

 51 

 52 /* USER CODE END PV */

 53 

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

 55 void SystemClock_Config(void);

 56 static void MX_GPIO_Init(void);

 57 static void MX_USART1_UART_Init(void);

 58 

 59 /* USER CODE BEGIN PFP */

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

 61 

 62 /* USER CODE END PFP */

 63 

 64 /* USER CODE BEGIN 0 */

 65 

 66 /* USER CODE END 0 */

 67 

 68 int main(void)

 69 {

 70 

 71   /* USER CODE BEGIN 1 */

 72 

 73   /* USER CODE END 1 */

 74 

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

 76 

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

 78   HAL_Init();

 79 

 80   /* USER CODE BEGIN Init */

 81 

 82   /* USER CODE END Init */

 83 

 84   /* Configure the system clock */

 85   SystemClock_Config();

 86 

 87   /* USER CODE BEGIN SysInit */

 88 

 89   /* USER CODE END SysInit */

 90 

 91   /* Initialize all configured peripherals */

 92   MX_GPIO_Init();

 93   MX_USART1_UART_Init();

 94 

 95   /* USER CODE BEGIN 2 */

 96 

 97 HAL_UART_Transmit (&huart1,'使用HAL库函数发送数据n',21,1000);

 98 printf('n使用函数Printf函数发送数据n');

 99 

100 char t;

101 while(1)

102 {

103     scanf('%c',&t);//接受的t的数值

104     if(t=='0')

105     {

106         HAL_GPIO_WritePin (GPIOB,GPIO_PIN_5,0);//给低电平,红灯亮

107     }

108     if(t=='1')

109     {

110         HAL_GPIO_WritePin (GPIOB,GPIO_PIN_5,1);//给高电平,红灯灭

111     }

112 }

113 

114 

115   /* USER CODE END 2 */

116 

117   /* Infinite loop */

118   /* USER CODE BEGIN WHILE */

119   while (1)

120   {

121   /* USER CODE END WHILE */

122 

123   /* USER CODE BEGIN 3 */

124 

125   }

126   /* USER CODE END 3 */

127 

128 }

129 

130 /** System Clock Configuration

131 */

132 void SystemClock_Config(void)

133 {

134 

135   RCC_OscInitTypeDef RCC_OscInitStruct;

136   RCC_ClkInitTypeDef RCC_ClkInitStruct;

137 

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

139     */

140   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;

141   RCC_OscInitStruct.HSIState = RCC_HSI_ON;

142   RCC_OscInitStruct.HSICalibrationValue = 16;

143   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;

144   if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)

145   {

146     _Error_Handler(__FILE__, __LINE__);

147   }

148 

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

150     */

151   RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK

152                               |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;

153   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;

154   RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;

155   RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;

156   RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

157 

158   if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)

159   {

160     _Error_Handler(__FILE__, __LINE__);

161   }

162 

163     /**Configure the Systick interrupt time 

164     */

165   HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);

166 

167     /**Configure the Systick 

168     */

169   HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);

170 

171   /* SysTick_IRQn interrupt configuration */

172   HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);

173 }

174 

175 /* USART1 init function */

176 static void MX_USART1_UART_Init(void)

177 {

178 

179   huart1.Instance = USART1;

180   huart1.Init.BaudRate = 9600;

181   huart1.Init.WordLength = UART_WORDLENGTH_8B;

182   huart1.Init.StopBits = UART_STOPBITS_1;

183   huart1.Init.Parity = UART_PARITY_NONE;

184   huart1.Init.Mode = UART_MODE_TX_RX;

185   huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;

186   huart1.Init.OverSampling = UART_OVERSAMPLING_16;

187   if (HAL_UART_Init(&huart1) != HAL_OK)

188   {

189     _Error_Handler(__FILE__, __LINE__);

190   }

191 

192 }

193 

194 /** Configure pins as 

195         * Analog 

196         * Input 

197         * Output

198         * EVENT_OUT

199         * EXTI

200 */

201 static void MX_GPIO_Init(void)

202 {

203 

204   GPIO_InitTypeDef GPIO_InitStruct;

205 

206   /* GPIO Ports Clock Enable */

207   __HAL_RCC_GPIOA_CLK_ENABLE();

208   __HAL_RCC_GPIOB_CLK_ENABLE();

209 

210   /*Configure GPIO pin Output Level */

211   HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_RESET);

212 

213   /*Configure GPIO pin : PB5 */

214   GPIO_InitStruct.Pin = GPIO_PIN_5;

215   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

216   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;

217   HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

218 

219 }

220 

221 /* USER CODE BEGIN 4 */

222 

223 /* USER CODE END 4 */

224 

225 /**

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

227   * @param  None

228   * @retval None

229   */

230 void _Error_Handler(char * file, int line)

[1] [2]
关键字:printf函数  发送数据  直接输出 引用地址:修改HAL标准库用printf函数发送数据直接输出

上一篇:STM32串口usart发送数据
下一篇:用STM32CudeMX 配置用到的函数(记住他!)

推荐阅读最新更新时间:2026-03-19 11:25

嵌入式STM32开发方式的本质区别:寄存器、标准库HAL库对比(嵌入式初级开发者必读)
作为嵌入式初级开发者,理解STM32的三种开发方式(寄存器、标准库、HAL库)的本质区别及其适用场景,是掌握STM32开发的关键。以下是专业且通俗的对比分析: 1. 寄存器开发(Register-Level) 本质 直接通过读写硬件寄存器控制外设,开发者需手动配置每一个寄存器的位字段,完全掌控底层硬件。 代码示例 // 配置GPIOA的Pin0为输出模式 RCC- APB2ENR |= 1 2; // 使能GPIOA时钟 GPIOA- CRL &= ~(0x0F 0); // 清除Pin0原有配置 GPIOA- CRL |= 0x03 0; // 推挽输出,50MHz速度 GPIOA- ODR |= 1
[单片机]
STM32标准库HAL库比较
ST为开发者提供了非常方便的开发库。到目前为止,有标准外设库(STD库)、HAL库、LL库 三种。 其中标准库与HAL库最常用,LL库只是最近新添加的。 标准外设库(Standard Peripherals Library)是对STM32芯片的一个完整的封装,包括所有标准器件外设的器件驱动器。这应该是目前使用最多的ST库,几乎全部使用C语言实现。但是,标准外设库也是针对某一系列芯片而言的,没有可移植性。 HAL库与新增的LL库,都是ST公司提供的新标准库,包含在ST为新的标准库注册了一个新商标:STMCube™当中。LL库和HAL库两者相互独立,只不过LL库更底层。而且,部分HAL库会调用LL库(例如:USB驱动)。同
[单片机]
标准库函数与基于HAL函数的说明
开始学习51的时候有的人会直接选择进行对单片机的寄存器进行操作,可以很好的理解单片机的工作原理,对于代码的编写也会后很好的理解,但是在stm32的时候操作寄存器就不太行了,因为stm32的寄存器是51的数十倍,如此多的寄存器根本无法全部记忆,开发时需要经常的翻查芯片的数据手册,此时直接操作寄存器就变得非常的费力了。这是我们就有了其他的操作方式,来简化我们的工作。 一、标准库 STM32有非常多的寄存器,导致了开发困难,所以为此ST公司就为每款芯片都编写了一份库文件,也就是工程文件里stm32F1xx……之类的。在这些 .c .h文件中,包括一些常用量的宏定义,把一些外设也通过结构体变量封装起来,如GPIO口时钟等。所以我们只需
[单片机]
STM32标准库HAL库有什么不同 我们怎么用
摘要:通常新手在入门STM32的时候,首先都要先选择一种要用的开发方式,不同的开发方式会导致你编程的架构是完全不一样的。一般大多数都会选用标准库和HAL库,而极少部分人会通过直接配置寄存器进行开发。 网上关于标准库、HAL库的描述相信是数不胜数。可是一个对于很多刚入门的朋友还是没法很直观的去真正了解这些不同开发发方式彼此之间的区别,所以笔者想以一种非常直白的方式,用自己的理解去将这些东西表述出来,如果有描述的不对的地方或者是不同意见的也可以大家提出。 一、配置寄存器不少先学了51的朋友可能会知道,会有一小部分人或是教程是通过汇编语言直接操作寄存器实现功能的,这种方法到了STM32就变得不太容易行得通了。 因为STM32的
[单片机]
STM32<font color='red'>标准库</font>和<font color='red'>HAL</font>库有什么不同 我们怎么用
STM32之HAL库和标准库的GPIO
HAL库 使用CubeMX自动生成需要的代码。 一、初始化GPIO 自动生成的HAL库GPIO初始化代码: void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; /* GPIO Ports Clock Enable */ __HAL_RCC_GPIOF_CLK_ENABLE(); __HAL_RCC_GPIOH_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); /*Configure GPIO pin Output Level */ HAL_GPIO
[单片机]
STM32:如何写出多串口共用printf函数语句?
(1)问题描述: 多串口共用printf函数,百度到的资料大部分是建议重新写一个xx_printf(format, …)。但是使用起来还是不方便,就此问题而言加上一个判断语句便可解决。 (2)解决方法: printf函数最后调用的是int fputc(int ch, FILE *f),那么重新改写此函数便可。 (3)代码: //标志量定义 int USART_PRINTF_FLAG = 2;//默认串口2 //改写 fputcint fputc(int ch, FILE *f) { if (USART_PRINTF_FLAG == 2) { while(USART_GetFlagStatus(USART2,USART_FLAG_T
[单片机]
STM32:如何写出多串口共用<font color='red'>printf</font><font color='red'>函数</font>语句?
STM32F103自定义的printf函数的实现
  在单片机中使用最多的通信接口基本就是串口了,说起串口就不得不提串口中最常用的一个函数就是打印函数printf()函数,通常使用这个函数都是直接调用库函数来实现的,在单片机中如何要使用printf()函数一般都是在串口中进行重映射。如要在串口1中使用printf()函数,可以使用下面的代码进行重映射。 //加入以下代码,支持printf函数,而不需要选择use MicroLIB #if 1 #pragma import(__use_no_semihosting) //标准库需要的支持函数 struct __FILE { int handle; }; FILE __stdout; //定义_sys_exit()以避免使用半
[单片机]
STM32F103自定义的<font color='red'>printf</font><font color='red'>函数</font>的实现
在STM8单片机中自己实现 printf()函数功能
  由于STM8单片机本身内存比较小,而系统自带的printf()函数又比较占据空间,所以在稍微大一点的工程中有时候一使用 printf() 函数就会导致单片机内存不足,于是想着能不能自己写一个比较小的函数来实现类似printf()函数的功能。经过网上查找资料和总结终于找到了一个占用内存比较小,又能实现串口打印功能的方法。   现在将自己的方法分享出来,这里使用 STM8S003F3P6单片机测试。   首先新建一个工程,专门用来测试串口功能。   串口部分相关代码如下: //串口 void Uart1_IO_Init( void ) { PD_DDR |= ( 1 5 ); //输出模式
[单片机]
在STM8单片机中自己实现 <font color='red'>printf</font>()<font color='red'>函数</font>功能
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved