【STM32】CubeMX+HAL 点亮LED

发布者:SereneNature最新更新时间:2022-02-16 来源: eefocus关键字:STM32  CubeMX  HAL  点亮LED 手机看文章 扫描二维码
随时随地手机看文章

1. 配置STM32CubeMX

【1.1】打开软件:

【1.2】 在 STM32CubeMX 的主界面中,点击 “New Project” 功能框中的 “ACCESS TO MCU SELECTOR” 功能按钮,从 MCU 开始新的工程。

【1.3】 在弹出对话框的 “MCU/MPU Selector” 选项卡中,首先,在左侧搜索框中输入该工 程需要使用的芯片型号 “STM32F407VE” ,然后,用鼠标在右下方的芯片列表中选择具体的 芯片型号,接着点击右上角的“Start Project” 按钮,开始工程的各项配置。

【1.4】 工程配置的主界面有四个菜单:Pinout & Configuration、Clock Configuration、 Project Manager 和 Tools。

【1.5】 在 Pinout & Configuration 界面左侧的菜单中,选择 “System Core” 菜单项中的 “SYS”,在点击其右边展开的 “Mode” 功能框中配置工程的仿真调试方式。我使用的是 SWD 接口的仿真器,点击“Debug”下拉列表,选择 “Serial Ware” 选项。


注:不同接口仿真器可以选择不同的调试方式。

【1.6】在 Pinout & Configuration 界面左侧的菜单中,选择 “System Core” 菜单项中的 “RCC”,在点击其右边展开的 “Mode” 功能框中时钟源。如果你的芯片使用外部晶振,则 在 HSE 和 LSE 下拉列表中选择“Crystal/Ceramic Resonator”。


注:一般开发板上都会有两个外部晶振。

【1.7】点亮LED,这边时钟树默认就可以了,后面如果用到其他外设就有可能要设置时钟树了。

【1.8】LED 引脚接在 PA6 上,所以,需要将 PA6 引脚设置 为 GPIO 输出功能。


完成功能选择的引脚上会标志一个图钉并会根据不同功能填充不同的颜色,同时在该引脚旁边标识出所选定的功能。

【1.9】 在 Pinout & Configuration 界面左侧的菜单中,选择 “System Core” 菜单项中的 “GPIO”,点击小三角符号,向右边展开 GPIO 的功能框,在这里可以对所有选择的芯片引脚的输入和输出功能进行参数配置。


本次工程中 “SYS” 中设置了仿真调试引脚,在 “RCC” 中设置了外部晶振引脚, 在 “GPIO” 中设置了 LED 的控制引脚。选择不同的选项卡,就会看到其相关的芯片引脚, 可以根据具体需要对其属性参加修改配置。

【1.10】当把工程的引脚和外设全部配置完成后,点击主界面中的 “Project Manager” 菜单项,进入工程相关的参数配置界面。

【1.11】在工程参数配置界面左侧的 “Code Generator” 菜单项中,将 “Generated files” 中的第一项打钩。


这样生成的工程将会为你配置的每一个外设生成对应的.c 文件和.h 文件。

【1.12】点击主界面右上角的 “GENERATE CODE”, 开始生成工程代码。

【1.13】代码生成后会弹出一个提示框,点击 “Open Floder” 按钮可直接打开生成工程代 码所在的文件夹


也可以点击 “Close” 按钮直接完成,但不会关闭 STM32CubeMX。

2. 添加代码

在这里插入图片描述

只需添加一行代码即可:


HAL_GPIO_WritePin(GPIOA,GPIO_PIN_6,GPIO_PIN_RESET);


下面贴出主要的生成代码:


2.1 gpio.c

/**

  ******************************************************************************

  * File Name          : gpio.c

  * Description        : This file provides code for the configuration

  *                      of all used GPIO pins.

  ******************************************************************************

  * @attention

  *

  *

© Copyright (c) 2020 STMicroelectronics.

  * All rights reserved.

  *

  * This software component is licensed by ST under BSD 3-Clause license,

  * the "License"; You may not use this file except in compliance with the

  * License. You may obtain a copy of the License at:

  *                        opensource.org/licenses/BSD-3-Clause

  *

  ******************************************************************************

  */


/* Includes ------------------------------------------------------------------*/

#include "gpio.h"

/* USER CODE BEGIN 0 */


/* USER CODE END 0 */


/*----------------------------------------------------------------------------*/

/* Configure GPIO                                                             */

/*----------------------------------------------------------------------------*/

/* USER CODE BEGIN 1 */


/* USER CODE END 1 */


