STM32hal库串口中断接收任意字符

发布者:RadiantEnergy最新更新时间:2022-08-18 来源: csdn关键字:STM32  hal库  串口中断 手机看文章 扫描二维码
随时随地手机看文章

cubeMCX设置:

生成工程文件

usart.c


/**

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

  * @file    usart.c

  * @brief   This file provides code for the configuration

  *          of the USART instances.

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

  * @attention

  *

  *

© Copyright (c) 2021 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

  *

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

  */


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

#include "usart.h"


/* USER CODE BEGIN 0 */

//串口1中断服务程序

//注意,读取USARTx->SR能避免莫名其妙的错误   

uint8_t USART_RX_BUF[USART_REC_LEN];     //接收缓冲,最大USART_REC_LEN个字节.

//接收状态

//bit15, 接收完成标志

//bit14, 接收到0x0d

//bit13~0, 接收到的有效字节数目

uint16_t USART_RX_STA=0;       //接收状态标记   


uint8_t aRxBuffer[RXBUFFERSIZE];//HAL库使用的串口接收缓冲

UART_HandleTypeDef UART1_Handler; //UART句柄


int fputc(int ch, FILE *f){

HAL_UART_Transmit (&huart1,(uint8_t *)&ch,1,0xffff);

return ch;

}


int fgetc(FILE *f)

{

  uint8_t ch = 0;

  HAL_UART_Receive(&huart1, &ch, 1, 0xffff);

  return ch;


/* USER CODE END 0 */


UART_HandleTypeDef huart1;


/* USART1 init function */


void MX_USART1_UART_Init(void)

{


  /* USER CODE BEGIN USART1_Init 0 */


  /* USER CODE END USART1_Init 0 */


  /* USER CODE BEGIN USART1_Init 1 */


  /* USER CODE END USART1_Init 1 */

  huart1.Instance = USART1;

  huart1.Init.BaudRate = 115200;

  huart1.Init.WordLength = UART_WORDLENGTH_8B;

  huart1.Init.StopBits = UART_STOPBITS_1;

  huart1.Init.Parity = UART_PARITY_NONE;

  huart1.Init.Mode = UART_MODE_TX_RX;

  huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;

  huart1.Init.OverSampling = UART_OVERSAMPLING_16;

  if (HAL_UART_Init(&huart1) != HAL_OK)

  {

    Error_Handler();

  }

  /* USER CODE BEGIN USART1_Init 2 */


  /* USER CODE END USART1_Init 2 */


}


void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)

{


  GPIO_InitTypeDef GPIO_InitStruct = {0};

  if(uartHandle->Instance==USART1)

  {

  /* USER CODE BEGIN USART1_MspInit 0 */


  /* USER CODE END USART1_MspInit 0 */

    /* USART1 clock enable */

    __HAL_RCC_USART1_CLK_ENABLE();


    __HAL_RCC_GPIOA_CLK_ENABLE();

    /**USART1 GPIO Configuration

    PA9     ------> USART1_TX

    PA10     ------> USART1_RX

    */

    GPIO_InitStruct.Pin = GPIO_PIN_9;

    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;

    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;

    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);


    GPIO_InitStruct.Pin = GPIO_PIN_10;

    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;

    GPIO_InitStruct.Pull = GPIO_NOPULL;

    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);


    /* USART1 interrupt Init */

    HAL_NVIC_SetPriority(USART1_IRQn, 3, 0); //抢占优先级3,子优先级3

    HAL_NVIC_EnableIRQ(USART1_IRQn); //使能USART1中断通道

  /* USER CODE BEGIN USART1_MspInit 1 */


  /* USER CODE END USART1_MspInit 1 */

  }

}


void HAL_UART_MspDeInit(UART_HandleTypeDef* uartHandle)

{


  if(uartHandle->Instance==USART1)

  {

  /* USER CODE BEGIN USART1_MspDeInit 0 */


  /* USER CODE END USART1_MspDeInit 0 */

    /* Peripheral clock disable */

    __HAL_RCC_USART1_CLK_DISABLE();


    /**USART1 GPIO Configuration

    PA9     ------> USART1_TX

    PA10     ------> USART1_RX

    */

    HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9|GPIO_PIN_10);


    /* USART1 interrupt Deinit */

    HAL_NVIC_DisableIRQ(USART1_IRQn);

  /* USER CODE BEGIN USART1_MspDeInit 1 */


  /* USER CODE END USART1_MspDeInit 1 */

  }

}


/* USER CODE BEGIN 1 */

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) //自定义中断回调函数

{

if(huart->Instance==USART1)//如果是串口1

{

if((USART_RX_STA&0x8000)==0)//接收未完成

{

if(USART_RX_STA&0x4000)//接收到了0x0d

{

if(aRxBuffer[0]!=0x0a)USART_RX_STA=0;//接收错误,重新开始

else USART_RX_STA|=0x8000; //接收完成了 

}

else //还没收到0X0D

{

if(aRxBuffer[0]==0x0d)USART_RX_STA|=0x4000;

else

{

USART_RX_BUF[USART_RX_STA&0X3FFF]=aRxBuffer[0] ;

USART_RX_STA++;

if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收   

}  

}

}

}

}


