STM32G030C8T6:定时器1ms中断(以64MHz外部晶振为例)

本文详细介绍了如何使用STM32G030C8单片机,通过STM32CubeMX配置系统、GPIO、RCC和定时器,实现每秒通过PB9引脚控制LED灯的亮灭,包括了错误配置和正确配置的区别,以及1ms中断回调函数的编写。
摘要由CSDN通过智能技术生成

本专栏记录STM32开发各个功能的详细过程,方便自己后续查看,当然也供正在入门STM32单片机的兄弟们参考;

本小节的目标是,系统主频64 MHZ,采用高速外部晶振,通过定时器3 每秒中断控制 PB9 引脚输出高低电平,从而实现 LED 灯的亮灭。
原理:通过配置定时器3每1mS进入中断一次,每进入中断服务程序一次,增加一次计数,计数到达500,控制PB9引脚输出高或低电平,从而实现1S钟周期闪烁。。
涉及到的知识:配置UART引脚,定时器中断,STM32CubeMX的使用

1 新建工程

点击File 菜单下的New Project

在这里插入图片描述

选择芯片型号,如下图所示先输入芯片型号,目前这边输入STM32G030C8,

在这里插入图片描述

双击选择,就确定了芯片型号,界面会变成如下图所示

在这里插入图片描述

2 配置SWD下载引脚

如下图所示,在Pinout&Configuration 栏目的System Core 下,先点击SYS,再勾选Serial Wire 框,
配置好SWD 下载引脚设置:

在这里插入图片描述

3 配置GPIO输出

按下图 的1,2,3 步骤完成PB9 引脚配置成GPIO 输出设置:

在这里插入图片描述

配置成功后如下图所示:
在这里插入图片描述

4 配置RCC

如下图,先点击RCC,在HSE 配置中选择Crystal/Ceramic Resonator 外部晶振设

在这里插入图片描述

5 设置系统主频

如下图, 先点击Clock Configuration 栏目,按下图的1,2,3,4 步骤完成系统64MHZ 主频设置:

在这里插入图片描述

6 定时器配置

6.1 错误配置记录

如下图的1,2,3,4 步骤完成定时器1ms 计时:
(注意,这里我踩了一个坑,误以为Clock source中的Internal Clock为内部时钟,而我是使用的外部晶振,所以我一直选择了第二个选项ETR2。其实第二个选项是ETR2 外部触发输入(ETR)(仅适用TIM2,3,4),意思外接界的其他信号源;正确的应该是:外部晶振也是internal clock ,相当于使用外部时钟分频来的时钟,只要你rcc配置的是外部晶振就没事),所以下面的示例是错误的,正确过程请参考6.2
在这里插入图片描述

ETR2 外部触发输入(ETR)(仅适用TIM2,3,4),意思外接界的其他信号源。

如下图所示完成TIM3 中断使能:

在这里插入图片描述

6.2 正确配置

如下图的1,2,3,4 步骤完成定时器1ms 计时:
在这里插入图片描述
因为我们选择的是64MHz的外部时钟,64分频,1000计数时,1ms产生一次中断。
上图中各个参数的计数以及计数器周期计算方法如下:

Clock Source(时钟来源) :本文中使用的64MHz外部晶振也要使用Internal Clock
计数器设置:
Prtscaler (定时器预分频系数) : 63
Counter Mode(计数模式) : Up(向上计数模式)
Counter Period(自动重装载值) : 999
CKD(时钟分频因子) : No Division 不分频 (可以选择二分频和四分频 )
auto-reload-preload(自动重装载) : Disable 不使能
定时器的定时周期计算方法:
T = (psc+1)(arr+1)/Tclk 其中psc 为定时器预分频系数 arr为自动重装载值 Tclk为系统时钟频率
通过计算 T = (psc+1)(arr+1)/Tclk=(63+1)(999+1)/64us=1000us=1ms

因此实现了1ms中断。

如下图所示完成TIM3 中断使能:

在这里插入图片描述

7 生成工程

按照下图的步骤,进行项目配置,项目名称和路径设置等,生成项目的类型选择STM32CubeIDE(我这里以STM32CubeIDE为例,如果你要试用keil5,那就选择MDK-RAM,如果要使用makefile,就选择Makefile),注意项目名称和路径不要有中文名;
在这里插入图片描述

最后全部设置完毕后点击create code,生成项目代码:

在这里插入图片描述

生成的工程如下图所示:
在这里插入图片描述

8 增加代码实现每1S 控制PB9 引脚输出高或者低电平

如下图,如箭头所示实现1ms 中断回调函数中实现计数到500ms 后PB9 翻转输出,

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)//1ms中断回调函数
{
	TimeCounter++;
	if(TimeCounter>=500)//500ms时间到
	{
		TimeCounter=0;
		HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_9);//LED反转输出
	}
}

在这里插入图片描述
在这里插入图片描述

您好!要使用STM32F103C8T6微控制器的定时器1来实现10毫秒的定时,您可以按照以下步骤进行设置: 1. 首先,需要确保您已经正确配置了系统时钟,以便使用定时器1。您可以使用时钟初始化函数来设置系统时钟。例如,使用适合您的应用程序的外部晶振或内部RC振荡器作为时钟源。 2. 接下来,您需要配置定时器1的相关寄存器。定时器1是16位定时器,可以使用16位或32位计数模式。在这种情况下,我们将使用16位计数模式。 a. 首先,将TIM1_CR1寄存器设置为默认值,即不使用预分频器和向上计数模式。 b. 然后,将TIM1_PSC寄存器设置为适当的预分频值,以获得10毫秒的时间基准。预分频值可以通过以下公式计算:PSC = (预分频系数 - 1),其中预分频系数是一个16位无符号整数。 c. 将TIM1_ARR寄存器设置为适当的自动重装载值,以获得10毫秒的定时周期。自动重装载值可以通过以下公式计算:ARR = (定时周期 / (PSC + 1)) - 1,其中定时周期是一个16位无符号整数。 3. 接下来,您需要启用定时器1的更新中断。更新中断将在定时器计数器溢出时触发。 4. 最后,您需要在主循环中启用全局中断以及定时器1的开始计数。 下面是一个示例代码片段,用于设置和启动定时器1以实现10毫秒的定时: ```c #include "stm32f10x.h" void TIM1_IRQHandler(void) { if (TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET) { // 在这里执行您的定时任务 // ... // 清除更新中断标志位 TIM_ClearITPendingBit(TIM1, TIM_IT_Update); } } int main(void) { // 初始化系统时钟 // ... // 使能定时器1的时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); // 配置定时器1 TIM_TimeBaseInitTypeDef TIM_InitStructure; TIM_InitStructure.TIM_Prescaler = 7199; // 预分频值,得到10毫秒的时间基准 TIM_InitStructure.TIM_CounterMode = TIM_CounterMode_Up; // 向上计数模式 TIM_InitStructure.TIM_Period = 999; // 自动重装载值,得到10毫秒的定时周期 TIM_InitStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_InitStructure.TIM_RepetitionCounter = 0; TIM_TimeBaseInit(TIM1, &TIM_InitStructure); // 使能定时器1更新中断 TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE); // 配置中断优先级 NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = TIM1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); // 启动定时器1 TIM_Cmd(TIM1, ENABLE); // 启用全局中断 __enable_irq(); while (1) { // 主循环 // ... } } ``` 请注意,上述示例代码仅供参考,您可能需要根据您的具体应用程序进行适当的调整和修改。另外,还可以使用HAL库或其他库来简化定时器的配置和使用过程。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乘凉~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值