用户名 立即注册 找回密码

微雪课堂

搜索
微雪课堂 STM32 STM32CubeMX系列教程 查看内容

STM32CubeMX系列教程1:GPIO

2016-4-27 17:33| 发布者: MyMX1213| 查看: 140000| 评论: 12

摘要: 本章讲解stm32的GPIO使用,通过按键控制LED灯亮灭
打开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之间,否则下次重新生成代码后,会被删除

01/* USER CODE BEGIN 2 */
02  
03/**
04  * @brief  Turns selected LED On.
05  * @param  Led: LED to be set on
06  *          This parameter can be one of the following values:
07  *            @arg  LED1
08  *            @arg  LED2
09  *            @arg  LED3
10  *            @arg  LED4
11  * @retval None
12  */
13void BSP_LED_On(Led_TypeDef Led)
14{
15  HAL_GPIO_WritePin(GPIO_PORT[Led], GPIO_PIN[Led], GPIO_PIN_SET);
16}
17  
18/**
19  * @brief  Turns selected LED Off.
20  * @param  Led: LED to be set off
21  *          This parameter can be one of the following values:
22  *            @arg  LED1
23  *            @arg  LED2
24  *            @arg  LED3
25  *            @arg  LED4
26  * @retval None
27  */
28void BSP_LED_Off(Led_TypeDef Led)
29{
30  HAL_GPIO_WritePin(GPIO_PORT[Led], GPIO_PIN[Led], GPIO_PIN_RESET);
31}
32  
33/**
34  * @brief  Toggles the selected LED.
35  * @param  Led: LED to be toggled
36  *          This parameter can be one of the following values:
37  *            @arg  LED1
38  *            @arg  LED2
39  *            @arg  LED3
40  *            @arg  LED4
41  * @retval None
42  */
43void BSP_LED_Toggle(Led_TypeDef Led)
44{
45  HAL_GPIO_TogglePin(GPIO_PORT[Led], GPIO_PIN[Led]);
46}
47  
48/**
49  * @brief  Returns the current joystick status.
50  * @retval Code of the joystick key pressed
51  *          This code can be one of the following values:
52  *            @arg  WAKEUP
53  *            @arg  JOY_NONE
54  *            @arg  JOY_CTR
55  *            @arg  JOY_DOWN
56  *            @arg  JOY_LEFT
57  *            @arg  JOY_RIGHT
58  *            @arg  JOY_UP
59  */
60JOYState_TypeDef BSP_JOY_GetState(void)
61
62  /* Check the pressed keys */ 
63    if(HAL_GPIO_ReadPin(WAKEUP_GPIO_Port,WAKEUP_Pin) == GPIO_PIN_SET)
64  {
65    return (JOYState_TypeDef) WAKEUP;
66  }
67  else if(HAL_GPIO_ReadPin(CTR_GPIO_Port,CTR_Pin) == GPIO_PIN_RESET)
68  {
69    return (JOYState_TypeDef) JOY_CTR;
70  }
71  else if(HAL_GPIO_ReadPin(DOWN_GPIO_Port,DOWN_Pin) == GPIO_PIN_RESET)
72  {
73    return (JOYState_TypeDef) JOY_DOWN;
74  }
75  else if(HAL_GPIO_ReadPin(LEFT_GPIO_Port,LEFT_Pin) == GPIO_PIN_RESET)
76  {
77    return (JOYState_TypeDef) JOY_LEFT;
78  }
79  else if(HAL_GPIO_ReadPin(RIGHT_GPIO_Port,RIGHT_Pin) == GPIO_PIN_RESET)
80  {
81    return (JOYState_TypeDef) JOY_RIGHT;
82  }
83  else if(HAL_GPIO_ReadPin(UP_GPIO_Port,UP_Pin) == GPIO_PIN_RESET)
84  {
85    return (JOYState_TypeDef) JOY_UP;
86  }
87  else
88  {
89    return (JOYState_TypeDef) JOY_NONE;
90  
91}
92/* USER CODE END 2 */


以上三个函数的功能分别为点亮LED,熄灭LED,LED状态翻转,读取按键状态。
在gpio.c前面添加LED1-LED4的管脚的数组变量。

