用STM32G12K128单片机编写程序,实现P39-P42口连接的四个按键分别按下,P2口对应的LED点亮
时间: 2024-04-07 18:33:52 浏览: 183
您好!下面是用STM32G12K128单片机编写的程序示例,实现P39-P42口连接的四个按键分别按下时,P2口对应的LED点亮的功能:
```c
#include "stm32g1xx.h"
void GPIO_Init(void);
void EXTI_Init(void);
void LED_On(void);
void LED_Off(void);
int main(void)
{
GPIO_Init();
EXTI_Init();
while (1)
{
// 程序主循环
}
}
void GPIO_Init(void)
{
RCC->IOPENR |= RCC_IOPENR_GPIOBEN | RCC_IOPENR_GPIOCEN; // 使能GPIOB和GPIOC的时钟
GPIOB->MODER &= ~(GPIO_MODER_MODE2_Msk | GPIO_MODER_MODE3_Msk | GPIO_MODER_MODE4_Msk | GPIO_MODER_MODE5_Msk); // 将P2口设置为输出模式
GPIOB->MODER |= (GPIO_MODER_MODE2_0 | GPIO_MODER_MODE3_0 | GPIO_MODER_MODE4_0 | GPIO_MODER_MODE5_0); // 设置P2口为推挽输出
GPIOC->MODER &= ~(GPIO_MODER_MODE9_Msk | GPIO_MODER_MODE10_Msk | GPIO_MODER_MODE11_Msk | GPIO_MODER_MODE12_Msk); // 将P39-P42口设置为输入模式
GPIOC->PUPDR &= ~(GPIO_PUPDR_PUPD9_Msk | GPIO_PUPDR_PUPD10_Msk | GPIO_PUPDR_PUPD11_Msk | GPIO_PUPDR_PUPD12_Msk); // 关闭P39-P42口的上下拉电阻
}
void EXTI_Init(void)
{
RCC->APBENR1 |= RCC_APBENR1_SYSCFGEN; // 使能SYSCFG的时钟
SYSCFG->EXTICR[2] &= ~(SYSCFG_EXTICR3_EXTI9_Msk | SYSCFG_EXTICR3_EXTI10_Msk | SYSCFG_EXTICR3_EXTI11_Msk | SYSCFG_EXTICR3_EXTI12_Msk); // 将P39-P42口连接到EXTI9-EXTI12
EXTI->IMR1 |= EXTI_IMR1_IM9 | EXTI_IMR1_IM10 | EXTI_IMR1_IM11 | EXTI_IMR1_IM12; // 使能EXTI9-EXTI12中断
EXTI->RTSR1 |= EXTI_RTSR1_RT9 | EXTI_RTSR1_RT10 | EXTI_RTSR1_RT11 | EXTI_RTSR1_RT12; // 设置EXTI9-EXTI12上升沿触发
NVIC_EnableIRQ(EXTI9_5_IRQn); // 使能EXTI9-EXTI12中断的中断向量
NVIC_SetPriority(EXTI9_5_IRQn, 0); // 设置EXTI9-EXTI12中断的优先级
}
void EXTI9_5_IRQHandler(void)
{
if (EXTI->PR1 & EXTI_PR1_PIF9)
{
EXTI->PR1 = EXTI_PR1_PIF9; // 清除P39口的中断标志位
LED_On();
}
if (EXTI->PR1 & EXTI_PR1_PIF10)
{
EXTI->PR1 = EXTI_PR1_PIF10; // 清除P40口的中断标志位
LED_On();
}
if (EXTI->PR1 & EXTI_PR1_PIF11)
{
EXTI->PR1 = EXTI_PR1_PIF11; // 清除P41口的中断标志位
LED_On();
}
if (EXTI->PR1 & EXTI_PR1_PIF12)
{
EXTI->PR1 = EXTI_PR1_PIF12; // 清除P42口的中断标志位
LED_On();
}
}
void LED_On(void)
{
GPIOB->BSRR = GPIO_BSRR_BS2; // 点亮P2口对应的LED
}
void LED_Off(void)
{
GPIOB->BSRR = GPIO_BSRR_BR2; // 熄灭P2口对应的LED
}
```
以上代码中,我们首先使用`GPIO_Init`函数初始化了P2口和P39-P42口的GPIO配置,将P2口设置为输出模式,将P39-P42口设置为输入模式。然后使用`EXTI_Init`函数初始化了EXTI9-EXTI12中断,将P39-P42口连接到相应的中断线,并设置了中断触发条件为上升沿。在`EXTI9_5_IRQHandler`中断服务函数中,我们判断按键的中断标志位是否被置位,如果是,则清除中断标志位,并点亮P2口对应的LED。
请注意,以上代码只是一个示例,具体的引脚和寄存器配置可能需要根据您的硬件电路和需求进行修改。同时,还需要根据您的开发环境选择合适的编译工具链和调试器,并进行适当的配置。
希望以上信息能够对您有所帮助!如果您还有其他问题,请随时提出。
阅读全文