/** Configure pins as 

        * Analog 

        * Input 

        * Output

        * EVENT_OUT

        * EXTI

*/

void MX_GPIO_Init(void)

{


  GPIO_InitTypeDef GPIO_InitStruct = {0};


  /* GPIO Ports Clock Enable */

  __HAL_RCC_GPIOA_CLK_ENABLE();


  /*Configure GPIO pin Output Level */

  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_RESET);


  /*Configure GPIO pin : PA6 */

  GPIO_InitStruct.Pin = GPIO_PIN_6;

  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

  GPIO_InitStruct.Pull = GPIO_NOPULL;

  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;

  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);


}


/* USER CODE BEGIN 2 */


/* USER CODE END 2 */


/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/


2.2 main.c

/* USER CODE BEGIN Header */

/**

  ******************************************************************************

  * @file           : main.c

  * @brief          : Main program body

  ******************************************************************************

  * @attention

  *

  *

© Copyright (c) 2020 STMicroelectronics.

  * All rights reserved.

  *

  * This software component is licensed by ST under BSD 3-Clause license,

  * the "License"; You may not use this file except in compliance with the

  * License. You may obtain a copy of the License at:

  *                        opensource.org/licenses/BSD-3-Clause

  *

  ******************************************************************************

  */

/* USER CODE END Header */


/* Includes ------------------------------------------------------------------*/

#include "main.h"

#include "gpio.h"


/* Private includes ----------------------------------------------------------*/

/* USER CODE BEGIN Includes */


/* USER CODE END Includes */


/* Private typedef -----------------------------------------------------------*/

/* USER CODE BEGIN PTD */


/* USER CODE END PTD */


/* Private define ------------------------------------------------------------*/

/* USER CODE BEGIN PD */


/* USER CODE END PD */


/* Private macro -------------------------------------------------------------*/

/* USER CODE BEGIN PM */


/* USER CODE END PM */


/* Private variables ---------------------------------------------------------*/


/* USER CODE BEGIN PV */


/* USER CODE END PV */


/* Private function prototypes -----------------------------------------------*/

void SystemClock_Config(void);

/* USER CODE BEGIN PFP */


/* USER CODE END PFP */


/* Private user code ---------------------------------------------------------*/

/* USER CODE BEGIN 0 */


/* USER CODE END 0 */


/**

  * @brief  The application entry point.

  * @retval int

  */

int main(void)

{

  /* USER CODE BEGIN 1 */


  /* USER CODE END 1 */

  


  /* MCU Configuration--------------------------------------------------------*/


  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */

  HAL_Init();


  /* USER CODE BEGIN Init */


  /* USER CODE END Init */


  /* Configure the system clock */

  SystemClock_Config();


  /* USER CODE BEGIN SysInit */


  /* USER CODE END SysInit */


  /* Initialize all configured peripherals */

  MX_GPIO_Init();

  /* USER CODE BEGIN 2 */


  /* USER CODE END 2 */


  /* Infinite loop */

  /* USER CODE BEGIN WHILE */

  while (1)

  {

    

    /* USER CODE END WHILE */


    /* USER CODE BEGIN 3 */

HAL_GPIO_WritePin(GPIOA,GPIO_PIN_6,GPIO_PIN_RESET);

  }

  /* USER CODE END 3 */

}


/**

  * @brief System Clock Configuration

  * @retval None

  */

void SystemClock_Config(void)

{

  RCC_OscInitTypeDef RCC_OscInitStruct = {0};

  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};


  /** Configure the main internal regulator output voltage 

  */

  __HAL_RCC_PWR_CLK_ENABLE();

  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);

  /** Initializes the CPU, AHB and APB busses clocks 

  */

  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;

  RCC_OscInitStruct.HSIState = RCC_HSI_ON;

  RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;

  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;

  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)

  {

    Error_Handler();

  }

  /** Initializes the CPU, AHB and APB busses clocks 

  */

  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK

                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;

  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;

  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;

  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;

  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;


  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)

  {

    Error_Handler();

  }

}


/* USER CODE BEGIN 4 */


/* USER CODE END 4 */


/**

  * @brief  This function is executed in case of error occurrence.

  * @retval None

  */

void Error_Handler(void)

{

  /* USER CODE BEGIN Error_Handler_Debug */

  /* User can add his own implementation to report the HAL error return state */


  /* USER CODE END Error_Handler_Debug */

}


#ifdef  USE_FULL_ASSERT

/**

  * @brief  Reports the name of the source file and the source line number

  *         where the assert_param error has occurred.

  * @param  file: pointer to the source file name

  * @param  line: assert_param error line source number

  * @retval None

  */

