STM32之中断和DMA通信

您所在的位置:网站首页 为什么程序中的printf不执行文件 STM32之中断和DMA通信

STM32之中断和DMA通信

2023-05-26 06:38| 来源: 网络整理| 查看: 265

一、什么是中断

1.中断即打断,实至CPU再执行当前程序时,由于系统出现了某种需要处理的紧急情况,CPU暂停正在执行的程序,转而去执行另一段特殊程序来处理的出现的紧急事务,处理结束后CPU自动返回到原先暂停的程序中去继续执行,这种执行过程由于外界的的原因被中间打断的情况成为中断

二、STM32CUBEMX生成中断点灯代码

1.首先打开STM32CUBEMX,新建一个工程,依然选择芯片STM32F103C8 在这里插入图片描述 2.点击开始工程,配置系统调试接口 SYS,选择 Serial Wire 在这里插入图片描述 3.配置外设 RCC ,选择 HSE (外部高速时钟)为 Crystal/Ceramic Resonator(晶振/陶瓷谐振器) 在这里插入图片描述 4.设置LED灯引脚为PA1的输出模式 GPIO_Output,按键引脚为PB15的外部中断模式GPIO_EXIT1 在这里插入图片描述 5.LED对应PA1管脚,User Label处设置为LED,开关对应PB15管脚,GPIO mode处设置为上升沿触发,User Label处设置为 KEY 在这里插入图片描述 6.使能外部中断线,点击Enabled 在这里插入图片描述 7.设置时钟树,选择PLLCLK,修改HCLK为36MHz 在这里插入图片描述 8.设置项目名称和路径,修改Toolchain/IDE为MDK-ARM 在这里插入图片描述 9.打开keil,打开建好的工程LED,在main.c文件中添加以下代码 /

@brief EXTI line detection callbacks.@param GPIO_Pin: Specifies the pins connected EXTI line,@retval None */ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if( GPIO_Pin == KEY_Pin ) // 判断外部中断源 { HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin); // 翻转LED状态 } }

10.开始烧录 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

三、STM32CUBEMX生成中断通信代码

1.创建新工程

点击 File->New Pioject或ACCEE TO MCU SELECTOR,创建新工程 选择 STM32F103C8 芯片,点击 Start Project 进入工程 在这里插入图片描述 设置时钟RCC,点击HSE,选择Crystal/Ceramic Resonator 在这里插入图片描述 设置USART1,点击Mode,选择Asynchronous 在这里插入图片描述 设置中断,在NVIC Settings中点击Enabled。 点击Clock Configuration选择HSE和PLLCLK,修改HCLK值 在这里插入图片描述 设置项目名称和路径,修改Application Structure为Basic,Toolchain/IDE为MDK-ARM,生成项目 在这里插入图片描述 2.程序编写. 添加头文件 stm32f1xx_hal.c文件 代码 #include extern UART_HandleTypeDef huart1; //声明串口 在这里插入图片描述 重写fget和fput函数

/**

函数功能: 重定向c库函数printf到DEBUG_USARTx输入参数: 无返 回 值: 无说 明:无 */ int fputc(int ch, FILE *f) { HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff); return ch; }

/**

函数功能: 重定向c库函数getchar,scanf到DEBUG_USARTx输入参数: 无返 回 值: 无说 明:无 */ int fgetc(FILE *f) { uint8_t ch = 0; HAL_UART_Receive(&huart1, &ch, 1, 0xffff); return ch; }

在这里插入图片描述

main.c文件 在主函数main的while循环中添加发送数据 printf(“hello windows!\r\n”); HAL_Delay(1000);

在这里插入图片描述 添加定义,接收串口数据 #include “stdio.h” #include

#define RXBUFFERSIZE 256 //最大接收字节数 char RxBuffer[RXBUFFERSIZE]; //接收数据 uint8_t aRxBuffer; //接收中断缓冲 uint8_t Uart1_Rx_Cnt = 0; //接收缓冲计数

在主函数main中添加开启接收中断的语句 HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1);

在这里插入图片描述

在这里插入图片描述 添加中断回调函数 /* USER CODE BEGIN 4 */

void HAL_UART_RxCpltCallback(UART_HandleTypeDef huart) { / Prevent unused argument(s) compilation warning / UNUSED(huart); / NOTE: This function Should not be modified, when the callback is needed, the HAL_UART_TxCpltCallback could be implemented in the user file */

if(Uart1_Rx_Cnt >= 255) //溢出判断 { Uart1_Rx_Cnt = 0; memset(RxBuffer,0x00,sizeof(RxBuffer)); HAL_UART_Transmit(&huart1, (uint8_t *)"数据溢出", 10,0xFFFF); } else { RxBuffer[Uart1_Rx_Cnt++] = aRxBuffer; //接收数据转存 if((RxBuffer[Uart1_Rx_Cnt-1] == 0x0A)&&(RxBuffer[Uart1_Rx_Cnt-2] == 0x0D)) //判断结束位 { HAL_UART_Transmit(&huart1, (uint8_t *)&RxBuffer, Uart1_Rx_Cnt,0xFFFF); //将收到的信息发送出去 while(HAL_UART_GetState(&huart1) == HAL_UART_STATE_BUSY_TX);//检测UART发送结束 Uart1_Rx_Cnt = 0; memset(RxBuffer,0x00,sizeof(RxBuffer)); //清空数组 } } HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1); //再开启接收中断

} /* USER CODE END 4 */ 在这里插入图片描述 波形观察 打开Serial Windows中的UART #1窗口和逻辑分析仪,添加要观察的端口,修改各个显示方式,将Display Type处设置为Bit

硬件操作

使用USB-TTL直接进行串口下载,将USB-TTL的GND和3.3V接入STM32系统板的GND和3.3V,然后TXD和RXD分别接入A10和A9引脚。

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

四、DMA通信

创建DMA工程 基本步骤和上面一样的: 点击 File->New Pioject或ACCEE TO MCU SELECTOR,创建新工程 选择 STM32F103C8 芯片,点击 Start Project 进入工程 设置时钟RCC,点击HSE,选择Crystal/Ceramic Resonator 设置USART1,点击Mode,选择Asynchronous,在NVIC Settings中点击Enabled(中断) 在USART1中,点击DMA Settings的Add,添加USART_RX 和USART_TX,传输速率设置为中速Medium,模式设置为Normal,右侧选择Memory;在最右侧的System view中选择DMA,点击Add,添加MEMTOMEM。 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 设置时钟源,点击Clock Configuration选择HSE和PLLCLK 在这里插入图片描述 设置项目文件,修改Application Structure为Basic,Toolchain/IDE为MDK-ARM。 在这里插入图片描述 在这里插入图片描述 编写编程 main.c文件的主函数main uint8_t Senbuff[] = “Goodbye\r\n”; //定义数据发送数组 主函数main的while循环 HAL_UART_Transmit_DMA(&huart1, (uint8_t *)Senbuff, sizeof(Senbuff)); HAL_Delay(1000); 在这里插入图片描述 调试和野火操作 1)连接 使用USB-TTL直接进行串口下载,将USB-TTL的GND和3.3V接入STM32系统板的GND和3.3V,然后TXD和RXD分别接入A10和A9引脚。

2)烧录 BOOT0置1,BOOT1置0,打开mcuisp,选择文件路径,开始烧录。 在这里插入图片描述

五.效果

在这里插入图片描述

六.总结

通过本次STM32中断与DMA通信编程实验,我了解了stm32中断、DMA通信原理和编程方法,自己也是对这个只能是入门,需要学习的地方还很多。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3