[应用相关] STM32F4 DMA数据流多外设使用

[复制链接]
804|6
 楼主| 慢醇 发表于 2022-2-26 23:27 | 显示全部楼层 |阅读模式
DM, ST

软件STM32cubeIDE上
(1)STM32的 DMA 数据流是否可以映射到多个外设,是否可以同时使用如何在数据流中进行判断
(2)如下图是DMA1映射,它们同时在数据流5上

14620621a46cb30568.png


 楼主| 慢醇 发表于 2022-2-26 23:28 | 显示全部楼层
(3)本人调试的时候,发现使用tim2_ch1(PA0)和tim3_ch2(PA7)时,因为流中断函数中有如下写法,才导致无法使用,屏蔽一方,另一个通道就可以输出。\
25953621a4735b1108.png
 楼主| 慢醇 发表于 2022-2-26 23:30 | 显示全部楼层
(4)如下图时同时使用函数情况,另外开了tim2_ch3(PA2引脚)和tim3_ch1(PA6引脚), 图中逻辑分析仪>>1通道2通道抓到有波形,其中0通道(tim2_ch1(PA0引脚))3通道(tim3_ch2(PA7)) 无数据
20777621a478f7aedb.png
 楼主| 慢醇 发表于 2022-2-26 23:31 | 显示全部楼层
(5)追求目标,在DMA1_Stream5_IRQHandler函数如何编写判断
 楼主| 慢醇 发表于 2022-2-26 23:35 | 显示全部楼层
(6)以下是代码

