Waveshare
直播中

林新武

9年用户 185经验值
擅长:处理器/DSP
私信 关注
[经验]

STM32CubeMX系列教程1:GPIO

本帖最后由 ka**ha 于 2016-5-17 18:43 编辑

打开STM32CubeMX新建工程,选择STMF746IGT6芯片。选择外部高速晶振(HSE).

根据Open746I-C开发板原理图(原理图可在微雪电子网站上下载),选择按键和LED引脚


PA0,PG2,PG3,PD4,PD5,PD11为按键输入管脚,选择GPIO_INPUT模式。
PB6,PB7,PH4,PI8为LED输出控制管脚,选择GPIO_OUTPUT模式。


点击Clock Configuration配置系统时钟为216M最高速度。


点击Configuration->GPIO配置管脚。五向按键管脚配置为上拉输入模式,WakeUp按键已经为外部下拉,故不用配置(R6为下拉电阻,R5,C3为RC滤波去抖动)。LED管脚配置为低速推挽输出模式,既不上拉也不下拉(即默认的模式不用配置)。


点击生成报告,软件会提示新建工程,输入工程名,选择工程保存路径。IDE选择MDK-ARM V5.


在Code Generator中找到Generated files框,勾选Generated periphera initialization as a pair of
'.c/.h' files per IP。外设初始化为独立的C文件和头文件。



点击生成代码。点击Open Project打开工程。到这里我们就配置好工程外设初始化。



点击Build按钮,然后等一会,Build Optput信息框会输出没有错误没有警告。



在gpio.c文件中最后面的USER CODE BEGIN 2和USER CODE END 2中间添加如下四个函数。
用户代码要加在USER CODE BEGIN N和USER CODE END N之间,否则下次重新生成代码后,会被删除
  1. /* USER CODE BEGIN 2 */

  2. /**
  3.   * @brief  Turns selected LED On.
  4.   * @param  Led: LED to be set on
  5.   *          This parameter can be one of the following values:
  6.   *            @arg  LED1
  7.   *            @arg  LED2
  8.   *            @arg  LED3
  9.   *            @arg  LED4
  10.   * @retval None
  11.   */
  12. void BSP_LED_On(Led_TypeDef Led)
  13. {
  14.   HAL_GPIO_WritePin(GPIO_PORT[Led], GPIO_PIN[Led], GPIO_PIN_SET);
  15. }

  16. /**
  17.   * @brief  Turns selected LED Off.
  18.   * @param  Led: LED to be set off
  19.   *          This parameter can be one of the following values:
  20.   *            @arg  LED1
  21.   *            @arg  LED2
  22.   *            @arg  LED3
  23.   *            @arg  LED4
  24.   * @retval None
  25.   */
  26. void BSP_LED_Off(Led_TypeDef Led)
  27. {
  28.   HAL_GPIO_WritePin(GPIO_PORT[Led], GPIO_PIN[Led], GPIO_PIN_RESET);
  29. }

  30. /**
  31.   * @brief  Toggles the selected LED.
  32.   * @param  Led: LED to be toggled
  33.   *          This parameter can be one of the following values:
  34.   *            @arg  LED1
  35.   *            @arg  LED2
  36.   *            @arg  LED3
  37.   *            @arg  LED4
  38.   * @retval None
  39.   */
  40. void BSP_LED_Toggle(Led_TypeDef Led)
  41. {
  42.   HAL_GPIO_TogglePin(GPIO_PORT[Led], GPIO_PIN[Led]);
  43. }

  44. /**
  45.   * @brief  Returns the current joystick status.
  46.   * @retval Code of the joystick key pressed
  47.   *          This code can be one of the following values:
  48.   *            @arg  WAKEUP
  49.   *            @arg  JOY_NONE
  50.   *            @arg  JOY_CTR
  51.   *            @arg  JOY_DOWN
  52.   *            @arg  JOY_LEFT
  53.   *            @arg  JOY_RIGHT
  54.   *            @arg  JOY_UP
  55.   */
  56. JOYState_TypeDef BSP_JOY_GetState(void)
  57. {  
  58.   /* Check the pressed keys */  
  59.     if(HAL_GPIO_ReadPin(WAKEUP_GPIO_Port,WAKEUP_Pin) == GPIO_PIN_SET)
  60.   {
  61.     return (JOYState_TypeDef) WAKEUP;
  62.   }
  63.   else if(HAL_GPIO_ReadPin(CTR_GPIO_Port,CTR_Pin) == GPIO_PIN_RESET)
  64.   {
  65.     return (JOYState_TypeDef) JOY_CTR;
  66.   }
  67.   else if(HAL_GPIO_ReadPin(DOWN_GPIO_Port,DOWN_Pin) == GPIO_PIN_RESET)
  68.   {
  69.     return (JOYState_TypeDef) JOY_DOWN;
  70.   }
  71.   else if(HAL_GPIO_ReadPin(LEFT_GPIO_Port,LEFT_Pin) == GPIO_PIN_RESET)
  72.   {
  73.     return (JOYState_TypeDef) JOY_LEFT;
  74.   }
  75.   else if(HAL_GPIO_ReadPin(RIGHT_GPIO_Port,RIGHT_Pin) == GPIO_PIN_RESET)
  76.   {
  77.     return (JOYState_TypeDef) JOY_RIGHT;
  78.   }
  79.   else if(HAL_GPIO_ReadPin(UP_GPIO_Port,UP_Pin) == GPIO_PIN_RESET)
  80.   {
  81.     return (JOYState_TypeDef) JOY_UP;
  82.   }
  83.   else
  84.   {
  85.     return (JOYState_TypeDef) JOY_NONE;
  86.   }  
  87. }
  88. /* USER CODE END 2 */

