STM32 CubeMX学习:2. 闪烁LED

STM32入门系列-STM32时钟系统,STM32时钟树 时钟对于单片机来说是非常重要的,它为单片机工作提供一个稳定的机器周期从而使系统能够正常运行。时钟系统犹如人的心脏,一旦有问题整个系统就崩溃。我们知道STM32属于高级单片机,其内部有很多的外设,但不是所有外设都使用同一时钟频率工作,比如内部看门狗和RTC,它只需30KHz的时钟频率即可工作,所以内部时钟源就有多种选择。在前面章节的介绍中,我们知道STM32系统复位后首先进入SystemInit函数... 阅读详情

STM32 CubeMX学习:2. 闪烁LED

系列文章目录
  1. 前期的准备
  2. 点亮 LED
  3. 闪烁 LED
  4. 定时器闪烁LED
  5. PWM控制LED亮度
  6. 常见的PWM设备
  7. 按键的外部中断
  8. ADC模数转换
  9. 串口收发
  10. 串口打印遥控器数据
  11. 未完待续…


0.前言

前2篇博客,我们已经学会了如何通过配置引脚的高低电平点亮LED,但是LED不能总是开着鸭,或者做的更加酷炫一点,让它闪烁起来。这篇博客我来带领大家做一个可以闪烁的LED小工程。
咳咳咳,我们现在开始吧。

1.基础学习

1.1 学习目标

今天,我们将学习如何控制STM32的电平变化,学习STM32中的三种延时方法,了解Hal_Init函数的作用,了解滴答定时器的原理及作用。使用CubeMX软件完成引脚的配置,然后编写程序,通过引脚电平反转翻转函数HAL_GPIO_TogglePin和延时函数,实现LED灯的闪烁效果。

1.2 GPIO的反转速度

1、在不同情况下,需要GPIO引脚会输出不同频率的方波。例如在led闪烁时,只需要1Hz的频率就可以看到明显的闪烁效果,但在软件模拟I2C时,需要数百KHz频率才能完成正常的通信。在cubeMX中可以根据不同的输出频率需求,设置GPIO不同的翻转速度。

2、下面我们直接开始使用CubeMX进行代码的生成吧!!!
(1)采用上一篇博客介绍的方法开启PF9,PF10引脚的输出功能。
(2)在cubeMX的左侧边栏中的System Core下有GPIO选项,在该选项下可以看到已经开启的引脚的配置信息,如下图所示:
GPIO配置
(3)在这个标签页下,可以选中需要配置的GPIO,并查看其详细状态,其中Maximum output speed就是可以选择的翻转速度模式,如图所示,对应的翻转模式是Low,为低速输出模式。
翻转速度模式
3、点击右端小箭头,可选的输出速度分为Low,Medium,High,Very High四档,如图所示。一般使用GPIO输出驱动LED等功能时选择Low档翻转速度即可,而一般用于通信的GPIO需要设置为High或者Very High,具体设置可以根据相关通信协议对GPIO的翻转速度的要求进行设置。
速度模式

1.3 三种延时方式

1.3.1 计时延迟

在 STM32 内执行任何一条指令是需要消耗时间的。实现延时效果可以让 STM32 持续执行一段计数循环,直到其计数到设定的数目后,再让 STM32 退出循环。

在程序中,通过user_delay_us函数完成微秒级的延时功能,函数的实现如下所示:

void user_delay_us(uint16_t us) 
{ 
	for(; us > 0; us--) 
	{ 
		for(uint8_t i = 50; i > 0; i--) 
		{ 
			; 
		} 
	} 
}

这里我们将内层循环变量i初始化为50,外层循环变量的赋值则由函数的入口参数来决定,入口参数对应了外层循环的次数,继而相应的实现了对应时长的延时。
类似于微秒级延迟的实现,再加一层外部循环便可以实现毫秒级的延迟,对应函数为user_delay_ms,其具体实现如下所示。该函数调用了user_delay_us函数,并给其参数赋值1000,1毫秒等于1000微秒。通过循环调用的方式,将延时时间折算到毫秒级。

