利用PA0引脚连接的Button来控制连接到PC5上的LED的状态取反,试写出PA0和PC5的初始化函数GPIO_Config()。

void GPIO_Config(void)

{

  GPIO_InitTypeDef GPIO_InitStruct;

  __HAL_RCC_GPIOA_CLK_ENABLE();

  __HAL_RCC_GPIOC_CLK_ENABLE();

   HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET);

  GPIO_InitStruct.Pin = Button_Pin;

  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
实现这个功能,需要使用STM32的外部中断和GPIO功能。首先,需要初始化PA4和PA5为输入引脚,PA6和PA7为输出引脚。然后,需要使能PA4和PA5的外部中断,并设置中断触发方式为下降沿触发。在中断处理函数中,读取PA4和PA5的状态,根据状态控制PA6和PA7的输出状态取反即可。 以下是一个简单的示例代码,仅供参考: ```c #include "stm32f10x.h" void GPIO_Config(void); void EXTI_Config(void); void EXTI4_IRQHandler(void); void EXTI9_5_IRQHandler(void); int main(void) { GPIO_Config(); EXTI_Config(); while (1) { // 程序主循环 } } void GPIO_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; // 使能GPIOA时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 配置PA4和PA5为输入引脚 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // 上拉输入 GPIO_Init(GPIOA, &GPIO_InitStructure); // 配置PA6和PA7为输出引脚 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); } void EXTI_Config(void) { EXTI_InitTypeDef EXTI_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; // 使能AFIO时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); // 配置PA4和PA5为外部中断输入 GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource4); GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource5); // 配置EXTI线路 EXTI_InitStructure.EXTI_Line = EXTI_Line4 | EXTI_Line5; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; // 下降沿触发 EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); // 配置中断优先级 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; // 配置中断向量 NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn; NVIC_Init(&NVIC_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn; NVIC_Init(&NVIC_InitStructure); } void EXTI4_IRQHandler(void) { if (EXTI_GetITStatus(EXTI_Line4) != RESET) { // 读取PA4的状态控制PA7的输出状态取反 if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_4) == RESET) { GPIO_WriteBit(GPIOA, GPIO_Pin_7, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_7))); } EXTI_ClearITPendingBit(EXTI_Line4); } } void EXTI9_5_IRQHandler(void) { if (EXTI_GetITStatus(EXTI_Line5) != RESET) { // 读取PA5的状态控制PA6的输出状态取反 if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_5) == RESET) { GPIO_WriteBit(GPIOA, GPIO_Pin_6, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_6))); } EXTI_ClearITPendingBit(EXTI_Line5); } } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小码1111

谢谢那么优秀的你来为我加油

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

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

打赏作者

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

抵扣说明:

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

余额充值