//串口1中断服务程序

void USART1_IRQHandler(void)               

uint32_t timeout=0;

HAL_UART_IRQHandler(&huart1); //调用HAL库中断处理公用函数

timeout=0;

    while (HAL_UART_GetState(&huart1) != HAL_UART_STATE_READY)//等待就绪

{

timeout++;超时处理

     if(timeout>HAL_MAX_DELAY) break;

}    

timeout=0;

while(HAL_UART_Receive_IT(&huart1, (uint8_t *)aRxBuffer, RXBUFFERSIZE) != HAL_OK)//一次处理完成之后,重新开启中断并设置RxXferCount为1

{

timeout++; //超时处理

if(timeout>HAL_MAX_DELAY) break;

}


/* USER CODE END 1 */


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


main.c


/* USER CODE BEGIN Header */

/**

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

  * @file           : main.c

  * @brief          : Main program body

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

  * @attention

  *

  *

© Copyright (c) 2021 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"

#include "usart.h"

#include "gpio.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 ---------------------------------------------------------*/


/* USER CODE BEGIN PV */


/* USER CODE END PV */


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

void SystemClock_Config(void);

/* USER CODE BEGIN PFP */


/* USER CODE END PFP */


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

/* USER CODE BEGIN 0 */


/* USER CODE END 0 */


/**

  * @brief  The application entry point.

  * @retval int

  */

int main(void)

