STM32F103C8的中断与DMA通信

Posted 伊木子曦

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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[] = "\\r\\n**** Serial Output Message by DMA ***\\r\\n ";  //定义数据发送数组

在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

以上是关于STM32F103C8的中断与DMA通信的主要内容,如果未能解决你的问题,请参考以下文章

STM32F103在RX中断时无法通过UART接收数据

STM32F103(二十一)DMA(超详细的~)

STM32F103VET6基于STM32CubeMX创建串口中断+ DMA 不定长数据接收

STM32F103VE基于标准库串口1空闲中断+DMA数据接收工程

stm32f103 dma是怎么实现的

STM32学习笔记 二基于STM32F103C8T6和STM32CubeMX实现UART串口通信数据收发