stm32l151c8t6基于HAL库,利用STM32CubeMX和MDK5,利用定时器中断和按键外部中断在OLED设置秒表
时间: 2024-11-13 14:28:33 浏览: 8
STM32L151C8T6基于HAL库点亮LED灯
在STM32L151C8T6单片机上,基于STM32CubeMX和MDK5工具链,你可以按照以下步骤实现一个简单的秒表功能,包括定时器中断、按键外部中断以及OLED显示:
1. **环境设置**:
- 在STM32CubeMX中选择STM32L151C8T6作为设备,配置定时器TIM6和GPIO用于按键输入。TIM6作为基本定时器,设置为上升沿触发中断,频率约为32MHz/1000 = 31.25kHz。
2. **硬件配置**:
- 连接OLED屏幕至相应的GPIO端口。通常,你需要配置GPIO为推挽输出,控制OLED的R/W和D/C信号。
- 对于按键,如假设使用PA2和PA3,需配置为输入模式,外部中断使能。
3. **定时器配置**:
- 在`main.c`中,实例化TIM6结构体并初始化定时器。设置定时器预分频值,使得每0.1秒产生一次中断。
- 通过`HAL_TIM_TimeBase_Start_IT(&htim6)`启动定时器,使用`HAL_TIM_IRQHandler(&htim6)`处理中断。
4. **外部中断配置**:
- 在`NVIC_InitTypeDef`中,给按键中断分配适当的优先级,并启用对应中断请求。
- 编写外部中断服务函数(如`EXTI0_IRQHandler`),当按键被按下时读取GPIO状态,然后更新秒表计数或OLED显示。
5. **OLED显示**:
- 创建一个函数来负责OLED的刷新,接收定时器的当前值(例如,毫秒数)。将时间转换为秒和毫秒格式,显示在OLED的两行上。
6. **主循环**:
- 主循环内判断定时器中断标志是否被设,如果是,则清除标志并更新OLED。同时,检查按键中断标志,响应按键操作。
下面是简化后的代码片段示例:
```c
#include "stm32f1xx_hal.h"
#include "stm32l1xx_tim.h"
#include "stm32l1xx_exti.h"
#include "stm32l1xx_gpio.h"
#include "oled.h"
// ...其他头文件...
void EXTI0_IRQHandler(void); // 外部中断服务函数
uint32_t seconds; // 秒表计数器
void setupTimersAndInterrupts(void) {
// ...配置定时器TIM6和GPIO...
}
void updateOLED(uint32_t milliseconds) {
// ...将毫秒转换为OLED显示格式...
}
int main(void) {
// ...系统时钟配置...
setupTimersAndInterrupts();
while (1) {
if (HAL_TIM_GetOverrun(&htim6)) { // 判断是否有定时器中断
HAL_TIM_IRQHandler(&htim6);
updateOLED(seconds * 1000); // OLED显示秒数
seconds++;
}
if (HAL_GPIO_ReadPin(GPIOA, KEY2_GPIO_PIN)) { // 检查按键
EXTI0_IRQHandler();
}
}
}
void EXTI0_IRQHandler(void) {
if (HAL_GPIO_EXTI_Get RisingEdge(&EXTI能满足条件)) {
// 按钮操作...
}
}
```
**
阅读全文