void user_delay_ms(uint16_t ms) 
{ 
	for(; ms > 0; ms--) 
	{ 
		user_delay_us(1000); 
	} 
}

1.3.2 nop延时

使用nop函数是第二种延时方法,其原理与计时延时类似。同样是通过重复执行指令,直到消耗时间,再进行下一步的工作。但与计数延时不同的是,nop延时通过空操作指令__nop()函数来实现延时。当stm32执行到__nop()时,可以理解为在当前指令周期中,stm32没有进行任何工作。
同样是通过循环的方式,可以完成微秒级的延迟nop_delay_us和nop_delay_ms

void nop_delay_us(uint16_t us)
 { 
 	for(; us > 0; us--) 
 	{ 
 		for(uint8_t i = 10; i > 0; i--) 
 		{ 
 			__nop();
 			__nop();
 			__nop();
 			__nop();
 			__nop();
 			__nop();
 			__nop(); 
 			__nop(); 
 			__nop(); 
 			__nop();
 			__nop(); 
 			__nop(); 
 			__nop(); 
 			__nop(); 
 			__nop(); 
 		} 
 	} 
 } 
 
 void nop_delay_ms(uint16_t ms) 
 { 
 	for(; ms > 0; ms--) 
 	{ 
 		nop_delay_us(1000); 
 	} 
 }

1.3.3 滴答计时器介绍以及HAL_Init初始化

在介绍第三种延时方法之前,先介绍滴答定时器及其初始化。

滴答定时器也称为SysTick,是STM32内置的倒计时定时器,每当计数到0时,触发一次SysTick中断,并重载寄存器值。滴答计时器的初始化在HAL_Init函数中完成,配置成1ms的中断。HAL_Init的内容如下,通过注释了解到:在HAL_Init中,实现了SysTick以及底层硬件的初始化。

HAL_StatusTypeDef HAL_Init(void) 
{ 
	/* Configure Flash prefetch, Instruction cache, Data cache */ 
	#if (INSTRUCTION_CACHE_ENABLE != 0U) 	                 
		__HAL_FLASH_INSTRUCTION_CACHE_ENABLE(); 
	#endif /* INSTRUCTION_CACHE_ENABLE */ 
	
	#if (DATA_CACHE_ENABLE != 0U)
		__HAL_FLASH_DATA_CACHE_ENABLE(); 
	#endif /* DATA_CACHE_ENABLE */ 
	
	#if (PREFETCH_ENABLE != 0U) 
		__HAL_FLASH_PREFETCH_BUFFER_ENABLE(); 
	#endif /* PREFETCH_ENABLE */ 

	/* Set Interrupt Group Priority */ 
	HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4); 
	
	/* Use systick as time base source and configure 1ms tick (default clock after Reset is HSI) */ 	
	HAL_InitTick(TICK_INT_PRIORITY); 
	
	/* Init the low level hardware */ 
	HAL_MspInit(); 
	
	/* Return function status */ 
	return HAL_OK; 
	
	}

在HAL_Init的实现中,我门需要关注滴答定时器初始化函数。

__weak HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority);

HAL_InitTick函数将设定SysTick的定时周期为1ms,即频率为1000Hz,并使SysTick开始工作。
每当滴答计时器递减到0时,会触发中断,使程序进入SysTick中断处理函数。

void SysTick_Handler(void) 
{ 
	/* USER CODE BEGIN SysTick_IRQn 0 */ 


	/* USER CODE END SysTick_IRQn 0 */ 
	HAL_IncTick(); 
	/* USER CODE BEGIN SysTick_IRQn 1 */
	
	/* USER CODE END SysTick_IRQn 1 */ 
	
}

在其中会调用HAL_IncTick函数,该函数实现如下

__weak void HAL_IncTick(void) 
{ 
	uwTick += uwTickFreq;
}

