STM32L151 NB-IoT and FreeRTOS Project
guowenxue
2018-11-05 d774f40a8d826bd9ce059e0ee6bfe8267aacf247
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
/****************************************************************************
*   Copyright: (C)2018 Î人ÁèÔÆÎïÍøÖÇ¿ÆÊµÑéÊÒ www.iot-yun.com
*      Author: GuoWenxue<guowenxue@gmail.com> QQ: 281143292
* Description: STM32L151C8T6 CubeMX ¿ª·¢°åÖ»ÓÐÒ»¸ö°´¼ü°´Å¥Á¬µ½PA0,ÁíÍâÒ»¸öÊǸ´Î»°´¼ü¡£
*   ChangeLog:
*        °æ±¾ºÅ     ÈÕÆÚ       ×÷Õß      ËµÃ÷
*        V1.0.0  2018.11.05  GuoWenxue   ·¢²¼¸Ã°æ±¾
****************************************************************************/
#include <stdio.h>
#include "stm32l1xx.h"
 
void init_key1_gpio_interrupt(void);
 
/* º¯Êý˵Ã÷:  ÅäÖÃËùÓеİ´¼üµÄ GPIO¿Ú¡¢Ê±ÖÓºÍÖжϠ */
void init_keys_interrupt(void)
{
    /* STM32L151C8T6 CubeMX ¿ª·¢°åÖ»ÓÐÒ»¸ö°´¼ü°´Å¥Á¬µ½PA0ÉÏ */
    init_key1_gpio_interrupt();
}
 
 
void init_key1_gpio_interrupt(void) 
    GPIO_InitTypeDef      GPIO_InitStructure; 
    NVIC_InitTypeDef      NVIC_InitStructure;
    EXTI_InitTypeDef      EXTI_InitStructure;
    
    /* Ê¹ÄÜGPIOAµÄʱÖÓ */
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
 
    /* ³õʼ»¯ÖжÏÓÅÏȼ¶ */
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
  NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
 
    /* °´¼üÉ϶Ëͨ¹ýÉÏÀ­µç×èÁ¬µ½VCCÉÏ, ËùÒÔÉèÖÃÖжÏΪÉÏÉýÑØ´¥·¢ */
    EXTI_DeInit();
  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); 
    
    /* Ä¬ÈϽ«GPIO¿ÚÅäÖóÉÏÂÀ­µÍµçƽģʽ, ÕâÑùµ±°´¼ü°´Ïº󽫻á±ä³ÉVCC²úÉúÉÏÉýÑØ */
    GPIO_InitStructure.GPIO_Speed  = GPIO_Speed_2MHz;
  GPIO_InitStructure.GPIO_Pin    = GPIO_Pin_0;  
    GPIO_InitStructure.GPIO_Mode   = GPIO_Mode_IN; 
  GPIO_InitStructure.GPIO_OType  = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd   = GPIO_PuPd_DOWN;
  GPIO_Init(GPIOA, &GPIO_InitStructure);    
 
 
/* Ïû³ý°´¼ü¶¶¶¯ÑÓʱº¯Êý */
static __inline void key_dejitter_delay(void)
{
    uint32_t       times=6000;  
    while( times--) ;
}
 
 
/* µ±°´¼ü°´ÏÂʱ»á²úÉúÖжϣ¬CPUÌø×ªµ½startup_stm32l1xx_md.sÖвéѯÖжÏÏòÁ¿±í,²¢µ÷ÓÃÏàÓ¦µÄÖжϷþÎñ´¦Àí³EXTI0_IRQHandler() */
void EXTI0_IRQHandler(void)
{
    if(EXTI_GetITStatus(EXTI_Line0) != RESET)
    {
        /* È¥¶¶£º ÑÓʱһ¶Îʱ¼ä²é¿´GPIOµÄ״̬£¬Èç¹û»¹ÊÇµÍµçÆ½ËµÃ÷ÊÇÓÐЧ°´¼ü */
        key_dejitter_delay();
        if( Bit_SET == GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) )
        {
            printf("Detect Key Pressed and turn LED ON/off.\n");
            GPIO_WriteBit(GPIOB, GPIO_Pin_1, (BitAction)((1-GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_1))));
            EXTI_ClearITPendingBit(EXTI_Line0);
        }            
    }
}