基于STM32F1以及STM32CubeMx实现串口中断通讯(字符串发送与接收)

这篇具有很好参考价值的文章主要介绍了基于STM32F1以及STM32CubeMx实现串口中断通讯(字符串发送与接收)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

STM32CubeMx软件设置

首先选好自己的板子并打开软件设置,本实验基于STM32F103ZET6实现,打开软件后如图:
cubemx 串口中断接收,STM32学习记录,stm32,单片机,嵌入式硬件
打开外部高速晶振,然后接着配置时钟:
cubemx 串口中断接收,STM32学习记录,stm32,单片机,嵌入式硬件
将时钟频率修改为72MHz,接着设置接线方式为SW
cubemx 串口中断接收,STM32学习记录,stm32,单片机,嵌入式硬件
接下来需要使用串口中断通讯,打开我们的串口设置并打开中断
cubemx 串口中断接收,STM32学习记录,stm32,单片机,嵌入式硬件
这里波特率设置为115200,数据位为8位,无校验位,停止位为1位,通信模式设置为异步通信,以及可以接受及发送数据。
cubemx 串口中断接收,STM32学习记录,stm32,单片机,嵌入式硬件
接着打开中断,并设置抢占优先级和响应优先级,这里设置为0,0。
至此STM32CubeMx就设置完成了。

Keil软件及代码编写

打开Keil以后生成以下文件:
cubemx 串口中断接收,STM32学习记录,stm32,单片机,嵌入式硬件
这里的uart.c是我自己编写的,方便后续管理,我们先来看看usart.c中的初始化函数:
cubemx 串口中断接收,STM32学习记录,stm32,单片机,嵌入式硬件
cubemx 串口中断接收,STM32学习记录,stm32,单片机,嵌入式硬件
分别有两个函数,一个设置我们的串口相关功能,一个则是打开我们所需要功能的时钟、配置相应的IO口,以及打开中断。
接下来看中断的相关处理
cubemx 串口中断接收,STM32学习记录,stm32,单片机,嵌入式硬件
Hal库的中断处理函数都会放在这个it.c文件中,然后函数内部会调用关于串口的中断公共处理函数,并且会在里面失能中断,所以添加一个while重新使能中断。
关于函数的快速查找可以点击左边窗口下方的functions打开对应的文件就能找到我们所需的函数:
cubemx 串口中断接收,STM32学习记录,stm32,单片机,嵌入式硬件
接着通过跳转功能进入中断的公共处理函数,并找到对应的中断回调函数,即:

cubemx 串口中断接收,STM32学习记录,stm32,单片机,嵌入式硬件
这里是一个弱定义,里面是空,即用户需要使用到时可以自己进行改写,所以下一步就是来编写所需要的功能:

串口的功能设计

uart.h编写

#ifndef __UART_H
#define __UART_H

#include "usart.h"

#define uart_len 200
#define hal_uart_len 1

extern uint8_t g_rx[uart_len];                  //存放字符串数组
extern uint8_t g_rx_buffer[hal_uart_len];       //HAL库用存放缓存区

/* 存放数据标志位
   以回车换行符进行判断接收完毕
   15位置1表示接收到换行符,14位置1表示接收到回车
*/

extern uint16_t  g_usart1_rx_sta;


#endif

uart.c编写

uint8_t g_rx[uart_len];                  //存放字符串数组
uint8_t g_rx_buffer[hal_uart_len];       //HAL库用存放缓存区

uint16_t  g_usart1_rx_sta = 0;

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    if((g_usart1_rx_sta & 0x8000) == 0)         //判断标志位15位是否被置1,若为0则接受还没结束
    {
        if(g_usart1_rx_sta & 0x4000)            //判断标志位14位是否被置1
        {
            if(g_rx_buffer[0] != 0x0a)
            {
                g_usart1_rx_sta = 0;            //若接收到回车后下一位不为换行则接收失败
            }
            else
            {
                g_usart1_rx_sta |= 0x8000;
            }
        }
        else
        {
            if(g_rx_buffer[0] == 0x0d)          //判断缓存器中当前是否接收到回车
            {
                g_usart1_rx_sta |= 0x4000;
            }
            else
            {
                //数据转移
                g_rx[g_usart1_rx_sta & 0x3fff] = g_rx_buffer[0];
                g_usart1_rx_sta++;
                
                //超出数组存放上限
                if(g_usart1_rx_sta > (uart_len-1))
                {
                    g_usart1_rx_sta = 0;
                }
            }
            
        }
    }
}