在uwTick变量中存储的是从STM32的Systick初始化以来所经过的时间(ms),uwTick的存在相当于给整个程序提供了一个绝对的时间基准,而HAL_Delay函数延时功能便是通过uwTick的值完成的。

获取当前的uwTick值可以使用HAL库提供的函数HAL_GetTick

uint32_t HAL_GetTick(void)

该函数的返回值是当前时刻的uwTick,此函数的作用就是返回当前时刻的uwTick值

1.3.4 HAL_Delay 延时

现在有了上面的基础,我们终于可以隆重地介绍第三种延时——HAL_Delay函数,它是由HAL库提供的用于毫秒级延迟的函数
(使用_weak修饰符说明该函数是可以用户重定义的)。

__weak void HAL_Delay(uint32_t Delay)

该函数的返回值为void,其作用在于使系统延迟对应的毫秒级时间,其参数是Delay,对应的延迟毫秒数,比如延迟1秒就为1000。

在HAL_Delay的实现中,调用HAL_GetTick函数获取基准时间uwTick,说明了HAL_Delay函数的实现是基于滴答计时器(Systick)。

__weak void HAL_Delay(uint32_t Delay) 
{ 
	uint32_t tickstart = HAL_GetTick(); 
	uint32_t wait = Delay; 
	
	/* Add a freq to guarantee minimum wait */ 
	if (wait < HAL_MAX_DELAY) 
	{ 
		wait += (uint32_t)(uwTickFreq); 
	} 
	
	while((HAL_GetTick() - tickstart) < wait)
	 { 
	 
	 }
}

以上三种延时方法各自有各自的特点,计数延时与nop延时都需要用户编写函数来自行实现,比较麻烦,而直接调用HAL库提供的HAL_Delay函数会更加方便一些。但HAL_Delay只能够实现毫秒级的延时,如果需要时间更短的延时函数则必须使用用户编写的延时函数。

1.3.5 HAL_GPIO_TogglePin函数

1、这次使用的cubeMX配置与之前的相同。
之前我已经介绍了操作GPIO电平的函数:HAL_GPIO_WritePin,通过这个函数可以设置GPIO输出高电平或者低电平。为了实现LED灯的闪烁,只要交替输出高低电平即可,因此可以通过两句HAL_GPIO_WritePin,各自分别将引脚设置为高电平和低电平,就可以实现闪烁功能。/2、但是除了以上方法之外,这里我们还有更简便的函数来实现引脚电平翻转——HAL库提供的HAL_GPIO_TogglePin函数。

void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)

这个函数的返回值为void,其作用在于翻转对应引脚的电平,该函数有两个参数
(1)GPIOx——对应GPIO总线,其中x可以是A…I。
(例如PF9,则输入GPIOF)
(2)GPIO_Pin——对应引脚数。可以是0-15。
(例如PF9,则输入GPIO_PIN_9)

1.4 程序学习

程序经过HAL_Init初始化,SystemClock初始化,GPIO初始化后,进入主循环,在主循环内分别使用之前介绍过的三种方式进行延时,然后将LED的电平翻转,从而使LED按照500毫秒的固定频率进行亮灭,主循环代码如下。

bsp_led_toggle(); 

//nop delay 
nop_delay_ms(500); 

bsp_led_toggle(); 

//cycly count 
delay user_delay_ms(500); 

bsp_led_toggle(); 

//systick delay 
HAL_Delay(500);

整体main.c文件如下所示哦

/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file           : main.c
  * @brief          : Main program body
  ******************************************************************************
  * @attention
  *
  * <h2><center>&copy; Copyright (c) 2021 STMicroelectronics.
  * All rights reserved.</center></h2>
  *
  * 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 */
void bsp_led_toggle(void);
void user_delay_us(uint16_t us);
void user_delay_ms(uint16_t ms);
void nop_delay_us(uint16_t us);
void nop_delay_ms(uint16_t ms);
/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */

