#include "stm32f2xx.h"
void GPIO_ConfigInputMode(void);
void EXTI_Config(void);
void NVIC_Config(void);
int main(void)
{
/* Configure EXTI Line0 (Connected to PA0 pin) in interrupt mode */
GPIO_ConfigInputMode();
EXTI_Config();
NVIC_Config();
/* Generate software interrupt: simulate rising edge applied on EXTI0 Line */
EXTI_GenerateSWInterrupt(EXTI_Line0);
while (1);
}
void GPIO_ConfigInputMode(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* Enable GPIOA's AHB interface clock */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
/* Configure PA0 pin in input mode */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void EXTI_Config(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
/* Enable SYSCFG's APB interface clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
/* Connect EXTI Line0 to PA0 pin */
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0);
/* Configure EXTI line0 */
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);
}
void NVIC_Config(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
/* Enable and set EXTI Line0 Interrupt to the lowest priority */
/* EXTI0 Line interrupt handler */
/*
<GPIO Configuration as a input mode>
@skip Refer to "Programming Example : GPIO - Input Mode"
<Connect External Interrupt Line to GPIO pin>
@reg SYSCFG->EXTICR (0~3)
@desc Bits 15:0, EXTIx[3:0]: EXTI x configuration
@fn void SYSCFG_EXTILineConfig(uint8_t EXTI_PortSourceGPIOx, uint8_t EXTI_PinSourcex)
@ref stm32f2xx_syscfg.h
<External Interrupt Configuration>
@reg EXTI->IMR, EXTI->EMR, EXTI->RTSR, EXTI->FTSR
@desc [EXTI->IMR, EXTI->EMR] Bits 22:0, MRx: interrupt/event mask on line x
[EXTI->RTSR, EXTI->FTSR] Bits 22:0, TRx: rising/falling trigger event configuration bit on line x
@fn void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct)
@ref stm32f2xx_exti.h
<NVIC Configuration>
@reg NVIC->IPRx, NVIC->ISERx, NVIC->ICERx
@desc [NVIC->IPRx] IPR0 ~ IPR20: Interrupt priority register, IP[0] ~ IP[80]
[NVIC->ISERx] Bits 31:0, SETENA[31:0]: Interrupt set-enable bits. Write: 0(No effect), 1(Enable interrupt)
[NVIC->ICERx] Bits 31:0, SETENA[31:0]: Interrupt clear-enable bits. Write: 0(No effect), 1(Clear interrupt)
@fn void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct)
@param EXTI0_IRQn, NVIC_InitTypeDef
@ref stm32f2xx.h, misc.h
<External Interrupt Triggering by SW>
@reg EXTI->SWIER
@desc Bits 22:0, SWIERx: software interrupt on line x
@fn void EXTI_GenerateSWInterrupt(uint32_t EXTI_Line)
@param EXTI_Line0
@ref stm32f2xx_exti.h
<External Interrupt Handling>
1. Get external interrupt status
@reg EXTI->IMR, EXTI->PR
@desc [EXTI->IMR] Bits 22:0, MRx: interrupt/event mask on line x
[EXTI->PR] Bits 22:0, PRx: pending bit
@fn ITStatus EXTI_GetITStatus(uint32_t EXTI_Line)
@param EXTI_Line0
@ref stm32f2xx_exti.h
2. Clear interrupt pending bit
@reg EXTI->PR
@desc Bits 22:0, PRx: pending bit, cleared by writing a 1 to the bit
@fn void EXTI_ClearITPendingBit(uint32_t EXTI_Line)
@param EXTI_Line0
@ref stm32f2xx_exti.h
*/
void GPIO_ConfigInputMode(void);
void EXTI_Config(void);
void NVIC_Config(void);
int main(void)
{
/* Configure EXTI Line0 (Connected to PA0 pin) in interrupt mode */
GPIO_ConfigInputMode();
EXTI_Config();
NVIC_Config();
/* Generate software interrupt: simulate rising edge applied on EXTI0 Line */
EXTI_GenerateSWInterrupt(EXTI_Line0);
while (1);
}
void GPIO_ConfigInputMode(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* Enable GPIOA's AHB interface clock */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
/* Configure PA0 pin in input mode */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void EXTI_Config(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
/* Enable SYSCFG's APB interface clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
/* Connect EXTI Line0 to PA0 pin */
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0);
/* Configure EXTI line0 */
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);
}
void NVIC_Config(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
/* Enable and set EXTI Line0 Interrupt to the lowest priority */
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}/* EXTI0 Line interrupt handler */
void EXTI0_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line0) != RESET)
{
/* Todo: Toggle LED, etc. */
...
/* Clear the EXTI line 0 pending bit */
EXTI_ClearITPendingBit(EXTI_Line0);
}
}
/*
<GPIO Configuration as a input mode>
@skip Refer to "Programming Example : GPIO - Input Mode"
<Connect External Interrupt Line to GPIO pin>
@reg SYSCFG->EXTICR (0~3)
@desc Bits 15:0, EXTIx[3:0]: EXTI x configuration
@fn void SYSCFG_EXTILineConfig(uint8_t EXTI_PortSourceGPIOx, uint8_t EXTI_PinSourcex)
@ref stm32f2xx_syscfg.h
<External Interrupt Configuration>
@reg EXTI->IMR, EXTI->EMR, EXTI->RTSR, EXTI->FTSR
@desc [EXTI->IMR, EXTI->EMR] Bits 22:0, MRx: interrupt/event mask on line x
[EXTI->RTSR, EXTI->FTSR] Bits 22:0, TRx: rising/falling trigger event configuration bit on line x
@fn void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct)
@ref stm32f2xx_exti.h
<NVIC Configuration>
@reg NVIC->IPRx, NVIC->ISERx, NVIC->ICERx
@desc [NVIC->IPRx] IPR0 ~ IPR20: Interrupt priority register, IP[0] ~ IP[80]
[NVIC->ISERx] Bits 31:0, SETENA[31:0]: Interrupt set-enable bits. Write: 0(No effect), 1(Enable interrupt)
[NVIC->ICERx] Bits 31:0, SETENA[31:0]: Interrupt clear-enable bits. Write: 0(No effect), 1(Clear interrupt)
@fn void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct)
@param EXTI0_IRQn, NVIC_InitTypeDef
@ref stm32f2xx.h, misc.h
<External Interrupt Triggering by SW>
@reg EXTI->SWIER
@desc Bits 22:0, SWIERx: software interrupt on line x
@fn void EXTI_GenerateSWInterrupt(uint32_t EXTI_Line)
@param EXTI_Line0
@ref stm32f2xx_exti.h
<External Interrupt Handling>
1. Get external interrupt status
@reg EXTI->IMR, EXTI->PR
@desc [EXTI->IMR] Bits 22:0, MRx: interrupt/event mask on line x
[EXTI->PR] Bits 22:0, PRx: pending bit
@fn ITStatus EXTI_GetITStatus(uint32_t EXTI_Line)
@param EXTI_Line0
@ref stm32f2xx_exti.h
2. Clear interrupt pending bit
@reg EXTI->PR
@desc Bits 22:0, PRx: pending bit, cleared by writing a 1 to the bit
@fn void EXTI_ClearITPendingBit(uint32_t EXTI_Line)
@param EXTI_Line0
@ref stm32f2xx_exti.h
*/
No comments:
Post a Comment