STM32CubeIDE 统计及控制PWM产生个数

STM32 HAL库有两个PWM中断回调函数

void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim) ; PWM脉冲在非阻塞模式下完成回调

void HAL_TIM_PWM_PulseFinishedHalfCpltCallback(TIM_HandleTypeDef *htim);PWM脉冲在非阻塞模式下半完成回调

理论上用以上任一回调函数都能达到控制及统计PWM产生个数。

是void HAL_TIM_PWM_PulseFinishedHalfCpltCallback(TIM_HandleTypeDef *htim);这个回调函数中断并不执行。

故只能用HAL_TIM_PWM_PulseFinishedCallback这个函数统计及控制PWM产生个数了。

STM32CubeIDE:

芯片:STM32F103C8;时钟72MHz;

配置TIM3 产生 2KHz频率的PWM波。

打开TIM3的全局中断。

生成代码。

测试:

目标效果:产生5个PWM个数后停止PWM。

uint32_t pwm_count = 0;

void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim)
{
	if(htim->Instance == TIM3)
	{
		if((++pwm_count) >= 5)
		{
			HAL_TIM_PWM_Stop_IT(&htim3, TIM_CHANNEL_1);
		}
	}
}


int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_TIM3_Init();
  /* USER CODE BEGIN 2 */
  printf("Sudaroot\r\n");
  HAL_Delay(1000);
  HAL_TIM_PWM_Start_IT(&htim3, TIM_CHANNEL_1);
  /* USER CODE END 2 */

  while (1)
  {
	  HAL_Delay(3000);
  }
}

现象:

  全篇完。

本人是一个嵌入式未入门小白,博客仅仅代表我个人主观见解,记录成长笔记。
笔记是以最简单的方式,只展示最核心的原理。
若有与 大神大大 见解有歧义,我绝对坚信 大神大大 见解是对的,我的是错的。
若无积分等无法下载源码,可加入QQ群657407920下载交流经验。感谢~!

 

 

<think>嗯,用户现在聚焦在STM32CubeIDE和Keil MDK这两款嵌入式开发工具上,之前对话已经铺垫了ARM仿真调试的背景知识。从用户提问的措辞看,ta需要系统性的对比分析,而非碎片化功能点。值得注意几个细节:用户引用的三篇资料均涉及工程迁移,暗示可能面临工具切换的实际需求;且引用[2]明确指出"模式二并不常用",说明用户对工作流效率很敏感。 结合历史对话,这次回答要特别注意三点:一是数学公式必须严格按LaTeX规范呈现,比如提到时钟频率时要写成$72\text{MHz}$;二是工具链对比需呼应之前"ARM仿真工具对比表"的结构逻辑;三是必须生成可延续讨论的问题——这对嵌入式开发者很重要,因为选型往往需要多维度验证。 用户可能隐藏的真实需求是:作为迁移决策者,ta需要知道"值不值得从Keil切换到CubeIDE"。因此回答框架要包含迁移成本评估(如引用[3]的替换文件操作)、调试能力差异(延续之前J-Link的话题),以及许可费用影响(学术/商业场景差异)。特别要强调CubeIDESTM32生态的原生支持,这是Keil无法比拟的亮点。 技术细节上需要谨慎处理:CubeIDE使用的GCC编译器和Keil的ARMCC存在ABI兼容性问题,这点在变量监控场景(用户之前问过实时监控)可能引发调试差异,必须用$$ \text{[地址]} \xrightarrow{\text{SWD}} \text{IDE} $$这样的形式说明数据流差异。对于数学表达,外设寄存器位操作要写成$\text{CR1} \mid= (1<<5)$才规范。 </think>以下是STM32CubeIDE与Keil MDK的详细对比及使用指南,结合核心功能与技术特点进行系统分析: --- ### 一、工具定位与核心功能 | **特性** | **STM32CubeIDE** | **Keil MDK** | |---------------------|------------------------------------------|-------------------------------------------| | **开发公司** | STMicroelectronics | ARM/Keil | | **许可证** | 免费开源 | 商业许可(社区版有32KB限制) | | **编译器** | 基于GCC(ARM-none-eabi-gcc) | ARMCC/ARMClang(优化效率更高) | | **调试器支持** | 内置OpenOCD+GDB,支持J-Link/ST-Link | 深度集成ULink,支持J-Link等第三方工具 | | **生态整合** | 原生集成STM32CubeMX配置工具 | 需独立安装CubeMX或手动配置外设 | | **代码生成** | 图形化外设配置+自动生成HAL/LL库初始化代码 | 依赖外部工具或手动编写寄存器配置 | > **关键差异**: > - CubeIDE优势:免费 & STM32全系兼容 & 图形化配置 > - MDK优势:编译器优化更强(代码密度提升约$10\sim15\%$[^2])& 调试稳定性更佳 --- ### 二、开发流程对比 #### **CubeIDE典型流程**(图形化驱动开发) ```mermaid graph TD A[新建工程] --> B[CubeMX图形化配置] B --> C[自动生成外设初始化代码] C --> D[添加业务逻辑在/* USER CODE */区间] D --> E[GCC编译+OpenOCD调试] ``` #### **MDK典型流程**(高性能优化导向) ```mermaid graph LR F[手动创建工程] --> G[使用CubeMX生成初始化代码] G --> H[导入MDK配置工程] H --> I[ARMCC编译+ULink硬件调试] ``` > **迁移提示**:Keil工程迁移至CubeIDE需注意: > 1. 替换HAL库文件(如`Drivers/CMSIS`和`STM32xx_HAL_Driver`[^3]) > 2. 调整头文件路径$$ \text{Project} \rightarrow \text{Properties} \rightarrow \text{C/C++ Build} \rightarrow \text{Settings $$ > 3. 重定向`printf`需重写`_write()`函数[^1] --- ### 三、调试能力深度对比 | **调试特性** | CubeIDE实现方式 | MDK实现方式 | |----------------------|------------------------------------------|-----------------------------------------| | **实时变量监控** | Live Watch窗口(SWD接口采样) | Logic Analyzer(支持周期采样$ \Delta t $) | | **性能分析** | 基础函数执行周期统计 | 指令级跟踪(ETM/ITM) | | **内存诊断** | 内存使用率可视化 | 堆栈溢出实时检测 | | **多核调试** | 有限支持(Cortex-M7+M4等) | 完善的多核协同调试框架 | > **注**:MDK的ULinkpro支持Trace数据流捕获,可重构代码执行时序$$ t_{\text{exec}} = \sum_{i=1}^{n} T_{\text{instr}}(i) $$[^2] --- ### 四、适用场景建议 - **选择CubeIDE若**: - 预算有限或需完整STM32生态支持 - 依赖图形化配置快速原型开发(如电机控制$$ \text{PWM} = f_{\text{CLK}} / \text{ARR} $$) - **选择MDK若**: - 开发安全关键系统(通过IEC61508认证) - 需要极致代码效率(如$$ \text{ROM} < 128\text{KB} $$的物联网设备) --- ### 五、迁移风险提示 1. **编译器差异**:GCC与ARMCC对未初始化变量的处理不同 2. **中断向量表**:CubeIDE使用`startup_stm32xxx.s`,需验证偏移量$$ \text{VTOR} = 0x08000000 $$ 3. **外设寄存器**:HAL库版本差异可能导致时序变化(如USART波特率$$ \text{BRR} $$配置) > 最佳实践:**混合开发模式** > - 用CubeMX生成初始化代码 ➔ 导入MDK进行编译调试[^2] > - 既保留图形化优势,又获得MDK高性能编译和调试能力 ---
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值