/**
  * @brief          Toggle the red led AND green led led 
  * @param[in]      none
  * @retval         none
  */
/**
  * @brief          反转红灯,绿灯电平
  * @param[in]      none
  * @retval         none
  */
void bsp_led_toggle(void)
{
    HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_9);
    HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_10);
    
}

/**
  * @brief          use nop function to wait a time
  * @param[in]      us: us microseconds
  * @retval         none
  */
/**
  * @brief          使用nop函数延迟一段时间
  * @param[in]      us:us微秒
  * @retval         none
  */
void nop_delay_us(uint16_t us)
{
    for(; us > 0; us--)
    {
        for(uint8_t i = 10; i > 0; i--)
        {
            __nop();
            __nop();
            __nop();
            __nop();
            __nop();
            __nop();
            __nop();
            __nop();
            __nop();
            __nop();
            __nop();
            __nop();
            __nop();
            __nop();
            __nop();
        }
    }
}

/**
  * @brief          use nop_delay_us wait a time
  * @param[in]      ms: ms milliseconds
  * @retval         none
  */
/**
  * @brief          使用nop_delay_us函数延迟一段时间
  * @param[in]      ms:ms毫秒
  * @retval         none
  */
void nop_delay_ms(uint16_t ms)
{
    for(; ms > 0; ms--)
    {
        nop_delay_us(1000);
    }
}



/**
  * @brief          use cycle count to wait a time
  * @param[in]      us: us microseconds
  * @retval         none
  */
/**
  * @brief          使用循环计数延迟一段时间
  * @param[in]      us:us微秒
  * @retval         none
  */
void user_delay_us(uint16_t us)
{
    for(; us > 0; us--)
    {
        for(uint8_t i = 50; i > 0; i--)
        {
            ;
        }
    }
}

/**
  * @brief          use user_delay_us function to wait a time
  * @param[in]      ms: ms milliseconds
  * @retval         none
  */
/**
  * @brief          使用user_delay_us函数延迟一段时间
  * @param[in]      ms:ms毫秒
  * @retval         none
  */
void user_delay_ms(uint16_t ms)
{
    for(; ms > 0; ms--)
    {
        user_delay_us(1000);
    }
}


/* 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 */
		bsp_led_toggle();

        //nop delay
        nop_delay_ms(500);

        bsp_led_toggle();

        //cycle count delay
        user_delay_ms(500);

        bsp_led_toggle();

        //systick delay
        HAL_Delay(500);

  }
  /* 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_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLM = 6;
  RCC_OscInitStruct.PLL.PLLN = 168;
  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  RCC_OscInitStruct.PLL.PLLQ = 4;
  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_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != 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 %d\r\n", file, line) */
  /* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */

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

1.5 效果展示

单片机上的LED灯会以约500ms跳变一次,呈现闪烁的效果。如图所示,分别为单片机LED点亮和熄灭效果。
LED点亮
LED点亮图
LED熄灭
LED熄灭图

代码我已经放到了我的GitHub仓库,如有需要可以下载使用:
CubeMX学习


总结

延时操作也是STM32中的基本操作,本节课介绍的三种延时方式各有特点,调用HAL库提供的HAL_Delay函数最为方便,但是无法完成微秒级的延时,可以通过自己定义的nop延时或者计数延时的方法来进行实现。 阿巴阿巴,这次的博客的确有点长,大家可能已经晕菜 不过大家不要担心,现在开始敲黑板啦

其实我们主要掌握的内容是
1、计时延迟(需要自己编写函数)
2、nop延迟 (需要自己编写函数)
3、HAL_Delay 延时
4、滴答计时器以及HAL_Init初始化
5、HAL_GPIO_TogglePin函数(引脚电平的翻转)


