Sunday, September 29, 2013

Programming Example : EXTI

#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 */

  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