这里通过设定一个g_usart1_rx_sta标志位来判断接收到的数据有多长,这里设定字符串加上回车就代表发送完成,即需要判断是否收到\r\n来判断接收是否终止。\r的ascii值为0x0d,\n的ascii值为0x0a。

主函数的编写

  /* USER CODE BEGIN 2 */
    //接收数据使能中断
    HAL_UART_Receive_IT(&huart1, (uint8_t*)g_rx_buffer, hal_uart_len);
    uint8_t len = 0;
    uint16_t time = 0;
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
      if (g_usart1_rx_sta & 0x8000)        /* 接收到了数据? */
        {
            len = g_usart1_rx_sta & 0x3fff;  /* 得到此次接收到的数据长度 */
            printf("\r\n您发送的消息为:\r\n");

            HAL_UART_Transmit(&huart1,(uint8_t*)g_rx, len, 1000);    /* 发送接收到的数据 */
            while(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_TC) != SET);           /* 等待发送结束 */
            printf("\r\n\r\n");             /* 插入换行 */
            g_usart1_rx_sta = 0;
        }
        else
        {
            time++;

            if (time % 5000 == 0)
            {
                printf("\r\n串口实验\r\n");
            }

            if (time % 200 == 0) printf("请输入数据,以回车键结束\r\n");
            HAL_Delay(10);
        }
  }
  /* USER CODE END 3 */

这里是需要使用到串口中断接收,所以我们第一步是需要使能我们的串口中断接收,即下面这个函数:

HAL_UART_Receive_IT(&huart1, (uint8_t*)g_rx_buffer, hal_uart_len);

这个函数的第一个参数是句柄,也就是对应的初始化串口的结构体,可在usart.c中找到,第二个参数是接收的缓冲寄存器,即用户自己设定的寄存器,第三个则是接收长度。
然后接收完成后,通过len参数判断接收到的长度,在通过发送函数将数据发送回去,即下面这个函数:

HAL_UART_Transmit(&huart1,(uint8_t*)g_rx, len, 1000); 

这个函数的参数跟使能中断接收差不多,多了最后一个参数为超时时间,同时这个函数为阻塞发送,即数据没发送完就会一直发送无法处理其他事情。
同时还在这个主函数中添加了printf函数代表我们的STM32正常工作,需要用到这个printf函数我们就需要在usart.c中添加一个重定向函数:

/* USER CODE BEGIN 1 */
//串口打印重定向
int fputc(int ch, FILE *f)
{
  HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
  return ch;
}
/* USER CODE END 1 */

添加完成后再包含stdio.h头文件即可。

效果实现

cubemx 串口中断接收,STM32学习记录,stm32,单片机,嵌入式硬件文章来源地址https://www.toymoban.com/news/detail-704816.html

