【算法题】归并排序
2026/1/13 23:15:37
这三个都是嵌入式芯片(尤其是 ARM Cortex-M 系列、国产 MCU 如华大 / 兆易创新等)中常见的定时器外设,核心都是 “计时 / 定时”,但设计定位和功能侧重完全不同。
// 初始化BFTM(1ms定时) void BFTM_Init(void) { // 1. 使能BFTM时钟 BFTM_CLK_Enable(); // 2. 设置计数值(假设系统主频72MHz,分频后1MHz,1ms则计数值1000) BFTM->CNT = 0; // 计数器清零 BFTM->CMP = 1000; // 比较值:计数到1000触发中断 // 3. 使能中断 + 使能定时器 BFTM->CR |= (1 << 1); // 使能比较中断 BFTM->CR |= (1 << 0); // 启动定时器(自动重装) // 4. 开启NVIC中断 NVIC_EnableIRQ(BFTM_IRQn); } // BFTM中断服务函数(1ms进入一次) void BFTM_IRQHandler(void) { if(BFTM->INT_FLAG & 0x01) { BFTM->INT_FLAG = 0x01; // 清除中断标志 static uint32_t tick = 0; tick++; // 1ms计数累加 } }// 初始化GPTM输出PWM(50Hz,占空比50%) void GPTM_PWM_Init(void) { // 1. 使能时钟(定时器+GPIO) GPTM_CLK_Enable(); GPIO_CLK_Enable(GPIOA); // 2. GPIO配置为定时器复用功能 GPIO_Mode_Set(GPIOA, PIN8, GPIO_MODE_AF); GPIO_AF_Set(GPIOA, PIN8, AF_GPTM1_CH1); // 3. 定时器配置 GPTM->CR1 = 0; // 向上计数,默认模式 GPTM->PSC = 7199; // 分频:72MHz/(7199+1)=10kHz GPTM->ARR = 199; // 自动重装:10kHz/(199+1)=50Hz // 4. PWM模式配置(通道1,PWM模式1) GPTM->CCMR1 |= (6 << 4); // CH1为PWM模式1 GPTM->CCMR1 |= (1 << 3); // 预装载使能 GPTM->CCR1 = 99; // 比较值:占空比50%(99/199) GPTM->CCER |= (1 << 0); // 使能CH1输出 GPTM->CR1 |= (1 << 7); // 自动重装预装载使能 GPTM->CR1 |= (1 << 0); // 启动定时器 }// 初始化MCTM输出三相互补PWM(500Hz,占空比30%,带死区保护) void MCTM_Motor_PWM_Init(void) { // -------------------------- 1. 时钟使能 -------------------------- // 使能MCTM定时器时钟 MCTM_CLK_Enable(); // 使能GPIO时钟(6路PWM引脚:CH1/CH1N、CH2/CH2N、CH3/CH3N) GPIO_CLK_Enable(GPIOA); GPIO_CLK_Enable(GPIOB); // -------------------------- 2. GPIO配置(复用功能) -------------------------- // CH1 (PA8)、CH1N (PB13) GPIO_Mode_Set(GPIOA, PIN8, GPIO_MODE_AF); GPIO_AF_Set(GPIOA, PIN8, AF_MCTM1); GPIO_Mode_Set(GPIOB, PIN13, GPIO_MODE_AF); GPIO_AF_Set(GPIOB, PIN13, AF_MCTM1); // CH2 (PA9)、CH2N (PB14) GPIO_Mode_Set(GPIOA, PIN9, GPIO_MODE_AF); GPIO_AF_Set(GPIOA, PIN9, AF_MCTM1); GPIO_Mode_Set(GPIOB, PIN14, GPIO_MODE_AF); GPIO_AF_Set(GPIOB, PIN14, AF_MCTM1); // CH3 (PA10)、CH3N (PB15) GPIO_Mode_Set(GPIOA, PIN10, GPIO_MODE_AF); GPIO_AF_Set(GPIOA, PIN10, AF_MCTM1); GPIO_Mode_Set(GPIOB, PIN15, GPIO_MODE_AF); GPIO_AF_Set(GPIOB, PIN15, AF_MCTM1); // -------------------------- 3. MCTM核心配置 -------------------------- // 基础配置:中心对齐模式(适配电机FOC)、自动重装预装载使能 MCTM1->CR1 = 0; MCTM1->CR1 |= (2 << 5); // 中心对齐模式2(上下计数都更新) MCTM1->CR1 |= (1 << 7); // 自动重装预装载使能 // 分频配置:72MHz/(71+1)=1MHz MCTM1->PSC = 71; // 自动重装值:1MHz/2000=500Hz(PWM频率) MCTM1->ARR = 2000; // -------------------------- 4. 互补PWM + 死区配置 -------------------------- // 通道1配置:PWM模式1、预装载使能 MCTM1->CCMR1 |= (6 << 4); // CH1为PWM模式1 MCTM1->CCMR1 |= (1 << 3); // CH1预装载使能 MCTM1->CCR1 = 600; // 占空比30%(600/2000) // 通道2配置 MCTM1->CCMR1 |= (6 << 12); // CH2为PWM模式1 MCTM1->CCMR1 |= (1 << 11); // CH2预装载使能 MCTM1->CCR2 = 600; // 占空比30% // 通道3配置 MCTM1->CCMR2 |= (6 << 4); // CH3为PWM模式1 MCTM1->CCMR2 |= (1 << 3); // CH3预装载使能 MCTM1->CCR3 = 600; // 占空比30% // 使能主通道+互补通道输出 MCTM1->CCER |= (1 << 0); // 使能CH1输出 MCTM1->CCER |= (1 << 1); // 使能CH1N互补输出 MCTM1->CCER |= (1 << 4); // 使能CH2输出 MCTM1->CCER |= (1 << 5); // 使能CH2N互补输出 MCTM1->CCER |= (1 << 8); // 使能CH3输出 MCTM1->CCER |= (1 << 9); // 使能CH3N互补输出 // 死区配置(BDTR寄存器核心):死区时间10us(1MHz时钟下计数值10) MCTM1->BDTR |= (10 << 0); // 死区时间设置 MCTM1->BDTR |= (1 << 15); // 主输出使能(MOE) MCTM1->BDTR |= (1 << 12); // 刹车功能使能(可选,硬件保护) // -------------------------- 5. 启动定时器 -------------------------- MCTM1->CR1 |= (1 << 0); // 启动MCTM定时器 }| 特性 | BFTM | GPTM | MCTM |
|---|---|---|---|
| 核心定位 | 极简基础定时 | 通用多功能 | 多通道专用(电机) |
| 功能复杂度 | 极低(仅计数 + 中断) | 中等(定时 / PWM / 捕获) | 高(互补 PWM / 刹车) |
| 通道数 | 无通道(单计数器) | 2-4 路 | 4-8 路(含互补) |
| 典型应用 | 简单延时 / 系统 tick | 普通 PWM / 定时 / 捕获 | 电机驱动 / 多轴控制 |
| 资源占用 | 极少 | 中等 | 较多 |
新手选型建议:优先用 GPTM 满足大部分定时 / PWM 需求;仅需简单延时用 BFTM;做电机驱动再考虑 MCTM。