STM32时钟系统简介 STM32种类繁多,时钟系统也不尽相同,但基本的还是大差不差,今日小飞哥就F1系列的MCU简单聊一聊STM32的时钟系统 1、时钟种类介绍: 先来看一看时钟树图,包含了整个系统的始终来源及各个外设的始终来源...LSI时钟频率大约40kHz(在30kHz和60kHz之间)。 以上介绍来自STM32手册,总共分为5大时钟源。...在HAL_RCC_OscConfig,函数中对HSE的配置如下,贴出一部分代码,其他时钟源配置类似,贴了一些中文注释: /* Check the parameters */ assert_param...return HAL_TIMEOUT; } } } 关于时钟的配置设计的寄存器是非常多的,小飞哥刚开始学习的时候,有寄存器版本和库函数版本,当时一看寄存器真精简啊...,后来发现库函数用着好简单...后来就放弃了寄存器版本...
本篇文章主要介绍STM32中Systick定时器的使用以及HAL_Delay函数的原理。 1....频率设定有三个值,在stm32l4xx_hal.h文件中: ? ② Systick默认中断服务函数 ?...HAL_IncTick函数会把当前系统中定义的计数值变量递加,在stm32l4xx_hal.c文件中,实现如下: ?...编写用户代码 HAL库中还定义了一个函数 HAL_GetTick(),使用此API可以获取到当前系统中的计数值,定义如下: ? 接下来使用此API来编写LED闪烁程序。...1 */ 然后在while(1)循环中调用 HAL_GetTick() 来获取当前的计数值,通过比较当前计数值和起始值即可起到延时的作用: while (1) { /* USER CODE
引言 我们在进行STM32开发的时候,使用寄存器进行开发的终究是少数,大多数人还是习惯用库函数进行开发。到目前为止,有标准外设库、HAL库、LL库 三种。本文将分别介绍以下三种库,便于大家区分。...它提供了对STM32微控制器的底层寄存器和外设的直接访问。标准库的设计目标是提供高度灵活性和低层次的硬件控制,以满足对性能和资源的严格要求。...HAL库基于标准库,并提供了一组API函数,将底层硬件操作抽象为高级函数调用。这样,开发人员可以使用更高级别的API函数来进行配置和控制微控制器的功能,而不需要直接操作底层寄存器。...LL库提供了对底层寄存器和外设的更直接的访问,并提供了一组低级别的API函数。LL库保留了更多的硬件细节,为开发人员提供了更高级别的灵活性和控制。...总结 ST提供的标准库、HAL库和LL库各有其优势和特点,如果是移植很久前的项目,大概率要使用标准库。如果新开发项目,使用STM32CubeMX就必须使用HAL库和LL库了。
上一段话包含两层意思:1、在不熟悉STM32的情况下,如何入手学习相关的技术知识。2、在不熟悉STM32的情况下,作为公司在职开发人员,如何快速进入STM32相关的项目开发工作中,保证开发效率。...看一个我碰到的项目实例:一同事在用STM32CubeMx生成的代码,要交到我这里来对项目代码进行整合,代码里用到的延时函数有两个HAL_Delay(), osDelay(),理论上,这两个延时函数的参数延时基准都是...通过图形配置部分,得知他设置的SYS 时钟源为TIM1,那么,理论上是和APB2的FCKL2相关。...我们先定得找到延时函数所用到的参数配置,看源代码: 函数原型: __weak void HAL_Delay(__IO uint32_t Delay) { uint32_t tickstart...= HAL_GetTick(); while((HAL_GetTick() – tickstart) < Delay) { } } –> __weak uint32_t HAL_GetTick
1、串口的使用方法 在hal库中,有三个串口发送的函数 a、HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, uint8...HAL_UART_Receive_IT和HAL_UART_Transmit_DMA两个函数,没有超时,说明是非阻塞式发送,基本上不会占用cpu的太多的资源,而且发送完成有出发中断的功能。...2、串口接收也有三个函数 a、HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_...*pData, uint16_t Size) HAL_UART_Receive是阻塞式的接受函数,因此不建议使用,通常在开发过程中,基本上使用HAL_UART_Receive_IT和HAL_UART_Receive_DMA...两个函数 目前我使用中断接受数据,dma发送数据,基本没有问题,如果加上定时器来判断空闲,基本上就实现了modbus的数据协议了。
人机交互:提供 LCD 显示屏和按钮操作界面,便于用户管理和查看状态。硬件设计1. STM32 微控制器本项目选择 STM32F103C8T6 作为核心控制单元。...在 STM32 上,我们通过 GPIO 和定时器来实现超声波传感器的数据读取。...= HAL_GetTick(); while (HAL_GPIO_ReadPin(GPIOA, ECHO_PIN) == GPIO_PIN_SET); uint32_t end_time...= HAL_GetTick(); pulse_width = end_time - start_time; // 距离计算:距离 = (脉冲宽度 / 2) * 声音传播速度...总结基于 STM32 的垃圾分类项目展示了如何使用微控制器、传感器和机械控制单元来实现自动化的垃圾分类。通过合理的硬件选型和模块化的软件设计,系统能够高效地完成垃圾的分类和投放任务。
通过SPI通信协议即可实现MCU(STM32)和 W25Q128 之间的通信。实现W25Q128的控制需要通过SPI协议发送相应的控制指令,并满足一定的时序。...当NSS管脚为低电平时,该spi设备被选中,可以和主设备进行通信。在stm32中,每个spi控制器的NSS信号引脚都具有两种功能,即输入和输出。所谓的输入就是NSS管脚的信号给自己。...轮询: 最基本的发送接收函数,就是正常的发送数据和接收数据 中断: 在SPI发送或者接收完成的时候,会进入SPI回调函数,用户可以编写回调函数,实现设定功能 DMA: DMA传输SPI数据 利用SPI接口发送和接收数据主要调用以下两个函数...读取数据的地址 Size 读取数据的大小 … 函数开始先将要发送的数据(命令和地址)存储在cmd数组中, 拉低片选信号,开始SPI通信 然后后通过HAL_SPI_Transmit()函数发送出去,首先发送写命令...huart1; //声明串口 在 stm32f1xx_hal.c 中重写fget和fput函数 /** * 函数功能: 重定向c库函数printf到DEBUG_USARTx * 输入参数: 无 *
【1.4】 工程配置的主界面有四个菜单:Pinout & Configuration、Clock Configuration、 Project Manager 和 Tools。 ?...如果你的芯片使用外部晶振,则 在 HSE 和 LSE 下拉列表中选择“Crystal/Ceramic Resonator”。 注:一般开发板上都会有两个外部晶振。 ?...【1.10】当把工程的引脚和外设全部配置完成后,点击主界面中的 “Project Manager” 菜单项,进入工程相关的参数配置界面。 ?...这样生成的工程将会为你配置的每一个外设生成对应的.c 文件和.h 文件。 ? 【1.12】点击主界面右上角的 “GENERATE CODE”, 开始生成工程代码。 ?...总结 CubeMX+HAL 不需要理解底层寄存器的定义,使用起来非常方便 要理解生成的代码之间的逻辑联系,熟悉常用的 hal 函数 建议学完标准库后上手 CubeMX
STM32CUBEMX系列教程之HAL库方式的微秒延时函数 ---- 标准库一般是使用系统嘀嗒定时器来进行微妙级别的延时,而HAL库将SysTick定时器用做了库函数的超时定时器,使用的地方非常多,自己修改代码使用嘀嗒定时器的话就会引起错乱...所以此时就需要自己实现一个微秒级别延时函数。 ---- 关注公众号雍正不秃头获取更多STM32资源及干货!...缺点:系统滴答定时器是HAL库初始化的,且必须有HAL库初始化。...#define CPU_FREQUENCY_MHZ 72 // STM32时钟主频 void delay_us(__IO uint32_t delay) { int last, curr...(delay--) { ; } } 方式三:普通定时器 优点: STM32全系列通用 缺点: 占用一个定时器 该方法的思路是将定时器设置为1MHZ的计数频率,定时器计一个数就是1us
配置STM32CubeMX 前面的一些基础步骤可参见:【STM32】CubeMX+HAL 点亮LED 的【1.1】~【1.6】步骤。...余下步骤可参见:【STM32】CubeMX+HAL 点亮LED 的【1.10】~【1.13】步骤。 2. 添加代码 ? ?...= HAL_OK) { Error_Handler(); } if (HAL_TIM_PWM_Init(&htim2) !...= HAL_OK) { Error_Handler(); } HAL_TIM_MspPostInit(&htim2); } void HAL_TIM_Base_MspInit(TIM_HandleTypeDef...总结 TIM 的配置是本工程的核心 通过观察 LED 判断是否输出成功,当然有条件的可以使用 示波器 看看波形 STM32 的基础配置用 CubeMX 很是方便
,必须调用本函数 */ HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority) { /* 使能DWT外设 */ DEM_CR |=...DWT_CYCCNT); } /** * @brief 读取当前时间戳 * @param 无 * @retval 当前时间戳,即DWT_CYCCNT寄存器的值 */ uint32_t HAL_GetTick...HAL_InitTick(uint32_t TickPriority); //使用以下函数前必须先调用CPU_TS_TmrInit函数使能计数器,或使能宏CPU_TS_INIT_IN_DELAY_FUNCTION...库中使用,注释掉: uint32_t HAL_GetTick(void) { return ((uint32_t)DWT_CYCCNT/SysClockFreq*1000); }...同时建议重新命名HAL_InitTick()函数。
为什么这么多个时钟源: STM32系统是复杂的,高精度、低精度、高速、低速等,且可以对每个时钟源进行开关操作,可以把不需要使用的关闭掉。...STM32时钟: 从时钟源的角度可分为: l 外部时钟(E) l 内部时钟(I) 从时钟速率的角度分为: l 高速时钟(HS) l 低速时钟(LS) STM32在芯片复位后默认选用的是内部的高速时钟...为了减少时钟输出的失真和缩短启动稳定时间,晶体/陶瓷谐振器和负载电容必须尽可能地靠近振荡器引脚。负载电容值必须根据所选择的晶体来具体调整。...STM32系统时钟框图 image.png 系统时钟源总共有4个: l HSI RC:内部高速RC振荡器,相比于外部精度较低。通常约为8MHZ。...l 时钟可以进行独立的开启和关闭 image.png 在STM32F103C8T6芯片中: PC14和PC15是外部低速时钟的输入脚 PD0和PD1是外部高速时钟的输入脚 PA8是时钟输出引脚,输出的时钟可编程选择
外部中断 前言 材料 NVIC 新建及配置工程 外部中断和事件中断 NVIC配置 进入代码 回调函数 HAL_Delay()分析 下载验证 结语 前言 学单片机的,相信对中断的概念都已经了如指掌了...那么接下来同样是打开我们STM32开发板的原理图,分别找到按键和LED的位置,可以看到有两个可编程LED,和四个按键,从中我们可以获得几点信息。...在写代码前,先来介绍一下回调函数的概念,用过STM32中断的应该都知道,单片机再执行中断服务函数之前,Contex-M4内核先将现在使用到的寄存器和主程序中断点的地址压入堆栈(保护现场)。.... * @retval None */ __weak void HAL_Delay(uint32_t Delay) { uint32_t tickstart = HAL_GetTick()...{ wait += (uint32_t)(uwTickFreq); } while((HAL_GetTick() - tickstart) < wait) {
sdram初始化函数之后,添加lcd初始化函数,并使用HAL库自带的systick时间戳测量一次清屏的时间: /* USER CODE BEGIN 2 */ printf("sdram test by...mculover666\r\n"); SDRAM_Init(); printf("sdram init success\r\n"); lcd_init(); start_time = HAL_GetTick...(); lcd_clear(PINK); end_time = HAL_GetTick(); printf("lcd clear spend time:%ld ms\r\n", end_time -...DMA2D 在STM32中,DMA2D外设专门用来给LCD显示加速,有LTDC外设的型号中,通常也会配套有DMA2D。...可以看到,刷屏一次只需31ms即可,并且在使用dma2d传输数据的情况下,数据传输时间和编译优化等级无关。 三、LCD基本功能实现 LCD基本功能包括打点、读点、画线、绘图等函数。 1.
https://en.wikipedia.org/wiki/SD_card#SDIO_cards 对于STM32的SDIO来说,他就是指STM32的一个外设接口,不仅能够来接SD卡,还可以接其它外设。...SDMMMC驱动文件stm32h7xx_hal_sd.c和stm32h7xx_ll_sdmmc.c 这个是STM32H7的HAL库自带的。 FatFs相关源文件。...第2阶段,进入main函数: 第1步,硬件初始化,主要是MPU,Cache,HAL库,系统时钟,滴答定时器,LED和串口。 第2步,FatFs应用程序设计部分。...该函数配置CPU寄存器和外设的寄存器并初始化一些全局变量。...该函数配置CPU寄存器和外设的寄存器并初始化一些全局变量。
本文详细的介绍如何来编写一个串口收发程序,我们采用常用的收发逻辑,发送直接编写函数进行实现,而接收使用中断进行完成。接收中断使用接收到一个字节和一帧数据两种中断触发方式。...一般在我们开始和配置完串口中断后,进入串口中断处理程序的情况会有很多,我们也可以自己选择打开哪些串口中断情况。一般情况下,我们在接受时主要使用的中断事件标志是RXNE和IDLE。...首先是判断标志位,我们使用HAL库中的__HAL_UART_GET_FLAG()函数,里面有两个参数,前者是串口句柄,后者是具体哪个标志位。...重定向printf和scanf 还有一点需要注意的,使用 fput 和 fgetc 函数达到重定向 C 语言标准库输入输出函数必须在 MDK 的工程选项把“Use MicroLIB”勾选上, MicoroLIB...HAL_UART_Transmit(&huart3, (uint8_t *)&ch, 1, 0xffff); return ch; } /** * 函数功能: 重定向c库函数getchar,
如果你对这个函数还有其它的兴趣,我们可以进一步讨论和这个函数的其它方面。...接着我们来看HAL_Delay()函数的定义: __weak void HAL_Delay(__IO uint32_t Delay) { uint32_t tickstart = HAL_GetTick...) { wait++; } while((HAL_GetTick() - tickstart) < wait) { } } 当程序进入延时函数时,就调用...HAL_GetTick()获取当前uwTick的值。...接着判断wait的值,若不大于可以延时的最大值,则wait自加1,最后不断的获取HAl_GetTick的值,直到这个值和初始值的差不小于等待的时间。
前言 上一节我们讲解了STM32CubeMX的基本使用和工程的配置,那么这一节我们正式来学习CubeMX配置STM32的各个外设功能了 今天我们会详细的带你学习STM32CubeMX配置外部中断,并且讲解...HAL库的GPIO的各种函数,带你学习不一样的STM32 如果还没有配置过工程,请参看上一篇博客 《STM32CubeMX教程二–基本使用(新建工程点亮LED灯)》 那么话不多说,我们开始正式的讲解吧!...准备工作: 1、STM32开发板(我的是STM32F407ZE和STM32F103RC) 2、STM32CubeMx软件、 IDE: Keil软件 3、STM32F1xx/STM32F4xxHAL库...,就是清除中断标志位,之后进入中断回调函数中 在HAL库中,中断运行结束后不会立刻退出,而是会先进入相对应的中断回调函数,处理该函数中的代码之后,才会退出中断,所以在HAL库中我们一般将中断需要处理代码放在中断回调函数中...中文参考手册》中查看 关于GPIO的八种模式请参看 《STM32 GPIO八种模式及工作原理详解》 按键消抖: /** * 函数功能: 按键外部中断回调函数 * 输入参数: GPIO_Pin:中断引脚
前两天使用HAL库的空闲中断+DMA接收串口数据,第一帧会丢失,今天找了下原因。...使能DMA接收用的如下语句, 我把这句话放在了 这里使用的,这个函数是被串口初始化调用的,就是这个函数 就是相当于先开启DMA接收再使能串口。...这样的话HAL_UART_Receive_DMA()这个函数就无法正常运行(他需要 ).所以HAL_UART_Receive_DMA()这个函数需要HAL_UART_INIT()之后调用。
稳定成熟,文档清晰: 标准库是ST公司早期为STM32开发的官方库,比较成熟且文档详尽。 对于老用户来说,标准库的API函数已经成为一种“经典”,很多老项目还在继续使用。...对代码大小和性能优化不如标准库 由于HAL库封装了更多的功能,代码会相对庞大,运行效率也稍逊一筹。 不过,对于大多数应用来说,HAL库的性能已经足够。...3、HAL库是“自动挡”,标准库是“手动挡” 可以把HAL库和标准库的关系比喻成“自动挡”和“手动挡”的汽车: HAL库就像自动挡:操作简便,容易上手,适合大多数驾驶者(开发者)。...LL库是STM32库中介于HAL和标准库之间的选项,提供比HAL更接近硬件的控制,又比标准库更简单一些。这样可以兼顾开发效率和性能优化。...而如果你已经有一定的经验,想要挑战更高的性能和精细的控制,那么标准库则能让你更好地挖掘STM32的潜力。