zoukankan      html  css  js  c++  java
  • 按键中断总结

    一、RCC初始化


    1. /****************************************************************************
    2. * Function Name : RCC_Configuration
    3. * Description : Sets System clock frequency to 72MHz and configure HCLK, PCLK2
    4. * and PCLK1 prescalers.
    5. * Input : None
    6. * Output : None
    7. * Return : None
    8. ****************************************************************************/
    9. void RCC_Configuration(void)
    10. {
    11.     /* Deinitialize the RCC registers */
    12.     RCC_DeInit();
    13.     
    14.     /* Enable the HSE */    
    15.     RCC_HSEConfig(RCC_HSE_ON);
    16.     
    17.     /* Wait till HSE is ready and if Time out is reached exit */
    18.     HSEStartUpStatus = RCC_WaitForHSEStartUp();
    19.     if(HSEStartUpStatus == SUCCESS)
    20.     {
    21.         /* Add here PLL ans system clock config */
    22.         
    23.         /* Enable The Prefetch Buffer */
    24.         FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
    25.         
    26.         /* Configure Tthe Latency cycle: Set 0 Latency cycles */
    27.         FLASH_SetLatency(FLASH_Latency_2);
    28.         
    29.         /* Configure HCLK such as HCLK = SYSCLK */
    30.         RCC_HCLKConfig(RCC_SYSCLK_Div1);
    31.         
    32.         /* PCLK2 = HCLK */
    33.         RCC_PCLK2Config(RCC_HCLK_Div1);
    34.         
    35.         /* PCLK1 = HCLK/2 */
    36.         RCC_PCLK1Config(RCC_HCLK_Div2);
    37.         
    38.         /* Select HSE as system clock source*/
    39.         RCC_SYSCLKConfig(RCC_SYSCLKSource_HSE);
    40.         
    41.         /* PLLCLK = 8MHz * 9 = 72MHz */
    42.         RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
    43.         
    44.         /* ADCCLK = PCLK/4 */
    45.         RCC_ADCCLKConfig(RCC_PCLK2_Div4);
    46.         
    47.         /* Enable PLL */
    48.         RCC_PLLCmd(ENABLE);
    49.         
    50.         /* Wait till PLL is ready */
    51.         while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
    52.         
    53.         /* Select PLL as system clock source */
    54.         RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); /* Wait till HSE is used as system clock source */
    55.         while(RCC_GetSYSCLKSource() != 0x08)
    56.         {
    57.             
    58.         }
    59.     }
    60.     else
    61.     {
    62.         /* If HSE fails to start-up. */
    63.         while(1)
    64.         {
    65.         }
    66.     }
    67. }
    相比之前的时钟初始化,多初始化了ADCCLK。

    二、GPIO初始化


    1. /****************************************************************************
    2. * Function Name : GPIO_Configuration
    3. * Description :
    4. * Input : None
    5. * Output : None
    6. * Return : None
    7. ****************************************************************************/
    8. void GPIO_Configuration(void)
    9. {
    10.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);

    11.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
    12.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    13.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    14.     GPIO_Init(GPIOB, &GPIO_InitStructure);
    15.     
    16.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
    17.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    18.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    19.     GPIO_Init(GPIOB, &GPIO_InitStructure);    
    20. }
    使用PB8作为推挽输出,PB6为浮空输入。

    三、NVIC初始化


    1. /****************************************************************************
    2. * Function Name : NVIC_Configuration
    3. * Description : Configures Vector Table base location.
    4. * Input : None
    5. * Output : None
    6. * Return : None
    7. ****************************************************************************/
    8. void NVIC_Configuration(void)
    9. {
    10.     NVIC_InitTypeDef NVIC_InitStructure;

    11. #ifdef VET_TAB_RAM
    12.     /* Set the Vector Table base location at 0x2000 0000 */
    13.     NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
    14. #else
    15.     /* Set the Vector Table base location at 0x8000 0000 */
    16.     NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
    17. #endif
    18.     
    19.     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
    20.     
    21.     NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;
    22.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    23.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    24.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    25.     NVIC_Init(&NVIC_InitStructure);    
    26. }
    因位PB6位输入,也就是外部中断源。所以初始化EXTI9_5_IRQn作为外部中断源

    四、EXTI初始化


    1. /****************************************************************************
    2. * Function Name : EXTI_PE6_Config
    3. * Description :
    4. * Input : None
    5. * Output : None
    6. * Return : None
    7. ****************************************************************************/
    8. void EXTI_PE6_Config(void)
    9. {
    10.     GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource6);
    11.     
    12.     EXTI_InitStructure.EXTI_Line = EXTI_Line6;
    13.     EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    14.     EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
    15.     EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    16.     EXTI_Init(&EXTI_InitStructure);
    17.     
    18.     EXTI_GenerateSWInterrupt(EXTI_Line6);

    19. }
    设置了外部中断源,把GPIOB6作为中断源。外部中断线是6,结合原理图使用下降沿触发。
    EXTI_GenerateSWInterrupt是触发一次软件中断。

    同时需要编写中断函数在stm32f10x_it.c中:
    1. /*******************************************************************************
    2. * Function Name : EXTI9_5_IRQHandler
    3. * Description : This function handles External lines 9 to 5 interrupt request.
    4. * Input : None
    5. * Output : None
    6. * Return : None
    7. *******************************************************************************/
    8. void EXTI9_5_IRQHandler(void)
    9. {
    10.     if(EXTI_GetITStatus(EXTI_Line6) != RESET)
    11.     {
    12.         GPIO_WriteBit(GPIOB, GPIO_Pin_8, (BitAction)(1-GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_8)));
    13.         
    14.         EXTI_ClearITPendingBit(EXTI_Line6);
    15.     }
    16. }

    五、main函数

    1. /****************************************************************************
    2. * Function Name : main
    3. * Description : Main program.
    4. * Input : None
    5. * Output : None
    6. * Return : None
    7. ****************************************************************************/
    8. int main(void)
    9. {
    10.     RCC_Configuration();
    11.     
    12.     NVIC_Configuration();
    13.     
    14.     GPIO_Configuration();
    15.     
    16.     EXTI_PE6_Config();
    17.     
    18.     while(1)
    19.     {
    20.     }    
    21. }





    无欲速,无见小利。欲速,则不达;见小利,则大事不成。
  • 相关阅读:
    Windows7下安装与破解IntelliJ IDEA2017
    Maven的目录结构和常用命令
    Maven三种仓库的配置
    Maven的安装
    Maven是什么
    SQL执行计划分析2
    SQL执行计划分析
    PHP 单点登录实现方案
    PHP消息队列实现及应用
    fastAdmin根据状态显示是否显示操作按钮
  • 原文地址:https://www.cnblogs.com/ch122633/p/7363271.html
Copyright © 2011-2022 走看看