【CubeMX】STM32定时器Timer定时器控制串口通信和LED闪烁

本文主要介绍了STM32的定时器原理,并基于CubeMX创建工程模板,使用TIMER定时器进行串口通信和LED闪烁
摘要由CSDN通过智能技术生成

【CubeMX】STM32定时器Timer定时器控制串口通信和LED闪烁

一、定时器Timer

  STM32 的定时器功能十分强大,有 TIME1 和 TIME8 等高级定时器,也有 TIME2~TIME5 等通用定时器,还有 TIME6 和TIME7 等基本定时器。
在这里插入图片描述

二、CubeMX新建工程

  
1、新建工程,进行基本配置。通过点击“ACCESS TO MCU SELECTOR”来创建一个新的工程:
在这里插入图片描述

芯片选择“STM32F103C8”。

打开外部时钟,点击“System Core”,选择RCC,在右侧弹出的菜单栏中选择“Crystal/Ceramic Resonator”。

选择调试接口,点击“System Core”,选择RCC。
在这里插入图片描述

2、配置IO。STM32F103C8T6中外设PC13连有LED,因此配置PC13,并命名为D1。
在这里插入图片描述

3、配置定时器2。这里我们使用定时器2来实现定时的功能。如图所示,依次点击位置1,选中定时器2;位置2,配置定时器2的时钟源为内部时钟;位置3,分频系数为71,向上计数模式,计数周期为5000,使能自动重载模式。

在这里插入图片描述

分频系数那里虽然写的是71,但系统处理的时候会自动加上1,所以实际进行的是72分频。由于时钟我们一般会配置为72MHZ,所以72分频后得到1MHZ的时钟。1MHZ的时钟,计数5000次,得到时间5000/1000000=0.005秒。也就是每隔0.005秒定时器2会产生一次定时中断。

3、配置中断。如下图所示,开启定时器2的中断。
在这里插入图片描述

如下图所示,生成定时器2中断优先级配置代码。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您可以使用STM32定时器来计时,并且在定时器中断中将计时值发送到串口。 以下是一个简单的示例代码: ```c #include "stm32f4xx.h" #include <stdio.h> #define TIMER_FREQ 1000000 // 定时器频率为1MHz #define BAUD_RATE 115200 // 串口波特率为115200bps volatile uint32_t timer_count = 0; // 定时器计数值 // 定时器中断处理函数 void TIM2_IRQHandler(void) { if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) // 检查定时器更新中断是否发生 { TIM_ClearITPendingBit(TIM2, TIM_IT_Update); // 清除定时器更新中断标志位 timer_count++; // 计数值加1 } } int main(void) { // 初始化系统时钟、GPIO、串口等 // ... // 配置定时器 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); // 使能定时器2时钟 TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct; TIM_TimeBaseInitStruct.TIM_Period = TIMER_FREQ - 1; // 定时器重载值,计数到1MHz - 1后触发更新中断 TIM_TimeBaseInitStruct.TIM_Prescaler = SystemCoreClock / TIMER_FREQ - 1; // 定时器分频系数,使计数频率为1MHz TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1; // 定时器时钟分频 TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up; // 定时器计数模式为向上计数 TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStruct); // 配置定时器中断 NVIC_InitTypeDef NVIC_InitStruct; NVIC_InitStruct.NVIC_IRQChannel = TIM2_IRQn; NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0; NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStruct); TIM_ClearITPendingBit(TIM2, TIM_IT_Update); // 清除定时器更新中断标志位 TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); // 使能定时器更新中断 // 启动定时器 TIM_Cmd(TIM2, ENABLE); // 发送计时值到串口 while (1) { if (timer_count > 0) // 如果计数值大于0 { char buf[16]; sprintf(buf, "%lu\r\n", timer_count); // 将计数值转换成字符串 USART_SendString(buf); // 发送字符串到串口 timer_count = 0; // 重置计数值为0 } } } ``` 在上述代码中,我们使用了定时器2来计时,计时频率为1MHz。在定时器中断处理函数中,将计数值加1。在主循环中,如果计数值大于0,则将计数值转换成字符串并发送到串口。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值