0. 概述
- 文本目标基于Cherryusb官方例程audio_v1_mic_speaker_multichan_template.c,底层对接STM32的内置ADC和PWM,实现录音和播放。
- 前面的文章已经详细讲述了ADC+DMA的配置. 这里重点讲PWM+DMA的配置. 我们的目的是用PWM作为DAC, 来播放音乐
- 为了达到这个目标,首先需要在STM32上调通PWM+DMA的测试, 比如输出单音信号(do 293Hz, so 440Hz).
- 通过听音, 以及逻辑分析抓波形的方式来进行分析
- 我们的开发板是STM32H750-ARTPI,环境是rt-thread+cherryusb
1. TIM12(TRGO)+TIM5(PWM)+DMA的CubeMX配置
这里先讲一个折腾过程中遇到的问题, 以了解这个问题的背景
- 最初, 我是用定时器级联+DMA+传输/半传输中断填充dma buffer实现播放音乐。TIM3设置为主定时器, TIM5设置为从定时器。具体来说,我用TIM3产生16kHz UG event,去触发TIM5的pwm(160kHz载波)。DMA设置的是TIM5,选择Circular mode。hdma_tim5_ch3.Init.Request = DMA_REQUEST_TIM5_CH3。我本来预期的是,每16kHz改变一次TIM5 pwm的占空比。实际情况是,每160kHz(每个pwm波形结束)都会改变占空比,这就有问题了。也就是说,每个DMA请求不是受TIM3 16kHz控制,而是受TIM5 160kHz控制,这肯定不对。
- 为了解决这个问题,我引入了DMA的同步机制,通过DMA请求同步定时器,来实现每16kHz改变一次占空比。我发现TIM5的DMA不接收TIM3的TRGO同步,它可以接收TIM12的TRGO,于是我开启了TIM12的TRGO,确实实现了效果。
- 这个时候重新审视发现,其实TIM3没有起到应有的作用,完全没有必要用。于是我去掉了TIM3,只用TIM5+TIM12。TIM5产生160kHz的PWM,TIM12产生16kHz的TRGO用于触发DMA请求,效果是一样的。
- 这一顿折腾的结果,就是下面给出的方案
CubeMX配置方法
TIM5选择内部时钟, 使能CH3-PWM(ARTPI-P2排针上PA2)
TIM5参数配置, Period配置1499(对应PWM频率=240MHz/1500=160kHz, 也就是载波频率),开启Auto-Reload功能,Pulse(也就是占空比)配置为750(50%占空比)。关于为什么选160kHz载波频率,后面有详细说明。
配置DMA后DMA中断使能默认开启。开启TIM5中断,虽然不确定是否需要,但是为了保险起见,还是开启了。(事实上从后面对HAL_TIM_PWM_Start_DMA函数的Trace分析来看,没有开启任何TIM的中断。因此这里没有必要打开TIM5的NVIC中断使能)
DMA配置,开启TIM5_CH3通道,选择Memory to Peripheral模式,使能循环模式,使能DMA请求同步定时器,选择TIM12_TRGO作为同步信号。
开启DMA Fifo,因为TIM5是32bits计数器,因此Data Width只能选择word,FiFo只能选择Full。选择Burst Size为4 beats,在Memory侧。
- 配置TIM12参数, 使能TRGO, 选择Update Event作为TRGO信号。period为14999,对应TRGO频率为240MHz/150000=16kHz。这个频率就是与UAC匹配的音频的采样率。
2. main.c程序关键点说明
- 特别注意, dac_buffer用于DMA改变TIM5的CCR3. 由于STM32H7的TIM5是32bits计数器, 因此CCR3是32bits的。因此dac_buffer的类型是uint32_t.
- 产生440Hz的正弦波, 采样频率是16kHz, 因此点数是16kHz/440Hz=36 pts
- sin_table也是uint32_t类型的
#define TONE_FREQ (440)
#define SIN_TABLE_SIZE (16000 / TONE_FREQ) /*16kHz/440Hz=36 pts*/
uint32_t sin_table[SIN_TABLE_SIZE];
USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint32_t dac_buffer[SIN_TABLE_SIZE * 2]; // Double buffer for DMA
static void generate_sin_table(void)
{
for (int i = 0; i < SIN_TABLE_SIZE; i++)
{
float angle = 2 * M_PI * i / SIN_TABLE_SIZE;
sin_table[i] = (uint32_t)((sin(angle)*0.95 + 1.0f) * 749.5f); // 12-bit DAC, 0-1499 range
}
}
static void fill_dac_buffer(void)
{
for (int i = 0; i < SIN_TABLE_SIZE; i++)
{
dac_buffer[i] = sin_table[i];
dac_buffer[i + SIN_TABLE_SIZE] = sin_table[i];
}
}
- TIM12用于同步DMA的request generator, 控制PWM改变CCR3的频率(对应音频采样率), 本例程需要为16kHz
- 由于TIM12挂在APB1上, 时钟频率=120x2=240MHz,因此产生16kHz的TRGO需要分频240MHz/16000=15000, 于是设置Prescaler=0, 即不分频。设置Period=14999,对应实际Period=14999+1=15000
htim12.Instance = TIM12;
htim12.Init.Prescaler = 0;
htim12.Init.CounterMode = TIM_COUNTERMODE_UP;
htim12.Init.Period = 14999;
htim12.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim12.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
if (HAL_TIM_Base_Init(&htim12) != HAL_OK)
{
Error_Handler();
}
- TIM5挂在APB2上, 时钟频率=120x2=240MHz, 因此产生160kHz的PWM需要分频240MHz/160000=1500, 于是设置Prescaler=0, 即不分频。设置Period=1499, 对应实际Period=1499+1=1500。
- 为什么需要160kHz频率?因为这个是PWM载波频率,需要不能被人耳听到,因此频率越高越好,实际只要大于44.1kHz人耳应该就听不到了。为了保险起见,这里取是16kHz的10倍,也就是160kHz,此时Period=1500,也就是PWM占空比的取值范围是0-1499,仍然有大于10bits的精度,这个可以产生比较好的音质了。
- 当然,如果降低160kHz到80kHz也是可以的,此时Period=3000, 占空比的取值范围是0-2999,有超过11bits的精度。
htim5.Instance = TIM5;
htim5.Init.Prescaler = 0;
htim5.Init.CounterMode = TIM_COUNTERMODE_UP;
htim5.Init.Period = 1499;
htim5.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim5.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
if (HAL_TIM_Base_Init(&htim5) != HAL_OK)
{
Error_Handler();
}
- TIM5 PWM模式的2个回调函数,分别如下。可以用于Circular DMA模式实现连续不断喂数据。
- 为了方便逻辑分析仪抓时序,我们初始化了一个GPIO,用于打点。
void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim)
{
if (htim->Instance == TIM5)
{
HAL_GPIO_TogglePin(GPIOG, GPIO_PIN_11);
}
}
void HAL_TIM_PWM_PulseFinishedHalfCpltCallback(TIM_HandleTypeDef *htim)
{
if (htim->Instance == TIM5)
{
HAL_GPIO_TogglePin(GPIOG, GPIO_PIN_11);
}
}
- 主函数
int ADC_TIM5_DMA_Init(void)
{
MX_DMA_Init();
MX_ADC1_Init();
MX_TIM2_Init();
MX_TIM5_Init();
MX_TIM12_Init();
generate_sin_table();
fill_dac_buffer();
adc_sem = rt_sem_create("adc_sem", 0, RT_IPC_FLAG_FIFO);
adc_thread = rt_thread_create("adc_thread",
adc_data_thread_entry,
RT_NULL,
4096,
20,
10);
rt_thread_startup(adc_thread);
HAL_TIM_Base_Start(&htim2);
HAL_TIM_Base_Start(&htim12);
HAL_ADC_Start_DMA(&hadc1, (uint32_t *)adc_buffer, ADC_BUFFER_SIZE * 2);
HAL_TIM_PWM_Start_DMA(&htim5, TIM_CHANNEL_3, (uint32_t *)dac_buffer, SIN_TABLE_SIZE * 2);
return 0;
}
INIT_APP_EXPORT(ADC_TIM5_DMA_Init);
- 发现了一个问题(bug),就是ADC的ClockPrescaler不能是ADC_CLOCK_ASYNC_DIV1, 必须用至少ADC_CLOCK_ASYNC_DIV2,否则工作异常。
- 虽然这个问题不属于PWM+DMA,但比较重要,不得不提醒一下。
hadc1.Instance = ADC1;
hadc1.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV2; /*这里ADC_CLOCK_ASYNC_DIV1输出异常, 必须用至少ADC_CLOCK_ASYNC_DIV2*/
hadc1.Init.Resolution = ADC_RESOLUTION_16B;
hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
hadc1.Init.LowPowerAutoWait = DISABLE;
hadc1.Init.ContinuousConvMode = DISABLE;
hadc1.Init.NbrOfConversion = 1;
hadc1.Init.DiscontinuousConvMode = DISABLE;
hadc1.Init.ExternalTrigConv = ADC_EXTERNALTRIG_T2_TRGO;
hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_RISING;
hadc1.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DMA_CIRCULAR;
hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED;
hadc1.Init.LeftBitShift = ADC_LEFTBITSHIFT_NONE;
hadc1.Init.OversamplingMode = DISABLE;
hadc1.Init.Oversampling.Ratio = 1;
if (HAL_ADC_Init(&hadc1) != HAL_OK)
{
Error_Handler();
}
3. 测试效果
测试293Hz频率ok(对应D调的do音)
测试440Hz频率ok(对应D调的so音)
这里的波形是293Hz的。我们设置DMA长度为2个sin完整波形的长度。PWM+DMA每遇到传输半完成,和传输完成中断,就会翻转一下GPIO。
因此GPIO翻转的时间=DMA点数x1/16kHz=(16kHz/293Hz)x(1/16kHz)=1/293Hz=3.413ms。这个与测试基本吻合。
可以看到PWM载波频率是160kHz,大约过10个点就改变一次占空比
4. 总结
- PWM + DMA播放音乐的方案,不能采用定时器级联的方案,主要是DMA搞不定。需要使用DMA request同步的方案。
- TIM5+TIM12的组合, 其中TIM5作为PWM, TIM12作为TRGO, 触发DMA的同步。
- TIM5频率配置为160kHz, 精度超过10bits。TIM5频率配置为16kHz。
- 需要特别注意,TIM5是32bits定时器,因此它的CCRx的数据位宽(包括DMA的数据位宽),都要使用32bits。
- 另外发现了一个ADC配置的bug,就是时钟prescaler不能使用1分频,最少必须2分频。
5. 附录1:几个关键文件内容
main.c
/* USER CODE BEGIN Header */
/**
******************************************************************************
* @file : main.c
* @brief : Main program body
******************************************************************************
* @attention
*
* Copyright (c) 2025 STMicroelectronics.
* All rights reserved.
*
* This software is licensed under terms that can be found in the LICENSE file
* in the root directory of this software component.
* If no LICENSE file comes with this software, it is provided AS-IS.
*
******************************************************************************
*/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "stdio.h"
/* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
/* USER CODE END PTD */
/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */
/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */
/* USER CODE END PM */
/* Private variables ---------------------------------------------------------*/
ADC_HandleTypeDef hadc1;
DMA_HandleTypeDef hdma_adc1;
TIM_HandleTypeDef htim2;
TIM_HandleTypeDef htim5;
TIM_HandleTypeDef htim12;
DMA_HandleTypeDef hdma_tim5_ch3;
UART_HandleTypeDef huart4;
/* USER CODE BEGIN PV */
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
void PeriphCommonClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_DMA_Init(void);
static void MX_UART4_Init(void);
static void MX_ADC1_Init(void);
static void MX_TIM2_Init(void);
static void MX_TIM5_Init(void);
static void MX_TIM12_Init(void);
/* USER CODE BEGIN PFP */
static int mpu_init(void);
/* USER CODE END PFP */
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
// Add before ADC_DAC_DMA_Init function
#define USB_NOCACHE_RAM_SECTION __attribute__((section(".noncacheable")))
#define USB_MEM_ALIGNX __attribute__((aligned(32)))
#define TONE_FREQ 293
#define SIN_TABLE_SIZE (16000 / TONE_FREQ) /*16kHz/293Hz=55 pts*/
#define ADC_BUFFER_SIZE 1024
#define ADC_BIG_BUFFER_SIZE (ADC_BUFFER_SIZE * 16)
#define M_PI 3.14159265358979323846
uint32_t sin_table[SIN_TABLE_SIZE];
USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint32_t dac_buffer[SIN_TABLE_SIZE * 2]; // Double buffer for DMA
USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint16_t adc_buffer[ADC_BUFFER_SIZE * 2]; // Double buffer for DMA
uint16_t adc_big_buffer[ADC_BIG_BUFFER_SIZE];
volatile uint32_t adc_buffer_index = 0;
volatile uint32_t TxCplt=0;
volatile uint32_t RxCplt=0;
static void generate_sin_table(void)
{
for (int i = 0; i < SIN_TABLE_SIZE; i++)
{
float angle = 2 * M_PI * i / SIN_TABLE_SIZE;
sin_table[i] = (uint32_t)((sin(angle)*0.95 + 1.0f) * 749.5f); // 12-bit DAC, 0-1499 range
}
}
static void fill_dac_buffer(void)
{
for (int i = 0; i < SIN_TABLE_SIZE; i++)
{
dac_buffer[i] = sin_table[i];
dac_buffer[i + SIN_TABLE_SIZE] = sin_table[i];
}
}
int fputc(int ch, FILE *f)
{
HAL_UART_Transmit(&huart4, (uint8_t *)&ch, 1, 0xFFFF);
return ch;
}
/* USER CODE END 0 */
/**
* @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();
/* Configure the peripherals common clocks */
PeriphCommonClock_Config();
/* USER CODE BEGIN SysInit */
mpu_init();
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_DMA_Init();
MX_UART4_Init();
MX_ADC1_Init();
MX_TIM2_Init();
MX_TIM5_Init();
MX_TIM12_Init();
/* USER CODE BEGIN 2 */
generate_sin_table();
fill_dac_buffer();
HAL_TIM_Base_Start(&htim2);
HAL_TIM_Base_Start(&htim12);
// HAL_DAC_Start_DMA(&hdac1, DAC_CHANNEL_2, (uint32_t *)dac_buffer, SIN_TABLE_SIZE * 2, DAC_ALIGN_12B_R);
HAL_ADC_Start_DMA(&hadc1, (uint32_t *)adc_buffer, ADC_BUFFER_SIZE * 2);
HAL_TIM_PWM_Start_DMA(&htim5, TIM_CHANNEL_3, (uint32_t *)dac_buffer, SIN_TABLE_SIZE * 2);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
printf("hello world!\n");
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
/**
* @brief System Clock Configuration
* @retval None
*/
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
/** Supply configuration update enable
*/
HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY);
/** Configure the main internal regulator output voltage
*/
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE0);
while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}
/** Initializes the RCC Oscillators according to the specified parameters
* in the RCC_OscInitTypeDef structure.
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI48|RCC_OSCILLATORTYPE_LSI
|RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.LSIState = RCC_LSI_ON;
RCC_OscInitStruct.HSI48State = RCC_HSI48_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLM = 5;
RCC_OscInitStruct.PLL.PLLN = 192;
RCC_OscInitStruct.PLL.PLLP = 2;
RCC_OscInitStruct.PLL.PLLQ = 2;
RCC_OscInitStruct.PLL.PLLR = 2;
RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_2;
RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;
RCC_OscInitStruct.PLL.PLLFRACN = 0;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Error_Handler();
}
/** Initializes the CPU, AHB and APB buses clocks
*/
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2
|RCC_CLOCKTYPE_D3PCLK1|RCC_CLOCKTYPE_D1PCLK1;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;
RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2;
RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2;
RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2;
RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK)
{
Error_Handler();
}
}
/**
* @brief Peripherals Common Clock Configuration
* @retval None
*/
void PeriphCommonClock_Config(void)
{
RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
/** Initializes the peripherals clock
*/
PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_FMC|RCC_PERIPHCLK_ADC
|RCC_PERIPHCLK_SDMMC|RCC_PERIPHCLK_SPI2
|RCC_PERIPHCLK_SPI4|RCC_PERIPHCLK_LTDC;
PeriphClkInitStruct.PLL2.PLL2M = 2;
PeriphClkInitStruct.PLL2.PLL2N = 64;
PeriphClkInitStruct.PLL2.PLL2P = 8;
PeriphClkInitStruct.PLL2.PLL2Q = 2;
PeriphClkInitStruct.PLL2.PLL2R = 4;
PeriphClkInitStruct.PLL2.PLL2RGE = RCC_PLL2VCIRANGE_3;
PeriphClkInitStruct.PLL2.PLL2VCOSEL = RCC_PLL2VCOWIDE;
PeriphClkInitStruct.PLL2.PLL2FRACN = 0;
PeriphClkInitStruct.PLL3.PLL3M = 5;
PeriphClkInitStruct.PLL3.PLL3N = 160;
PeriphClkInitStruct.PLL3.PLL3P = 8;
PeriphClkInitStruct.PLL3.PLL3Q = 8;
PeriphClkInitStruct.PLL3.PLL3R = 24;
PeriphClkInitStruct.PLL3.PLL3RGE = RCC_PLL3VCIRANGE_2;
PeriphClkInitStruct.PLL3.PLL3VCOSEL = RCC_PLL3VCOWIDE;
PeriphClkInitStruct.PLL3.PLL3FRACN = 0;
PeriphClkInitStruct.FmcClockSelection = RCC_FMCCLKSOURCE_PLL2;
PeriphClkInitStruct.SdmmcClockSelection = RCC_SDMMCCLKSOURCE_PLL2;
PeriphClkInitStruct.Spi123ClockSelection = RCC_SPI123CLKSOURCE_PLL3;
PeriphClkInitStruct.Spi45ClockSelection = RCC_SPI45CLKSOURCE_PLL3;
PeriphClkInitStruct.AdcClockSelection = RCC_ADCCLKSOURCE_PLL2;
if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
{
Error_Handler();
}
}
/**
* @brief ADC1 Initialization Function
* @param None
* @retval None
*/
static void MX_ADC1_Init(void)
{
/* USER CODE BEGIN ADC1_Init 0 */
/* USER CODE END ADC1_Init 0 */
ADC_MultiModeTypeDef multimode = {0};
ADC_ChannelConfTypeDef sConfig = {0};
/* USER CODE BEGIN ADC1_Init 1 */
/* USER CODE END ADC1_Init 1 */
/** Common config
*/
hadc1.Instance = ADC1;
hadc1.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1;
hadc1.Init.Resolution = ADC_RESOLUTION_16B;
hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
hadc1.Init.LowPowerAutoWait = DISABLE;
hadc1.Init.ContinuousConvMode = DISABLE;
hadc1.Init.NbrOfConversion = 1;
hadc1.Init.DiscontinuousConvMode = DISABLE;
hadc1.Init.ExternalTrigConv = ADC_EXTERNALTRIG_T2_TRGO;
hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_RISING;
hadc1.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DMA_CIRCULAR;
hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED;
hadc1.Init.LeftBitShift = ADC_LEFTBITSHIFT_NONE;
hadc1.Init.OversamplingMode = DISABLE;
hadc1.Init.Oversampling.Ratio = 1;
if (HAL_ADC_Init(&hadc1) != HAL_OK)
{
Error_Handler();
}
/** Configure the ADC multi-mode
*/
multimode.Mode = ADC_MODE_INDEPENDENT;
if (HAL_ADCEx_MultiModeConfigChannel(&hadc1, &multimode) != HAL_OK)
{
Error_Handler();
}
/** Configure Regular Channel
*/
sConfig.Channel = ADC_CHANNEL_1;
sConfig.Rank = ADC_REGULAR_RANK_1;
sConfig.SamplingTime = ADC_SAMPLETIME_8CYCLES_5;
sConfig.SingleDiff = ADC_SINGLE_ENDED;
sConfig.OffsetNumber = ADC_OFFSET_NONE;
sConfig.Offset = 0;
sConfig.OffsetSignedSaturation = DISABLE;
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN ADC1_Init 2 */
/* USER CODE END ADC1_Init 2 */
}
/**
* @brief TIM2 Initialization Function
* @param None
* @retval None
*/
static void MX_TIM2_Init(void)
{
/* USER CODE BEGIN TIM2_Init 0 */
/* USER CODE END TIM2_Init 0 */
TIM_ClockConfigTypeDef sClockSourceConfig = {0};
TIM_MasterConfigTypeDef sMasterConfig = {0};
/* USER CODE BEGIN TIM2_Init 1 */
/* USER CODE END TIM2_Init 1 */
htim2.Instance = TIM2;
htim2.Init.Prescaler = 0;
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = 14999;
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
{
Error_Handler();
}
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK)
{
Error_Handler();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN TIM2_Init 2 */
/* USER CODE END TIM2_Init 2 */
}
/**
* @brief TIM5 Initialization Function
* @param None
* @retval None
*/
static void MX_TIM5_Init(void)
{
/* USER CODE BEGIN TIM5_Init 0 */
/* USER CODE END TIM5_Init 0 */
TIM_ClockConfigTypeDef sClockSourceConfig = {0};
TIM_MasterConfigTypeDef sMasterConfig = {0};
TIM_OC_InitTypeDef sConfigOC = {0};
/* USER CODE BEGIN TIM5_Init 1 */
/* USER CODE END TIM5_Init 1 */
htim5.Instance = TIM5;
htim5.Init.Prescaler = 0;
htim5.Init.CounterMode = TIM_COUNTERMODE_UP;
htim5.Init.Period = 1499;
htim5.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim5.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
if (HAL_TIM_Base_Init(&htim5) != HAL_OK)
{
Error_Handler();
}
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
if (HAL_TIM_ConfigClockSource(&htim5, &sClockSourceConfig) != HAL_OK)
{
Error_Handler();
}
if (HAL_TIM_PWM_Init(&htim5) != HAL_OK)
{
Error_Handler();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim5, &sMasterConfig) != HAL_OK)
{
Error_Handler();
}
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 749;
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
if (HAL_TIM_PWM_ConfigChannel(&htim5, &sConfigOC, TIM_CHANNEL_3) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN TIM5_Init 2 */
/* USER CODE END TIM5_Init 2 */
HAL_TIM_MspPostInit(&htim5);
}
/**
* @brief TIM12 Initialization Function
* @param None
* @retval None
*/
static void MX_TIM12_Init(void)
{
/* USER CODE BEGIN TIM12_Init 0 */
/* USER CODE END TIM12_Init 0 */
TIM_ClockConfigTypeDef sClockSourceConfig = {0};
TIM_MasterConfigTypeDef sMasterConfig = {0};
/* USER CODE BEGIN TIM12_Init 1 */
/* USER CODE END TIM12_Init 1 */
htim12.Instance = TIM12;
htim12.Init.Prescaler = 0;
htim12.Init.CounterMode = TIM_COUNTERMODE_UP;
htim12.Init.Period = 14999;
htim12.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim12.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
if (HAL_TIM_Base_Init(&htim12) != HAL_OK)
{
Error_Handler();
}
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
if (HAL_TIM_ConfigClockSource(&htim12, &sClockSourceConfig) != HAL_OK)
{
Error_Handler();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim12, &sMasterConfig) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN TIM12_Init 2 */
/* USER CODE END TIM12_Init 2 */
}
/**
* @brief UART4 Initialization Function
* @param None
* @retval None
*/
static void MX_UART4_Init(void)
{
/* USER CODE BEGIN UART4_Init 0 */
/* USER CODE END UART4_Init 0 */
/* USER CODE BEGIN UART4_Init 1 */
/* USER CODE END UART4_Init 1 */
huart4.Instance = UART4;
huart4.Init.BaudRate = 115200;
huart4.Init.WordLength = UART_WORDLENGTH_8B;
huart4.Init.StopBits = UART_STOPBITS_1;
huart4.Init.Parity = UART_PARITY_NONE;
huart4.Init.Mode = UART_MODE_TX_RX;
huart4.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart4.Init.OverSampling = UART_OVERSAMPLING_16;
huart4.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
huart4.Init.ClockPrescaler = UART_PRESCALER_DIV1;
huart4.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
if (HAL_UART_Init(&huart4) != HAL_OK)
{
Error_Handler();
}
if (HAL_UARTEx_SetTxFifoThreshold(&huart4, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)
{
Error_Handler();
}
if (HAL_UARTEx_SetRxFifoThreshold(&huart4, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)
{
Error_Handler();
}
if (HAL_UARTEx_DisableFifoMode(&huart4) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN UART4_Init 2 */
/* USER CODE END UART4_Init 2 */
}
/**
* Enable DMA controller clock
*/
static void MX_DMA_Init(void)
{
/* DMA controller clock enable */
__HAL_RCC_DMA1_CLK_ENABLE();
/* DMA interrupt init */
/* DMA1_Stream0_IRQn interrupt configuration */
HAL_NVIC_SetPriority(DMA1_Stream0_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(DMA1_Stream0_IRQn);
/* DMA1_Stream1_IRQn interrupt configuration */
HAL_NVIC_SetPriority(DMA1_Stream1_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(DMA1_Stream1_IRQn);
/* DMAMUX1_OVR_IRQn interrupt configuration */
HAL_NVIC_SetPriority(DMAMUX1_OVR_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(DMAMUX1_OVR_IRQn);
}
/**
* @brief GPIO Initialization Function
* @param None
* @retval None
*/
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* USER CODE BEGIN MX_GPIO_Init_1 */
/* USER CODE END MX_GPIO_Init_1 */
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOK_CLK_ENABLE();
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOI_CLK_ENABLE();
__HAL_RCC_GPIOE_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
__HAL_RCC_GPIOG_CLK_ENABLE();
__HAL_RCC_GPIOJ_CLK_ENABLE();
__HAL_RCC_GPIOD_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOF_CLK_ENABLE();
__HAL_RCC_GPIOH_CLK_ENABLE();
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOG, GPIO_PIN_11, GPIO_PIN_RESET);
/*Configure GPIO pin : PG11 */
GPIO_InitStruct.Pin = GPIO_PIN_11;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);
/*Configure GPIO pin : PG14 */
GPIO_InitStruct.Pin = GPIO_PIN_14;
GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);
/*Configure GPIO pin : PA5 */
GPIO_InitStruct.Pin = GPIO_PIN_5;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* USER CODE BEGIN MX_GPIO_Init_2 */
/* USER CODE END MX_GPIO_Init_2 */
}
/* USER CODE BEGIN 4 */
int mpu_init(void)
{
MPU_Region_InitTypeDef MPU_InitStruct;
/* Disable the MPU */
HAL_MPU_Disable();
MPU_InitStruct.Enable = MPU_REGION_ENABLE;
MPU_InitStruct.BaseAddress = 0x00;
MPU_InitStruct.Size = MPU_REGION_SIZE_4GB;
MPU_InitStruct.AccessPermission = MPU_REGION_NO_ACCESS;
MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;
MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE;
MPU_InitStruct.IsShareable = MPU_ACCESS_SHAREABLE;
MPU_InitStruct.Number = MPU_REGION_NUMBER0;
MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
MPU_InitStruct.SubRegionDisable = 0x87;
MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_DISABLE;
/* Configure the MPU attributes as WT for AXI SRAM */
MPU_InitStruct.Enable = MPU_REGION_ENABLE;
MPU_InitStruct.BaseAddress = 0x24000000;
MPU_InitStruct.Size = MPU_REGION_SIZE_512KB;
MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;
MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;
MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
MPU_InitStruct.Number = MPU_REGION_NUMBER1;
MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
MPU_InitStruct.SubRegionDisable = 0X00;
MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
HAL_MPU_ConfigRegion(&MPU_InitStruct);
#ifdef BSP_USING_SDRAM
/* Configure the MPU attributes as WT for SDRAM */
MPU_InitStruct.Enable = MPU_REGION_ENABLE;
MPU_InitStruct.BaseAddress = 0xC0000000;
MPU_InitStruct.Size = MPU_REGION_SIZE_32MB;
MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;
MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;
MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
MPU_InitStruct.Number = MPU_REGION_NUMBER2;
MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
MPU_InitStruct.SubRegionDisable = 0x00;
MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
HAL_MPU_ConfigRegion(&MPU_InitStruct);
#endif
#ifdef BSP_USING_ETH_H750
/* Configure the MPU attributes as Device not cacheable
for ETH DMA descriptors and RX Buffers*/
MPU_InitStruct.Enable = MPU_REGION_ENABLE;
MPU_InitStruct.BaseAddress = 0x30040000;
MPU_InitStruct.Size = MPU_REGION_SIZE_32KB;
MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;
MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE;
MPU_InitStruct.IsShareable = MPU_ACCESS_SHAREABLE;
MPU_InitStruct.Number = MPU_REGION_NUMBER3;
MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL1;
MPU_InitStruct.SubRegionDisable = 0x00;
MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
HAL_MPU_ConfigRegion(&MPU_InitStruct);
#endif
/* Configure the MPU attributes as WT for QSPI */
MPU_InitStruct.Enable = MPU_REGION_ENABLE;
MPU_InitStruct.BaseAddress = 0x90000000;
MPU_InitStruct.Size = MPU_REGION_SIZE_8MB;
MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;
MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;
MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
MPU_InitStruct.Number = MPU_REGION_NUMBER4;
MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
MPU_InitStruct.SubRegionDisable = 0X00;
MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
HAL_MPU_ConfigRegion(&MPU_InitStruct);
/* Configure the MPU attributes for no-cache SRAM, used for cherryusb */
MPU_InitStruct.Enable = MPU_REGION_ENABLE;
MPU_InitStruct.BaseAddress = 0x24070000;
MPU_InitStruct.Size = MPU_REGION_SIZE_64KB;
MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;
MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE;
MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
MPU_InitStruct.Number = MPU_REGION_NUMBER5;
MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL1;
MPU_InitStruct.SubRegionDisable = 0X00;
MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
HAL_MPU_ConfigRegion(&MPU_InitStruct);
/* Enable the MPU */
HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);
SCB_EnableICache();
SCB_EnableDCache();
return 0;
}
void HAL_ADC_ConvHalfCpltCallback(ADC_HandleTypeDef* hadc)
{
}
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
TxCplt++;
// if(TxCplt>=2)
// {
// HAL_ADC_Stop_DMA(&hadc1);
// }
}
void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim)
{
if (htim->Instance == TIM5)
{
HAL_GPIO_TogglePin(GPIOG, GPIO_PIN_11);
}
}
void HAL_TIM_PWM_PulseFinishedHalfCpltCallback(TIM_HandleTypeDef *htim)
{
if (htim->Instance == TIM5)
{
HAL_GPIO_TogglePin(GPIOG, GPIO_PIN_11);
}
}
/* USER CODE END 4 */
/**
* @brief This function is executed in case of error occurrence.
* @retval None
*/
void Error_Handler(void)
{
/* USER CODE BEGIN Error_Handler_Debug */
/* User can add his own implementation to report the HAL error return state */
__disable_irq();
while (1)
{
}
/* USER CODE END Error_Handler_Debug */
}
#ifdef USE_FULL_ASSERT
/**
* @brief Reports the name of the source file and the source line number
* where the assert_param error has occurred.
* @param file: pointer to the source file name
* @param line: assert_param error line source number
* @retval None
*/
void assert_failed(uint8_t *file, uint32_t line)
{
/* USER CODE BEGIN 6 */
/* User can add his own implementation to report the file name and line number,
ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
/* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */
CubeMX_Config _my.sct
; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************
LR_IROM1 0x08000000 0x00020000 { ; load region size_region
ER_IROM1 0x08000000 0x00020000 { ; load address = execution address
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
.ANY (+XO)
}
RW_IRAM1 0x20000000 0x00020000 { ; RW data
.ANY (+RW +ZI)
}
RW_IRAM2 0x24000000 0x00080000 {
.ANY (+RW +ZI)
}
RW_IRAM_NOCACHE 0x24070000 0x00010000 { ; 64KB non-cacheable RAM
*.o (.noncacheable)
}
}
6. 附录2: CubeMX_Config.ioc
#MicroXplorer Configuration settings - do not modify
ADC1.Channel-0\#ChannelRegularConversion=ADC_CHANNEL_1
ADC1.ContinuousConvMode=DISABLE
ADC1.ConversionDataManagement=ADC_CONVERSIONDATA_DMA_CIRCULAR
ADC1.ExternalTrigConv=ADC_EXTERNALTRIG_T2_TRGO
ADC1.IPParameters=Rank-0\#ChannelRegularConversion,Channel-0\#ChannelRegularConversion,SamplingTime-0\#ChannelRegularConversion,OffsetNumber-0\#ChannelRegularConversion,OffsetSignedSaturation-0\#ChannelRegularConversion,NbrOfConversionFlag,master,ContinuousConvMode,ExternalTrigConv,ConversionDataManagement
ADC1.NbrOfConversionFlag=1
ADC1.OffsetNumber-0\#ChannelRegularConversion=ADC_OFFSET_NONE
ADC1.OffsetSignedSaturation-0\#ChannelRegularConversion=DISABLE
ADC1.Rank-0\#ChannelRegularConversion=1
ADC1.SamplingTime-0\#ChannelRegularConversion=ADC_SAMPLETIME_8CYCLES_5
ADC1.master=1
CAD.formats=
CAD.pinconfig=
CAD.provider=
CORTEX_M7.CPU_DCache=Disabled
CORTEX_M7.CPU_ICache=Disabled
CORTEX_M7.IPParameters=CPU_ICache,CPU_DCache
Dma.ADC1.0.Direction=DMA_PERIPH_TO_MEMORY
Dma.ADC1.0.EventEnable=DISABLE
Dma.ADC1.0.FIFOMode=DMA_FIFOMODE_ENABLE
Dma.ADC1.0.FIFOThreshold=DMA_FIFO_THRESHOLD_HALFFULL
Dma.ADC1.0.Instance=DMA1_Stream0
Dma.ADC1.0.MemBurst=DMA_MBURST_SINGLE
Dma.ADC1.0.MemDataAlignment=DMA_MDATAALIGN_HALFWORD
Dma.ADC1.0.MemInc=DMA_MINC_ENABLE
Dma.ADC1.0.Mode=DMA_CIRCULAR
Dma.ADC1.0.PeriphBurst=DMA_PBURST_INC4
Dma.ADC1.0.PeriphDataAlignment=DMA_PDATAALIGN_HALFWORD
Dma.ADC1.0.PeriphInc=DMA_PINC_DISABLE
Dma.ADC1.0.Polarity=HAL_DMAMUX_REQ_GEN_RISING
Dma.ADC1.0.Priority=DMA_PRIORITY_LOW
Dma.ADC1.0.RequestNumber=1
Dma.ADC1.0.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority,FIFOMode,FIFOThreshold,MemBurst,PeriphBurst,SignalID,Polarity,RequestNumber,SyncSignalID,SyncPolarity,SyncEnable,EventEnable,SyncRequestNumber
Dma.ADC1.0.SignalID=NONE
Dma.ADC1.0.SyncEnable=DISABLE
Dma.ADC1.0.SyncPolarity=HAL_DMAMUX_SYNC_NO_EVENT
Dma.ADC1.0.SyncRequestNumber=1
Dma.ADC1.0.SyncSignalID=NONE
Dma.Request0=ADC1
Dma.Request1=TIM5_CH3
Dma.RequestsNb=2
Dma.TIM5_CH3.1.Direction=DMA_MEMORY_TO_PERIPH
Dma.TIM5_CH3.1.EventEnable=DISABLE
Dma.TIM5_CH3.1.FIFOMode=DMA_FIFOMODE_ENABLE
Dma.TIM5_CH3.1.FIFOThreshold=DMA_FIFO_THRESHOLD_FULL
Dma.TIM5_CH3.1.Instance=DMA1_Stream1
Dma.TIM5_CH3.1.MemBurst=DMA_MBURST_INC4
Dma.TIM5_CH3.1.MemDataAlignment=DMA_MDATAALIGN_WORD
Dma.TIM5_CH3.1.MemInc=DMA_MINC_ENABLE
Dma.TIM5_CH3.1.Mode=DMA_CIRCULAR
Dma.TIM5_CH3.1.PeriphBurst=DMA_PBURST_SINGLE
Dma.TIM5_CH3.1.PeriphDataAlignment=DMA_PDATAALIGN_WORD
Dma.TIM5_CH3.1.PeriphInc=DMA_PINC_DISABLE
Dma.TIM5_CH3.1.Polarity=HAL_DMAMUX_REQ_GEN_RISING
Dma.TIM5_CH3.1.Priority=DMA_PRIORITY_LOW
Dma.TIM5_CH3.1.RequestNumber=1
Dma.TIM5_CH3.1.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority,FIFOMode,FIFOThreshold,MemBurst,PeriphBurst,SignalID,Polarity,RequestNumber,SyncSignalID,SyncPolarity,SyncEnable,EventEnable,SyncRequestNumber
Dma.TIM5_CH3.1.SignalID=NONE
Dma.TIM5_CH3.1.SyncEnable=ENABLE
Dma.TIM5_CH3.1.SyncPolarity=HAL_DMAMUX_SYNC_RISING
Dma.TIM5_CH3.1.SyncRequestNumber=1
Dma.TIM5_CH3.1.SyncSignalID=HAL_DMAMUX1_SYNC_TIM12_TRGO
File.Version=6
GPIO.groupedBy=
KeepUserPlacement=false
MMTAppRegionsCount=0
MMTConfigApplied=false
Mcu.CPN=STM32H750XBH6
Mcu.Family=STM32H7
Mcu.IP0=ADC1
Mcu.IP1=CORTEX_M7
Mcu.IP10=SDMMC2
Mcu.IP11=SPI2
Mcu.IP12=SPI4
Mcu.IP13=SYS
Mcu.IP14=TIM2
Mcu.IP15=TIM5
Mcu.IP16=TIM12
Mcu.IP17=UART4
Mcu.IP18=USART3
Mcu.IP19=USB_OTG_FS
Mcu.IP2=DMA
Mcu.IP3=FMC
Mcu.IP4=IWDG1
Mcu.IP5=LTDC
Mcu.IP6=MEMORYMAP
Mcu.IP7=NVIC
Mcu.IP8=RCC
Mcu.IP9=SDMMC1
Mcu.IPNb=20
Mcu.Name=STM32H750XBHx
Mcu.Package=TFBGA240
Mcu.Pin0=PK5
Mcu.Pin1=PC10
Mcu.Pin10=PI2
Mcu.Pin100=VP_IWDG1_VS_IWDG
Mcu.Pin101=VP_SYS_VS_Systick
Mcu.Pin102=VP_TIM2_VS_ClockSourceINT
Mcu.Pin103=VP_TIM5_VS_ClockSourceINT
Mcu.Pin104=VP_TIM12_VS_ClockSourceINT
Mcu.Pin105=VP_MEMORYMAP_VS_MEMORYMAP
Mcu.Pin11=PE2
Mcu.Pin12=PE0
Mcu.Pin13=PB3 (JTDO/TRACESWO)
Mcu.Pin14=PK6
Mcu.Pin15=PK3
Mcu.Pin16=PD7
Mcu.Pin17=PC12
Mcu.Pin18=PI3
Mcu.Pin19=PE5
Mcu.Pin2=PI1
Mcu.Pin20=PG15
Mcu.Pin21=PK7
Mcu.Pin22=PG14
Mcu.Pin23=PJ14
Mcu.Pin24=PJ12
Mcu.Pin25=PD2
Mcu.Pin26=PD0
Mcu.Pin27=PI9
Mcu.Pin28=PE6
Mcu.Pin29=PJ13
Mcu.Pin3=PE1
Mcu.Pin30=PD1
Mcu.Pin31=PC8
Mcu.Pin32=PC9
Mcu.Pin33=PA12
Mcu.Pin34=PA11
Mcu.Pin35=PG8
Mcu.Pin36=PF2
Mcu.Pin37=PF1
Mcu.Pin38=PF0
Mcu.Pin39=PG5
Mcu.Pin4=PB4 (NJTRST)
Mcu.Pin40=PI12
Mcu.Pin41=PI13
Mcu.Pin42=PI14
Mcu.Pin43=PF3
Mcu.Pin44=PG4
Mcu.Pin45=PG2
Mcu.Pin46=PK2
Mcu.Pin47=PH1-OSC_OUT (PH1)
Mcu.Pin48=PH0-OSC_IN (PH0)
Mcu.Pin49=PF5
Mcu.Pin5=PK4
Mcu.Pin50=PF4
Mcu.Pin51=PK0
Mcu.Pin52=PK1
Mcu.Pin53=PJ11
Mcu.Pin54=PJ10
Mcu.Pin55=PC2
Mcu.Pin56=PC3
Mcu.Pin57=PJ9
Mcu.Pin58=PA2
Mcu.Pin59=PA0
Mcu.Pin6=PG11
Mcu.Pin60=PJ0
Mcu.Pin61=PE10
Mcu.Pin62=PJ8
Mcu.Pin63=PJ7
Mcu.Pin64=PJ6
Mcu.Pin65=PH5
Mcu.Pin66=PI15
Mcu.Pin67=PJ1
Mcu.Pin68=PF13
Mcu.Pin69=PF14
Mcu.Pin7=PJ15
Mcu.Pin70=PE9
Mcu.Pin71=PE11
Mcu.Pin72=PB10
Mcu.Pin73=PB11
Mcu.Pin74=PD15
Mcu.Pin75=PD14
Mcu.Pin76=PF12
Mcu.Pin77=PF15
Mcu.Pin78=PE12
Mcu.Pin79=PE15
Mcu.Pin8=PD6
Mcu.Pin80=PJ5
Mcu.Pin81=PD11
Mcu.Pin82=PD12
Mcu.Pin83=PA1_C
Mcu.Pin84=PA5
Mcu.Pin85=PJ2
Mcu.Pin86=PF11
Mcu.Pin87=PG0
Mcu.Pin88=PE8
Mcu.Pin89=PE13
Mcu.Pin9=PC11
Mcu.Pin90=PB15
Mcu.Pin91=PD10
Mcu.Pin92=PD9
Mcu.Pin93=PJ3
Mcu.Pin94=PJ4
Mcu.Pin95=PG1
Mcu.Pin96=PE7
Mcu.Pin97=PE14
Mcu.Pin98=PB14
Mcu.Pin99=PD8
Mcu.PinsNb=106
Mcu.ThirdPartyNb=0
Mcu.UserConstants=
Mcu.UserName=STM32H750XBHx
MxCube.Version=6.14.1
MxDb.Version=DB.6.0.141
NVIC.ADC_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true
NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
NVIC.DMA1_Stream0_IRQn=true\:0\:0\:false\:false\:true\:false\:true\:true
NVIC.DMA1_Stream1_IRQn=true\:0\:0\:false\:false\:true\:false\:true\:true
NVIC.DMAMUX1_OVR_IRQn=true\:0\:0\:false\:false\:true\:false\:true\:true
NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
NVIC.ForceEnableDMAVector=true
NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
NVIC.MemoryManagement_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
NVIC.OTG_FS_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true
NVIC.PendSV_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
NVIC.PriorityGroup=NVIC_PRIORITYGROUP_4
NVIC.SDMMC1_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true
NVIC.SDMMC2_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true
NVIC.SPI2_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true
NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
NVIC.SysTick_IRQn=true\:0\:0\:false\:false\:true\:false\:true\:false
NVIC.TIM5_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true
NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
PA0.Locked=true
PA0.Mode=Asynchronous
PA0.Signal=UART4_TX
PA11.GPIOParameters=GPIO_Speed
PA11.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH
PA11.Mode=Device_Only
PA11.Signal=USB_OTG_FS_DM
PA12.GPIOParameters=GPIO_Speed
PA12.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH
PA12.Mode=Device_Only
PA12.Signal=USB_OTG_FS_DP
PA1_C.Locked=true
PA1_C.Signal=ADCx_INP1
PA2.Locked=true
PA2.Signal=S_TIM5_CH3
PA5.Locked=true
PA5.Signal=COMP_DAC12_group
PB10.Mode=Asynchronous
PB10.Signal=USART3_TX
PB11.Mode=Asynchronous
PB11.Signal=USART3_RX
PB14.Mode=SD_4_bits_Wide_bus
PB14.Signal=SDMMC2_D0
PB15.Mode=SD_4_bits_Wide_bus
PB15.Signal=SDMMC2_D1
PB3\ (JTDO/TRACESWO).Mode=SD_4_bits_Wide_bus
PB3\ (JTDO/TRACESWO).Signal=SDMMC2_D2
PB4\ (NJTRST).Mode=SD_4_bits_Wide_bus
PB4\ (NJTRST).Signal=SDMMC2_D3
PC10.Mode=SD_4_bits_Wide_bus
PC10.Signal=SDMMC1_D2
PC11.Mode=SD_4_bits_Wide_bus
PC11.Signal=SDMMC1_D3
PC12.Mode=SD_4_bits_Wide_bus
PC12.Signal=SDMMC1_CK
PC2.GPIOParameters=GPIO_Speed_High_Default
PC2.GPIO_Speed_High_Default=GPIO_SPEED_FREQ_VERY_HIGH
PC2.Mode=SdramChipSelect1_1
PC2.Signal=FMC_SDNE0
PC3.GPIOParameters=GPIO_Speed_High_Default
PC3.GPIO_Speed_High_Default=GPIO_SPEED_FREQ_VERY_HIGH
PC3.Mode=SdramChipSelect1_1
PC3.Signal=FMC_SDCKE0
PC8.Mode=SD_4_bits_Wide_bus
PC8.Signal=SDMMC1_D0
PC9.Mode=SD_4_bits_Wide_bus
PC9.Signal=SDMMC1_D1
PD0.GPIOParameters=GPIO_Speed_High_Default
PD0.GPIO_Speed_High_Default=GPIO_SPEED_FREQ_VERY_HIGH
PD0.Signal=FMC_D2_DA2
PD1.GPIOParameters=GPIO_Speed_High_Default
PD1.GPIO_Speed_High_Default=GPIO_SPEED_FREQ_VERY_HIGH
PD1.Signal=FMC_D3_DA3
PD10.GPIOParameters=GPIO_Speed_High_Default
PD10.GPIO_Speed_High_Default=GPIO_SPEED_FREQ_VERY_HIGH
PD10.Signal=FMC_D15_DA15
PD11.Mode=CTS_RTS
PD11.Signal=USART3_CTS
PD12.Mode=CTS_RTS
PD12.Signal=USART3_RTS
PD14.GPIOParameters=GPIO_Speed_High_Default
PD14.GPIO_Speed_High_Default=GPIO_SPEED_FREQ_VERY_HIGH
PD14.Signal=FMC_D0_DA0
PD15.GPIOParameters=GPIO_Speed_High_Default
PD15.GPIO_Speed_High_Default=GPIO_SPEED_FREQ_VERY_HIGH
PD15.Signal=FMC_D1_DA1
PD2.Mode=SD_4_bits_Wide_bus
PD2.Signal=SDMMC1_CMD
PD6.Mode=SD_4_bits_Wide_bus
PD6.Signal=SDMMC2_CK
PD7.Mode=SD_4_bits_Wide_bus
PD7.Signal=SDMMC2_CMD
PD8.GPIOParameters=GPIO_Speed_High_Default
PD8.GPIO_Speed_High_Default=GPIO_SPEED_FREQ_VERY_HIGH
PD8.Signal=FMC_D13_DA13
PD9.GPIOParameters=GPIO_Speed_High_Default
PD9.GPIO_Speed_High_Default=GPIO_SPEED_FREQ_VERY_HIGH
PD9.Signal=FMC_D14_DA14
PE0.GPIOParameters=GPIO_Speed_High_Default
PE0.GPIO_Speed_High_Default=GPIO_SPEED_FREQ_VERY_HIGH
PE0.Signal=FMC_NBL0
PE1.GPIOParameters=GPIO_Speed_High_Default
PE1.GPIO_Speed_High_Default=GPIO_SPEED_FREQ_VERY_HIGH
PE1.Signal=FMC_NBL1
PE10.GPIOParameters=GPIO_Speed_High_Default
PE10.GPIO_Speed_High_Default=GPIO_SPEED_FREQ_VERY_HIGH
PE10.Signal=FMC_D7_DA7
PE11.GPIOParameters=GPIO_Speed_High_Default
PE11.GPIO_Speed_High_Default=GPIO_SPEED_FREQ_VERY_HIGH
PE11.Signal=FMC_D8_DA8
PE12.GPIOParameters=GPIO_Speed_High_Default
PE12.GPIO_Speed_High_Default=GPIO_SPEED_FREQ_VERY_HIGH
PE12.Signal=FMC_D9_DA9
PE13.GPIOParameters=GPIO_Speed_High_Default
PE13.GPIO_Speed_High_Default=GPIO_SPEED_FREQ_VERY_HIGH
PE13.Signal=FMC_D10_DA10
PE14.GPIOParameters=GPIO_Speed_High_Default
PE14.GPIO_Speed_High_Default=GPIO_SPEED_FREQ_VERY_HIGH
PE14.Signal=FMC_D11_DA11
PE15.GPIOParameters=GPIO_Speed_High_Default
PE15.GPIO_Speed_High_Default=GPIO_SPEED_FREQ_VERY_HIGH
PE15.Signal=FMC_D12_DA12
PE2.GPIOParameters=GPIO_Speed
PE2.GPIO_Speed=GPIO_SPEED_FREQ_HIGH
PE2.Mode=Full_Duplex_Master
PE2.Signal=SPI4_SCK
PE5.GPIOParameters=GPIO_Speed
PE5.GPIO_Speed=GPIO_SPEED_FREQ_HIGH
PE5.Mode=Full_Duplex_Master
PE5.Signal=SPI4_MISO
PE6.GPIOParameters=GPIO_Speed
PE6.GPIO_Speed=GPIO_SPEED_FREQ_HIGH
PE6.Mode=Full_Duplex_Master
PE6.Signal=SPI4_MOSI
PE7.GPIOParameters=GPIO_Speed_High_Default
PE7.GPIO_Speed_High_Default=GPIO_SPEED_FREQ_VERY_HIGH
PE7.Signal=FMC_D4_DA4
PE8.GPIOParameters=GPIO_Speed_High_Default
PE8.GPIO_Speed_High_Default=GPIO_SPEED_FREQ_VERY_HIGH
PE8.Signal=FMC_D5_DA5
PE9.GPIOParameters=GPIO_Speed_High_Default
PE9.GPIO_Speed_High_Default=GPIO_SPEED_FREQ_VERY_HIGH
PE9.Signal=FMC_D6_DA6
PF0.GPIOParameters=GPIO_Speed_High_Default
PF0.GPIO_Speed_High_Default=GPIO_SPEED_FREQ_VERY_HIGH
PF0.Signal=FMC_A0
PF1.GPIOParameters=GPIO_Speed_High_Default
PF1.GPIO_Speed_High_Default=GPIO_SPEED_FREQ_VERY_HIGH
PF1.Signal=FMC_A1
PF11.GPIOParameters=GPIO_Speed_High_Default
PF11.GPIO_Speed_High_Default=GPIO_SPEED_FREQ_VERY_HIGH
PF11.Signal=FMC_SDNRAS
PF12.GPIOParameters=GPIO_Speed_High_Default
PF12.GPIO_Speed_High_Default=GPIO_SPEED_FREQ_VERY_HIGH
PF12.Signal=FMC_A6
PF13.GPIOParameters=GPIO_Speed_High_Default
PF13.GPIO_Speed_High_Default=GPIO_SPEED_FREQ_VERY_HIGH
PF13.Signal=FMC_A7
PF14.GPIOParameters=GPIO_Speed_High_Default
PF14.GPIO_Speed_High_Default=GPIO_SPEED_FREQ_VERY_HIGH
PF14.Signal=FMC_A8
PF15.GPIOParameters=GPIO_Speed_High_Default
PF15.GPIO_Speed_High_Default=GPIO_SPEED_FREQ_VERY_HIGH
PF15.Signal=FMC_A9
PF2.GPIOParameters=GPIO_Speed_High_Default
PF2.GPIO_Speed_High_Default=GPIO_SPEED_FREQ_VERY_HIGH
PF2.Signal=FMC_A2
PF3.GPIOParameters=GPIO_Speed_High_Default
PF3.GPIO_Speed_High_Default=GPIO_SPEED_FREQ_VERY_HIGH
PF3.Signal=FMC_A3
PF4.GPIOParameters=GPIO_Speed_High_Default
PF4.GPIO_Speed_High_Default=GPIO_SPEED_FREQ_VERY_HIGH
PF4.Signal=FMC_A4
PF5.GPIOParameters=GPIO_Speed_High_Default
PF5.GPIO_Speed_High_Default=GPIO_SPEED_FREQ_VERY_HIGH
PF5.Signal=FMC_A5
PG0.GPIOParameters=GPIO_Speed_High_Default
PG0.GPIO_Speed_High_Default=GPIO_SPEED_FREQ_VERY_HIGH
PG0.Signal=FMC_A10
PG1.GPIOParameters=GPIO_Speed_High_Default
PG1.GPIO_Speed_High_Default=GPIO_SPEED_FREQ_VERY_HIGH
PG1.Signal=FMC_A11
PG11.Locked=true
PG11.Signal=GPIO_Output
PG14.Locked=true
PG14.Signal=GPXTI14
PG15.GPIOParameters=GPIO_Speed_High_Default
PG15.GPIO_Speed_High_Default=GPIO_SPEED_FREQ_VERY_HIGH
PG15.Signal=FMC_SDNCAS
PG2.GPIOParameters=GPIO_Speed_High_Default
PG2.GPIO_Speed_High_Default=GPIO_SPEED_FREQ_VERY_HIGH
PG2.Signal=FMC_A12
PG4.GPIOParameters=GPIO_Speed_High_Default
PG4.GPIO_Speed_High_Default=GPIO_SPEED_FREQ_VERY_HIGH
PG4.Signal=FMC_A14_BA0
PG5.GPIOParameters=GPIO_Speed_High_Default
PG5.GPIO_Speed_High_Default=GPIO_SPEED_FREQ_VERY_HIGH
PG5.Signal=FMC_A15_BA1
PG8.GPIOParameters=GPIO_Speed_High_Default
PG8.GPIO_Speed_High_Default=GPIO_SPEED_FREQ_VERY_HIGH
PG8.Signal=FMC_SDCLK
PH0-OSC_IN\ (PH0).Mode=HSE-External-Oscillator
PH0-OSC_IN\ (PH0).Signal=RCC_OSC_IN
PH1-OSC_OUT\ (PH1).Mode=HSE-External-Oscillator
PH1-OSC_OUT\ (PH1).Signal=RCC_OSC_OUT
PH5.GPIOParameters=GPIO_Speed_High_Default
PH5.GPIO_Speed_High_Default=GPIO_SPEED_FREQ_VERY_HIGH
PH5.Locked=true
PH5.Signal=FMC_SDNWE
PI1.GPIOParameters=GPIO_Speed
PI1.GPIO_Speed=GPIO_SPEED_FREQ_HIGH
PI1.Mode=Full_Duplex_Master
PI1.Signal=SPI2_SCK
PI12.GPIOParameters=GPIO_Speed
PI12.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH
PI12.Locked=true
PI12.Mode=RGB888
PI12.Signal=LTDC_HSYNC
PI13.GPIOParameters=GPIO_Speed
PI13.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH
PI13.Locked=true
PI13.Mode=RGB888
PI13.Signal=LTDC_VSYNC
PI14.GPIOParameters=GPIO_Speed
PI14.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH
PI14.Locked=true
PI14.Mode=RGB888
PI14.Signal=LTDC_CLK
PI15.GPIOParameters=GPIO_Speed
PI15.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH
PI15.Locked=true
PI15.Mode=RGB888
PI15.Signal=LTDC_R0
PI2.GPIOParameters=GPIO_Speed
PI2.GPIO_Speed=GPIO_SPEED_FREQ_HIGH
PI2.Mode=Full_Duplex_Master
PI2.Signal=SPI2_MISO
PI3.GPIOParameters=GPIO_Speed
PI3.GPIO_Speed=GPIO_SPEED_FREQ_HIGH
PI3.Mode=Full_Duplex_Master
PI3.Signal=SPI2_MOSI
PI9.Locked=true
PI9.Mode=Asynchronous
PI9.Signal=UART4_RX
PJ0.GPIOParameters=GPIO_Speed
PJ0.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH
PJ0.Mode=RGB888
PJ0.Signal=LTDC_R1
PJ1.GPIOParameters=GPIO_Speed
PJ1.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH
PJ1.Mode=RGB888
PJ1.Signal=LTDC_R2
PJ10.GPIOParameters=GPIO_Speed
PJ10.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH
PJ10.Locked=true
PJ10.Mode=RGB888
PJ10.Signal=LTDC_G3
PJ11.GPIOParameters=GPIO_Speed
PJ11.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH
PJ11.Locked=true
PJ11.Mode=RGB888
PJ11.Signal=LTDC_G4
PJ12.GPIOParameters=GPIO_Speed
PJ12.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH
PJ12.Locked=true
PJ12.Mode=RGB888
PJ12.Signal=LTDC_B0
PJ13.GPIOParameters=GPIO_Speed
PJ13.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH
PJ13.Locked=true
PJ13.Mode=RGB888
PJ13.Signal=LTDC_B1
PJ14.GPIOParameters=GPIO_Speed
PJ14.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH
PJ14.Mode=RGB888
PJ14.Signal=LTDC_B2
PJ15.GPIOParameters=GPIO_Speed
PJ15.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH
PJ15.Mode=RGB888
PJ15.Signal=LTDC_B3
PJ2.GPIOParameters=GPIO_Speed
PJ2.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH
PJ2.Locked=true
PJ2.Mode=RGB888
PJ2.Signal=LTDC_R3
PJ3.GPIOParameters=GPIO_Speed
PJ3.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH
PJ3.Locked=true
PJ3.Mode=RGB888
PJ3.Signal=LTDC_R4
PJ4.GPIOParameters=GPIO_Speed
PJ4.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH
PJ4.Locked=true
PJ4.Mode=RGB888
PJ4.Signal=LTDC_R5
PJ5.GPIOParameters=GPIO_Speed
PJ5.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH
PJ5.Locked=true
PJ5.Mode=RGB888
PJ5.Signal=LTDC_R6
PJ6.GPIOParameters=GPIO_Speed
PJ6.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH
PJ6.Locked=true
PJ6.Mode=RGB888
PJ6.Signal=LTDC_R7
PJ7.GPIOParameters=GPIO_Speed
PJ7.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH
PJ7.Mode=RGB888
PJ7.Signal=LTDC_G0
PJ8.GPIOParameters=GPIO_Speed
PJ8.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH
PJ8.Mode=RGB888
PJ8.Signal=LTDC_G1
PJ9.GPIOParameters=GPIO_Speed
PJ9.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH
PJ9.Locked=true
PJ9.Mode=RGB888
PJ9.Signal=LTDC_G2
PK0.GPIOParameters=GPIO_Speed
PK0.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH
PK0.Locked=true
PK0.Mode=RGB888
PK0.Signal=LTDC_G5
PK1.GPIOParameters=GPIO_Speed
PK1.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH
PK1.Locked=true
PK1.Mode=RGB888
PK1.Signal=LTDC_G6
PK2.GPIOParameters=GPIO_Speed
PK2.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH
PK2.Locked=true
PK2.Mode=RGB888
PK2.Signal=LTDC_G7
PK3.GPIOParameters=GPIO_Speed
PK3.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH
PK3.Locked=true
PK3.Mode=RGB888
PK3.Signal=LTDC_B4
PK4.GPIOParameters=GPIO_Speed
PK4.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH
PK4.Locked=true
PK4.Mode=RGB888
PK4.Signal=LTDC_B5
PK5.GPIOParameters=GPIO_Speed
PK5.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH
PK5.Locked=true
PK5.Mode=RGB888
PK5.Signal=LTDC_B6
PK6.GPIOParameters=GPIO_Speed
PK6.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH
PK6.Locked=true
PK6.Mode=RGB888
PK6.Signal=LTDC_B7
PK7.GPIOParameters=GPIO_Speed
PK7.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH
PK7.Mode=RGB888
PK7.Signal=LTDC_DE
PinOutPanel.CurrentBGAView=Top
PinOutPanel.RotationAngle=0
ProjectManager.AskForMigrate=true
ProjectManager.BackupPrevious=false
ProjectManager.CompilerLinker=GCC
ProjectManager.CompilerOptimize=6
ProjectManager.ComputerToolchain=false
ProjectManager.CoupleFile=false
ProjectManager.CustomerFirmwarePackage=C\:\\Users\\Administrator\\STM32Cube\\Repository\\STM32Cube_FW_H7_V1.9.1
ProjectManager.DefaultFWLocation=false
ProjectManager.DeletePrevious=true
ProjectManager.DeviceId=STM32H750XBHx
ProjectManager.FirmwarePackage=STM32Cube FW_H7 V1.12.1
ProjectManager.FreePins=false
ProjectManager.HalAssertFull=false
ProjectManager.HeapSize=0x200
ProjectManager.KeepUserCode=true
ProjectManager.LastFirmware=false
ProjectManager.LibraryCopy=1
ProjectManager.MainLocation=Core/Src
ProjectManager.NoMain=false
ProjectManager.PreviousToolchain=
ProjectManager.ProjectBuild=false
ProjectManager.ProjectFileName=CubeMX_Config.ioc
ProjectManager.ProjectName=CubeMX_Config
ProjectManager.ProjectStructure=
ProjectManager.RegisterCallBack=
ProjectManager.StackSize=0x400
ProjectManager.TargetToolchain=MDK-ARM V5.27
ProjectManager.ToolChainLocation=
ProjectManager.UAScriptAfterPath=
ProjectManager.UAScriptBeforePath=
ProjectManager.UnderRoot=false
ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-SystemClock_Config-RCC-false-HAL-false,3-MX_DMA_Init-DMA-false-HAL-true,4-MX_FMC_Init-FMC-false-HAL-true,5-MX_LTDC_Init-LTDC-false-HAL-true,6-MX_SDMMC1_SD_Init-SDMMC1-false-HAL-true,7-MX_SDMMC2_SD_Init-SDMMC2-false-HAL-true,8-MX_SPI4_Init-SPI4-false-HAL-true,9-MX_UART4_Init-UART4-false-HAL-true,10-MX_USART3_UART_Init-USART3-false-HAL-true,11-MX_USB_OTG_FS_PCD_Init-USB_OTG_FS-false-HAL-true,12-MX_IWDG1_Init-IWDG1-false-HAL-true,13-MX_SPI2_Init-SPI2-false-HAL-true,14-MX_ADC1_Init-ADC1-false-HAL-true,15-MX_TIM2_Init-TIM2-false-HAL-true,16-MX_TIM5_Init-TIM5-false-HAL-true,17-MX_TIM3_Init-TIM3-false-HAL-true,18-MX_TIM12_Init-TIM12-false-HAL-true,0-MX_CORTEX_M7_Init-CORTEX_M7-false-HAL-true
RCC.ADCFreq_Value=100000000
RCC.AHB12Freq_Value=240000000
RCC.AHB4Freq_Value=240000000
RCC.APB1Freq_Value=120000000
RCC.APB2Freq_Value=120000000
RCC.APB3Freq_Value=120000000
RCC.APB4Freq_Value=120000000
RCC.AXIClockFreq_Value=240000000
RCC.CECFreq_Value=32000
RCC.CKPERFreq_Value=64000000
RCC.CortexFreq_Value=480000000
RCC.CpuClockFreq_Value=480000000
RCC.D1CPREFreq_Value=480000000
RCC.D1PPRE=RCC_APB3_DIV2
RCC.D2PPRE1=RCC_APB1_DIV2
RCC.D2PPRE2=RCC_APB2_DIV2
RCC.D3PPRE=RCC_APB4_DIV2
RCC.DFSDMACLkFreq_Value=480000000
RCC.DFSDMFreq_Value=120000000
RCC.DIVM1=5
RCC.DIVM2=2
RCC.DIVM3=5
RCC.DIVN1=192
RCC.DIVN2=64
RCC.DIVN3=160
RCC.DIVP1Freq_Value=480000000
RCC.DIVP2=8
RCC.DIVP2Freq_Value=100000000
RCC.DIVP3=8
RCC.DIVP3Freq_Value=100000000
RCC.DIVQ1Freq_Value=480000000
RCC.DIVQ2Freq_Value=400000000
RCC.DIVQ3=8
RCC.DIVQ3Freq_Value=100000000
RCC.DIVR1Freq_Value=480000000
RCC.DIVR2=4
RCC.DIVR2Freq_Value=200000000
RCC.DIVR3=24
RCC.DIVR3Freq_Value=33333333.333333332
RCC.FDCANFreq_Value=480000000
RCC.FMCCLockSelection=RCC_FMCCLKSOURCE_PLL2
RCC.FMCFreq_Value=200000000
RCC.FamilyName=M
RCC.HCLK3ClockFreq_Value=240000000
RCC.HCLKFreq_Value=240000000
RCC.HPRE=RCC_HCLK_DIV2
RCC.HRTIMFreq_Value=240000000
RCC.I2C123Freq_Value=120000000
RCC.I2C4Freq_Value=120000000
RCC.IPParameters=ADCFreq_Value,AHB12Freq_Value,AHB4Freq_Value,APB1Freq_Value,APB2Freq_Value,APB3Freq_Value,APB4Freq_Value,AXIClockFreq_Value,CECFreq_Value,CKPERFreq_Value,CortexFreq_Value,CpuClockFreq_Value,D1CPREFreq_Value,D1PPRE,D2PPRE1,D2PPRE2,D3PPRE,DFSDMACLkFreq_Value,DFSDMFreq_Value,DIVM1,DIVM2,DIVM3,DIVN1,DIVN2,DIVN3,DIVP1Freq_Value,DIVP2,DIVP2Freq_Value,DIVP3,DIVP3Freq_Value,DIVQ1Freq_Value,DIVQ2Freq_Value,DIVQ3,DIVQ3Freq_Value,DIVR1Freq_Value,DIVR2,DIVR2Freq_Value,DIVR3,DIVR3Freq_Value,FDCANFreq_Value,FMCCLockSelection,FMCFreq_Value,FamilyName,HCLK3ClockFreq_Value,HCLKFreq_Value,HPRE,HRTIMFreq_Value,I2C123Freq_Value,I2C4Freq_Value,LPTIM1Freq_Value,LPTIM2Freq_Value,LPTIM345Freq_Value,LPUART1Freq_Value,LTDCFreq_Value,MCO1PinFreq_Value,MCO2PinFreq_Value,PLL2FRACN,PLL3FRACN,PLLFRACN,PLLSourceVirtual,QSPIFreq_Value,RNGFreq_Value,RTCFreq_Value,SAI1Freq_Value,SAI23Freq_Value,SAI4AFreq_Value,SAI4BFreq_Value,SDMMC1CLockSelection,SDMMCFreq_Value,SPDIFRXFreq_Value,SPI123CLockSelection,SPI123Freq_Value,SPI45Freq_Value,SPI6Freq_Value,SWPMI1Freq_Value,SYSCLKFreq_VALUE,SYSCLKSource,Spi45ClockSelection,Tim1OutputFreq_Value,Tim2OutputFreq_Value,TraceFreq_Value,USART16Freq_Value,USART234578Freq_Value,USBCLockSelection,USBFreq_Value,VCO1OutputFreq_Value,VCO2OutputFreq_Value,VCO3OutputFreq_Value,VCOInput1Freq_Value,VCOInput2Freq_Value,VCOInput3Freq_Value
RCC.LPTIM1Freq_Value=120000000
RCC.LPTIM2Freq_Value=120000000
RCC.LPTIM345Freq_Value=120000000
RCC.LPUART1Freq_Value=120000000
RCC.LTDCFreq_Value=33333333.333333332
RCC.MCO1PinFreq_Value=64000000
RCC.MCO2PinFreq_Value=480000000
RCC.PLL2FRACN=0
RCC.PLL3FRACN=0
RCC.PLLFRACN=0
RCC.PLLSourceVirtual=RCC_PLLSOURCE_HSE
RCC.QSPIFreq_Value=240000000
RCC.RNGFreq_Value=48000000
RCC.RTCFreq_Value=32000
RCC.SAI1Freq_Value=480000000
RCC.SAI23Freq_Value=480000000
RCC.SAI4AFreq_Value=480000000
RCC.SAI4BFreq_Value=480000000
RCC.SDMMC1CLockSelection=RCC_SDMMCCLKSOURCE_PLL2
RCC.SDMMCFreq_Value=200000000
RCC.SPDIFRXFreq_Value=480000000
RCC.SPI123CLockSelection=RCC_SPI123CLKSOURCE_PLL3
RCC.SPI123Freq_Value=100000000
RCC.SPI45Freq_Value=100000000
RCC.SPI6Freq_Value=120000000
RCC.SWPMI1Freq_Value=120000000
RCC.SYSCLKFreq_VALUE=480000000
RCC.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK
RCC.Spi45ClockSelection=RCC_SPI45CLKSOURCE_PLL3
RCC.Tim1OutputFreq_Value=240000000
RCC.Tim2OutputFreq_Value=240000000
RCC.TraceFreq_Value=64000000
RCC.USART16Freq_Value=120000000
RCC.USART234578Freq_Value=120000000
RCC.USBCLockSelection=RCC_USBCLKSOURCE_HSI48
RCC.USBFreq_Value=48000000
RCC.VCO1OutputFreq_Value=960000000
RCC.VCO2OutputFreq_Value=800000000
RCC.VCO3OutputFreq_Value=800000000
RCC.VCOInput1Freq_Value=5000000
RCC.VCOInput2Freq_Value=12500000
RCC.VCOInput3Freq_Value=5000000
SH.ADCx_INP1.0=ADC1_INP1,IN1-Single-Ended
SH.ADCx_INP1.ConfNb=1
SH.COMP_DAC12_group.0=DAC1_OUT2
SH.COMP_DAC12_group.ConfNb=1
SH.FMC_A0.0=FMC_A0,13b-sda1
SH.FMC_A0.ConfNb=1
SH.FMC_A1.0=FMC_A1,13b-sda1
SH.FMC_A1.ConfNb=1
SH.FMC_A10.0=FMC_A10,13b-sda1
SH.FMC_A10.ConfNb=1
SH.FMC_A11.0=FMC_A11,13b-sda1
SH.FMC_A11.ConfNb=1
SH.FMC_A12.0=FMC_A12,13b-sda1
SH.FMC_A12.ConfNb=1
SH.FMC_A14_BA0.0=FMC_BA0,FourSdramBanks1
SH.FMC_A14_BA0.ConfNb=1
SH.FMC_A15_BA1.0=FMC_BA1,FourSdramBanks1
SH.FMC_A15_BA1.ConfNb=1
SH.FMC_A2.0=FMC_A2,13b-sda1
SH.FMC_A2.ConfNb=1
SH.FMC_A3.0=FMC_A3,13b-sda1
SH.FMC_A3.ConfNb=1
SH.FMC_A4.0=FMC_A4,13b-sda1
SH.FMC_A4.ConfNb=1
SH.FMC_A5.0=FMC_A5,13b-sda1
SH.FMC_A5.ConfNb=1
SH.FMC_A6.0=FMC_A6,13b-sda1
SH.FMC_A6.ConfNb=1
SH.FMC_A7.0=FMC_A7,13b-sda1
SH.FMC_A7.ConfNb=1
SH.FMC_A8.0=FMC_A8,13b-sda1
SH.FMC_A8.ConfNb=1
SH.FMC_A9.0=FMC_A9,13b-sda1
SH.FMC_A9.ConfNb=1
SH.FMC_D0_DA0.0=FMC_D0,sd-16b-d1
SH.FMC_D0_DA0.ConfNb=1
SH.FMC_D10_DA10.0=FMC_D10,sd-16b-d1
SH.FMC_D10_DA10.ConfNb=1
SH.FMC_D11_DA11.0=FMC_D11,sd-16b-d1
SH.FMC_D11_DA11.ConfNb=1
SH.FMC_D12_DA12.0=FMC_D12,sd-16b-d1
SH.FMC_D12_DA12.ConfNb=1
SH.FMC_D13_DA13.0=FMC_D13,sd-16b-d1
SH.FMC_D13_DA13.ConfNb=1
SH.FMC_D14_DA14.0=FMC_D14,sd-16b-d1
SH.FMC_D14_DA14.ConfNb=1
SH.FMC_D15_DA15.0=FMC_D15,sd-16b-d1
SH.FMC_D15_DA15.ConfNb=1
SH.FMC_D1_DA1.0=FMC_D1,sd-16b-d1
SH.FMC_D1_DA1.ConfNb=1
SH.FMC_D2_DA2.0=FMC_D2,sd-16b-d1
SH.FMC_D2_DA2.ConfNb=1
SH.FMC_D3_DA3.0=FMC_D3,sd-16b-d1
SH.FMC_D3_DA3.ConfNb=1
SH.FMC_D4_DA4.0=FMC_D4,sd-16b-d1
SH.FMC_D4_DA4.ConfNb=1
SH.FMC_D5_DA5.0=FMC_D5,sd-16b-d1
SH.FMC_D5_DA5.ConfNb=1
SH.FMC_D6_DA6.0=FMC_D6,sd-16b-d1
SH.FMC_D6_DA6.ConfNb=1
SH.FMC_D7_DA7.0=FMC_D7,sd-16b-d1
SH.FMC_D7_DA7.ConfNb=1
SH.FMC_D8_DA8.0=FMC_D8,sd-16b-d1
SH.FMC_D8_DA8.ConfNb=1
SH.FMC_D9_DA9.0=FMC_D9,sd-16b-d1
SH.FMC_D9_DA9.ConfNb=1
SH.FMC_NBL0.0=FMC_NBL0,Sd2ByteEnable1
SH.FMC_NBL0.ConfNb=1
SH.FMC_NBL1.0=FMC_NBL1,Sd2ByteEnable1
SH.FMC_NBL1.ConfNb=1
SH.FMC_SDCLK.0=FMC_SDCLK,13b-sda1
SH.FMC_SDCLK.ConfNb=1
SH.FMC_SDNCAS.0=FMC_SDNCAS,13b-sda1
SH.FMC_SDNCAS.ConfNb=1
SH.FMC_SDNRAS.0=FMC_SDNRAS,13b-sda1
SH.FMC_SDNRAS.ConfNb=1
SH.FMC_SDNWE.0=FMC_SDNWE,13b-sda1
SH.FMC_SDNWE.ConfNb=1
SH.GPXTI14.0=GPIO_EXTI14
SH.GPXTI14.ConfNb=1
SH.S_TIM5_CH3.0=TIM5_CH3,PWM Generation3 CH3
SH.S_TIM5_CH3.ConfNb=1
SPI2.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_2
SPI2.CLKPolarity=SPI_POLARITY_LOW
SPI2.CalculateBaudRate=50.0 MBits/s
SPI2.Direction=SPI_DIRECTION_2LINES
SPI2.IPParameters=VirtualType,Mode,Direction,CalculateBaudRate,BaudRatePrescaler,CLKPolarity
SPI2.Mode=SPI_MODE_MASTER
SPI2.VirtualType=VM_MASTER
SPI4.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_2
SPI4.CalculateBaudRate=50.0 MBits/s
SPI4.Direction=SPI_DIRECTION_2LINES
SPI4.IPParameters=VirtualType,Mode,Direction,CalculateBaudRate,BaudRatePrescaler
SPI4.Mode=SPI_MODE_MASTER
SPI4.VirtualType=VM_MASTER
TIM12.IPParameters=Period,TIM_MasterOutputTrigger
TIM12.Period=14999
TIM12.TIM_MasterOutputTrigger=TIM_TRGO_UPDATE
TIM2.IPParameters=TIM_MasterOutputTrigger,Prescaler,Period
TIM2.Period=14999
TIM2.Prescaler=0
TIM2.TIM_MasterOutputTrigger=TIM_TRGO_UPDATE
TIM5.AutoReloadPreload=TIM_AUTORELOAD_PRELOAD_ENABLE
TIM5.Channel-PWM\ Generation3\ CH3=TIM_CHANNEL_3
TIM5.IPParameters=Channel-PWM Generation3 CH3,Prescaler,Period,TIM_MasterOutputTrigger,Pulse-PWM Generation3 CH3,AutoReloadPreload
TIM5.Period=1499
TIM5.Prescaler=0
TIM5.Pulse-PWM\ Generation3\ CH3=749
TIM5.TIM_MasterOutputTrigger=TIM_TRGO_UPDATE
USART3.IPParameters=VirtualMode-Asynchronous
USART3.VirtualMode-Asynchronous=VM_ASYNC
USB_OTG_FS.IPParameters=VirtualMode
USB_OTG_FS.VirtualMode=Device_Only
VP_IWDG1_VS_IWDG.Mode=IWDG_Activate
VP_IWDG1_VS_IWDG.Signal=IWDG1_VS_IWDG
VP_MEMORYMAP_VS_MEMORYMAP.Mode=CurAppReg
VP_MEMORYMAP_VS_MEMORYMAP.Signal=MEMORYMAP_VS_MEMORYMAP
VP_SYS_VS_Systick.Mode=SysTick
VP_SYS_VS_Systick.Signal=SYS_VS_Systick
VP_TIM12_VS_ClockSourceINT.Mode=Internal
VP_TIM12_VS_ClockSourceINT.Signal=TIM12_VS_ClockSourceINT
VP_TIM2_VS_ClockSourceINT.Mode=Internal
VP_TIM2_VS_ClockSourceINT.Signal=TIM2_VS_ClockSourceINT
VP_TIM5_VS_ClockSourceINT.Mode=Internal
VP_TIM5_VS_ClockSourceINT.Signal=TIM5_VS_ClockSourceINT
board=custom
7. 附录3:TIM5 + DMA关键函数Trace分析(jlink trace)
- 对如下2个关键函数进行Trace分析
HAL_TIM_PWM_Start_DMA(&htim5, TIM_CHANNEL_3, (uint32_t *)dac_buffer, SIN_TABLE_SIZE * 2)
/**
* @brief This function handles DMA1 stream1 global interrupt.
*/
void DMA1_Stream1_IRQHandler(void)
{
/* USER CODE BEGIN DMA1_Stream1_IRQn 0 */
/* USER CODE END DMA1_Stream1_IRQn 0 */
rt_base_t level = rt_hw_interrupt_disable();
HAL_DMA_IRQHandler(&hdma_dac1_ch2);
rt_hw_interrupt_enable(level);
/* USER CODE BEGIN DMA1_Stream1_IRQn 1 */
/* USER CODE END DMA1_Stream1_IRQn 1 */
}
- HAL_TIM_PWM_Start_DMA
- 从这个函数的trace可以看出,这个函数会调用HAL_DMA_Start_IT函数,这个函数会配置DMA参数并使能DMA中断。这个函数会调用TIM_CCxChannelCmd配置TIM的通道参数。
- 从这个函数的trace可以看出,这个函数并没有开启任何TIM的中断, 因此确实不需要开启TIM的NVIC中断。
Continuing.
Breakpoint 2, HAL_TIM_PWM_Start_DMA (htim=0x2400100c <htim5>, Channel=8, pData=0x24070000 <dac_buffer>, Length=72) at libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_tim.c:1727
1727 HAL_StatusTypeDef status = HAL_OK;
1734 if (TIM_CHANNEL_STATE_GET(htim, Channel) == HAL_TIM_CHANNEL_STATE_BUSY)
1738 else if (TIM_CHANNEL_STATE_GET(htim, Channel) == HAL_TIM_CHANNEL_STATE_READY)
1740 if ((pData == NULL) || (Length == 0U))
1746 TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY);
1754 switch (Channel)
1802 htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMADelayPulseCplt;
1803 htim->hdma[TIM_DMA_ID_CC3]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt;
1806 htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAError ;
1809 if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)pData, (uint32_t)&htim->Instance->CCR3,
HAL_DMA_Start_IT (hdma=0x240010a4 <hdma_tim5_ch3>, SrcAddress=604438528, DstAddress=1073744956, DataLength=72) at libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_dma.c:683
683 HAL_StatusTypeDef status = HAL_OK;
689 if(hdma == NULL)
695 __HAL_LOCK(hdma);
697 if(HAL_DMA_STATE_READY == hdma->State)
700 hdma->State = HAL_DMA_STATE_BUSY;
703 hdma->ErrorCode = HAL_DMA_ERROR_NONE;
706 __HAL_DMA_DISABLE(hdma);
709 DMA_SetConfig(hdma, SrcAddress, DstAddress, DataLength);
DMA_SetConfig (hdma=0x240010a4 <hdma_tim5_ch3>, SrcAddress=604438528, DstAddress=1073744956, DataLength=72) at libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_dma.c:1776
1776 DMA_Base_Registers *regs_dma = (DMA_Base_Registers *)hdma->StreamBaseAddress;
1777 BDMA_Base_Registers *regs_bdma = (BDMA_Base_Registers *)hdma->StreamBaseAddress;
1779 if(IS_DMA_DMAMUX_ALL_INSTANCE(hdma->Instance) != 0U) /* No DMAMUX available for BDMA1 */
1782 hdma->DMAmuxChannelStatus->CFR = hdma->DMAmuxChannelStatusMask;
1784 if(hdma->DMAmuxRequestGen != 0U)
1791 if(IS_DMA_STREAM_INSTANCE(hdma->Instance) != 0U) /* DMA1 or DMA2 instance */
1794 regs_dma->IFCR = 0x3FUL << (hdma->StreamIndex & 0x1FU);
1797 ((DMA_Stream_TypeDef *)hdma->Instance)->CR &= (uint32_t)(~DMA_SxCR_DBM);
1800 ((DMA_Stream_TypeDef *)hdma->Instance)->NDTR = DataLength;
1803 if((hdma->Init.Direction) == DMA_MEMORY_TO_PERIPH)
1806 ((DMA_Stream_TypeDef *)hdma->Instance)->PAR = DstAddress;
1809 ((DMA_Stream_TypeDef *)hdma->Instance)->M0AR = SrcAddress;
1852 }
HAL_DMA_Start_IT (hdma=0x240010a4 <hdma_tim5_ch3>, SrcAddress=604438528, DstAddress=1073744956, DataLength=72) at libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_dma.c:711
711 if(IS_DMA_STREAM_INSTANCE(hdma->Instance) != 0U) /* DMA1 or DMA2 instance */
714 MODIFY_REG(((DMA_Stream_TypeDef *)hdma->Instance)->CR, (DMA_IT_TC | DMA_IT_TE | DMA_IT_DME | DMA_IT_HT), (DMA_IT_TC | DMA_IT_TE | DMA_IT_DME));
716 if(hdma->XferHalfCpltCallback != NULL)
719 ((DMA_Stream_TypeDef *)hdma->Instance)->CR |= DMA_IT_HT;
734 if(IS_DMA_DMAMUX_ALL_INSTANCE(hdma->Instance) != 0U) /* No DMAMUX available for BDMA1 */
737 if((hdma->DMAmuxChannel->CCR & DMAMUX_CxCR_SE) != 0U)
740 hdma->DMAmuxChannel->CCR |= DMAMUX_CxCR_SOIE;
743 if(hdma->DMAmuxRequestGen != 0U)
752 __HAL_DMA_ENABLE(hdma);
766 return status;
767 }
HAL_TIM_PWM_Start_DMA (htim=0x2400100c <htim5>, Channel=8, pData=0x24070000 <dac_buffer>, Length=72) at libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_tim.c:1816
1816 __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC3);
1817 break;
1846 if (status == HAL_OK)
1849 TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE);
TIM_CCxChannelCmd (TIMx=0x40000c00, Channel=8, ChannelState=1) at libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_tim.c:7878
7878 tmp = TIM_CCER_CC1E << (Channel & 0x1FU); /* 0x1FU = 31 bits max shift */
7881 TIMx->CCER &= ~tmp;
7884 TIMx->CCER |= (uint32_t)(ChannelState << (Channel & 0x1FU)); /* 0x1FU = 31 bits max shift */
7885 }
HAL_TIM_PWM_Start_DMA (htim=0x2400100c <htim5>, Channel=8, pData=0x24070000 <dac_buffer>, Length=72) at libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_tim.c:1851
1851 if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET)
1858 if (IS_TIM_SLAVE_INSTANCE(htim->Instance))
1860 tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS;
1861 if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr))
1863 __HAL_TIM_ENABLE(htim);
1861 if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr))
1873 return status;
1874 }
ADC_TIM5_DMA_Init () at applications\tim_adc_tim5_dma.c:159
159 return 0;
- DMA1_Stream1_IRQHandler
- 从这个函数的trace可以看出, 这个函数最终会调用HAL_TIM_PWM_PulseFinishedHalfCpltCallback和HAL_TIM_PWM_PulseFinishedCallback这2个回调函数。
Continuing.
Breakpoint 1, DMA1_Stream1_IRQHandler () at applications\tim_adc_tim5_dma.c:673
673 rt_base_t level = rt_hw_interrupt_disable();
rt_hw_interrupt_disable () at rt-thread\libcpu\arm\cortex-m7/context_gcc.S:39
39 MRS r0, PRIMASK
40 CPSID I
41 BX LR
DMA1_Stream1_IRQHandler () at applications\tim_adc_tim5_dma.c:674
674 HAL_DMA_IRQHandler(&hdma_tim5_ch3);
HAL_DMA_IRQHandler (hdma=0x240010a4 <hdma_tim5_ch3>) at libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_dma.c:1212
1212 __IO uint32_t count = 0U;
1213 uint32_t timeout = SystemCoreClock / 9600U;
1216 DMA_Base_Registers *regs_dma = (DMA_Base_Registers *)hdma->StreamBaseAddress;
1217 BDMA_Base_Registers *regs_bdma = (BDMA_Base_Registers *)hdma->StreamBaseAddress;
1219 tmpisr_dma = regs_dma->ISR;
1220 tmpisr_bdma = regs_bdma->ISR;
1222 if(IS_DMA_STREAM_INSTANCE(hdma->Instance) != 0U) /* DMA1 or DMA2 instance */
1225 if ((tmpisr_dma & (DMA_FLAG_TEIF0_4 << (hdma->StreamIndex & 0x1FU))) != 0U)
1240 if ((tmpisr_dma & (DMA_FLAG_FEIF0_4 << (hdma->StreamIndex & 0x1FU))) != 0U)
1252 if ((tmpisr_dma & (DMA_FLAG_DMEIF0_4 << (hdma->StreamIndex & 0x1FU))) != 0U)
1264 if ((tmpisr_dma & (DMA_FLAG_HTIF0_4 << (hdma->StreamIndex & 0x1FU))) != 0U)
1266 if(__HAL_DMA_GET_IT_SOURCE(hdma, DMA_IT_HT) != 0U)
1269 regs_dma->IFCR = DMA_FLAG_HTIF0_4 << (hdma->StreamIndex & 0x1FU);
1272 if(((((DMA_Stream_TypeDef *)hdma->Instance)->CR) & (uint32_t)(DMA_SxCR_DBM)) != 0U)
1296 if((((DMA_Stream_TypeDef *)hdma->Instance)->CR & DMA_SxCR_CIRC) == 0U)
1302 if(hdma->XferHalfCpltCallback != NULL)
1305 hdma->XferHalfCpltCallback(hdma);
TIM_DMADelayPulseHalfCplt (hdma=0x240010a4 <hdma_tim5_ch3>) at libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_tim.c:6721
6721 TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;
6723 if (hdma == htim->hdma[TIM_DMA_ID_CC1])
6727 else if (hdma == htim->hdma[TIM_DMA_ID_CC2])
6731 else if (hdma == htim->hdma[TIM_DMA_ID_CC3])
6733 htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3;
6747 HAL_TIM_PWM_PulseFinishedHalfCpltCallback(htim);
HAL_TIM_PWM_PulseFinishedHalfCpltCallback (htim=0x2400100c <htim5>) at applications\tim_adc_tim5_dma.c:111
111 }
TIM_DMADelayPulseHalfCplt (hdma=0x240010a4 <hdma_tim5_ch3>) at libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_tim.c:6750
6750 htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED;
6751 }
HAL_DMA_IRQHandler (hdma=0x240010a4 <hdma_tim5_ch3>) at libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_dma.c:1311
1311 if ((tmpisr_dma & (DMA_FLAG_TCIF0_4 << (hdma->StreamIndex & 0x1FU))) != 0U)
1313 if(__HAL_DMA_GET_IT_SOURCE(hdma, DMA_IT_TC) != 0U)
1316 regs_dma->IFCR = DMA_FLAG_TCIF0_4 << (hdma->StreamIndex & 0x1FU);
1318 if(HAL_DMA_STATE_ABORT == hdma->State)
1345 if(((((DMA_Stream_TypeDef *)hdma->Instance)->CR) & (uint32_t)(DMA_SxCR_DBM)) != 0U)
1369 if((((DMA_Stream_TypeDef *)hdma->Instance)->CR & DMA_SxCR_CIRC) == 0U)
1381 if(hdma->XferCpltCallback != NULL)
1384 hdma->XferCpltCallback(hdma);
TIM_DMADelayPulseCplt (hdma=0x240010a4 <hdma_tim5_ch3>) at libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_tim.c:6662
6662 TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;
6664 if (hdma == htim->hdma[TIM_DMA_ID_CC1])
6673 else if (hdma == htim->hdma[TIM_DMA_ID_CC2])
6682 else if (hdma == htim->hdma[TIM_DMA_ID_CC3])
6684 htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3;
6686 if (hdma->Init.Mode == DMA_NORMAL)
6708 HAL_TIM_PWM_PulseFinishedCallback(htim);
HAL_TIM_PWM_PulseFinishedCallback (htim=0x2400100c <htim5>) at applications\tim_adc_tim5_dma.c:103
103 }
TIM_DMADelayPulseCplt (hdma=0x240010a4 <hdma_tim5_ch3>) at libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_tim.c:6711
6711 htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED;
6712 }
HAL_DMA_IRQHandler (hdma=0x240010a4 <hdma_tim5_ch3>) at libraries\STM32H7xx_HAL\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_dma.c:1391
1391 if(hdma->ErrorCode != HAL_DMA_ERROR_NONE)
1566 }
DMA1_Stream1_IRQHandler () at applications\tim_adc_tim5_dma.c:675
675 rt_hw_interrupt_enable(level);
rt_hw_interrupt_enable () at rt-thread\libcpu\arm\cortex-m7/context_gcc.S:49
49 MSR PRIMASK, r0
50 BX LR
DMA1_Stream1_IRQHandler () at applications\tim_adc_tim5_dma.c:679
679 }
rt_hw_interrupt_enable () at rt-thread\libcpu\arm\cortex-m7/context_gcc.S:50
50 BX LR