STM32F103Timer学习笔记--寄存器版本

本文详细介绍了如何在STM32中使用TIM3定时器进行PWM信号生成,包括设置时钟源、配置寄存器、实现PWM模式、以及拓展到呼吸灯效果。适合学习嵌入式开发和STM32 PWM的应用开发者。

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

TIM3 定时器中断笔记

1.设置时钟源,采用外部高速时钟 F103是最大72MHz

在这里插入图片描述

2.APB1总线 挂载的TIM3的时钟

3.TIM3涉及到的寄存器

  1. CR1

[0] 使能计数器

​ [4] DIR 设置计数方向

​ [6:5] CMS 对齐模式

​ [7] ARPE:自动重装载预装载允许位

TIM3->CR1 |= 0X0081;

  1. 设置预分频器(TIM3_PSC) APB1 36Mhz 经过自动倍频后给TIM3,分频7200,可以得到10Khz的频率(0.0001s)

    TIM3->PSC = 7200-1;

  2. 设置自动重装载寄存器(TIM3_ARR) 自动装入初值

    TIM3->ARR = 5000-1; //5000次触发一次计数,则输出的定时时间为0.5s

  3. 设置中断使能寄存器(TIM3_DIER) 开启中断

  4. 设置中断优先级,和中断回调

工作原理:

在这里插入图片描述
TIMER3 的PWM 功能

  1. 查阅中文手册介绍,涉及如下寄存器,学习每一个对应的寄存器的配置。

在这里插入图片描述

  1. 工作原理

脉冲宽度调制模式可以产生一个由TIMx_ARR寄存器确定频率、由TIMx_CCRx寄存器确定占空
比的信号。

在这里插入图片描述

通道1PWM 产生电路图

捕获比较寄存器(CCMR1)比较当前计数值(CNT)和装载CCR1的值,如果大于则溢出产生一个脉冲翻转信号.循环往复,就产生了PWM

通过配置对应寄存器使STM32在外部8Mhz 的时钟下对通道2 (LED PB5引脚)输出PWM

  1. 让对应引脚进行复用。查阅手册

在这里插入图片描述
将此引脚配置成TIMER3 通道2的引脚输出。开发板直接连接LED0.可以观察PWM效果

RCC->APB1ENR|=1<<1; 	//TIM3时钟使能    
RCC->APB2ENR|=1<<3;    	//使能PORTB时钟	
GPIOB->CRL&=0XFF0FFFFF;	//PB5输出
GPIOB->CRL|=0X00B00000;	//复用功能输出 	  	 
   
RCC->APB2ENR|=1<<0;     //开启辅助时钟	   
AFIO->MAPR&=0XFFFFF3FF; //清除MAPR的[11:10]
AFIO->MAPR|=1<<11;      //部分重映像,TIM3_CH2->PB5
  1. 寄存器配置
TIM3->EGR |= 1<<0; //初始化所有的寄存器
   		
TIM3->PSC = 7200-1;  // 得到 10khz的分频
TIM3->ARR = 100;     // 每次到100HZ.重新进行装载 :10KZH --> 100HZ
   		
//在TIMx_CCMRx寄存器中的OCxM位写入’110’(PWM模式1)或’111’(PWM模式2),能够独立地设置每个OCx输出通道产生一路PWM
TIM3->CCMR1 |= 6<<12; // 通道2 PWM模式,输出比较1模式。
TIM3->CCMR1 |= 1<<11;  // 输出比较2预装载使能 
TIM3->CCMR1 |= 1<<3;  // 开启TIMx_CCR1寄存器的预装载功能(寄存器) 读写操作仅对预装载寄存器操作, TIMx_CCR1的预装载值在更新事件到来时被加载至当前寄存器中。
TIM3->CCMR1 &= ~(2<<0); //CC1通道被配置为输出	
// 使能定制器,并设置计数器向上计数,边沿对齐模式
TIM3->CR1 |= 0X0081; 	
TIM3->CCER |= 1<<4; //OC2 输出使能
TIM3->CCER &= ~(1<<5);// OC2高电平有效
   	
// 修改这个值5000,配合AAR寄存器与装载值10000,产生1hz的 50%占空比PWM
TIM3->CCR2 = 50; // PB5链接通道2所以是CCR2 : 50% 1HZ PWM

PWM 效果:

PWM

功能拓展:

​ 将PWM 和 定时器结合,定时器产生中断,来修改CCR2的比较值,就可以实现呼吸灯效果。

呼吸灯效果:

呼吸灯

参考
timer3-pwm学习笔记git
PWM定时器工作原理
STM32英文手册
STM32中文手册

