IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> STM32 利用空闲中断接收数据 -> 正文阅读

[嵌入式]STM32 利用空闲中断接收数据

STM32 利用空闲中断接收数据

  1. 利用cubeMX打开DMA串口接收中断
  2. 利用CubeMX打开串口中断
HAL_NVIC_SetPriority(USART2_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(USART2_IRQn);
  1. 打开空闲中断

    //打开空闲中断使能
      __HAL_UART_ENABLE_IT(&huart2, UART_IT_IDLE);
    
  2. 使能DMA 接收数据

    //启动 DMA 接收数据
    HAL_UART_Receive_DMA(&huart2, uart2_data, 128);
    
  3. 在中断函数内部调用自定义中断函数

void USART2_IRQHandler(void)
{
  /* USER CODE BEGIN USART2_IRQn 0 */

  /* USER CODE END USART2_IRQn 0 */
  HAL_UART_IRQHandler(&huart2);
  /* USER CODE BEGIN USART2_IRQn 1 */
HB_IRQHandler(&huart2);
  /* USER CODE END USART2_IRQn 1 */
}
  1. 空闲中断触发以后需要清除空闲中断标志(使用如下函数),
  2. 在空闲中断函数内部计算已经传输的字节数量
uint8_t uart2_data[128];
uint8_t uart2_flag = 0;
void HB_IRQHandler(UART_HandleTypeDef *huart)
{
    if (huart == &huart2)
    {
        if (__HAL_UART_GET_FLAG(huart, UART_FLAG_IDLE))

        {
            HAL_UART_DMAStop(huart);
            //__HAL_UART_CLEAR_FLAG(huart,UART_FLAG_IDLE); //使用这个函数不生效,不知道为啥
            __HAL_UART_CLEAR_IDLEFLAG(huart);
            uart2_flag = 1;
            //计算获取到的数据个数
            //huart->RxXferSize     希望传输的数据个数
            //huart->hdmarx->Instance->CNDTR DMA还需要传输的字节数
            huart->RxXferCount = huart->RxXferSize - huart->hdmarx->Instance->CNDTR;
        }
    }
}



串口口中断函数调用自定义中断函数

/**
  * @brief This function handles USART2 global interrupt.
  */
void USART2_IRQHandler(void)
{
  /* USER CODE BEGIN USART2_IRQn 0 */

  /* USER CODE END USART2_IRQn 0 */
  HAL_UART_IRQHandler(&huart2);
	
  /* USER CODE BEGIN USART2_IRQn 1 */
	//调用自定义函数
	 HB_IRQHandler(&huart2);
  /* USER CODE END USART2_IRQn 1 */
}

cubeMX设置
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

main 函数初始化代码


/**
  * @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_DMA_Init();
    MX_I2C1_Init();
    MX_USART1_UART_Init();
    MX_USART2_UART_Init();
    /* USER CODE BEGIN 2 */
    printf("hello hebao\r\n");

    Button_Create("Button1",
                  &Button1,
                  Read_KEY1_Level,
                  0);
    Button_Attach(&Button1, EV_CLICK, Btn1_Dowm_CallBack);           //单击
    Button_Attach(&Button1, EV_DOUBLE_CLICK, Btn1_Double_CallBack);  //双击
    Button_Attach(&Button1, EV_LONG_CLICK, Btn1_Continuos_CallBack); //连按

    //HAL_UART_Receive_IT(&huart2, uart2_data, 32);
    //打开空闲中断使能
    __HAL_UART_ENABLE_IT(&huart2, UART_IT_IDLE);

    //启动 DMA 接收数据
    HAL_UART_Receive_DMA(&huart2, uart2_data, 128);
    /* USER CODE END 2 */

    /* Infinite loop */
    /* USER CODE BEGIN WHILE */
    while (1)
    {
        Button_Process(); //需要周期调用按键处理函数
        HAL_Delay(50);
        if (uart2_flag)
        {

            for (uint8_t i = 0; i < huart2.RxXferCount; i++)
            {
                printf("%02x ", uart2_data[i]);
            }
            printf("\r\n");
            uart2_flag = 0;
            //数据处理完成以后再次打开接收数据
            HAL_UART_Receive_DMA(&huart2, uart2_data, 128);

            //__HAL_UART_CLEAR_OREFLAG(&huart2);
            // HAL_UART_Receive_IT(&huart2, uart2_data, 32);
        }
        /* USER CODE END WHILE */

        /* USER CODE BEGIN 3 */
    }
    /* USER CODE END 3 */
}


测试结果

在这里插入图片描述

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-08-10 13:34:55  更:2021-08-10 13:35:59 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 20:53:57-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码