[MM32软件] F031的按键测试

[复制链接]
 楼主| heisexingqisi 发表于 2019-12-30 23:00 | 显示全部楼层 |阅读模式
pi, IO, GPIO, gp, TI
  1. /**
  2. ******************************************************************************
  3. * [url=home.php?mod=space&uid=288409]@file[/url]     main.c
  4. * [url=home.php?mod=space&uid=187600]@author[/url]   AE team
  5. * [url=home.php?mod=space&uid=895143]@version[/url]  V1.1.1
  6. * [url=home.php?mod=space&uid=212281]@date[/url]     15/05/2019
  7. * @brief
  8. ******************************************************************************
  9. * @copy
  10. *
  11. * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
  12. * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
  13. * TIME. AS A RESULT, MindMotion SHALL NOT BE HELD LIABLE FOR ANY
  14. * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
  15. * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
  16. * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
  17. *
  18. * <h2><center>© COPYRIGHT 2019 MindMotion</center></h2>
  19. */
  20. #include "HAL_device.h"
  21. #include "HAL_conf.h"
  22. #include "stdio.h"

  23. void LED_Init(void);
  24. void KEY_Init(void);
  25. void EXTIX_Init(void);

  26. #define LED4_ON()  GPIO_ResetBits(GPIOA,GPIO_Pin_15)        // PA15
  27. #define LED4_OFF()  GPIO_SetBits(GPIOA,GPIO_Pin_15)        // PA15
  28. #define LED4_TOGGLE()  (GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_15))?(GPIO_ResetBits(GPIOA,GPIO_Pin_15)):(GPIO_SetBits(GPIOA,GPIO_Pin_15)) // PA15

  29. #define LED3_ON()  GPIO_ResetBits(GPIOB,GPIO_Pin_3)        // PB3
  30. #define LED3_OFF()  GPIO_SetBits(GPIOB,GPIO_Pin_3)        // PB3
  31. #define LED3_TOGGLE()  (GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_3))?(GPIO_ResetBits(GPIOB,GPIO_Pin_3)):(GPIO_SetBits(GPIOB,GPIO_Pin_3))        // PB3

  32. #define LED2_ON()  GPIO_ResetBits(GPIOB,GPIO_Pin_4)        // PB4
  33. #define LED2_OFF()  GPIO_SetBits(GPIOB,GPIO_Pin_4)        // PB4
  34. #define LED2_TOGGLE()  (GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_4))?(GPIO_ResetBits(GPIOB,GPIO_Pin_4)):(GPIO_SetBits(GPIOB,GPIO_Pin_4))        // PB4

  35. #define LED1_ON()  GPIO_ResetBits(GPIOB,GPIO_Pin_5)        // PB5
  36. #define LED1_OFF()  GPIO_SetBits(GPIOB,GPIO_Pin_5)        // PB5
  37. #define LED1_TOGGLE()  (GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_5))?(GPIO_ResetBits(GPIOB,GPIO_Pin_5)):(GPIO_SetBits(GPIOB,GPIO_Pin_5))        // PB5

  38. #define KEY1  GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_13)//读取按键1
  39. #define WK_UP   GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)//读取按键2
  40. #define KEY3  GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_10)//读取按键3
  41. #define KEY4  GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11)//读取按键4

  42. #define KEY1_PRES        1                //KEY1
  43. #define WKUP_PRES        2                //WK_UP  
  44. #define KEY3_PRES        3                //KEY3
  45. #define KEY4_PRES        4                //KEY4

  46. /********************************************************************************************************
  47. **函数信息 :main(void)
  48. **功能描述 :
  49. **输入参数 :无
  50. **输出参数 :无
  51. ********************************************************************************************************/
  52. int main(void)
  53. {
  54.     //GPIO口测试,闪烁LED灯

  55.     LED_Init();                                                                 //初始化与LED连接的硬件接口
  56.     KEY_Init();                                                                 //初始化与按键连接的硬件接口
  57.     EXTIX_Init();

  58.     while(1) {
  59.     }
  60. }

  61. /********************************************************************************************************
  62. **函数信息 :LED_Init(void)
  63. **功能描述 :LED初始化
  64. **输入参数 :无
  65. **输出参数 :无
  66. ********************************************************************************************************/
  67. void LED_Init(void)
  68. {

  69.     GPIO_InitTypeDef  GPIO_InitStructure;

  70.     RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOB, ENABLE);   //开启GPIOA,GPIOB时钟

  71.     GPIO_InitStructure.GPIO_Pin  =  GPIO_Pin_15;
  72.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  73.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  74.     GPIO_Init(GPIOA, &GPIO_InitStructure);

  75.     GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5;
  76.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  77.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  78.     GPIO_Init(GPIOB, &GPIO_InitStructure);

  79.     LED1_ON();
  80.     LED2_ON();
  81.     LED3_ON();
  82.     LED4_ON();
  83. }

  84. /********************************************************************************************************
  85. **函数信息 :void KEY_Init(void)
  86. **功能描述 :按键初始化函数
  87. **输入参数 :
  88. **输出参数 :
  89. **    备注 :
  90. ********************************************************************************************************/
  91. void KEY_Init(void)
  92. {
  93.     GPIO_InitTypeDef GPIO_InitStructure;

  94.     RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOB | RCC_AHBPeriph_GPIOC, ENABLE); //使能GPIOA,GPIOB,GPIOC时钟


  95.     GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_13;                                 //PC13,K1
  96.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;                               //设置成上拉输入
  97.     GPIO_Init(GPIOC, &GPIO_InitStructure);                                      //初始化GPIOC13

  98.     GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0;                                  //PA0,K2(WK_UP)
  99.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;                               //设置成下拉输入
  100.     GPIO_Init(GPIOA, &GPIO_InitStructure);                                      //初始化GPIOA0

  101.     GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_10 | GPIO_Pin_11;                   //PB10,PB11,K3,K4
  102.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;                               //设置成上拉输入
  103.     GPIO_Init(GPIOB, &GPIO_InitStructure);                                      //初始化GPIOB.10,11
  104. }

  105. /********************************************************************************************************
  106. **函数信息 :void EXTIX_Init(void)
  107. **功能描述 :外部中断初始化函数
  108. **输入参数 :
  109. **输出参数 :
  110. **常用函数 :
  111. ********************************************************************************************************/
  112. void EXTIX_Init(void)
  113. {
  114.     EXTI_InitTypeDef EXTI_InitStructure;
  115.     NVIC_InitTypeDef NVIC_InitStructure;

  116.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);                      //外部中断,需要使能AFIO时钟

  117.     KEY_Init();                                                                 //初始化按键对应io模式

  118.     //GPIOC.13 中断线以及中断初始化配置
  119.     SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOC, EXTI_PinSource13);

  120.     EXTI_InitStructure.EXTI_Line = EXTI_Line13;
  121.     EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  122.     EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;                     //下降沿触发
  123.     EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  124.     EXTI_Init(&EXTI_InitStructure);                                             //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器

  125.     //GPIOA.0          中断线以及中断初始化配置
  126.     SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0);

  127.     EXTI_InitStructure.EXTI_Line = EXTI_Line0;
  128.     EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  129.     EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;                      //上升沿触发
  130.     EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  131.     EXTI_Init(&EXTI_InitStructure);                                             //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器

  132.     //GPIOB.10          中断线以及中断初始化配置
  133.     SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOB, EXTI_PinSource10);

  134.     EXTI_InitStructure.EXTI_Line = EXTI_Line10;
  135.     EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  136.     EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;                     //下降沿触发
  137.     EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  138.     EXTI_Init(&EXTI_InitStructure);                                             //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器

  139.     //GPIOB.11          中断线以及中断初始化配置
  140.     SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOB, EXTI_PinSource11);

  141.     EXTI_InitStructure.EXTI_Line = EXTI_Line11;
  142.     EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  143.     EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;                     //下降沿触发
  144.     EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  145.     EXTI_Init(&EXTI_InitStructure);                                             //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器


  146.     NVIC_InitStructure.NVIC_IRQChannel = EXTI4_15_IRQn;                         //使能按键所在的外部中断通道
  147.     NVIC_InitStructure.NVIC_IRQChannelPriority = 0x02;                          //子优先级2
  148.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                             //使能外部中断通道
  149.     NVIC_Init(&NVIC_InitStructure);                                                  //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器

  150.     NVIC_InitStructure.NVIC_IRQChannel = EXTI0_1_IRQn;                          //使能按键所在的外部中断通道
  151.     NVIC_InitStructure.NVIC_IRQChannelPriority = 0x01;                          //子优先级1
  152.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                             //使能外部中断通道
  153.     NVIC_Init(&NVIC_InitStructure);

  154. }

  155. /********************************************************************************************************
  156. **函数信息 :void EXTI0_1_IRQHandler(void)
  157. **功能描述 :外部中断函数
  158. **输入参数 :
  159. **输出参数 :
  160. **常用函数 :
  161. ********************************************************************************************************/
  162. u16 EXTI_DELAY = 0;

  163. void EXTI0_1_IRQHandler(void)
  164. {
  165.     for(EXTI_DELAY = 0; EXTI_DELAY < 1000; EXTI_DELAY++);
  166.     if(WK_UP == 1) {
  167.         LED2_TOGGLE();
  168.     }
  169.     EXTI_ClearFlag(EXTI_Line0);                                                 //清除EXTI0线路挂起位
  170. }

  171. /********************************************************************************************************
  172. **函数信息 :void EXTI4_15_IRQHandler(void)
  173. **功能描述 :外部中断函数
  174. **输入参数 :
  175. **输出参数 :
  176. **常用函数 :
  177. ********************************************************************************************************/
  178. void EXTI4_15_IRQHandler(void)
  179. {
  180.     for(EXTI_DELAY = 0; EXTI_DELAY < 1000; EXTI_DELAY++);
  181.     if(KEY1 == 0) {
  182.         LED1_TOGGLE();
  183.     } else if(KEY3 == 0) {
  184.         LED3_TOGGLE();
  185.     } else if(KEY4 == 0) {
  186.         LED4_TOGGLE();
  187.     }
  188.     EXTI_ClearFlag(EXTI_Line10 | EXTI_Line11 | EXTI_Line13);                    //清除EXTI10,11,13线路挂起位

  189. }

  190. /**
  191. * @}
  192. */

  193. /**
  194. * @}
  195. */

  196. /**
  197. * @}
  198. */

  199. /*-------------------------(C) COPYRIGHT 2019 MindMotion ----------------------*/



 楼主| heisexingqisi 发表于 2019-12-30 23:00 | 显示全部楼层
库函数做的可以啊,仿效了STM32的风格。
dongnanxibei 发表于 2019-12-30 23:01 | 显示全部楼层
通俗易懂,很容易上手
您需要登录后才可以回帖 登录 | 注册

本版积分规则

157

主题

2767

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部

157

主题

2767

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部