基于STM32F103的LED闪烁仿真-定时器中断方式

基于STM32F103的LED闪烁仿真

仿真软件:

Proteus 8.17

编程软件:

Keil 5

定时器简介:

高级控制定时器(TIM1和TIM8)由一个16位的自动装载计数器组成,它由一个可编程的预分频器驱动。

它适合多种用途,包含测量输入信号的脉冲宽度(输入捕获),或者产生输出波形(输出比较、

PWM、嵌入死区时间的互补PWM等)。

使用定时器预分频器和RCC时钟控制预分频器,可以实现脉冲宽度和波形周期从几个微秒到几个毫秒的调节。

高级控制定时器(TIM1和TIM8)和通用定时器(TIMx)是完全独立的,它们不共享任何资源。它们可以同步操作。

TIM1和TIM8主要特性

TIM1和TIM8定时器的功能包括:

● 16位向上、向下、向上/下自动装载计数器

● 16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65535之间的任意

数值

● 多达4个独立通道:

─ 输入捕获

─ 输出比较

─ PWM生成(边缘或中间对齐模式)

─ 单脉冲模式输出

● 死区时间可编程的互补输出

● 使用外部信号控制定时器和定时器互联的同步电路

● 允许在指定数目的计数器周期之后更新定时器寄存器的重复计数器

● 刹车输入信号可以将定时器输出信号置于复位状态或者一个已知状态

● 如下事件发生时产生中断/DMA:

─ 更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发)

─ 触发事件(计数器启动、停止、初始化或者由内部/外部触发计数)

─ 输入捕获

─ 输出比较

─ 刹车信号输入

● 支持针对定位的增量(正交)编码器和霍尔传感器电路

● 触发输入作为外部时钟或者按周期的电流管理

本次实验仿真采用的TIM3定时器,16位自动装在模式,设定了一个1ms的定时器中断,用来精确定时来驱动LED的闪烁,避免使用阻塞式的延时来驱动LED。

电路介绍:

由于是基础模版,所以电路较为简单,基本的复位电路加上时钟电路,时钟电路其实可有可无,因为STM32也有内部时钟,但是大家基本都用外部时钟,都用上STM32了,没必要省这点钱,哈哈哈~~

程序介绍:

程序基于keil5开发,使用的是库函数开发,本次LED闪烁仿真延时采用的是定时器计数来确定时间,闪烁周期为1秒1次,也就是500ms亮500ms灭。

STM32与51单片机不同,在使用GPIO时需要先使能对应的GPIO的时钟,然后设置对应的IO口的输入输出模式。本次仿真由于是驱动LED闪烁,所以将对应的IO口设置为推挽输出状态。

LED的IO口模式设置:

复制代码
       RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能GPIOA的时钟

       GPIO_InitTypeDef GPIO_InitStruct;

       GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;

       GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;//PA0

       GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;     

       GPIO_Init(GPIOA,&GPIO_InitStruct);

       GPIO_SetBits(GPIOA,GPIO_Pin_0);

定时器初始化:

复制代码
void TIM3_Int_Init(u16 arr,u16 psc)

{

  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

       NVIC_InitTypeDef NVIC_InitStructure;

       RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能

       //定时器TIM3初始化

       TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值      

       TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值

       TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim

       TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式

       TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位



       //中断优先级NVIC设置

       NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3中断

       NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级0级

       NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  //从优先级3级

       NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能

       NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器



       TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断

       TIM_Cmd(TIM3, ENABLE);  //使能TIMx                               

}

主循环部分:

仿真效果

相关推荐
玩转单片机与嵌入式16 小时前
不会 Python、不会深度学习,也能在STM32上跑AI模型吗?
人工智能·单片机·嵌入式硬件·嵌入式ai
jghhh0117 小时前
基于STM32的桌面Mini时钟设计
stm32·单片机·嵌入式硬件
电化学仪器白超18 小时前
小乌龟Git全程图形化操作指南:嵌入式本地版本管理与Gitee私有云备份实战
git·python·单片机·嵌入式硬件·物联网·gitee·自动化
yong999020 小时前
基于STM32 Nucleo板的彩色LED照明灯设计(纯CubeMX开发)
stm32·单片机·嵌入式硬件
lingzhilab20 小时前
零知派——STM32驱动INA219电流功率监测计实现高精度电源管理
stm32·单片机·嵌入式硬件
ahccqw1 天前
CAN总线通信入门及实例代码(stm32f4系列)
stm32·单片机·嵌入式硬件
振南的单片机世界1 天前
电源、复位、时钟:单片机的“生存三要素”
单片机·嵌入式硬件
charlie1145141911 天前
嵌入式现代C++工程实践——第14篇:第二次重构 —— 模板登场,编译时绑定端口和引脚
开发语言·c++·stm32·安全·重构
SUNNYSPY0011 天前
16N65-ASEMI重塑功率电子新标杆16N65
单片机
踏着七彩祥云的小丑1 天前
嵌入式——简单电路常识
单片机·嵌入式硬件