嵌入式学习——使用定时器同时实现串口通信和LED流水灯 定时器顾名思义就是定时执行一个操作,在芯片中使用晶振作为计时单位,通过对晶振的计数来实现计时,当时间达到定时器设定的时长后,会跳入对应的函数执行对应的操作。常用的时间单位是毫秒,即一毫秒执行一次。定时器的主要作用是产生一个时基,通俗的讲就是从某一时刻开始,经过一段指定的时间,触发一个中断或超时回调事件,可以在中断或者超时回调函数中处理数据。定时器其实也是一种计数器,只不过在计数的同时,计算了每一次计数的时间,然后再计算需要的计数次数后运行设定好的程序,就是实现了定时器的功能。 阅读详情

相关推荐

STM32学习笔记 一、基于STM32F103C8T6最小系统板和STM32CubeMX实现板载LED灯循环闪烁

文章目录一、配置CubeMX1.1 新建工程1.2 时钟配置1.3 Debug配置1.4 GPIO配置1.5 项目设置二、Keil配置2.1 写逻辑代码2.2 设置debug三、现象 一、配置CubeMX 1.1 新建工程 工程选择STM32F103C8Tx芯片 1.2 时钟配置 打开RCC时钟外部输入,读原理图发现外部时钟有8MHz和32768Hz,外部8MHZ可以使得时钟达到最高的72MHz,没有外部8MHZ内部时钟最高能调到64MHz。没有外部32768Hz,内部的RTC模块工作不正常,这里我们只

遗忘丶的博客 1万+

[单片机框架][bsp层][AT32F415][bsp_led] LED配置和使用

本文将介绍,如何点亮LED灯。 重新封装一层函数,用于bsp层函数,方便调用。

嵌入式单片机实验室 5610

【MCU】基于STM32CubeMX定时器中断实现LED闪烁

基于STM32CubeMX定时器中断实现 LED 闪烁 本实验基于STM32CubeMX实现对STM32开发板的配置,通过定时器中断实现 LED 闪烁。 1. 软件与硬件 1.1 硬件要求: (1)ALIENTEK ELITE STM32F103 开发板 (STM32F103ZET6 芯片) 1.2 软件要求: (1)Java Runtime Environment (JRE) 1.8.0 版本 (2)STM32CubeMX 5.6.1 版本 (3)IAR Embedded Workbenc

Alvin的博客 3915

__NOP();延时函数

不用系统时钟与通用外设时钟的延时函数 介绍下__NOP();函数; 它类似于汇编里的伪指令,也称作“空指令”; 它不执行操作,但占一个程序步。 空指令使用时会占用执行一个指令的CPU时间片。常用于程序延时或精确计时,不过在较快的CPU上不明显。 程序如下: void delay_us() { __NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NO...

include1_的博客 2万+

【STM32项目笔记】STM32CubeMX+Keil+Proteus联合实现LED闪烁

摘要 利用STM32CubeMx配置STM32芯片的功能,然后将配置后的内容生成代码,并导出成可以使用Keil打开编辑的文件,在Keil中添加控制代码后,下载到Proteus仿真中,使用仿真观察代码执行结果。 所需软件 1) STM32CubeMx 下载地址:https://www.st.com/en/d...

Honglong 4393

STM32F103 + STM32CubeMX实现流水灯闪烁

文章目录一. 环境二. 使用STM32CubeMX1. 安装固件库2. 工程设置3. 添加代码三. 使用STLink下载程序四. 总结 一. 环境 硬件:stm32f103c8t6 核心板 软件:STM32CubeMX 6.3.0 软件:keil5 mdk 这里使用STLink进行下载程序。 二. 使用STM32CubeMX 1. 安装固件库 选择自己开发板的固件库,我这里是f1的。选择版本安装,我这里已经安装过了。 2. 工程设置 点击 file -> new project 建立工

You can do more than just get by. 3617

单片机中的 _nop_() 延时以及其相关的基础扩展

本文的内容包括:对 nop 的认识,单片机中的 nop 函数做延时的一些注意事项,以及单片机中基本的指令周期,机器周期等一些基本概念的说明。