到了这里,关于基于STM32F1以及STM32CubeMx实现串口中断通讯(字符串发送与接收)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • STM32F1基于STM32CubeMX配置硬件SPI驱动1.8寸TFT LCD128X160 ST7735S屏幕

    STM32F1基于STM32CubeMX配置硬件SPI驱动1.8寸TFT LCD128X160 ST7735S屏幕

    📌相关篇《【STM32CubeIDE】STM32F103硬件SPI驱动1.8寸TFT LCD128X160 ST7735S屏幕》 ✨驱动效果就不做演示了,和上面的相关篇一样,主要是为了方便使用MDK Keil开发的使用。所以花了点时间从上面的工程当中做了分离,重新使用STM32CubeMX配置一个方便二次开发移植使用和配置的工程。本

    2024年02月03日
    浏览(12)
  • 基于STM32CubeMX和keil采用USART/UART实现非中断以及中断方式数据回环测试借助CH340以及XCOM

    基于STM32CubeMX和keil采用USART/UART实现非中断以及中断方式数据回环测试借助CH340以及XCOM

    这篇博客从串口通信的接口讲起,阐述原理,介绍通信方式,最后上机测试。 本篇博客主要以异步通信为例。 串口分为很多种,我们STM32学习过程中常见的就是UART/USART,前者是同步模式,后者是异步模式。还有RS485,RS232这种也是串口。我们平常使用的串口模块,大多都是类似

    2024年02月06日
    浏览(5)
  • stm32f1xx单片机拦截中断源代码

    stm32f1xx单片机拦截中断源代码

    这个是实现后的效果,可以看到已经没有中断的效果了 这个是拦截前的效果可以看到电平是在变化的 实现原理非常简单:一句话搞定: 以下是完整的代码:是用来补充说明和筹字数的 这就表明了,单片机里面是可以植入病毒的,或者不算病毒,里面的代码也是具有修改破坏

    2024年02月10日
    浏览(13)
  • 基于STM32CubeMx配置FreeRtos以及USB虚拟串口步骤详解

    基于STM32CubeMx配置FreeRtos以及USB虚拟串口步骤详解

       Debug:推荐选择 Serial Wire (方便使用STLink打断点在线调试) 中间两项默认Disable就好 TimeBase Source:若需要配置FreeRtos则不能选择SysTick,随机选择一个TIM定时器即可,这里我选择TIM1定时器。 (解释:裸机的时钟源默认是SysTick,但是开启FreeRtos后,FreeRtos会占用SysTick,用于任

    2024年02月05日
    浏览(14)
  • STM32F103利用CubeMX配置开启定时中断

    STM32F103利用CubeMX配置开启定时中断

    1、外部晶振8MHz,下载方式SWD模式,需求配置定时器1,产生每100ms一次中断 新建工程、配置晶振、选择下载方式等略 2、查阅资料,STM32F103的时钟树分配  3、配置CubeMX的时钟树  4、配置定时器-开启定时中断  5、配置定时时间 ( 定时周期 = (Prescaler + 1) × (Period + 1) ÷ 时钟频率

    2024年02月15日
    浏览(9)
  • 【STM32 CubeMX】串口编程DMA+IDLE中断

    【STM32 CubeMX】串口编程DMA+IDLE中断

    在嵌入式系统中,串口通信是一项关键的任务,而使用DMA(直接内存访问)结合IDLE中断进行串口编程,尤其是在STM32 CubeMX环境中,能够提高系统的效率和性能。STM32 CubeMX为STM32微控制器提供了图形化的配置工具,可以简化初始化代码的生成过程,使得串口编程变得更加容易。

    2024年02月20日
    浏览(8)
  • STM32 cubemx+串口空闲中断+DMA双缓冲

            写这篇文章是为了记录下之前做过的项目中用到的一部分关键技术,之前做过的项目中涉及到 采用最小开销来实时接收遥控器数据、能够准确验证传输过来数据的准确性 ,减小误差率,要求能稳定适用于不同的环境。 目录 1、为什么要用到串口空闲中断? 2、为

    2024年02月09日
    浏览(11)
  • STM32F429IGT6使用CubeMX配置外部中断按键

    STM32F429IGT6使用CubeMX配置外部中断按键

    1、硬件电路 2、设置RCC,选择高速外部时钟HSE,时钟设置为180MHz 3、配置GPIO引脚  4、NVIC配置  PC13相同   5、生成工程配置   6、部分代码 中断回调函数 7、实验现象

    2024年02月13日
    浏览(11)
  • HAL库(STM32CubeMX)之外部中断(STM32F103C8T6)

    HAL库(STM32CubeMX)之外部中断(STM32F103C8T6)

    HAL库(STM32CubeMX)——ADC学习总结(包含单次/连续模式下的轮询/中断/DMA)(蓝桥杯STM32G431RBT6) HAL库(STM32CubeMX)——DAC学习(STM32G431RBT6) HAL库(STM32CubeMX)——USART配置(中断接收/STM32G431RBT6) HAL库(STM32CubeMX)——基本定时器、PWM、输入捕获、输出比较、互补式PWM等综合学习(STM32

    2024年02月06日
    浏览(11)
  • 【STM32】CUBEMX之串口:串口三种模式(轮询模式、中断模式、DMA模式)的配置与使用示例 + 串口重定向 + 使用HAL扩展函数实现不定长数据接收

    【STM32】CUBEMX之串口:串口三种模式(轮询模式、中断模式、DMA模式)的配置与使用示例 + 串口重定向 + 使用HAL扩展函数实现不定长数据接收

    目录   总览 使用CUBEMX创建工程的基本配置 CUBEMX中的配置 Keil中的配置 实物连接 串口轮询模式 轮询模式HAL库函数 特点 实验一:发送数据给单片机并让其返回相同值 串口重定向 串口中断模式 在CUBEMX中打开串口中断 中断模式HAL库函数 特点 实验二:使用中断回调完成实验一

    2024年04月10日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包