void assert_failed(uint8_t *file, uint32_t line)

  /* USER CODE BEGIN 6 */

  /* User can add his own implementation to report the file name and line number,

     tex: printf("Wrong parameters value: file %s on line %drn", file, line) */

  /* USER CODE END 6 */

}

#endif /* USE_FULL_ASSERT */


/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/


3. 总结

CubeMX+HAL 不需要理解底层寄存器的定义,使用起来非常方便

要理解生成的代码之间的逻辑联系,熟悉常用的 hal 函数

建议学完标准库后上手 CubeMX

关键字:STM32  CubeMX  HAL  点亮LED 引用地址:【STM32】CubeMX+HAL 点亮LED

上一篇:【STM32】CubeMX+HAL 输出PWM
下一篇:【STM32】stm32f407 + DS18B20 碰出不一样的火花

推荐阅读最新更新时间:2024-11-12 09:24

STM32串口中断、DMA接收的几点注意地方
1UART串口中断接收 使能UART串口中断之后,有接收到UART数据,进入中断,此时要清除RXNE接收标志位: 1.通过软件向该RXNE标志位写入零来清零; 2.通过对 USART_DR 寄存器执行读入操作将该位清零。 这里可以查看对应《参考手册》,一般我们选择第2种,通过读取UART串口数据来清零。 1.中断接收数据丢失 在UART串口中断函数中,或者更高优先级中断函数中长时间执行,导致接收丢失,所以,请勿在中断函数中长时间执行。 特别有些人,还在中断函数添加延时函数。实际应用中,只要不是特殊情况,比如测试某个功能可以添加延时函数,都不建议在中断函数添加延时函数。 2.ORE上溢错误 ORE上溢错误是什么意思呢? 可能很
[单片机]
第四节:定时器中断及定时器产生PWM(用CubeMX学习STM32)
前言: STM32定时器概述 我演示用的STM32F407ZGt6的核心板有多达14个定时器;  其中包含两个高级定时器(TIM1和TIM8); 十个通用定时器(TIM2~TIM5, TIM9~TIM14); 两个基础定时器(TIM6、TIM7)。 Tips: 在十个通用定时器里面包含两个看门狗定时器(two watchdog timers) 下面是datasheet里面官方给出的介绍 Couter resolution— 计数器位数, 位数越高精度越高; Counter type — 计数类型 即向上计数还是向下计数 Prescaler factor — 分频因子, 对时钟的分频, 比如单片机的时钟为84MHz, 预
[单片机]
第四节:定时器中断及定时器产生PWM(用<font color='red'>CubeMX</font>学习<font color='red'>STM32</font>)
STM32】一种基于Cortex-M内核的精确延时方法
Cortex-M内核是一种广泛应用于嵌入式系统中的32位微处理器内核,常常用于实现低功耗、高性能和高可靠性的应用程序。在某些应用场景中,需要对程序进行精确的延时控制,例如控制电机的启动时间、PWM波形的频率和占空比等。本文将介绍一种基于Cortex-M内核的精确延时方法,可以实现纳秒级别的精度。 1. 原理 Cortex-M内核中的SysTick定时器是一个24位的倒计时器,可以实现从1ms到2^24-1即16,777,215个时钟周期的定时。使用SysTick定时器可以实现微秒级别的延时控制,但是要实现纳秒级别的延时控制,则需要进行更高精度的计时方案。 通过测量实际的时钟周期数来精确计算时间,可以获得更高精度的计时结果。
[单片机]
STM32使用标准库,有时候在SLEEP模式下无法唤醒问题
现在标准库暴露越来越多的问题,今天碰到一个客户在sleep mode下出现无法唤醒现象,正常来说,只要有中断,都可以把它唤醒,但事实就是相反,几千套产品出现几十台无法从sleep模式下唤醒。 解决办法: 1、在无法唤醒条件下,检测外围电压,电流,一切正常。 2、测量唤醒源电压,能达到唤醒电平。 3、查看代码配置,似乎并未有什么异常。 4、通过对比重上电条件和唤醒后执行代码的条件,发现重上电初始化了时钟和IO口,而唤醒后却没有,尝试在唤醒后加上时钟初始化和IO口初始化,还是不行; 5、最后在唤醒后先初始化IO口,再初始化时钟,发现能解决问题。 总结:有可能标准库唤醒时,因硬件
[单片机]
读写STM32内部flash读写代码
由于老师的要求,所以写了一份读写STM32内部FLASH的代码,这样的话就可以把STM32里面没有用来保存代码段的部分用来存储数据了。 由于《stm32flash编程手册》是很久很久以前看的,现在也没心情去仔细看那份手册了。大概浏览了一下,只看到了STM32里面的flash是以16位为单位读写的。 为什么记住这个,因为之前想写一个字节老是出错,所以翻翻手册,果然看到不能写1个字节数据。而且还发现,flash写地址为奇数时也会出错。所以这份代码里面 写flash的地址只能是偶数。浏览过程中还发现,手册里面说写flash和擦除flash的时候会影响cpu的运行速度,没仔细看(真心不想看)。其他具体手册里面的资料的话没有了, 看有没有高
[单片机]
STM32】DMA基本原理、寄存器、库函数(DMA一般步骤)
STM32F1xx官方资料: 《STM32中文参考手册V10》-第10章 DMA控制器 DMA的基本介绍 DMA的基本定义 DMA,全称Direct Memory Access,即直接存储器访问。 DMA传输将数据从一个地址空间复制到另一个地址空间,提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。当CPU初始化这个传输动作,传输动作本身是由DMA控制器来实现和完成的。DMA传输方式无需CPU直接控制传输,也没有中断处理方式那样保留现场和恢复现场过程,通过硬件为RAM和IO设备开辟一条直接传输数据的通道,使得CPU的效率大大提高。 DMA的主要特征 每个通道都直接连接专用的硬件DMA请求,每个通道都同样支
[单片机]
【<font color='red'>STM32</font>】DMA基本原理、寄存器、库函数(DMA一般步骤)
stm32的RTC
两个分离的时钟:用于APB1接口的PCLK1和RTC时钟的(RTC时钟的频率必须小于PCLK1时钟频率的四分之一); RTC的时钟源的配置可以使用函数库中的函数进行配置; RTC的中断也是使用函数库中的额函数进行配置的; void RTC_Configuration(void) {//RTC的时钟为两个分离的时钟:用于APB1的PCLK1和RTC时钟(RTC的时钟的频率必须小于PCLK1时钟频率的四分之一以上 RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR|RCC_APB1Periph_BKP,ENABLE); //PWR和BKP时钟使能 PWR_BackupAccessCmd(ENAB
[单片机]
<font color='red'>stm32</font>的RTC

推荐帖子

赚分,速结
0赚分,速结0
jxrth 嵌入式系统
DDK中: 如何Sleep ?
如果执行这个语句:while(1){printf(这个是死循环!\\n);}CPU估计能飚到60%以上;但是:while(1){printf(这个是死循环!但是有Sleep\\n);Sleep(2000);}CPU就不会狂飚了.....我不懂编写驱动,近来无事从网上弄了个玩,发现里面有while在某种情况下使CPU狂飚到50%+,DDK里可没有Sleep!求方法解决......DDK中:如何Sleep?执行等待函数,例如
ttjj120 嵌入式系统
变频器控制系统回路电源的监控及自投
论述了针对聚酯工业生产过程中的集中式变频器控制系统的电源进行的改造。改造此系统使用Intel公司的MCS251系列的单片机8031芯片去控制2路电源的自投和撤出。由于单片机运行稳定,计算精确,功能强大,很多功能都可以通过软件编写来加以实现。能减少使用大量外围电气设备。使得改造后的系统能运行在一个安全稳定可靠的环境中,且易于维护。变频器控制系统回路电源的监控及自投
frozenviolet 电源技术
msp432 相关问题求助?
这个问题改怎么样解决呀,debugger改的tiXDSXDS里面的选项是xds110那项msp432相关问题求助?
sunj 微控制器 MCU
哪位大侠提一个stc89c52的12864液晶显示的c语言代码,以供学习,谢谢
哪位大侠提一个stc89c52的12864液晶显示的c语言代码,以供学习,谢谢哪位大侠提一个stc89c52的12864液晶显示的c语言代码,以供学习,谢谢里面有一个ST7565P的芯片的LCD驱动,看你用的着不
450678797 51单片机
节约型社会话电源节能
如今我们已经进入了一个节约型社会,如何提高电源的使用功效、创造电源节能设计是摆在电源工程师们面前的课题。观点一:提高电源使用效率是电源管理的一部分提高电源效率是一项专门的技术,多数由硬件电路构成,如高效的开关电源(DC-DC变换),但它只是电源管理的一个部分,而不是全部。目前为了使设计者更方便地进行电源管理,一些厂商还开发了电源管理软件用于嵌入式操作系统,运用这类操作系统,可以有效地降低软件编制中的工作量,同时优化系统的电源管理,所以说电源管理既包含电源变换效率问题也包含负载降低功耗的问题。
zbz0529 电源技术
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved