STM32CubeMX系列教程1:GPIO

打开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之间,否则下次重新生成代码后,会被删除)
 
/* USER CODE BEGIN 2 */
 
/**
  * @brief  Turns selected LED On.
  * @param  Led: LED to be set on 
  *          This parameter can be one of the following values:
  *            @arg  LED1
  *            @arg  LED2
  *            @arg  LED3
  *            @arg  LED4
  * @retval None
  */
void BSP_LED_On(Led_TypeDef Led)
{
  HAL_GPIO_WritePin(GPIO_PORT[Led], GPIO_PIN[Led], GPIO_PIN_SET);
}
 
/**
  * @brief  Turns selected LED Off. 
  * @param  Led: LED to be set off
  *          This parameter can be one of the following values:
  *            @arg  LED1
  *            @arg  LED2
  *            @arg  LED3
  *            @arg  LED4
  * @retval None
  */
void BSP_LED_Off(Led_TypeDef Led)
{
  HAL_GPIO_WritePin(GPIO_PORT[Led], GPIO_PIN[Led], GPIO_PIN_RESET); 
}
 
/**
  * @brief  Toggles the selected LED.
  * @param  Led: LED to be toggled
  *          This parameter can be one of the following values:
  *            @arg  LED1
  *            @arg  LED2
  *            @arg  LED3
  *            @arg  LED4
  * @retval None
  */
void BSP_LED_Toggle(Led_TypeDef Led)
{
  HAL_GPIO_TogglePin(GPIO_PORT[Led], GPIO_PIN[Led]);
}
 
/**
  * @brief  Returns the current joystick status.
  * @retval Code of the joystick key pressed
  *          This code can be one of the following values:
  *            @arg  WAKEUP
  *            @arg  JOY_NONE
  *            @arg  JOY_CTR
  *            @arg  JOY_DOWN
  *            @arg  JOY_LEFT
  *            @arg  JOY_RIGHT
  *            @arg  JOY_UP
  */
JOYState_TypeDef BSP_JOY_GetState(void)
{  
  /* Check the pressed keys */  
    if(HAL_GPIO_ReadPin(WAKEUP_GPIO_Port,WAKEUP_Pin) == GPIO_PIN_SET)
  {
    return (JOYState_TypeDef) WAKEUP;
  }
  else if(HAL_GPIO_ReadPin(CTR_GPIO_Port,CTR_Pin) == GPIO_PIN_RESET)
  {
    return (JOYState_TypeDef) JOY_CTR;
  }
  else if(HAL_GPIO_ReadPin(DOWN_GPIO_Port,DOWN_Pin) == GPIO_PIN_RESET)
  {
    return (JOYState_TypeDef) JOY_DOWN;
  } 
  else if(HAL_GPIO_ReadPin(LEFT_GPIO_Port,LEFT_Pin) == GPIO_PIN_RESET)
  {
    return (JOYState_TypeDef) JOY_LEFT;
  }
  else if(HAL_GPIO_ReadPin(RIGHT_GPIO_Port,RIGHT_Pin) == GPIO_PIN_RESET)
  {
    return (JOYState_TypeDef) JOY_RIGHT;
  }
  else if(HAL_GPIO_ReadPin(UP_GPIO_Port,UP_Pin) == GPIO_PIN_RESET)
  {
    return (JOYState_TypeDef) JOY_UP;
  }
  else
  { 
    return (JOYState_TypeDef) JOY_NONE;
  }  
}
/* USER CODE END 2 */
 
以上三个函数的功能分别为点亮LED,熄灭LED,LED状态翻转,读取按键状态。
在gpio.c前面添加LED1-LED4的管脚的数组变量。
 
<span style="color:#333333"><code>/* USER CODE BEGIN 1 */
GPIO_TypeDef* GPIO_PORT[] = {LED1_GPIO_Port,
                             LED2_GPIO_Port,
                             LED3_GPIO_Port,
                             LED4_GPIO_Port};
 
