因为STM32 HAL库中仅有对HAl_Delay()毫秒级的延时,为实现精确的微秒级延时,就不得不修改Systick,但由于HAL库内部使用其作为超时判断等操作,对其修改会发生不可预期的错误,不建议修改。因此,使用通用定时器进行定时操作。
参考网上例程,使用定时器中断方式实现延时,代码如下:
/*
TIM3溢出时间=72MHz/(71+1)/(0+1)=1Mhz=1us
计数模式:向上计数模式
使能TIM3中断
*/
__IO static uint32_t usDelay=0;
void Delayms(uint32_t ms)
{
Delayus(ms*1000);
}
void Delayus(uint32_t us)
{
usDelay=us;
HAL_TIM_Base_Start_IT(&htim3);
while(usDelay);
HAL_TIM_Base_Stop_IT(&htim3);
}
//重写回调函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance == TIM3)
{
if(usDelay!=0)
{
usDelay--;
}
}
}
虽然说以上程序的并没什么错误,但在实际运行中,却无法得到正确的运行。同时,在进行Debug调试时,单步执行又可以正常运行。
主要原因在于:中断间隔时间太短,导致中断函数还没有运行完成,其中断标志位却再次置位,导致在程序卡死。
因此,关闭定时器中断,采用定时器轮询的方式实现延时,代码如下:
/*
TIM3溢出时间=72MHz/(71+1)/(0+1)=1Mhz=1us
计数模式:向下计数模式
*/
void Delay_us(uint32_t us){
uint16_t counter=us&0xffff;
HAL_TIM_Base_Start(&htim3);
__HAL_TIM_SetCounter(&htim3,counter);
while(counter>1)
{
counter=__HAL_TIM_GetCounter(&htim3);
}
HAL_TIM_Base_Stop(&htim3);
}
void Delay_ms(uint32_t ms){
Delay_us(1000*ms);
}
关键字:STM32Cubemx 通用定时器 微秒级延时
引用地址:
STM32Cubemx下实现通用定时器微秒级延时
推荐阅读最新更新时间:2024-03-16 16:00
STM32CubeMX系列 | 独立看门狗
1. 独立看门狗简介 看门狗其实就是一个定时器,从功能上说它可以让微控制器在程序发生意外(程序进入死循环或跑飞)的时候,能重新回复到系统刚上电状态,以保障系统出问题的时候可以重启一次。说的复杂一点,看门狗就是能让程序出问题是能重新启动系统 STM32的独立看门狗(IWDG)由内部专门的40KHz低速时钟驱动,即使主时钟发生故障,它也仍然有效。注意IWDG的时钟是一个内部RC时钟,是一个在30~60KHz之间的一个可变化的时钟,只是我们在估算的时候以40KHz的频率来计算,看门狗对时间的要求不是很精确 独立看门口功能框图如下。实际上独立看门口狗是一个递减计数器,当计时器的值减到0时,IWDG会产生一个复位信号,系统复位重新启动。为避
[单片机]
STM32CubeMX学习--(5)SPI读写W25Q128
CUBE配置 SPI配置 引脚配置 参数配置 点击生成代码 代码修改 uint8_t Data1 ={0x90,0x00,0x00,0x00}; uint8_t Data2 ={0x00,0x00}; uint8_t RxData ={0x00,0x00}; /****************************/ while (1) { HAL_GPIO_WritePin(SPI1_NSS_GPIO_Port,SPI1_NSS_Pin,GPIO_PIN_RESET); HAL_SPI_Transmit(&hspi1,Data1,4,100); HAL_SPI_TransmitReceive(
[单片机]
STM32CubeMX自动生成SYSTICK配置
1.SYSTICK原理及其寄存器 1.1 SYSTICK原理 SysTick 是一个24位的倒计数定时器,当计到0时,将从RELOAD寄存器中自动重装载定时初值并继续计数,且同时触发中断。只要不把它在SysTick控制及状态寄存器中的使能位清除,就永不停息。 SysTick 的最大使命,就是定期地产生异常请求,作为系统的时基,产生一个周期性的中断。 1.2SYSTICK寄存器 CTRL: Systick控制和状态寄存器 LOAD: Systick重装载寄存器 VAL: Systick当前值寄存器 CALIB: Systick校准值寄存器 CLKCOURCE-时钟源
[单片机]
STM32CubeMX学习教程之六:USART串口输出和printf( )重定向到串口
软件: STM32CubeMX V4.25.0 System Workbench V2.4 固件库版本: STM32Cube FW_F1 V1.6.1 硬件: OneNet 麒麟座V2.3 在STM32CubeMX中新建项目,选择正确的MCU型号 首先设置RCC和SYS,如下图 然后根据板子实际情况设置时钟(麒麟座外部晶振是12M,STM32F103x的最高主频是72M),如下图 配置USART1为Asychronous模式 可以看到PA9和PA10被配置为了USART1_TX, USART1_RX。 UART1配置用默认的115200,8, None和1就好。
[单片机]
STM32CUBEMX开发GD32F303(3)----点亮LED
概述 以 STM32 CUBEMX创建STM32F103工程,同时移植在 GD32 F303中,同时通过J-LINK烧录GD32303C_START和GD32303E_EVAL开发板内进行验证。需要样片的可以加群申请:6_15061293。 芯片 申请 芯片和开发板都可免费申请,暂时只能以公司名义免费申请,填下下面表格即可。 硬件 准备 这里准备了2块开发板进行验证,分别是GD32303C_START和GD32303E_EVAL开发板。 开发板管脚配置 在GD32303C_START中的 LED 管脚配置如下所示。 在GD32303E_EVALT中的LED管脚配置如下所示。 STM32CUBEMX配置 以ST
[单片机]
通用定时器(中断功能和PWM输出)
目录: 1:概述 2:常用中断功能 3:PWM输出 1:概述 在开发中,定时器的应用很广泛,简单总结为三个方面: 1.1:中断功能的应用,常用的是利用定时器中断,实现定时、记时、延时、超时判断,前面博文中有总结过内核定时器的各种使用的方法; 1.2:比较输出,常用应用就是PWM输出,用脉宽调制来实现led、电机等的控制; 1.3:输入捕获,可以抓取输入的方波信号,统计波形周期和占空比,最常见利用就是门控,将外部模拟量转化为数字量(定时器的计数值); 2:常用中断功能 定时器的初始化详细参考手册,主要的一点是确定定时器的溢出周期,利用公式:Tout = (arr+1)*(psc+1)/Tclk,可计算出定时器的溢出频率; 如
[单片机]
STM32CubeMX系列 | 按键输入
按键输入 1. 实验介绍 本实验介绍如何使用STM32F103的IO口作为输入使用。IO口作为输入使用时,是通过读取IDR的内容来读取IO口的状态的。 本实验利用板载的4个按键,来控制板载的两个LED的亮灭和蜂鸣器。其中KEY_UP控制蜂鸣器;K1控制D1,按一次亮再按一次灭;K2控制D2,按一次亮再按一次灭;K3同时控制D1和D2,按一次它们的状态就翻转一次 2. 硬件设计 用到的硬件资源有: 指示灯D1、D2 蜂鸣器BUZ 4个按键:KEY_UP、K1、K2、K3 硬件连接原理图如下,注意K1、K2、K3是低电平有效的,而KEY_UP是高电平有效,并且外部都没有上下拉电阻,所以需要在STM32F1内部设置上下拉; ST
[单片机]
STM32学习笔记——利用通用定时器TIM2进行精确延时
1. 通用定时器概述及性能 1.1 概述 在作者所使用的stm32芯片上,共有TIM1 1个高级定时器以及TIM2、TIM3、TIM4共3个通用定时器。其中各通用定时器均由一个通过可编程预分频器驱动的16位自动装载计数器构成。适用于多种场合,包括测量输入信号的脉冲长度(输入采集)或者产生输出波形(输出比较和PWM)。使用定时器预分频器和RCC时钟控制器预分频器,脉冲长度和波形周期可以在几个微秒到几个毫秒间调整。定时器是完全独立的,而且没有互相共享任何资源。它们可以一起同步操作。 1.2 性能 通用TIMx定时器特性包括: 16 位向上,向下,向上/向下自动装载计数器 16 位可编程预分频器,计数器时钟频率的分频系数为
[单片机]