STM32F103C8的中断与DMA通信

一、准备工作

  1. STM32开发板(我的是STM32F103C8T6)
  2. STM32CubeMx软件、 IDE: Keil软件
  3. STM32F1xxHAL库
  4. 用stm32F103核心板的GPIOA端一管脚接一个LED,GPIOB端口一引脚接一个开关(用杜邦线模拟代替)。采用中断模式编程,当开关接高电平时,LED亮灯;接低电平时,LED灭灯。
  5. 采用串口中断方式的串口通信。
  6. 按键管脚 PB0
  7. LED管脚 PA12

二、新建工程

  1. New Project
    在这里插入图片描述
  • 搜索芯片型号
  • 选择芯片
  • 创建工程
  1. 设置RCC
    在这里插入图片描述
  • 点击RCC
  • 高速时钟(HSE)选择外部晶振
  • 软件自动配置管脚
  1. GPIO初始化
    LED:1个GPIO_OUTPUT (输出模式)
    按键:1个GPIO_EXITx(外部中断模式)
    在这里插入图片描述
  • 点击对应管脚
  • 设置对应模式

在这里插入图片描述
在这里插入图片描述

我们的按键选择上升沿触发中断

  1. 设置串口的中断
    在这里插入图片描述

  2. 设置NVIC(嵌套向量中断控制器)
    在这里插入图片描述

  3. DMA设置

在这里插入图片描述

根据DMA通道预览可以知道,我们用的USART1 的TX RX 分别对应DMA1 的通道4和通道5

  • 点击DMA Settings 点击 Add 添加通道
  • 选择USART_RX USART_TX 传输速率设置为中速
  • DMA传输模式为正常模式
  • DMA内存地址自增,每次增加一个Byte(字节)
  1. 时钟源设置

在这里插入图片描述

  • 选择外部时钟HSE 8MHz
  • PLL锁相环倍频9倍
  • 系统时钟来源选择为PLL
  • 设置APB1分频器为 /2
  1. 项目文件设置

在这里插入图片描述

  • 设置项目名称
  • 设置存储路径
  • 选择basic
  • 选择所用IDE

在这里插入图片描述
这个看自己的选择

  1. 创建工程文件

在这里插入图片描述
随后我们可以在stm32f1xx_it.c中看到我们所配置的中断服务函数 并且可以看到gpio的初始化分到了gpio.c里面
在这里插入图片描述

三、执行

  1. GPIO中断
    重写回调函数
    在main.c中
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	/* Prevent unused argument(s) compilation warning */
    HAL_GPIO_WritePin(GPIOA,GPIO_PIN_12,GPIO_PIN_RESET);
  /* NOTE: This function Should not be modified, when the callback is needed,
           the HAL_GPIO_EXTI_Callback could be implemented in the user file
   */
}

while循环中

 HAL_GPIO_WritePin(GPIOA,GPIO_PIN_12,GPIO_PIN_SET); HAL_Delay(1000);

结果:请添加图片描述

  1. 串口中断
    在main.c中
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	/* Prevent unused argument(s) compilation warning */
  if(length>20){
		memset(message,0,sizeof(message));
		HAL_UART_Transmit(&huart1, (uint8_t *)&message, sizeof(message),0xFFFF);
		memset(message,0,sizeof(message));
		length=0;	
	}
	else{
		message[length++]=c;
		if(c=='n'){
			  HAL_UART_Transmit(&huart1, (uint8_t *)&message, sizeof(message),0xFFFF);
				length=0;
				memset(message,0,sizeof(message));
		}
	}
	HAL_UART_Receive_IT(&huart1, (uint8_t *)&c, 1);//重新设置中断

  /* NOTE: This function should not be modified, when the callback is needed,
           the HAL_UART_RxCpltCallback could be implemented in the user file
   */
}

在while中

	HAL_UART_Receive_IT(&huart1, (uint8_t *)&c, 1);
  while (1)
  {
    /* USER CODE END WHILE */
     
    /* USER CODE BEGIN 3 */		 
		 HAL_Delay(1000);
		 HAL_UART_Transmit(&huart1, (uint8_t *)&data, sizeof(data),0xFFFF);
		 
  }

请添加图片描述

  1. DMA通信

main.c

uint8_t Senbuff[] = "rn**** Serial Output Message by DMA ***rn ";  //定义数据发送数组

在while循环中

//DMA 
		   HAL_UART_Transmit_DMA(&huart1, (uint8_t *)Senbuff, sizeof(Senbuff));
	     HAL_Delay(1000);

请添加图片描述

四、参考

https://blog.csdn.net/as480133937/article/details/104827639

https://blog.csdn.net/as480133937/article/details/98983268

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>