STM32学习笔记(基于B站江科大标准库教程)

文章详细介绍了STM32F103C8T6芯片中定时器的基本结构和工作原理,包括预分频器、计数器、自动重装载寄存器、中断系统以及如何配置定时器以实现定时中断任务。还给出了时基单元初始化、中断配置和NVIC设置的示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

TIM--基本定时器

类型编号总线功能
高级定时器TIM1、TIM8APB2拥有通用定时器全部功能,并额外具有重复计数器、死区生成、互补输出、刹车输入等功能
通用定时器TIM2、TIM3、TIM4、TIM5APB1拥有基本定时器全部功能,并额外具有内外时钟源选择、输入捕获、输出比较、编码器接口、主从触发模式等功能
基本定时器TIM6、TIM7APB1拥有定时中断、主模式触发DAC的功能

 stm32f103c8t6只有TIM1 TIM2 TIM3 TIM4定时器

功能框图:

 

 基本定时器的核心是时基。

1.预分频器PSC:对输入的基准频率提前进行一个分频操作。预分频器可对计数时钟进行预分频, 输出频率=输入频率/(预分频值+1)[最大值65535+1]

2.实际分频值=预分频值+1 

3.计数器  计数器CNT是一个16位的计数器,只能向上计数,最大计数值为65535。计数达到自动重装寄存器的时候产生更新事件(中断),并且清零从头开始计数。

4.自动重装载寄存器  存储计数目标,达到目标后清零计数器并产生中断信号。

5 .计数器计数频率: CK_CNT=CK_PSC/(PSC+1)

   计数器溢出频率:CK_CNT_OV=CK_CNT/(ARR+1)=CK_PSC/(PSC+1)/(ARR+1)

6.缓冲寄存器:某时刻将预分频器有0改1,当计数到一半的时候改变了分频值,这个变化不会马上生效,⽽是会等到本次计数周期结束时,产⽣了了更新事件,预分频器的值才会被传递到缓冲寄存器⾥⾯去,才会⽣效。 

举个例⼦,如果我们想改变ARR寄存器中的值,但是当前的定时还没有结束,在这时如 果未设置影⼦寄存器,那么设定的值会⽴即⽣效。⽽如果设置了影⼦寄存器,那么新的值会 在当前计数周期结束之后⽣效。

从基准时钟,到预分频器,再到计数器,计数器⾃增,同时不断地与⾃动重装寄存
器进⾏⽐较,计数器和⾃动重装寄存器的值相等时,即计时时间到,这时会产⽣⼀
个更新中断和更新事件, CPU 响应更新中断,就完成了定时中断的任务了。

开启定时器步骤
1. RCC 开启时钟
2. 选择时基单元的时钟源
3. 配置时基单元
4. 配置输出中断控制,允许更新中断输出到 NVIC
5. 配置 NVIC ,在 NVIC 中打开定时器中断的通道,并分配⼀个优先级
6. 运⾏控制
7. 使能计数器

定时器常⽤的库函数


void TIM_DeInit(TIM_TypeDef* TIMx);//恢复缺省配置函数

void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef*TIM_TimeBaseInitStruct);//时基单元初始化函数

void TIM_TimeBaseStructInit(TIM_TimeBaseInitTypeDef*TIM_TimeBaseInitStruct);//时基单元初始化函数

void TIM_TimeBaseStructInit(TIM_TimeBaseInitTypeDef*TIM_TimeBaseInitStruct);//结构体变量赋⼀个默认值函数
void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState);//使能计数器函数

void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalStateNewState);//使能中断输出信号函数
void TIM_InternalClockConfig(TIM_TypeDef* TIMx);//选择内部时钟函数
void TIM_ITRxExternalClockConfig(TIM_TypeDef* TIMx, uint16_tTIM_InputTriggerSource);//选择ITRx其他定时器的时钟函数
void TIM_TIxExternalClockConfig(TIM_TypeDef* TIMx,uint16_tTIM_TIxExternalCLKSource,uint16_t TIM_ICPolarity, uint16_t ICFilter);//选择TIx捕获通道的时钟函数
void TIM_ETRClockMode1Config(TIM_TypeDef* TIMx, uint16_tTIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity, uint16_tExtTRGFilter);//选择ETR通过外部时钟模式1输⼊的时钟函数
void TIM_ETRClockMode2Config(TIM_TypeDef* TIMx, uint16_tTIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity, uint16_tExtTRGFilter);//选择ETR通过外部时钟模式2输⼊的时钟函数
void TIM_ETRConfig(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler,
uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter);//单独配置ETR引脚的预分频器、极性、滤波器这些参数的函数
代码示例:
void Timer_Init(void)
{
 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);//开启TIM2时钟
 
 TIM_InternalClockConfig(TIM2);//使⽤内部时钟
 
 TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;//定义时基单元结构体
 TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;//设置不分
频
 TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;//设
置向上计数
 TIM_TimeBaseInitStructure.TIM_Period = 10000 - 1;//ARR⾃动重装值
 TIM_TimeBaseInitStructure.TIM_Prescaler = 7200 - 1;//PSC不分频
 TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;//重复计数器的值,
⾼级定时器特有
 TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);//写⼊参数
 
 TIM_ClearFlag(TIM2, TIM_FLAG_Update);//清除更新标志位
 TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);//中断输出
 
 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中断优先级分组
 
 NVIC_InitTypeDef NVIC_InitStructure;//NVIC结构体
 NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;//定时器通道
 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能
 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;//抢占优先级
 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//响应优先级
 NVIC_Init(&NVIC_InitStructure);//写⼊参数

 
 TIM_Cmd(TIM2, ENABLE);//开启定时器
}

嗨!对于学习STM32笔记,我可以给你一些基本的指导。首先,你需要了解STM32是一系列由STMicroelectronics公司开发的32位微控制器。它们具有广泛的应用领域,包括嵌入式系统、物联网和工业自动化等。 在学习STM32时,你可以按照以下步骤进行: 1. 硬件准备:获取一块STM32开发板,例如STM32F4 Discovery或NUCLEO系列。这些开发板通常带有一些外设和接口,便于学习和实验。 2. 开发环境搭建:下载并安装Keil MDK或者IAR Embedded Workbench等集成开发环境(IDE)。这些IDE提供了编译器、调试器和其他工具,方便你编写和调试STM32的代码。 3. 学习基本知识:了解STM32的体系结构、寄存器和外设等基本知识。可以通过阅读相关的参考手册、数据手册和应用笔记来深入了解。 4. 编写代码:使用C/C++语言编写STM32的应用程序。你可以使用相关的库函数来简化开发过程,如标准外设库(StdPeriph Library)或者新的STM32Cube库。 5. 调试和测试:使用调试器和仿真器来调试和测试你的代码。这些工具能够帮助你单步执行代码、观察寄存器和内存的状态,以及检查外设的操作。 6. 实践项目:尝试一些小型的项目,如LED闪烁、按键输入和PWM输出等,以巩固你的学习成果。随着经验的积累,你可以尝试更复杂的项目,如通信接口、传感器应用和无线通信等。 记得在学习过程中多查阅官方文档、参考资料和在线论坛,以便解决遇到的问题。祝你学习STM32的旅程愉快!如果你有具体的问题,欢迎随时向我提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值