stm32f103r6:keil编程实现GPIO口控制两个灯LED0和LED1。每个灯可以实现4种显示效果:常亮、1Hz闪烁、5Hz闪烁和熄灭。要求用TIM3中断方式实现延时500ms。main.c led.c led.h。led0连接pc0,led1连接pc1
时间: 2024-10-04 19:04:33 浏览: 58
STM32F103R6芯片+Proteus仿真+Keil5实现按键中断点亮LED
STM32F103R6是一款基于ARM Cortex-M3内核的微控制器,Keil是常用的STM32开发工具。要在这款芯片上通过GPIO控制LED灯并实现不同的显示效果,我们需要按照以下步骤操作:
1. **头文件**(led.h):
```c
#include "stm32f10x.h"
#define LED0 GPIO_Pin_0 // PC0连接LED0
#define LED1 GPIO_Pin_1 // PC1连接LED1
#define GPIO_PORT GPIOA // 所有GPIO端口
```
2. **驱动函数声明**(led.c):
```c
void initialize_GPIO(void);
void set_LED_state(GPIO_TypeDef* port, uint8_t pin, bool state);
void toggle_LED(uint8_t led_num);
void delay_ms(uint32_t ms);
```
3. **GPIO初始化**(led.c):
```c
void initialize_GPIO() {
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); // 启动GPIOA时钟
GPIO_InitStructure.GPIO_Pin = LED0 | LED1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 输出推挽模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIO_PORT, &GPIO_InitStructure);
}
```
4. **设置LED状态**(led.c):
```c
void set_LED_state(GPIO_TypeDef* port, uint8_t pin, bool state) {
GPIO_SetBits(port, pin); // 设置LED亮
GPIO_ResetBits(port, pin); // 设置LED灭
}
```
5. **定时器中断实现延时**(main.c):
```c
void TIM3_IRQHandler(void) {
if (EXTI_GetITStatus(TIM3_IRQn) != RESET) { // 检查中断是否发生
EXTI_ClearITPendingBit(TIM3_IRQn); // 清除中断标志
if (timer_flag == 1) { // 到达500ms延时
toggle_LED(LED0);
toggle_LED(LED1);
timer_flag = 0;
}
TIM3->CNT++; // 更新计数器
}
}
// 定义延时函数
static void timer_init(uint32_t period) {
// ... 实现TIM3配置为分频器模式,计数到预设值触发中断
}
// 主程序入口
int main(void) {
initialize_GPIO();
timer_init(500000 / 100); // 分频系数100表示500ms周期
timer_flag = 1; // 初始化延时标志
// 其他必要的系统配置
EnableGlobalInterrupt(); // 开启全局中断
NVIC_EnableIRQ(TIM3_IRQn); // 开启TIM3中断
while (1) {
// LED控制循环
}
}
```
阅读全文