【STM32F746G-DISCO试用体验】+外部中断实验

  • A401480224
  • LV2工程师
  • |      2018-03-02 23:02:39
  • 浏览量 804
  • 回复:0
今天的帖子主题是关于开发板的外部中断实验,只需在LED程序的基础上进行修改,同之前相同,首先对实验概况进行简要介绍。 实验功能 程序运行,按一次user按键,LED1指示灯(reset按键旁)状态翻转一次 时钟分配 A.晶振: -外部高速晶振:25MHz -RTC晶振:32.768KHz B.各总线运行时钟: -系统时钟 = SYCCLK = AHB1 = 216MHz -APB2 = 108MHz -APB1 = 54MHz C.浮点运算单元:使用 管脚分配 LD1->PI1 KEY->PI11 工程的建立 以下为本次实验新增部分的源代码: 系统节拍时钟驱动: #include "Systick.h" _SysTick_Info SysTick_Info; void SysTick_Handler (void) { SysTick->CTRL &= ~SysTick_CTRL_COUNTFLAG_Msk; HAL_IncTick(); if(SysTick_Info.Operation != NULL) SysTick_Info.Operation(); } void SysTick_Init(void (*ISR)(void)) { SysTick_Info.Operation = ISR; SysTick_Config(HAL_RCC_GetHCLKFreq()/1000); } 按键驱动程序: #include "key.h" #include "delay.h" _KEY_ Key_Info; void Key_Info_Init(void) { Key_Info.Num = 0; Key_Info.State = Key_UP; Key_Info.Num_Last = 0; Key_Info.Key_Delay_Cnt = 0; } void Key_Init(void) { GPIO_InitTypeDef GPIO_InitStruct; __GPIOI_CLK_ENABLE(); GPIO_InitStruct.Pin = GPIO_PIN_11; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FAST; HAL_GPIO_Init(GPIOI, &GPIO_InitStruct); Key_Info_Init(); } __INLINE u8 Independent_Key_Scan(void) { if(HAL_GPIO_ReadPin(GPIOI, GPIO_PIN_11)) { return KEY_ONE; } return 0; } void Key_Read(void) { u8 Key_CurrNum; delay_ms(1); Key_CurrNum = 0; Key_CurrNum = Independent_Key_Scan(); if((Key_Info.Shake_LastNum == Key_CurrNum)&&(Key_CurrNum != 0)) { Key_Info.Key_Delay_Cnt++; #if KEY_TRIGGER_MODE == DOWN_TRIGGER if(Key_Info.Key_Delay_Cnt > KEY_SHAKE_DELAY) { Key_Info.Key_Delay_Cnt = KEY_SHAKE_DELAY + 1; Key_Info.State = Key_KEEP; } if(Key_Info.Key_Delay_Cnt == KEY_SHAKE_DELAY) { Key_Info.Num = Key_Info.Shake_LastNum; Key_Info.State = Key_DOWN; } #endif } else { #if KEY_TRIGGER_MODE == DOWN_TRIGGER Key_Info.Key_Delay_Cnt = 0; Key_Info.Num = 0; Key_Info.State = Key_UP; goto KEY_END; #elif KEY_TRIGGER_MODE == UP_TRIGGER if(Key_Info.Key_Delay_Cnt < KEY_SHAKE_DELAY) { Key_Info.Key_Delay_Cnt = 0; Key_Info.Num = 0; Key_Info.State = Key_UP; goto KEY_END; } else { Key_Info.Key_Delay_Cnt = 0; Key_Info.Num = Key_Info.Shake_LastNum; Key_Info.State = Key_UP; goto KEY_END; } #endif } KEY_END: Key_Info.Shake_LastNum = Key_CurrNum; } 外部中断驱动: #include "Exti.h" _EXTI_ISR Exti_ISR; void Exti_Init(void (*ISR)(uint16_t GPIO_Pin)) { GPIO_InitTypeDef GPIO_InitStruct; Exti_ISR.exti_isr = ISR; __GPIOI_CLK_ENABLE(); GPIO_InitStruct.Pin = GPIO_PIN_11; GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FAST; HAL_GPIO_Init(GPIOI, &GPIO_InitStruct); HAL_NVIC_SetPriority(EXTI15_10_IRQn , 0x0F, 0); HAL_NVIC_EnableIRQ(EXTI15_10_IRQn); } void EXTI15_10_IRQHandler(void) { HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_11); } void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if(Exti_ISR.exti_isr != NULL) Exti_ISR.exti_isr(GPIO_Pin); }
  • 0
  • 收藏
  • 举报
  • 分享
我来回复

登录后可评论,请 登录注册

所有回答 数量:0
x
收藏成功!点击 我的收藏 查看收藏的全部帖子