01/* USER CODE BEGIN 1 */
02GPIO_TypeDef* GPIO_PORT[] = {LED1_GPIO_Port,
03                             LED2_GPIO_Port,
04                             LED3_GPIO_Port,
05                             LED4_GPIO_Port};
06  
07const uint16_t GPIO_PIN[] = {LED1_Pin,
08                             LED2_Pin,
09                             LED3_Pin,
10                             LED4_Pin};
11/* USER CODE END 1 */

在gpio.h前面添加Led_TypeDef和JOYState_TypeDef两个枚举类型。声明刚才添加的四个函数。

01/* USER CODE BEGIN Private defines */
02typedef enum
03{
04  LED1 = 0,
05  LED2 = 1,
06  LED3 = 2,
07  LED4 = 3
08}Led_TypeDef;
09  
10typedef enum
11{
12  JOY_NONE  = 0,
13  JOY_CTR   = 1,
14  JOY_DOWN  = 2,
15  JOY_LEFT  = 3,
16  JOY_RIGHT = 4,
17  JOY_UP    = 5,
18  WAKEUP    = 6
19}JOYState_TypeDef;
20/* USER CODE END Private defines */
21  
22void MX_GPIO_Init(void);
23  
24/* USER CODE BEGIN Prototypes */
25void BSP_LED_On(Led_TypeDef Led);
26void BSP_LED_Off(Led_TypeDef Led);
27void BSP_LED_Toggle(Led_TypeDef Led);
28JOYState_TypeDef BSP_JOY_GetState(void);
29/* USER CODE END Prototypes */

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

01/* USER CODE BEGIN WHILE */
02  while (1)
03  {
04  /* USER CODE END WHILE */
05  
06  /* USER CODE BEGIN 3 */
07        switch(BSP_JOY_GetState())
08        {
09            case JOY_UP:
10                BSP_LED_On(LED1);break;
11            case JOY_RIGHT:
12                BSP_LED_On(LED2);break;
13            case JOY_DOWN:
14                BSP_LED_On(LED3);break;  
15            case JOY_LEFT:
16                BSP_LED_On(LED4);break;
17            case JOY_CTR:
18            case WAKEUP:
19                BSP_LED_On(LED1);
20                BSP_LED_On(LED2);
21                BSP_LED_On(LED3);
22                BSP_LED_On(LED4);
23                break;
24            default:
25                BSP_LED_Off(LED1);
26                BSP_LED_Off(LED2);
27                BSP_LED_Off(LED3);
28                BSP_LED_Off(LED4);
29                break;
30        }
31  }
32  /* USER CODE END 3 */
再次编译程序,如果编译没有错误。点击下载到Open746I-C开发板。如果提示错误,可以点击图标对Option for Target 的Dubug选项进行修改。(图上选的是ST-LINK)

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


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


1056

顶一下

刚表态过的朋友 (1056 人)

相关阅读

发表评论

最新评论

引用 Yang 2019-11-6 19:38
好用
引用 游客 2019-8-2 20:05
这样的话,led灯状态不是基本维持在关闭吗,按键按下会亮,松开就灯灭了
引用 游客 2019-3-20 21:23
当我们自己做一个东西的时候,这些代码都是需要我们自己敲出来的吗
引用 游客 2019-3-17 15:55
请问一下上面的这些代码都需要自己一个一个的敲出来吗
引用 游客 2018-4-8 20:58
直接用HAL_GPIO_ReadPin()怎么用?
引用 游客 2017-4-6 10:39
代码不全,看还是要下载例程看
引用 Ezio_神仙醋 2017-1-19 15:03
good
引用 weifeng0310 2016-11-17 12:25
太好了!!
引用 kaloha 2016-9-20 18:14
任风吹吹: 能请问下,最后那张图在烧录算法中的第二行是什么意思吗?不是很明白为什么这里有两个烧录算法。
图片更新了
引用 MyMX1213 2016-8-24 09:11
孙光祖: 可以分享一下程序源码吗?
下载Open746I-C的示例程序就可以了。
http://www.waveshare.net/wiki/Open746I-C
引用 孙光祖 2016-8-23 16:50
可以分享一下程序源码吗?
引用 任风吹吹 2016-6-14 16:49
能请问下,最后那张图在烧录算法中的第二行是什么意思吗?不是很明白为什么这里有两个烧录算法。

查看全部评论(12)

微雪官网|产品资料|手机版|小黑屋|微雪课堂. ( 粤ICP备05067009号 )

GMT+8, 2025-4-2 15:32 , Processed in 0.025600 second(s), 21 queries .

返回顶部