今天的帖子主题是关于开发板的外部中断实验,只需在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);
}
今天的帖子主题是关于开发板的外部中断实验,只需在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);
}