main.c



  1. ```c
  2. /* USER CODE BEGIN Header */
  3. /**
  4.   ******************************************************************************
  5.   * [url=home.php?mod=space&uid=288409]@file[/url]           : main.c
  6.   * [url=home.php?mod=space&uid=247401]@brief[/url]          : Main program body
  7.   ******************************************************************************
  8.   * @attention
  9.   *
  10.   * Copyright (c) 2021 STMicroelectronics.
  11.   * All rights reserved.
  12.   *
  13.   * This software is licensed under terms that can be found in the LICENSE file
  14.   * in the root directory of this software component.
  15.   * If no LICENSE file comes with this software, it is provided AS-IS.
  16.   *
  17.   ******************************************************************************
  18.   */
  19. /* USER CODE END Header */
  20. /* Includes ------------------------------------------------------------------*/
  21. #include "main.h"

  22. /* Private includes ----------------------------------------------------------*/
  23. /* USER CODE BEGIN Includes */

  24. /* USER CODE END Includes */

  25. /* Private typedef -----------------------------------------------------------*/
  26. /* USER CODE BEGIN PTD */

  27. /* USER CODE END PTD */

  28. /* Private define ------------------------------------------------------------*/
  29. /* USER CODE BEGIN PD */
  30. /* USER CODE END PD */

  31. /* Private macro -------------------------------------------------------------*/
  32. /* USER CODE BEGIN PM */

  33. /* USER CODE END PM */

  34. /* Private variables ---------------------------------------------------------*/
  35. TIM_HandleTypeDef htim2;
  36. TIM_HandleTypeDef htim3;
  37. DMA_HandleTypeDef hdma_tim2_ch1;
  38. DMA_HandleTypeDef hdma_tim2_up_ch3;
  39. DMA_HandleTypeDef hdma_tim2_ch1;
  40. DMA_HandleTypeDef hdma_tim3_ch2;
  41. DMA_HandleTypeDef hdma_tim3_ch1_trig;
  42. /* USER CODE BEGIN PV */

  43. /* USER CODE END PV */

  44. /* Private function prototypes -----------------------------------------------*/
  45. void SystemClock_Config(void);
  46. static void MX_GPIO_Init(void);
  47. static void MX_DMA_Init(void);
  48. static void MX_TIM2_Init(void);
  49. static void MX_TIM3_Init(void);
  50. /* USER CODE BEGIN PFP */
  51. /* USER CODE BEGIN 0 */
  52. uint32_t tim2_ccr1_value[] = {30, 20, 30, 40, 50, 60, 70, 80, 90};
  53. uint16_t tim3_ccr1_value[] = {10, 20, 30, 40, 50, 60, 70, 80, 90};

  54. void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim)
  55. {
  56.       if(htim->Instance == TIM2)
  57.       {
  58.          if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)
  59.          {
  60.               HAL_DMA_IRQHandler(&hdma_tim2_ch1);
  61.              __HAL_TIM_SetCompare(htim, TIM_CHANNEL_1,0); //占空比清0,若不清会导致灯珠颜色不对
  62.              HAL_TIM_PWM_Stop_DMA(htim,TIM_CHANNEL_1);
  63.          }else
  64.          if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_3)
  65.          {
  66.              __HAL_TIM_SetCompare(htim, TIM_CHANNEL_3,0); //占空比清0,若不清会导致灯珠颜色不对
  67.              HAL_TIM_PWM_Stop_DMA(htim,TIM_CHANNEL_3);
  68.          }
  69.       }
  70.      if(htim->Instance == TIM3)
  71.      {
  72.           if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)
  73.           {
  74.               __HAL_TIM_SetCompare(htim, TIM_CHANNEL_1,0); //占空比清0,若不清会导致灯珠颜色不对
  75.               HAL_TIM_PWM_Stop_DMA(htim,TIM_CHANNEL_1);
  76.           }else
  77.           if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)
  78.           {
  79.                  __HAL_TIM_SetCompare(htim, TIM_CHANNEL_2,0); //占空比清0,若不清会导致灯珠颜色不对
  80.                  HAL_TIM_PWM_Stop_DMA(htim,TIM_CHANNEL_2);
  81.            }
  82.       }
  83.   //  __HAL_TIM_SetCompare(htim, TIM_CHANNEL_2,0); //占空比清0,若不清会导致灯珠颜色不对
  84.   //     HAL_TIM_PWM_Stop_DMA(htim,TIM_CHANNEL_2);
  85. }
  86. /* USER CODE END PFP */

  87. /* Private user code ---------------------------------------------------------*/
  88. /* USER CODE BEGIN 0 */

  89. /* USER CODE END 0 */

  90. /**
  91.   * @brief  The application entry point.
  92.   * @retval int
  93.   */
  94. int main(void)
  95. {
  96.   /* USER CODE BEGIN 1 */

  97.   /* USER CODE END 1 */

  98.   /* MCU Configuration--------------------------------------------------------*/

  99.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  100.   HAL_Init();

  101.   /* USER CODE BEGIN Init */

  102.   /* USER CODE END Init */

  103.   /* Configure the system clock */
  104.   SystemClock_Config();

  105.   /* USER CODE BEGIN SysInit */

  106.   /* USER CODE END SysInit */

  107.   /* Initialize all configured peripherals */
  108.   MX_GPIO_Init();
  109.   MX_DMA_Init();
  110.   MX_TIM2_Init();
  111.   MX_TIM3_Init();
  112.   /* USER CODE BEGIN 2 */

  113.   /* USER CODE END 2 */

  114.   /* Infinite loop */
  115.   /* USER CODE BEGIN WHILE */
  116.   while (1)
  117.   {
  118.     /* USER CODE END WHILE */
  119.         /* USER CODE END WHILE */
  120.               HAL_TIM_PWM_Start_DMA(&htim2,TIM_CHANNEL_1,tim2_ccr1_value,9);
  121.               HAL_Delay(5);
  122.               HAL_TIM_PWM_Start_DMA(&htim2,TIM_CHANNEL_3,tim2_ccr1_value,9);
  123.               HAL_Delay(5);
  124.               HAL_TIM_PWM_Start_DMA(&htim3,TIM_CHANNEL_1,(uint32_t *)tim3_ccr1_value,9);
  125.               HAL_Delay(5);
  126.               HAL_TIM_PWM_Start_DMA(&htim3,TIM_CHANNEL_2,(uint32_t *)tim3_ccr1_value,9);
  127.                HAL_Delay(500);
  128.     /* USER CODE BEGIN 3 */
  129.   }
  130.   /* USER CODE END 3 */
  131. }

  132. /**
  133.   * @brief System Clock Configuration
  134.   * @retval None
  135.   */
  136. void SystemClock_Config(void)
  137. {
  138.   RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  139.   RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  140.   /** Configure the main internal regulator output voltage
  141.   */
  142.   __HAL_RCC_PWR_CLK_ENABLE();
  143.   __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
  144.   /** Initializes the RCC Oscillators according to the specified parameters
  145.   * in the RCC_OscInitTypeDef structure.
  146.   */
  147.   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  148.   RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  149.   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  150.   RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  151.   RCC_OscInitStruct.PLL.PLLM = 4;
  152.   RCC_OscInitStruct.PLL.PLLN = 168;
  153.   RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  154.   RCC_OscInitStruct.PLL.PLLQ = 4;
  155.   if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  156.   {
  157.     Error_Handler();
  158.   }
  159.   /** Initializes the CPU, AHB and APB buses clocks
  160.   */
  161.   RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
  162.                               |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  163.   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  164.   RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV2;
  165.   RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
  166.   RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
  167.   if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
  168.   {
  169.     Error_Handler();
  170.   }
  171. }
  172. /**
  173.   * @brief TIM2 Initialization Function
  174.   * @param None
  175.   * @retval None
  176.   */
  177. static void MX_TIM2_Init(void)
  178. {
  179.   /* USER CODE BEGIN TIM2_Init 0 */

  180.   /* USER CODE END TIM2_Init 0 */

  181.   TIM_MasterConfigTypeDef sMasterConfig = {0};
  182.   TIM_OC_InitTypeDef sConfigOC = {0};

  183.   /* USER CODE BEGIN TIM2_Init 1 */

  184.   /* USER CODE END TIM2_Init 1 */
  185.   htim2.Instance = TIM2;
  186.   htim2.Init.Prescaler = 0;
  187.   htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
  188.   htim2.Init.Period = 105;
  189.   htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  190.   htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  191.   if (HAL_TIM_PWM_Init(&htim2) != HAL_OK)
  192.   {
  193.     Error_Handler();
  194.   }
  195.   sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  196.   sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  197.   if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
  198.   {
  199.     Error_Handler();
  200.   }
  201.   sConfigOC.OCMode = TIM_OCMODE_PWM1;
  202.   sConfigOC.Pulse = 0;
  203.   sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  204.   sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  205.   if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
  206.   {
  207.     Error_Handler();
  208.   }
  209.   if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_3) != HAL_OK)
  210.   {
  211.     Error_Handler();
  212.   }
  213.   /* USER CODE BEGIN TIM2_Init 2 */

  214.   /* USER CODE END TIM2_Init 2 */
  215.   HAL_TIM_MspPostInit(&htim2);
  216. }
  217. /**
  218.   * @brief TIM3 Initialization Function
  219.   * @param None
  220.   * @retval None
  221.   */
  222. static void MX_TIM3_Init(void)
  223. {
  224.   /* USER CODE BEGIN TIM3_Init 0 */

  225.   /* USER CODE END TIM3_Init 0 */

  226.   TIM_MasterConfigTypeDef sMasterConfig = {0};
  227.   TIM_OC_InitTypeDef sConfigOC = {0};

  228.   /* USER CODE BEGIN TIM3_Init 1 */

  229.   /* USER CODE END TIM3_Init 1 */
  230.   htim3.Instance = TIM3;
  231.   htim3.Init.Prescaler = 0;
  232.   htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
  233.   htim3.Init.Period = 105;
  234.   htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  235.   htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  236.   if (HAL_TIM_PWM_Init(&htim3) != HAL_OK)
  237.   {
  238.     Error_Handler();
  239.   }
  240.   sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  241.   sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  242.   if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK)
  243.   {
  244.     Error_Handler();
  245.   }
  246.   sConfigOC.OCMode = TIM_OCMODE_PWM1;
  247.   sConfigOC.Pulse = 0;
  248.   sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  249.   sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  250.   if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
  251.   {
  252.     Error_Handler();
  253.   }
  254.   if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
  255.   {
  256.     Error_Handler();
  257.   }
  258.   /* USER CODE BEGIN TIM3_Init 2 */

  259.   /* USER CODE END TIM3_Init 2 */
  260.   HAL_TIM_MspPostInit(&htim3);
  261. }
  262. /**
  263.   * Enable DMA controller clock
  264.   */
  265. static void MX_DMA_Init(void)
  266. {
  267.   /* DMA controller clock enable */
  268.   __HAL_RCC_DMA1_CLK_ENABLE();

  269.   /* DMA interrupt init */
  270.   /* DMA1_Stream1_IRQn interrupt configuration */
  271.   HAL_NVIC_SetPriority(DMA1_Stream1_IRQn, 0, 0);
  272.   HAL_NVIC_EnableIRQ(DMA1_Stream1_IRQn);
  273.   /* DMA1_Stream2_IRQn interrupt configuration */
  274.   HAL_NVIC_SetPriority(DMA1_Stream2_IRQn, 0, 0);
  275.   HAL_NVIC_EnableIRQ(DMA1_Stream2_IRQn);
  276.   /* DMA1_Stream4_IRQn interrupt configuration */
  277.   HAL_NVIC_SetPriority(DMA1_Stream4_IRQn, 0, 0);
  278.   HAL_NVIC_EnableIRQ(DMA1_Stream4_IRQn);
  279.   /* DMA1_Stream5_IRQn interrupt configuration */
  280.   HAL_NVIC_SetPriority(DMA1_Stream5_IRQn, 0, 0);
  281.   HAL_NVIC_EnableIRQ(DMA1_Stream5_IRQn);
  282. }
  283. /**
  284.   * @brief GPIO Initialization Function
  285.   * @param None
  286.   * @retval None
  287.   */
  288. static void MX_GPIO_Init(void)
  289. {
  290.   /* GPIO Ports Clock Enable */
  291.   __HAL_RCC_GPIOH_CLK_ENABLE();
  292.   __HAL_RCC_GPIOA_CLK_ENABLE();
  293. }
  294. /* USER CODE BEGIN 4 */

  295. /* USER CODE END 4 */

  296. /**
  297.   * @brief  This function is executed in case of error occurrence.
  298.   * @retval None
  299.   */
  300. void Error_Handler(void)
  301. {
  302.   /* USER CODE BEGIN Error_Handler_Debug */
  303.   /* User can add his own implementation to report the HAL error return state */
  304.   __disable_irq();
  305.   while (1)
  306.   {
  307.   }
  308.   /* USER CODE END Error_Handler_Debug */
  309. }

  310. #ifdef  USE_FULL_ASSERT
  311. /**
  312.   * @brief  Reports the name of the source file and the source line number
  313.   *         where the assert_param error has occurred.
  314.   * @param  file: pointer to the source file name
  315.   * @param  line: assert_param error line source number
  316.   * @retval None
  317.   */
  318. void assert_failed(uint8_t *file, uint32_t line)
  319. {
  320.   /* USER CODE BEGIN 6 */
  321.   /* User can add his own implementation to report the file name and line number,
  322.      ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  323.   /* USER CODE END 6 */
  324. }
  325. #endif /* USE_FULL_ASSERT */


 楼主| 慢醇 发表于 2022-2-26 23:36 | 显示全部楼层
  1. it.c

  2. ```c
  3. /* USER CODE BEGIN Header */
  4. /**
  5.   ******************************************************************************
  6.   * @file    stm32f4xx_it.c
  7.   * @brief   Interrupt Service Routines.
  8.   ******************************************************************************
  9.   * @attention
  10.   *
  11.   * Copyright (c) 2021 STMicroelectronics.
  12.   * All rights reserved.
  13.   *
  14.   * This software is licensed under terms that can be found in the LICENSE file
  15.   * in the root directory of this software component.
  16.   * If no LICENSE file comes with this software, it is provided AS-IS.
  17.   *
  18.   ******************************************************************************
  19.   */
  20. /* USER CODE END Header */

  21. /* Includes ------------------------------------------------------------------*/
  22. #include "main.h"
  23. #include "stm32f4xx_it.h"
  24. /* Private includes ----------------------------------------------------------*/
  25. /* USER CODE BEGIN Includes */
  26. /* USER CODE END Includes */

  27. /* Private typedef -----------------------------------------------------------*/
  28. /* USER CODE BEGIN TD */

  29. /* USER CODE END TD */

  30. /* Private define ------------------------------------------------------------*/
  31. /* USER CODE BEGIN PD */

  32. /* USER CODE END PD */

  33. /* Private macro -------------------------------------------------------------*/
  34. /* USER CODE BEGIN PM */

  35. /* USER CODE END PM */

  36. /* Private variables ---------------------------------------------------------*/
  37. /* USER CODE BEGIN PV */

  38. /* USER CODE END PV */

  39. /* Private function prototypes -----------------------------------------------*/
  40. /* USER CODE BEGIN PFP */

  41. /* USER CODE END PFP */

  42. /* Private user code ---------------------------------------------------------*/
  43. /* USER CODE BEGIN 0 */

  44. /* USER CODE END 0 */

  45. /* External variables --------------------------------------------------------*/
  46. extern DMA_HandleTypeDef hdma_tim2_ch1;
  47. extern DMA_HandleTypeDef hdma_tim2_up_ch3;
  48. extern DMA_HandleTypeDef hdma_tim3_ch1_trig;
  49. extern DMA_HandleTypeDef hdma_tim3_ch2;
  50. extern TIM_HandleTypeDef htim2;
  51. extern TIM_HandleTypeDef htim3;
  52. /* USER CODE BEGIN EV */

  53. /* USER CODE END EV */

  54. /******************************************************************************/
  55. /*           Cortex-M4 Processor Interruption and Exception Handlers          */
  56. /******************************************************************************/
  57. /**
  58.   * @brief This function handles Non maskable interrupt.
  59.   */
  60. void NMI_Handler(void)
  61. {
  62.   /* USER CODE BEGIN NonMaskableInt_IRQn 0 */

  63.   /* USER CODE END NonMaskableInt_IRQn 0 */
  64.   /* USER CODE BEGIN NonMaskableInt_IRQn 1 */
  65.   while (1)
  66.   {
  67.   }
  68.   /* USER CODE END NonMaskableInt_IRQn 1 */
  69. }

  70. /**
  71.   * @brief This function handles Hard fault interrupt.
  72.   */
  73. void HardFault_Handler(void)
  74. {
  75.   /* USER CODE BEGIN HardFault_IRQn 0 */

  76.   /* USER CODE END HardFault_IRQn 0 */
  77.   while (1)
  78.   {
  79.     /* USER CODE BEGIN W1_HardFault_IRQn 0 */
  80.     /* USER CODE END W1_HardFault_IRQn 0 */
  81.   }
  82. }
  83. /**
  84.   * @brief This function handles Memory management fault.
  85.   */
  86. void MemManage_Handler(void)
  87. {
  88.   /* USER CODE BEGIN MemoryManagement_IRQn 0 */

  89.   /* USER CODE END MemoryManagement_IRQn 0 */
  90.   while (1)
  91.   {
  92.     /* USER CODE BEGIN W1_MemoryManagement_IRQn 0 */
  93.     /* USER CODE END W1_MemoryManagement_IRQn 0 */
  94.   }
  95. }
  96. /**
  97.   * @brief This function handles Pre-fetch fault, memory access fault.
  98.   */
  99. void BusFault_Handler(void)
  100. {
  101.   /* USER CODE BEGIN BusFault_IRQn 0 */

  102.   /* USER CODE END BusFault_IRQn 0 */
  103.   while (1)
  104.   {
  105.     /* USER CODE BEGIN W1_BusFault_IRQn 0 */
  106.     /* USER CODE END W1_BusFault_IRQn 0 */
  107.   }
  108. }
  109. /**
  110.   * @brief This function handles Undefined instruction or illegal state.
  111.   */
  112. void UsageFault_Handler(void)
  113. {
  114.   /* USER CODE BEGIN UsageFault_IRQn 0 */

  115.   /* USER CODE END UsageFault_IRQn 0 */
  116.   while (1)
  117.   {
  118.     /* USER CODE BEGIN W1_UsageFault_IRQn 0 */
  119.     /* USER CODE END W1_UsageFault_IRQn 0 */
  120.   }
  121. }
  122. /**
  123.   * @brief This function handles System service call via SWI instruction.
  124.   */
  125. void SVC_Handler(void)
  126. {
  127.   /* USER CODE BEGIN SVCall_IRQn 0 */

  128.   /* USER CODE END SVCall_IRQn 0 */
  129.   /* USER CODE BEGIN SVCall_IRQn 1 */

  130.   /* USER CODE END SVCall_IRQn 1 */
  131. }

  132. /**
  133.   * @brief This function handles Debug monitor.
  134.   */
  135. void DebugMon_Handler(void)
  136. {
  137.   /* USER CODE BEGIN DebugMonitor_IRQn 0 */

  138.   /* USER CODE END DebugMonitor_IRQn 0 */
  139.   /* USER CODE BEGIN DebugMonitor_IRQn 1 */

  140.   /* USER CODE END DebugMonitor_IRQn 1 */
  141. }

  142. /**
  143.   * @brief This function handles Pendable request for system service.
  144.   */
  145. void PendSV_Handler(void)
  146. {
  147.   /* USER CODE BEGIN PendSV_IRQn 0 */

  148.   /* USER CODE END PendSV_IRQn 0 */
  149.   /* USER CODE BEGIN PendSV_IRQn 1 */

  150.   /* USER CODE END PendSV_IRQn 1 */
  151. }

  152. /**
  153.   * @brief This function handles System tick timer.
  154.   */
  155. void SysTick_Handler(void)
  156. {
  157.   /* USER CODE BEGIN SysTick_IRQn 0 */

  158.   /* USER CODE END SysTick_IRQn 0 */
  159.   HAL_IncTick();
  160.   /* USER CODE BEGIN SysTick_IRQn 1 */

  161.   /* USER CODE END SysTick_IRQn 1 */
  162. }

  163. /******************************************************************************/
  164. /* STM32F4xx Peripheral Interrupt Handlers                                    */
  165. /* Add here the Interrupt Handlers for the used peripherals.                  */
  166. /* For the available peripheral interrupt handler names,                      */
  167. /* please refer to the startup file (startup_stm32f4xx.s).                    */
  168. /******************************************************************************/

  169. /**
  170.   * @brief This function handles DMA1 stream1 global interrupt.
  171.   */
  172. void DMA1_Stream1_IRQHandler(void)
  173. {
  174.   /* USER CODE BEGIN DMA1_Stream1_IRQn 0 */

  175.   /* USER CODE END DMA1_Stream1_IRQn 0 */
  176.   //HAL_DMA_IRQHandler(&hdma_tim2_up_ch3);
  177.     HAL_DMA_IRQHandler(htim2.hdma[TIM_DMA_ID_CC3]);
  178.   /* USER CODE BEGIN DMA1_Stream1_IRQn 1 */

  179.   /* USER CODE END DMA1_Stream1_IRQn 1 */
  180. }

  181. /**
  182.   * @brief This function handles DMA1 stream2 global interrupt.
  183.   */
  184. void DMA1_Stream2_IRQHandler(void)
  185. {
  186.   /* USER CODE BEGIN DMA1_Stream2_IRQn 0 */

  187.   /* USER CODE END DMA1_Stream2_IRQn 0 */
  188.   HAL_DMA_IRQHandler(&hdma_tim3_ch2);
  189.   /* USER CODE BEGIN DMA1_Stream2_IRQn 1 */

  190.   /* USER CODE END DMA1_Stream2_IRQn 1 */
  191. }

  192. /**
  193.   * @brief This function handles DMA1 stream4 global interrupt.
  194.   */
  195. void DMA1_Stream4_IRQHandler(void)
  196. {
  197.   /* USER CODE BEGIN DMA1_Stream4_IRQn 0 */

  198.   /* USER CODE END DMA1_Stream4_IRQn 0 */
  199.   HAL_DMA_IRQHandler(&hdma_tim3_ch1_trig);
  200.     //HAL_DMA_IRQHandler(htim3.hdma[TIM_DMA_ID_CC1]);
  201.   /* USER CODE BEGIN DMA1_Stream4_IRQn 1 */

  202.   /* USER CODE END DMA1_Stream4_IRQn 1 */
  203. }

  204. /**
  205.   * @brief This function handles DMA1 stream5 global interrupt.
  206.   */
  207. void DMA1_Stream5_IRQHandler(void)
  208. {
  209.   /* USER CODE BEGIN DMA1_Stream5_IRQn 0 */

  210.   /* USER CODE END DMA1_Stream5_IRQn 0 */

  211.            //    HAL_DMA_IRQHandler(&hdma_tim2_ch1);
  212.           //     HAL_DMA_IRQHandler(&hdma_tim3_ch2);
  213.     //HAL_TIM_PWM_PulseFinishedCallback(&htim2);
  214.     //HAL_TIM_PWM_PulseFinishedCallback(&htim3);
  215.     /*
  216.     if(DMA_GetFlagStatus(DMA1_FLAG_TC4)==SET)
  217.         {
  218.             DMA_ClearFlag(DMA1_FLAG_TC4);
  219.         }
  220.         */
  221.     HAL_DMA_IRQHandler(htim2.hdma[TIM_DMA_ID_CC1]);
  222.     HAL_DMA_IRQHandler(htim3.hdma[TIM_DMA_ID_CC2]);
  223.   /* USER CODE BEGIN DMA1_Stream5_IRQn 1 */

  224.   /* USER CODE END DMA1_Stream5_IRQn 1 */
  225. }

  226. /**
  227.   * @brief This function handles TIM2 global interrupt.
  228.   */
  229. void TIM2_IRQHandler(void)
  230. {
  231.   /* USER CODE BEGIN TIM2_IRQn 0 */

  232.   /* USER CODE END TIM2_IRQn 0 */
  233.   HAL_TIM_IRQHandler(&htim2);
  234.   /* USER CODE BEGIN TIM2_IRQn 1 */

  235.   /* USER CODE END TIM2_IRQn 1 */
  236. }

  237. /**
  238.   * @brief This function handles TIM3 global interrupt.
  239.   */
  240. void TIM3_IRQHandler(void)
  241. {
  242.   /* USER CODE BEGIN TIM3_IRQn 0 */

  243.   /* USER CODE END TIM3_IRQn 0 */
  244.   HAL_TIM_IRQHandler(&htim3);
  245.   /* USER CODE BEGIN TIM3_IRQn 1 */

  246.   /* USER CODE END TIM3_IRQn 1 */
  247. }

  248. /* USER CODE BEGIN 1 */

  249. /* USER CODE END 1 */


 楼主| 慢醇 发表于 2022-2-26 23:44 | 显示全部楼层
