定时器+中断 闪烁led

文章介绍了在Ubuntu18.04环境下,基于STM32F427IIH6芯片进行定时器和中断的配置,包括定时器的分频、重载值设置,以及中断处理函数中实现GPIO引脚翻转的功能。通过对比轮询和中断,强调中断在处理事件上的优势。文章还详细讲述了如何配置定时器、中断,以及RCC和SYS,最后展示了实验效果。
摘要由CSDN通过智能技术生成

运行环境:

ubuntu18.04.melodic
宏基暗影骑士笔记本
stm32f427IIH6
stlink
9-24v可调电源

1.1 定时器和中断

1)定时器

类似闹钟,设定好对应时间,会在设定的时刻响起铃声。

分频:降低频率
计数:用来计数
重载:清零

当定时器中的计数值达到重载值时,计数值就会被清零,触发中断

2)轮询和中断

例如厨房里烧着开水,主人在客厅里看电视。为了防止开水烧干,他有两种方式:

第一种是每隔10分钟就去厨房看一眼

另一种是等水壶烧开了之后开始发出响声再去处理。

前者是轮询的方式,后者是中断的方式。

2.1配置

1)定时器配置

内部时钟稳定、省电,适用于精度要求不高的应用

在这里插入图片描述分频值:18000
计算周期(重载值):10000

A板计算:
180 000 000/180 00 /10000 = 1Hz
(1Hz,每秒触发一次中断)

实际填入17999、9999 (因为从0开始计数)

在这里插入图片描述

TIM1挂载在APB2

在这里插入图片描述在这里插入图片描述

2)中断配置

打开定时器更新中断(满了触发中断)

在这里插入图片描述

3)RCC和SYS

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

为每个外设 生成外设初始化.c/.h文件

在这里插入图片描述

3.1代码分析

在这里插入图片描述

初始化了定时器,但是还没启动,需要启动定时器
进入 初始化函数MX_TIM1_Init(),启动定时器

在这里插入图片描述

中断触发位置:
中断触发后就会执行这个函数 HAL_TIM_IRQHandler(&htim1),这个函数将定时器初始化,重新开始计数。

在这里插入图片描述

3.2添加代码

1)中断处理函数IRQ中添加代码

// 每秒翻转一次
HAL_GPIO_TogglePin(GPIOE, GPIO_PIN_11);
HAL_GPIO_TogglePin(GPIOF  , GPIO_PIN_14);

在这里插入图片描述

make编译,F5烧录调试

2)launch设置

修改成以下内容:可执行文件名是freeRTOS_LED.elf

{ =400x
    "configurations": [
    

        {
            "showDevDebugOutput": "parsed",
            "cwd": "${workspaceRoot}",
            "executable": "./build/TIM1.elf",
            "name": "Debug STM32",
            "request": "launch",
            "type": "cortex-debug",
            "servertype": "openocd",
            "device": "stm32f427",
            "configFiles": [
                "interface/stlink-v2-1.cfg",
                "target/stm32f4x.cfg"
            ]
        }
    ]
}

4.1定时器启动和定时器中断启动函数

在这里插入图片描述在这里插入图片描述

5.1实验效果

在这里插入图片描述在这里插入图片描述


⭐⭐⭐ 嘟嘟崽 ⭐⭐⭐
⭐⭐⭐ 祝你成功 ⭐⭐⭐
F28335是一款TI公司的数字信号处理器(DSP),它内建了丰富的定时器功能,可以用来实现LED的周期性闪烁。具体步骤如下: 1. **配置定时器**: 首先,你需要选择合适的定时器,如Timer0或Timer1,设置它的工作模式为PWM(脉宽调制),以便于控制输出的占空比。 2. **初始化定时器**: 设置定时器的工作频率、分频系数和自动装载值。比如,如果你想让LED每秒闪动多次,就需要设置适当的定时周期。 3. **配置中断**: 把定时器的溢出中断功能打开,并设置中断优先级。当定时器计数到设定值后会引发中断。 4. **中断服务程序**: 当定时器中断发生时,进入相应的中断服务函数。在这个函数里,你可以改变LED的状态,例如,如果当前LED是关闭的,就让它点亮;如果是点亮的,就让它熄灭。然后清零定时器并允许下一次中断。 5. **点亮和熄灭LED**: 通过GPIO口控制LED的开关状态,比如使用P1OUT寄存器来控制GPIO引脚。 6. **软件延时**: 如果需要更复杂的闪烁效果,你可以在中断处理后添加一个短暂停顿,调整LED亮的时间长度。 **示例代码片段(仅做参考)**: ```c // 初始化定时器 TMR0_A = 0; // 清零定时器A计数器 TMR0_CFG = TMR0_CFG__PRESCALER_1 | TMR0_CFG__TIMER_ON | TMR0_CFG__INT_ON; // 预设值=1, 开启定时器A和中断 // 定义中断服务函数 void Timer0_ISR(void) __interrupt(TIMER0_A_vect) { P1DIR |= _BV(LED_PIN); // LED ON while(--delay_count); // 暂停时间 P1DIR &= ~(_BV(LED_PIN)); // LED OFF } // 主函数 while (1) { sei(); // 开启全局中断 __enable_interrupt(); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

圆嘟嘟2019

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值