{

  /* USER CODE BEGIN 1 */

uint8_t len;

uint16_t times=0;

  /* 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_USART1_UART_Init();

  HAL_UART_Receive_IT(&huart1, (uint8_t *)aRxBuffer, RXBUFFERSIZE);//该函数会开启接收中断:标志位UART_IT_RXNE,并且设置接收缓冲以及接收缓冲接收最大数据量

 

 /* USER CODE BEGIN 2 */


  /* USER CODE END 2 */


  /* Infinite loop */

  /* USER CODE BEGIN WHILE */

  while (1)

  {

    /* USER CODE END WHILE */


    /* USER CODE BEGIN 3 */

       if(USART_RX_STA&0x8000)

{    

len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度

printf("rn您发送的消息为:rn");

HAL_UART_Transmit(&huart1,(uint8_t*)USART_RX_BUF,len,1000); //发送接收到的数据

while(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_TC)!=SET); //等待发送结束

printf("rnrn");//插入换行

USART_RX_STA=0;

}else

{

times++;

if(times%2000==0)printf("请输入数据,以回车键结束rn");  

HAL_Delay(10);   

  }

  /* 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 RCC Oscillators according to the specified parameters

  * in the RCC_OscInitTypeDef structure.

  */

  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;

  RCC_OscInitStruct.HSIState = RCC_HSI_ON;

  RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;

  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;

  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)

  {

    Error_Handler();

[1] [2]
关键字:STM32  hal库  串口中断 引用地址:STM32hal库串口中断接收任意字符

上一篇:STM32字符转整型处理
下一篇:STM32获取DHT11温湿度(单总线通信实验笔记)

推荐阅读最新更新时间:2024-10-12 22:57

STM32烧写方法一】ST-LINK烧写
首先烧写就是将你写好的程序下载到单片机的芯片里,这篇提供2中烧写方法! 第一种为ST-LINK烧写: STLink的JTAG接口在SWD模式下载时理论上需要4根数据线就okay了SWCLK,SWDIO,GND,VCC。 我们只需要上面的 19、20 、7、9 脚即可!至于管口的确定你可以根据上电后的电压来判断! 将上面的口连接到STM32芯片上的对应口,再将芯片上电!记住一定要上电! 然后到keil里做下面选择: ort选择SW 就可以编译烧写程序了!
[单片机]
【<font color='red'>STM32</font>烧写方法一】ST-LINK烧写
stm32专题十八:详细分析SPI FLASH
这里使用的SPI FLASH型号为W25Q64,是一种NOR FLASH。容量为64M bit = 8M Byte(8M 字节),而AT24C02 EEPROM才只有256字节,存储容量简直不是一个量级,这个FLASH和stm32内部的FLASH性质一样,适合存储语音、文本和数据。 W25Q64BV阵列分为32,768个可编程页面,每页256字节。 一次最多可编程256个字节。 可以以16个组(4KB扇区擦除),128个组(32KB块擦除),256个组(64KB块擦除)或整个芯片(芯片擦除)的组擦除页面。 W25Q64BV分别具有2,048个可擦除扇区和128个可擦除块。 小的4KB扇区允许在需要数据和参数存储的应用中具有更大
[单片机]
<font color='red'>stm32</font>专题十八:详细分析SPI FLASH
STM32外部中断详解
一、基本概念 ARM Coetex-M3内核共支持256个中断,其中16个内部中断,240个外部中断和可编程的256级中断优先级的设置。STM32目前支持的中断共84个(16个内部+68个外部),还有16级可编程的中断优先级的设置,仅使用中断优先级设置8bit中的高4位。 STM32可支持68个中断通道,已经固定分配给相应的外部设备,每个中断通道都具备自己的中断优先级控制字节PRI_n(8位,但是STM32中只使用4位,高4位有效),每4个通道的8位中断优先级控制字构成一个32位的优先级寄存器。68个通道的优先级控制字至少构成17个32位的优先级寄存器。 4bit的中断优先级可以分成2组,从高位看,前面定义的是抢占式优先级,
[单片机]
keil ,stm32 用ulink2 连接和查看变量的设置
打开一个例程,设置好芯片型号。 设置debug选项,点击setting,继续设置。详细设置可参考《ULINK2_用户指南_中文_使用说明.pdf》。 用Ulink2时,有时候keil提示 no Jlink found ,可以在utilities 里设置默认的flash下载器,并在setting里设置flash芯片型号。若仍旧连不上,重插Ulink2试试。 调试时,看到某变量值为'????' 尝试一下方法: 修改 debug里的setting中的download to Flash ,不要选中。如下图 看下编译器的优化等级,设置为0。等级较高会优化无用的中间变量。
[单片机]
keil ,<font color='red'>stm32</font> 用ulink2 连接和查看变量的设置
一种STM32微控制器处理电机控制的设计和实现
变频器是利用电力半导体器件的通断作用将工频电源变换为另一频率的电能控制装置,能实现对交流异步电机的软起动、变频调速、提高运转精度、改变功率因数、过流/过压/过载保护等功能。变频器集成了高压大功率晶体管技术和电子控制技术,得到广泛应用。变频器的作用是改变交流电机供电的频率和幅值,因而改变其运动磁场的周期,达到平滑控制电动机转速的目的。变频器的出现,使得复杂的调速控制简单化,用变频器+交流鼠笼式感应电动机组合替代了大部分原先只能用直流电机完成的工作,缩小了体积,降低了维修率,使传动技术发展到新阶段。本文将探讨基于ARM的标准微控制器如何在一个被DSP和FPGA长期垄断的市场上打破复杂的控制模式,我们将以意法半导体的基于Cortex-M
[单片机]
一种<font color='red'>STM32</font>微控制器处理电机控制的设计和实现
STM32 中断函数SysTick_Handler理解
目的 滴答定时器整理(STM32F103)。用了一段时间的滴答定时器,突然忘记其中配置方法,重新翻阅手册及博文,在此记录备忘。 SysTick的重装寄存器决定了定时器频率,若SysTick的时钟源是72M, SystemFrequency = 72000000Hz //1ms时基 //HCLK_Frequency = 72000000Hz; //#define OS_TICKS_PER_SEC 1000 SysTick_SetReload((u32)RCC_Clocks.HCLK_Frequency / OS_TICKS_PER_SEC); 时钟树 寄存器 寄存器名称和地址 STK_CSR, 0x
[单片机]
<font color='red'>STM32</font> <font color='red'>中断</font>函数SysTick_Handler理解
Keil MDK STM32系列(六) 基于抽象外设库HAL的ADC模数转换
配置 ADC 模式: 如果只启用了一个ADC, 这里只能配置为Independent mode 时钟分频: 这个选项是ADC的预分频器, 可设置为2/4/6/8, 决定了一个ADC时钟周期. 加入设置为2, 由于ADC是挂载在APB2总线(84M)上, 所以一个ADC时钟便是84 * M/2=42M 分辨率: 最高为12位分辨率, 分辨率越高转换时间越长 数据对齐方式: 如果选择12位分辨率, 右对齐, 得到的结果最大便是4096. 扫描模式: 转换完一个通道会不会继续转换下一个通道 连续转换模式: 使能的话转换将连续进行 不连续转换模式: 当使能多个转换通道时, 可单独设置不连续转换通道. DMA连续请求: 是否连续请求DMA.
[单片机]
手把手之STM32中断
●中断 中断,在单片机中占有非常重要的地位。代码默认地从上向下执行,遇到条件或者其他语句,会按照指定的地方跳转。而在单片机执行代码的过程中,难免会有一些突发的情况需要处理,这样就会打断当前的代码,待处理完突发情况之后,程序会回到被打断的地方继续执行。 ●关于STM32的中断 几乎任何一款单片机都会有中断。以STM32F407VE来说,这是一款基于Cortex-M4内核的芯片,在CM4内核中有关于中断的一些管理,在STM32芯片中也有关于中断的一些管理。因此可以总结出一条规律,STM32的中断是有两层控制器分别控制的,如果你想使用中断,那么必须同时配置内核和芯片。 ●CM4内核中断 从内核架构图可以看到,NVIC控制器来管
[单片机]
手把手之<font color='red'>STM32</font><font color='red'>中断</font>
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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