zoukankan      html  css  js  c++  java
  • 修改HAL标准库用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库函数发送数据
    ",21,1000);
     98 printf("
    使用函数Printf函数发送数据
    ");
     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)
    231 {
    232   /* USER CODE BEGIN Error_Handler_Debug */
    233   /* User can add his own implementation to report the HAL error return state */
    234   while(1) 
    235   {
    236   }
    237   /* USER CODE END Error_Handler_Debug */ 
    238 }
    239 
    240 #ifdef USE_FULL_ASSERT
    241 
    242 /**
    243    * @brief Reports the name of the source file and the source line number
    244    * where the assert_param error has occurred.
    245    * @param file: pointer to the source file name
    246    * @param line: assert_param error line source number
    247    * @retval None
    248    */
    249 void assert_failed(uint8_t* file, uint32_t line)
    250 {
    251   /* USER CODE BEGIN 6 */
    252   /* User can add his own implementation to report the file name and line number,
    253     ex: printf("Wrong parameters value: file %s on line %d
    ", file, line) */
    254   /* USER CODE END 6 */
    255 
    256 }
    257 
    258 #endif
    259 
    260 /**
    261   * @}
    262   */ 
    263 
    264 /**
    265   * @}
    266 */ 
    267 
    268 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

    新建一个文件,随便命名,这是核心内容,修改标准库函数的,有点难理解!!!。

     1 #include "stdio.h"
     2 #include "stm32f1xx_hal.h"
     3 
     4 //这个变量是其他.c文件定义的
     5 extern UART_HandleTypeDef huart1;
     6 uint8_t ch;
     7 uint8_t ch_r;
     8 //重写这个函数,重定向printf函数到串口,意思就是说printf直接输出到串口,其默认输出到控制台的
     9 /*fputc*/
    10 int fputc(int c, FILE * f)
    11 {
    12     ch=c;
    13     HAL_UART_Transmit(&huart1,&ch,1,1000);//发送串口
    14     return c;
    15 }
    16 
    17 
    18 
    19 //重定向scanf函数到串口 意思就是说接受串口发过来的数据,其默认是接受控制台的数据
    20 /*fgetc*/
    21 int fgetc(FILE * F)    
    22 {
    23     HAL_UART_Receive (&huart1,&ch_r,1,0xffff);//接收
    24     return ch_r;
    25 }
  • 相关阅读:
    DataTable 只保留想要的几列
    如何用多个字符串来切分字符串
    用.net 发送邮件
    sqlserver 行列转换
    sql面试题一 学生成绩
    将DataReader转换为DataTable
    C# 如何用多个字符串来切分字符串并去除空格
    SqlServer按时间自动生成生成单据编号
    实验一 Java开发环境的熟悉
    Java学习笔记心得——初识Java
  • 原文地址:https://www.cnblogs.com/kinson/p/7880978.html
Copyright © 2011-2022 走看看