const uint16_t GPIO_PIN[] = {LED1_Pin,
                             LED2_Pin,
                             LED3_Pin,
                             LED4_Pin};
/* USER CODE END 1 */</code></span>
在gpio.h前面添加Led_TypeDef和JOYState_TypeDef两个枚举类型。声明刚才添加的四个函数。
 
<span style="color:#333333"><code>/* USER CODE BEGIN Private defines */
typedef enum 
{
  LED1 = 0,
  LED2 = 1,
  LED3 = 2,
  LED4 = 3
}Led_TypeDef;
 
typedef enum 
{ 
  JOY_NONE  = 0,
  JOY_CTR   = 1,
  JOY_DOWN  = 2,
  JOY_LEFT  = 3,
  JOY_RIGHT = 4,
  JOY_UP    = 5,
  WAKEUP    = 6
}JOYState_TypeDef;
/* USER CODE END Private defines */
 
void MX_GPIO_Init(void);
 
/* USER CODE BEGIN Prototypes */
void BSP_LED_On(Led_TypeDef Led);
void BSP_LED_Off(Led_TypeDef Led);
void BSP_LED_Toggle(Led_TypeDef Led);
JOYState_TypeDef BSP_JOY_GetState(void);
/* USER CODE END Prototypes */</code></span>
在main.c文件中的main函数的while循环中添加应用代码。代码中使用switch case语句。先通过BSP_JOY_GetState()语句判断是否有按键按下,然后根据按下的按键改变LED1~LED4的状态。
 
<span style="color:#333333"><code>/* USER CODE BEGIN WHILE */
  while (1)
  {
  /* USER CODE END WHILE */
 
  /* USER CODE BEGIN 3 */
        switch(BSP_JOY_GetState())
        {
            case JOY_UP:
                BSP_LED_On(LED1);break;
            case JOY_RIGHT:
                BSP_LED_On(LED2);break;
            case JOY_DOWN:
                BSP_LED_On(LED3);break;   
            case JOY_LEFT:
                BSP_LED_On(LED4);break;
            case JOY_CTR:
            case WAKEUP:
                BSP_LED_On(LED1);
                BSP_LED_On(LED2);
                BSP_LED_On(LED3);
                BSP_LED_On(LED4);
                break;
            default:
                BSP_LED_Off(LED1);
                BSP_LED_Off(LED2);
                BSP_LED_Off(LED3);
                BSP_LED_Off(LED4);
                break;
        }
  }
  /* USER CODE END 3 */</code></span>
再次编译程序,如果编译没有错误。点击下载到Open746I-C开发板。如果提示错误,可以点击图标对Option for Target 的Dubug选项进行修改。(图上选的是ST-LINK)
 

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

 

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

 

关注微信订阅号:STM32CubeMx    查看更多stm32cubemx 系列教程!!!!!!

 

 

 

 

 

 

 

 

 

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
关于STM32CubeMX系列学习教程,有很多资源可供参考。在这些教程中,你可以学习到如何使用STM32CubeMX工具来进行STM32芯片的图形化配置。这个工具可以帮助你快速建立和初始化工程,并生成C语言的初始化代码,从而减轻开发工作的负担,提高开发效率。同时,STM32CubeMX工具还提供了可视化的引脚、外设和时钟配置功能,使得开发者可以更方便地进行硬件配置。这些教程涵盖了多个方面的内容,包括GPIO的输入输出、外部中断、定时器中断、PWM实现呼吸灯效果、串口通信、ADC读取电压等等。你可以根据自己的需求选择相应的教程进行学习。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* [STM32CubeMX学习系列教程目录](https://blog.csdn.net/toopoo/article/details/88234293)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [用stm32cubemx点亮一个流水灯](https://blog.csdn.net/algorithm_lixuan/article/details/76640298)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [STM32 CubeMx教程 -- 基础知识及配置使用教程](https://blog.csdn.net/Dir_x/article/details/128846252)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值