<think>好的,我现在需要帮助用户寻找关于STM32电子时钟的标准库资源和教程。首先,用户提到了他们想实现电子时钟,可能需要用到标准库函数,比如GPIO控制、定时器和中断管理等。根据用户提供的引用内容,引用[1]提到STM32固件库包含驱动程序和接口,包括GPIO、定时器等,以及一些数据结构和算法,比如排序和搜索。这可能对电子时钟的实现有帮助,特别是时间管理和外设控制方面。 接下来,引用[2]提到了江协科技/江科大的STM32入门教程,里面有各章节的详细笔记,这可能包含电子时钟相关的示例。用户可能需要具体的教程步骤和代码示例,所以需要推荐这个资源。另外,引用[3]详细说明了标准库函数在GPIO控制和定时器中断中的应用,这两部分对电子时钟至关重要,因为时钟需要精确的定时器中断来更新时间,以及GPIO来控制显示模块,比如数码管或LCD屏幕。 用户的问题是关于电子时钟的实现,所以需要考虑以下几个方面:硬件组成(RTC、显示模块、按键)、软件设计(定时器配置、中断处理、时间显示)。根据引用内容,标准库中的RTC函数、定时器中断处理以及GPIO控制函数都是关键。例如,RTC_Init()函数用于初始化实时时钟,TIM_Config()配置定时器产生周期性中断来刷新显示,GPIO控制LCD或数码管的显示。 此外,用户可能需要示例代码的结构,比如主函数中初始化各模块,进入循环处理按键和显示。引用[1]提到标准库提供常用数据结构和算法,可能在处理时间数据时会用到,比如队列或堆栈来管理事件。 可能还需要考虑如何获取外部资源,比如推荐ST官网的标准库下载,以及社区论坛如STM32CubeMX或电子工程世界,这些地方可能有开源项目或教程。引用[2]强调动手实践和利用官方文档,所以建议用户查阅STM32参考手册和标准库用户手册,特别是RTC和定时器章节。 最后,用户可能需要进一步的问题,比如如何优化电子时钟的精度,或者如何添加闹钟功能,这些都可以作为相关问题提出,引导用户深入学习和解决问题。</think>### STM32标准库实现电子时钟的教程与资源 要实现基于STM32标准库的电子时钟,需要结合**RTC(实时时钟)模块**、**定时器中断**和**外设驱动**(如LCD或数码管显示)。以下是具体步骤和资源推荐: --- #### **1. 硬件与软件基础** - **硬件需求**:STM32开发板(如STM32F103C8T6)、RTC晶振(32.768kHz)、显示模块(如LCD1602或数码管)、按键(用于时间设置)。 - **软件依赖**:STM32标准库(如STM32F10x标准外设库)、Keil MDK或STM32CubeIDE开发环境。 --- #### **2. 核心实现步骤** **① RTC模块初始化** RTC用于提供精确的时间基准。STM32标准库提供了`RTC_Init()`函数,需配置时钟源(通常选择外部低速晶振LSE)和日历寄存器[^3]。 ```c RTC_InitTypeDef RTC_InitStruct; RTC_InitStruct.RTC_AsynchPrediv = 0x7F; // 异步分频值 RTC_InitStruct.RTC_SynchPrediv = 0xFF; // 同步分频值 RTC_Init(&RTC_InitStruct); ``` **② 定时器中断配置** 使用定时器(如TIM2)生成周期性中断(例如每秒一次),用于更新显示或处理按键输入。 ```c TIM_TimeBaseInitTypeDef TIM_InitStruct; TIM_InitStruct.TIM_Prescaler = 7200 - 1; // 72MHz / 7200 = 10kHz TIM_InitStruct.TIM_Period = 10000 - 1; // 10kHz / 10000 = 1Hz TIM_TimeBaseInit(TIM2, &TIM_InitStruct); TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); // 使能更新中断 ``` **③ 显示模块驱动** 通过GPIO或SPI/I2C控制LCD显示时间数据。例如,使用标准库的`GPIO_WriteBit()`函数控制数码管段选: ```c GPIO_WriteBit(GPIOA, GPIO_Pin_0, (time.second % 2 == 0) ? Bit_SET : Bit_RESET); // 秒闪烁 ``` --- #### **3. 推荐资源与教程** 1. **ST官方标准库下载** 在[ST官网](https://www.st.com)搜索“STM32 Standard Peripheral Library”,下载对应型号的库文件,包含RTC、定时器等外设的示例代码[^1]。 2. **江科大STM32入门教程** 该教程详细讲解标准库开发流程,第12章专门介绍RTC和电子时钟实现,配套代码可直接复用[^2]。 3. **开源项目参考** - GitHub搜索“STM32 Clock Example”获取完整工程(如[STM32F4-RTC-Clock](https://github.com/example))。 - 电子工程世界论坛的《基于STM32的电子时钟设计与实现》帖子提供调试经验。 --- #### **4. 示例代码框架** ```c #include "stm32f10x.h" #include "lcd.h" int main() { RTC_Init(); // 初始化RTC TIM_Config(); // 配置定时器中断 LCD_Init(); // 初始化显示模块 while (1) { if (timer_flag) { // 定时器中断触发 Time_Struct time = RTC_GetTime(); LCD_DisplayTime(time); // 更新显示 timer_flag = 0; } Key_Process(); // 处理按键设置时间 } } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值