不浮夸,不将就,认真对待学知识的我们 2万+

STM32cubemx初使用——LED灯闪烁以及proteus仿真

一、STM32cubemx介绍 二、初使用LED灯的点亮 三、proteus仿真 参考资源 https://www.st.com/zh/development-tools/stm32cubemx.html#overview

请叫我小纯洁 1万+

stm32延时函数

其他函数根据这些变量到达一定的值,做出对用的功能。xtime可以在接收里一直置1,接受完成不重新置1后,就可以加到很大的值(可以用来算接收数据后多久了)系统时钟:默认频率72Mhz ---->1个时钟周期是1/72000000s(反正很快不算了)LED_time,rxtime(变量类型尽量大一点 u32)这些变量是全局变量,都声明出去,NOP指令:空指令,单片在执行此指令时,什么事都不做,干等一个时钟周。//1ms进一次中断。//系统定时器的中断服务函数 1ms进一次。//它会自动清除标志位。

weixin_46442534的博客 3826

STM32CubeMX系列教程0:创建工程

文章目录1、创建工程2、配置外设开启SWD调试功能使能外部时钟选择GPIO配置GPIO3、配置时钟系统4、工程输出设置工程设置源码输出设置生成源码工程5、写入用户代码编译下载   STM32Cube 是一个全面的软件平台,包括了ST产品的每个系列。平台包括了STM32Cube 硬件抽象层(一个STM32抽象层嵌入式软件,确保在STM32系列最大化的便携性)和一套的中间件组件(RTOS, USB, FatFs, TCP/IP, Graphics, 等等). 直观的STM32微控制器的选择和时钟树配置 微控

小白的学习笔记 1万+

Stm32CubeMx入门及编写LED灯闪烁(基于stm32f103vetx)

Stm32CubeMx入门及编写LED灯闪烁Stm32CubeMx入门(基于stm32f103vetx)创建stm32CubeMx工程创建一个新的工程选择相应的型号进行相应配置设置时钟工程配置配置完成,生成代码编写代码注意!!!!!! Stm32CubeMx入门(基于stm32f103vetx) 基于stm32f103vetx的Stm32CubeMx入门配置 创建stm32CubeMx工程 创建一个新的工程 选择相应的型号 进行相应配置 我的开发板PE6连接着LED2,这里就配置LED2闪烁

weixin_44229981的博客 4214

学习记录(二)LED闪烁 STM32CubeMX MDK5 ST-LinkV2 STM32G474VET6

①首先用STM32CubeMX创建工程,选择所用的芯片型号,STM32G474VET6-LQFP100,双击。 ②调GPIO,查原理图知所要用的5个LED的IO引脚,如下图LED345对应引脚PD765,低电平亮。点Cube软件芯片图中打开对应引脚选择GPIO_Output。 ③再打开时钟HSE选择Crystal/Ceramic Resonator,芯片引脚图自动打开。Clock Configuration暂时可不设置。 ④在Project Manager中设置工程名...

Cheung2020的博客 1620

STM32CUBEMX创建FreeRTOS操作系统的多任务实现2个LED灯不同的闪烁

(注:继上回学习完STM32CUBEMX之后发现这个东西是真的好用,上次说的串口的博客还没写,由于这段时间任务较重,因此先延迟。) 本文主要记录本人的学习过程,有错误的地方请各位大咖们指正! FreeRTOS,是指实时操作系统,是可以多任务进行的一个操作系统,相当于裸机开发而已,任务的实现相对方便很多。 这次实验材料:STM32F103ZETX,正点原子的战舰开发板,应用到的软件有KEIL5...

build_oooxf的博客 4319

【STM32+HAL+Proteus】系列学习教程---定时器(TIM2)

1、生活中哪些场景会用到定时器?2、STM32F1定时器。

面包板扎的专栏 3253

STM32CUBEMX_定时器控制LED闪烁和串口通信

通过这次实验,了解了定时器的相关知识和stm32cubemx的相关配置,并能简单运用到项目中。