msp.c
  1. /* USER CODE BEGIN Header */
  2. /**
  3.   ******************************************************************************
  4.   * @file         stm32f4xx_hal_msp.c
  5.   * @brief        This file provides code for the MSP Initialization
  6.   *               and de-Initialization codes.
  7.   ******************************************************************************
  8.   * @attention
  9.   *
  10.   * Copyright (c) 2021 STMicroelectronics.
  11.   * All rights reserved.
  12.   *
  13.   * This software is licensed under terms that can be found in the LICENSE file
  14.   * in the root directory of this software component.
  15.   * If no LICENSE file comes with this software, it is provided AS-IS.
  16.   *
  17.   ******************************************************************************
  18.   */
  19. /* USER CODE END Header */

  20. /* Includes ------------------------------------------------------------------*/
  21. #include "main.h"
  22. /* USER CODE BEGIN Includes */

  23. /* USER CODE END Includes */
  24. extern DMA_HandleTypeDef hdma_tim2_ch1;
  25. extern DMA_HandleTypeDef hdma_tim2_up_ch3;
  26. extern DMA_HandleTypeDef hdma_tim3_ch1_trig;
  27. extern DMA_HandleTypeDef hdma_tim3_ch2;

  28. /* Private typedef -----------------------------------------------------------*/
  29. /* USER CODE BEGIN TD */

  30. /* USER CODE END TD */

  31. /* Private define ------------------------------------------------------------*/
  32. /* USER CODE BEGIN Define */

  33. /* USER CODE END Define */

  34. /* Private macro -------------------------------------------------------------*/
  35. /* USER CODE BEGIN Macro */

  36. /* USER CODE END Macro */

  37. /* Private variables ---------------------------------------------------------*/
  38. /* USER CODE BEGIN PV */

  39. /* USER CODE END PV */

  40. /* Private function prototypes -----------------------------------------------*/
  41. /* USER CODE BEGIN PFP */

  42. /* USER CODE END PFP */

  43. /* External functions --------------------------------------------------------*/
  44. /* USER CODE BEGIN ExternalFunctions */

  45. /* USER CODE END ExternalFunctions */

  46. /* USER CODE BEGIN 0 */

  47. /* USER CODE END 0 */

  48. void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim);
  49.                                         /**
  50.   * Initializes the Global MSP.
  51.   */
  52. void HAL_MspInit(void)
  53. {
  54.   /* USER CODE BEGIN MspInit 0 */

  55.   /* USER CODE END MspInit 0 */

  56.   __HAL_RCC_SYSCFG_CLK_ENABLE();
  57.   __HAL_RCC_PWR_CLK_ENABLE();

  58.   /* System interrupt init*/

  59.   /* USER CODE BEGIN MspInit 1 */

  60.   /* USER CODE END MspInit 1 */
  61. }

  62. /**
  63. * @brief TIM_PWM MSP Initialization
  64. * This function configures the hardware resources used in this example
  65. * @param htim_pwm: TIM_PWM handle pointer
  66. * @retval None
  67. */
  68. void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef* htim_pwm)
  69. {
  70.   if(htim_pwm->Instance==TIM2)
  71.   {
  72.   /* USER CODE BEGIN TIM2_MspInit 0 */

  73.   /* USER CODE END TIM2_MspInit 0 */
  74.     /* Peripheral clock enable */
  75.     __HAL_RCC_TIM2_CLK_ENABLE();

  76.     /* TIM2 DMA Init */
  77.     /* TIM2_CH1 Init */
  78.     hdma_tim2_ch1.Instance = DMA1_Stream5;
  79.     hdma_tim2_ch1.Init.Channel = DMA_CHANNEL_3;
  80.     hdma_tim2_ch1.Init.Direction = DMA_MEMORY_TO_PERIPH;
  81.     hdma_tim2_ch1.Init.PeriphInc = DMA_PINC_DISABLE;
  82.     hdma_tim2_ch1.Init.MemInc = DMA_MINC_ENABLE;
  83.     hdma_tim2_ch1.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
  84.     hdma_tim2_ch1.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
  85.     hdma_tim2_ch1.Init.Mode = DMA_CIRCULAR;
  86.     hdma_tim2_ch1.Init.Priority = DMA_PRIORITY_LOW;
  87.     hdma_tim2_ch1.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
  88.     if (HAL_DMA_Init(&hdma_tim2_ch1) != HAL_OK)
  89.     {
  90.       Error_Handler();
  91.     }

  92.     __HAL_LINKDMA(htim_pwm,hdma[TIM_DMA_ID_CC1],hdma_tim2_ch1);
  93.     /*****************************20211217添加***************************************/
  94.     HAL_NVIC_SetPriority(DMA1_Stream5_IRQn, 0, 1);//使用中断可开启
  95.     HAL_NVIC_EnableIRQ(DMA1_Stream5_IRQn);
  96.     /*****************************20211217添加***************************************/

  97.     /* TIM2_UP_CH3 Init */
  98.     hdma_tim2_up_ch3.Instance = DMA1_Stream1;
  99.     hdma_tim2_up_ch3.Init.Channel = DMA_CHANNEL_3;
  100.     hdma_tim2_up_ch3.Init.Direction = DMA_MEMORY_TO_PERIPH;
  101.     hdma_tim2_up_ch3.Init.PeriphInc = DMA_PINC_DISABLE;
  102.     hdma_tim2_up_ch3.Init.MemInc = DMA_MINC_ENABLE;
  103.     hdma_tim2_up_ch3.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
  104.     hdma_tim2_up_ch3.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
  105.     hdma_tim2_up_ch3.Init.Mode = DMA_NORMAL;
  106.     hdma_tim2_up_ch3.Init.Priority = DMA_PRIORITY_LOW;
  107.     hdma_tim2_up_ch3.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
  108.     if (HAL_DMA_Init(&hdma_tim2_up_ch3) != HAL_OK)
  109.     {
  110.       Error_Handler();
  111.     }

  112.     /* Several peripheral DMA handle pointers point to the same DMA handle.
  113.      Be aware that there is only one stream to perform all the requested DMAs. */
  114.     __HAL_LINKDMA(htim_pwm,hdma[TIM_DMA_ID_UPDATE],hdma_tim2_up_ch3);
  115.     __HAL_LINKDMA(htim_pwm,hdma[TIM_DMA_ID_CC3],hdma_tim2_up_ch3);


  116.     /*****************************20211217添加***************************************/
  117.     HAL_NVIC_SetPriority(DMA1_Stream1_IRQn, 0, 1);//使用中断可开启
  118.     HAL_NVIC_EnableIRQ(DMA1_Stream1_IRQn);
  119.     /*****************************20211217添加***************************************/

  120.     /* TIM2 interrupt Init */
  121.     //HAL_NVIC_SetPriority(TIM2_IRQn, 0, 0);
  122.     //HAL_NVIC_EnableIRQ(TIM2_IRQn);
  123.   /* USER CODE BEGIN TIM2_MspInit 1 */

  124.   /* USER CODE END TIM2_MspInit 1 */
  125.   }
  126.   else if(htim_pwm->Instance==TIM3)
  127.   {
  128.   /* USER CODE BEGIN TIM3_MspInit 0 */

  129.   /* USER CODE END TIM3_MspInit 0 */
  130.     /* Peripheral clock enable */
  131.     __HAL_RCC_TIM3_CLK_ENABLE();

  132.     /* TIM3 DMA Init */
  133.     /* TIM3_CH1_TRIG Init */
  134.     hdma_tim3_ch1_trig.Instance = DMA1_Stream4;
  135.     hdma_tim3_ch1_trig.Init.Channel = DMA_CHANNEL_5;
  136.     hdma_tim3_ch1_trig.Init.Direction = DMA_MEMORY_TO_PERIPH;
  137.     hdma_tim3_ch1_trig.Init.PeriphInc = DMA_PINC_DISABLE;
  138.     hdma_tim3_ch1_trig.Init.MemInc = DMA_MINC_ENABLE;
  139.     hdma_tim3_ch1_trig.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
  140.     hdma_tim3_ch1_trig.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
  141.     hdma_tim3_ch1_trig.Init.Mode = DMA_NORMAL;
  142.     hdma_tim3_ch1_trig.Init.Priority = DMA_PRIORITY_LOW;
  143.     hdma_tim3_ch1_trig.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
  144.     if (HAL_DMA_Init(&hdma_tim3_ch1_trig) != HAL_OK)
  145.     {
  146.       Error_Handler();
  147.     }

  148.     /* Several peripheral DMA handle pointers point to the same DMA handle.
  149.      Be aware that there is only one stream to perform all the requested DMAs. */
  150.     __HAL_LINKDMA(htim_pwm,hdma[TIM_DMA_ID_CC1],hdma_tim3_ch1_trig);
  151.     __HAL_LINKDMA(htim_pwm,hdma[TIM_DMA_ID_TRIGGER],hdma_tim3_ch1_trig);

  152.     HAL_NVIC_SetPriority(DMA1_Stream4_IRQn, 0, 1);//使用中断可开启
  153.     HAL_NVIC_EnableIRQ(DMA1_Stream4_IRQn);


  154.     /* TIM3_CH2 Init */
  155.       hdma_tim3_ch2.Instance = DMA1_Stream5;
  156.       hdma_tim3_ch2.Init.Channel = DMA_CHANNEL_5;
  157.       hdma_tim3_ch2.Init.Direction = DMA_MEMORY_TO_PERIPH;
  158.       hdma_tim3_ch2.Init.PeriphInc = DMA_PINC_DISABLE;
  159.       hdma_tim3_ch2.Init.MemInc = DMA_MINC_ENABLE;
  160.       hdma_tim3_ch2.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
  161.       hdma_tim3_ch2.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
  162.       hdma_tim3_ch2.Init.Mode = DMA_CIRCULAR;
  163.       hdma_tim3_ch2.Init.Priority = DMA_PRIORITY_VERY_HIGH;
  164.       hdma_tim3_ch2.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
  165.       if (HAL_DMA_Init(&hdma_tim3_ch2) != HAL_OK)
  166.       {
  167.         Error_Handler();
  168.       }

  169.       __HAL_LINKDMA(htim_pwm,hdma[TIM_DMA_ID_CC2],hdma_tim3_ch2);

  170.       /* TIM3 interrupt Init */
  171.       //HAL_NVIC_SetPriority(TIM3_IRQn, 0, 0);
  172.       //HAL_NVIC_EnableIRQ(TIM3_IRQn);
  173.     /* USER CODE BEGIN TIM3_MspInit 1 */


  174.       /*****************************20211217添加***************************************/
  175.       HAL_NVIC_SetPriority(DMA1_Stream5_IRQn, 0, 1);//使用中断可开启
  176.       HAL_NVIC_EnableIRQ(DMA1_Stream5_IRQn);
  177.       /*****************************20211217添加***************************************/

  178.     /* USER CODE END TIM3_MspInit 1 */
  179.   }

  180. }

  181. void HAL_TIM_MspPostInit(TIM_HandleTypeDef* htim)
  182. {
  183.   GPIO_InitTypeDef GPIO_InitStruct = {0};
  184.   if(htim->Instance==TIM2)
  185.   {
  186.   /* USER CODE BEGIN TIM2_MspPostInit 0 */

  187.   /* USER CODE END TIM2_MspPostInit 0 */
  188.     __HAL_RCC_GPIOA_CLK_ENABLE();
  189.     /**TIM2 GPIO Configuration
  190.     PA0-WKUP     ------> TIM2_CH1
  191.     PA2     ------> TIM2_CH3
  192.     */
  193.     GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_2;
  194.     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  195.     GPIO_InitStruct.Pull = GPIO_NOPULL;
  196.     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  197.     GPIO_InitStruct.Alternate = GPIO_AF1_TIM2;
  198.     HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  199.   /* USER CODE BEGIN TIM2_MspPostInit 1 */

  200.   /* USER CODE END TIM2_MspPostInit 1 */
  201.   }
  202.   else if(htim->Instance==TIM3)
  203.   {
  204.   /* USER CODE BEGIN TIM3_MspPostInit 0 */

  205.   /* USER CODE END TIM3_MspPostInit 0 */

  206.     __HAL_RCC_GPIOA_CLK_ENABLE();
  207.     /**TIM3 GPIO Configuration
  208.     PA6     ------> TIM3_CH1
  209.     PA7     ------> TIM3_CH2
  210.     */
  211.     GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;
  212.     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  213.     GPIO_InitStruct.Pull = GPIO_NOPULL;
  214.     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  215.     GPIO_InitStruct.Alternate = GPIO_AF2_TIM3;
  216.     HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  217.   /* USER CODE BEGIN TIM3_MspPostInit 1 */

  218.   /* USER CODE END TIM3_MspPostInit 1 */
  219.   }

  220. }
  221. /**
  222. * @brief TIM_PWM MSP De-Initialization
  223. * This function freeze the hardware resources used in this example
  224. * @param htim_pwm: TIM_PWM handle pointer
  225. * @retval None
  226. */
  227. void HAL_TIM_PWM_MspDeInit(TIM_HandleTypeDef* htim_pwm)
  228. {
  229.   if(htim_pwm->Instance==TIM2)
  230.   {
  231.   /* USER CODE BEGIN TIM2_MspDeInit 0 */

  232.   /* USER CODE END TIM2_MspDeInit 0 */
  233.     /* Peripheral clock disable */
  234.     __HAL_RCC_TIM2_CLK_DISABLE();

  235.     /* TIM2 DMA DeInit */
  236.     HAL_DMA_DeInit(htim_pwm->hdma[TIM_DMA_ID_CC1]);
  237.     HAL_DMA_DeInit(htim_pwm->hdma[TIM_DMA_ID_UPDATE]);
  238.     HAL_DMA_DeInit(htim_pwm->hdma[TIM_DMA_ID_CC3]);

  239.     /* TIM2 interrupt DeInit */
  240.     HAL_NVIC_DisableIRQ(TIM2_IRQn);
  241.   /* USER CODE BEGIN TIM2_MspDeInit 1 */

  242.   /* USER CODE END TIM2_MspDeInit 1 */
  243.   }
  244.   else if(htim_pwm->Instance==TIM3)
  245.   {
  246.   /* USER CODE BEGIN TIM3_MspDeInit 0 */

  247.   /* USER CODE END TIM3_MspDeInit 0 */
  248.     /* Peripheral clock disable */
  249.     __HAL_RCC_TIM3_CLK_DISABLE();

  250.     /* TIM3 DMA DeInit */
  251.     HAL_DMA_DeInit(htim_pwm->hdma[TIM_DMA_ID_CC1]);
  252.     HAL_DMA_DeInit(htim_pwm->hdma[TIM_DMA_ID_TRIGGER]);
  253.     HAL_DMA_DeInit(htim_pwm->hdma[TIM_DMA_ID_CC4]);
  254.     HAL_DMA_DeInit(htim_pwm->hdma[TIM_DMA_ID_UPDATE]);

  255.     /* TIM3 interrupt DeInit */
  256.     HAL_NVIC_DisableIRQ(TIM3_IRQn);
  257.   /* USER CODE BEGIN TIM3_MspDeInit 1 */

  258.   /* USER CODE END TIM3_MspDeInit 1 */
  259.   }

  260. }

  261. /* USER CODE BEGIN 1 */

  262. /* USER CODE END 1 */


您需要登录后才可以回帖 登录 | 注册

本版积分规则

134

主题

1382

帖子

6

粉丝
快速回复 在线客服 返回列表 返回顶部