STM32CuBeMX(HAL库)实现定时器中断(STM32F407ZGT6)

工具:

1、芯片: STM32F407ZET6

2、STM32CubeMx软件

3、IDE: MDK-Keil软件

4、STM32F4xxHAL库 

这部分内容源自https://blog.csdn.net/weixin_44584198/article/details/119078492

STM32定时器分为基本定时器、通用定时器和高级定时器,部分型号还具有低功耗定时器等等。

STM32基本定时器具有以下功能:

16位向上、向下、向上/下自动装载计数器。

16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65535之间的任意数值。

定时触发ADC或者DAC以达到固定频率采用或者还原的目的(部分基本定时器具有此功能)。

STM32通用定时器具有以下功能:

16位向上、向下、向上/下自动装载计数器。

16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65535之间的任意数值。

4 个独立通道(TIMx_CH1~4)可以用作:
测量输入信号的脉冲长度( 输入捕获)。
输出比较。
单脉冲模式输出。
PWM输出(边缘或中间对齐模式)。

支持针对定位的增量(正交)编码器和霍尔传感器电路。

如下事件发生时产生中断/DMA:
更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内 部/外部触发)
触发事件(计数器启动、停止、初始化或者由内部/外部触发计数)
输入捕获
输出比较

STM32高级定时器具有以下功能:

还具有控制交直流电动机所有的功能。

输出6路互补带死区的信号,刹车功能等等。

还具有一般定时器的功能。

建立工程、SYS配置、RCC配置参考:

https://blog.csdn.net/weixin_53000184/article/details/124246194

时钟树配置:

13cd2092350e4e01ae0babcfa4c96704.png

 配置GPIO:

7419852b2189468a95f479243560bad4.png

 PE3和PE4是两个LED灯。

配置定时器:

60145361d4d44487be40c9ffdd8917e6.png

 点点鼠标CuBe就会自己配置相应参数,这是CuBe的强大的地方,节省很多时间!

7303804503f247da941f1b507cfd52e3.png

其中参数含义分别为:
Prescaler 分频系数
Counter Mode 计数模式(分为向上和向下)
Count Period 计数周期
auto-reload preload 自动重装载
TRGO Event Selection 触发事件

其中时间溢出公式为:ac722732fd054eafbb2ad77cba64f47f.png

 其他参数无须修改,用到再查资料。

d5607da88c6b4430ae8669caef01bfd4.png

 剩下生成工程的操作参考:https://blog.csdn.net/weixin_53000184/article/details/124246194

CuBe的配置就这样完成了,接下来进入MDK了。

首先是启动驱动器:

这个过程想要手动启动定时器,系统才能进入定时器中断(这个放在main函数开头的地方)

HAL_TIM_Base_Start_IT(&htim6);

注意,如果使用HAL_TIM_Base_Start(&htim6);函数打开定时器,则定时器会启动,但不会进入定时器中断。

主函数中就不需要再编写其他的代码了。

然后我们来到stm32f4××_it.c文件,找到TIM6中断,在里面添加自己的代码即可。我这里就只添加了这个:

db5a88623f22487fb8a8f40ff1033a0a.png

  HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_3);

然后我代码的效果就是PE3每隔500ms翻转一次,PE4保持常亮。大家记得还要配置debug里面的东西,之后就是编译、下载程序了。具体参考下面:

0cc9804b4a1d490c8b389092214c77e3.png

 9569cbb7f1894e7d83bf8d15d39425d6.png

STM32F407ZG定时器-C文档类资源-CSDN下载 

  • 8
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
STM32 HAL 中,如果发生了内存溢出,会触发硬件中断,此时应该执行内存溢出中断服务函数来处理这个问题。 内存溢出中断服务函数的代码示例如下: ```c void HardFault_Handler(void) { __ASM volatile("TST LR, #4"); __ASM volatile("ITE EQ"); __ASM volatile("MRSEQ R0, MSP"); __ASM volatile("MRSNE R0, PSP"); __ASM volatile("B hard_fault_handler_c"); } void hard_fault_handler_c(unsigned int * hardfault_args) { volatile unsigned int stacked_r0; volatile unsigned int stacked_r1; volatile unsigned int stacked_r2; volatile unsigned int stacked_r3; volatile unsigned int stacked_r12; volatile unsigned int stacked_lr; volatile unsigned int stacked_pc; volatile unsigned int stacked_psr; stacked_r0 = ((unsigned long) hardfault_args[0]); stacked_r1 = ((unsigned long) hardfault_args[1]); stacked_r2 = ((unsigned long) hardfault_args[2]); stacked_r3 = ((unsigned long) hardfault_args[3]); stacked_r12 = ((unsigned long) hardfault_args[4]); stacked_lr = ((unsigned long) hardfault_args[5]); stacked_pc = ((unsigned long) hardfault_args[6]); stacked_psr = ((unsigned long) hardfault_args[7]); printf("[HardFault]\n"); printf("R0 = %x\n", stacked_r0); printf("R1 = %x\n", stacked_r1); printf("R2 = %x\n", stacked_r2); printf("R3 = %x\n", stacked_r3); printf("R12 = %x\n", stacked_r12); printf("LR = %x\n", stacked_lr); printf("PC = %x\n", stacked_pc); printf("PSR = %x\n", stacked_psr); while (1); } ``` 在该代码中,`HardFault_Handler` 函数是内存溢出中断服务函数的入口函数。在该函数中,首先使用汇编代码判断当前使用的堆栈是主堆栈还是进程堆栈,然后再跳转到 `hard_fault_handler_c` 函数中执行实际的处理。 在 `hard_fault_handler_c` 函数中,首先将异常发生时的相关寄存器的值保存到变量中,然后输出相关信息,并在最后进入死循环,以防止程序继续执行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不会创建对象

谢谢考官。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值