jynyyhd的博客 2530

请叫我鱼拆,2024扫地机器人的第一次拆机

从背面可以看出,这个机器人是两轮差速模型,两个驱动轮,一个万向轮,驱动轮位于机器人中心位置,这样原地旋转的圆心就是机器人的中心。可以看到设备已经连接,但是没有办法进shell,厂家应该有做了安全保护之类的,有知道从这个口可以登录系统办法的小伙伴可以后台留言。但这台机器人一直报警说,机器人轮子离地,小鱼 估计是防跌落模块有问题,误触发了,所以打算先拆机看看。接着小鱼试了下,机器可以开机,然后给他重新配置wifi,连上 米家。Allwinner,全志的片子,不知道哪个型号的,看产品id,应该支持adb。

生活不止眼前的苟且 3926

STM32Cube学习笔记-定时器中断

今天聊一聊使用STM32Cube MX配置STM32F429IGT6的定时器中断。 定时器中断是常用的一个功能,主要是希望自己的程序经过一定的时间执行一段代码。定时器一般和PWM联系比较紧密,本文不介绍PWM的内容。STM32F429系列的定时器有很多,基本定时器、一般定时器和高级定时器,本文介绍的是基本定时器,使用的定时器是TIM2。具体哪个是基本的哪个是高级的哪个是一般的可以去查相关手册。 硬件:野火STM32F429挑战者开发板;软件:STM32Cube MX、Keil 5...

qq_25207883的博客 957

Comsol 弧形声学换能器声聚焦仿真

1. 弧度和曲率半径:弧形声学换能器的形状和曲率半径对声聚焦效果有重要影响。通常,较小的曲率半径和较大的弧度可以实现更强的声聚焦效果。弧形声学换能器声聚焦是指将声波能量集中在弧形声学换能器的特定区域内,以实现更强的声场强度和分辨率。4. 数值仿真和优化:使用声学仿真软件进行数值仿真可以帮助设计和优化弧形声学换能器的声聚焦效果。通过调整几何参数、材料特性和激励信号等参数,可以模拟和优化声聚焦效果。2. 激励信号:通过调整激励信号的频率和幅值,可以实现声波在弧形声学换能器中的聚焦效果。

声学黑洞仿真工作室 1616

STM32 CubeMX学习:3. 定时器闪烁LED

STM32 CubeMX学习:3. 定时器闪烁LED 系列文章目录 前期的准备 点亮 LED 闪烁 LED 定时器闪烁LED 未完待续… 文章目录STM32 CubeMX学习:3. 定时器闪烁LED0.前言1.基础学习1.1 定时器功能讲解1.2 中断的讲解2 程序的学习2.1 定时器在CubeMX里的配置2.2 中断优先级讲解2.3 CubeMX中的中断配置以及中断函数管理2.3.1 CubeMX的中断配置2.3.2 定时器回调函数介绍1.总结 0.前言 这次的博文,我们要了解定时器的基

快乐撸代码 6775

ARM交叉编译gdbserver并远程在线调试

arm-linux平台。5、生成完整的makefile,新建full_install,执行 ./configure --target=arm-linux-gnueabihf --host=arm-linux-gnueabihf --program-prefix=arm-linux-gnueabihf- CC=arm-linux-gnueabihf-gcc --prefix=/home/geyuxi/Documents/full_install。如果--host和--build不同,是交叉编译;

wangjie36的博客 3168

一键开关机电路

一键开关机电路

让你爱上电路设计 4175

STM32CubeMX安装

STM32CubeMX安装

心之所向 2万+

2 中望CAD二次开发-绘制图形(ZRX C++)

本文讲解中望CAD二次开发,关于块的概念及基本图形的绘制

cilvsuanna的博客 411
上一篇: STM32 CubeMX学习:1. 点亮LED
下一篇: C#学习笔记——CH0: C#与.net框架
北冥航
博客等级 码龄7年 232粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值