以上三个函数的功能分别为点亮LED,熄灭LED,LED状态翻转,读取按键状态。
在gpio.c前面添加LED1-LED4的管脚的数组变量。
  1. /* USER CODE BEGIN 1 */
  2. GPIO_TypeDef* GPIO_PORT[] = {LED1_GPIO_Port,
  3.                              LED2_GPIO_Port,
  4.                              LED3_GPIO_Port,
  5.                              LED4_GPIO_Port};

  6. const uint16_t GPIO_PIN[] = {LED1_Pin,
  7.                              LED2_Pin,
  8.                              LED3_Pin,
  9.                              LED4_Pin};
  10. /* USER CODE END 1 */

在gpio.h前面添加Led_TypeDef和JOYState_TypeDef两个枚举类型。声明刚才添加的四个函数。
  1. /* USER CODE BEGIN Private defines */
  2. typedef enum
  3. {
  4.   LED1 = 0,
  5.   LED2 = 1,
  6.   LED3 = 2,
  7.   LED4 = 3
  8. }Led_TypeDef;

  9. typedef enum
  10. {
  11.   JOY_NONE  = 0,
  12.   JOY_CTR   = 1,
  13.   JOY_DOWN  = 2,
  14.   JOY_LEFT  = 3,
  15.   JOY_RIGHT = 4,
  16.   JOY_UP    = 5,
  17.   WAKEUP    = 6
  18. }JOYState_TypeDef;
  19. /* USER CODE END Private defines */

  20. void MX_GPIO_Init(void);

  21. /* USER CODE BEGIN Prototypes */
  22. void BSP_LED_On(Led_TypeDef Led);
  23. void BSP_LED_Off(Led_TypeDef Led);
  24. void BSP_LED_Toggle(Led_TypeDef Led);
  25. JOYState_TypeDef BSP_JOY_GetState(void);
  26. /* USER CODE END Prototypes */


在main.c文件中的main函数的while循环中添加应用代码。代码中使用switch case语句。先通过BSP_JOY_GetState()语句判断是否有按键按下,然后根据按下的按键改变LED1~LED4的状态。

  1. /* USER CODE BEGIN WHILE */
  2.   while (1)
  3.   {
  4.   /* USER CODE END WHILE */

  5.   /* USER CODE BEGIN 3 */
  6.         switch(BSP_JOY_GetState())
  7.         {
  8.             case JOY_UP:
  9.                 BSP_LED_On(LED1);break;
  10.             case JOY_RIGHT:
  11.                 BSP_LED_On(LED2);break;
  12.             case JOY_DOWN:
  13.                 BSP_LED_On(LED3);break;   
  14.             case JOY_LEFT:
  15.                 BSP_LED_On(LED4);break;
  16.             case JOY_CTR:
  17.             case WAKEUP:
  18.                 BSP_LED_On(LED1);
  19.                 BSP_LED_On(LED2);
  20.                 BSP_LED_On(LED3);
  21.                 BSP_LED_On(LED4);
  22.                 break;
  23.             default:
  24.                 BSP_LED_Off(LED1);
  25.                 BSP_LED_Off(LED2);
  26.                 BSP_LED_Off(LED3);
  27.                 BSP_LED_Off(LED4);
  28.                 break;
  29.         }
  30.   }
  31.   /* USER CODE END 3 */


再次编译程序,如果编译没有错误。点击下载到Open746I-C开发板。如果提示错误,可以点击图标对Option for Target 的Dubug选项进行修改。(图上选的是ST-LINK)




点击Settings->Flash Download勾选 Reset and Run选项。这样程序下载后自动启动运行,不用再按一下复位或者重新上电才能运行。


最后,下载程序见证奇迹的时候。按下不同按键,LED1~LED2灯显示不同的转态。以后写的程序我们可以在这个模板的基础上修改。




更多回帖

发帖
×
20
完善资料,
赚取积分