写一个stm32f103c8t6的独立按键点灯代码(完整)
时间: 2024-08-28 14:03:44 浏览: 33
当涉及到STM32F103C8T6微控制器的独立按键点亮LED灯的简单示例代码,我们需要准备一些基本组件:一个LED、一个按键和相关的库文件。这里假设你已经配置了Keil MDK集成开发环境,并且已经设置好GPIO和中断支持。
首先,我们需要包含必要的头文件并初始化硬件资源:
```c
#include "stm32f10x.h"
#include "delay.h"
void RCC_APB2PeriphClockCmd(uint8_t Periph, FunctionalState NewState);
GPIO_InitTypeDef GPIO_InitStructure;
// LED 和按键的GPIO口地址
#define LED_PIN GPIO_Pin_13
#define KEY_PIN GPIO_Pin_0
// 定义延时函数
void delay_ms(uint32_t ms);
```
接下来,编写函数开启GPIO时钟并配置LED和按键:
```c
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 开启GPIOA时钟
GPIO_InitStructure.GPIO_Pin = LED_PIN | KEY_PIN; // 设置LED和按键引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 输出推挽模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 高速
GPIO_Init(GPIOA, &GPIO_InitStructure); // 初始化GPIO
```
定义按键中断处理函数,当按键按下时点亮LED:
```c
void EXTI0_IRQHandler(void)
{
if (EXTI_GetITStatus(EXTI_Line0) != RESET)
{
GPIO_SetBits(GPIOA, LED_PIN); // 点亮LED
EXTI_ClearITPendingBit(EXTI_Line0); // 清除中断标志
}
}
```
最后,在主函数中注册中断服务请求以及设置按键中断:
```c
int main(void)
{
// 其他系统初始化...
// 注册按键中断
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
// 开启按键中断
EXTI_InitStructure.EXTI_Line = EXTI_Line0;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
while (1)
{
// 永远保持主循环,以便监听按键事件
}
}
// 延迟函数用于模拟按键按下
void delay_ms(uint32_t ms)
{
for (uint32_t i = 0; i < ms * 1000 / 10; i++);
}
```
阅读全文