嵌入式实验---实验三 定时器实验

一、实验目的

1、掌握STM32F103定时器程序设计流程;

2、熟悉STM32固件库的基本使用。

二、实验原理

1、使用SysTick定时方式控制LED闪烁;

2、使用通用定时器产生PWM脉冲,通过调整占空比实现两个目标:

(1)连接到STM32F103上的LED亮度从暗到亮、再从亮到暗,一次循环,实现呼吸灯效果;

(2)使用数字示波器查看PWM的波形图。

三、实验设备和器材

电脑、Keil uVision5软件、Proteus 8 Professional软件

四、实验内容和步骤

4.1 代码开发

按照书本中实验流程在Keil中完成LED闪烁和呼吸灯实验的代码开发;

4.2 原理图设计

在Proteus中完成原理图的设计,如图3所示为LED闪烁实验原理图;图4所示为呼吸灯实验原理图。

图3 LED闪烁实验原理图

图4 呼吸灯实验原理图

五、实验记录和实验结果

5.1 实验效果记录(附照片即可)

5.2 实验效果说明

LED闪烁实验效果说明:

  1. LED以固定的频率或模式(如1秒闪烁一次)交替亮灭。

  1. 可以通过修改代码中的延时时间或使用定时器来调整LED的闪烁频率。

呼吸灯实验效果说明:

  1. LED的亮度呈现出由低到高再由高到低的变化,类似于呼吸的效果。

  1. 从数字显示器中可以看出,PA7输出的PWM脉冲,PWM的占空比在发生渐变,LED灯的亮度也会发生变化。

  1. 可以通过调整PWM的占空比和周期来改变LED的呼吸速度和范围。

六、实验预习要求

  1. 实验前认真阅读本实验指导;
  2. 熟悉书本中相关操作及相关器件。
  3. 完成5.1和5.2内容。

七、思考题

1. 定时器常用的功能有哪些

  1. 计时功能:用于简单的时间测量和计算,例如厨房用计时、运动比赛计时等。

  1. 闹钟功能:定时器可以设置在特定时间响铃或震动,用作闹钟提醒。

  1. 倒计时功能:设置一个特定的时间段,倒计时器会逆向计算时间,直到时间结束发出提醒。

  1. 重复功能:一些定时器允许设置重复功能,比如每天同一时间提醒。

  1. 多个计时器:有些高级定时器可以同时运行多个计时器,方便管理多个任务或事件。

  1. 定时开关功能:例如定时开关灯、电视等电子设备,节省能源。

  1. 自动关机功能:设定电脑或手机等设备在特定时间自动关机,省电和定时任务。

  1. 计时器历史记录:记录过去的计时或倒计时,以便回顾和分析。

2、使用定时器功能的配置流程

  1. 选择定时器和时钟配置:首先确定使用的定时器(如TIM1、TIM2等)以及其时钟源,通常是外部晶振或内部时钟源。

  1. 定时器时钟初始化:配置定时器的时钟,确定其工作频率。这一步骤确保定时器能够以正确的时钟频率运行。

  1. 定时器初始化:配置定时器的基本参数,如计数模式(向上、向下或双边),计数器的预分频因子(用于调整定时器时钟的频率),自动重装载寄存器(ARR)的值(决定定时器的溢出周期)等。

  1. 配置定时器中断:如果需要使用定时器的中断功能,配置中断优先级、使能定时器中断等。
  2. 启动定时器:最后,启动定时器开始计数。在STM32中,通过设置定时器的使能位(CR1寄存器的CEN位)来启动定时器。
包含代码和文档 实验实验内容 编写程序,演示多进程并发执行和进程软中断、管道通信。 父进程使用系统调用pipe( )建立一个管道,然后使用系统调用fork()创建两个子进程,子进程1和子进程2; 子进程1每隔1秒通过管道向子进程2发送数据: I send you x times. (x初值为1,每次发送后做加一操作) 子进程2从管道读出信息,并显示在屏幕上。 父进程用系统调用signal()捕捉来自键盘的中断信号(即按Ctrl+C键);当捕捉到中断信号后,父进程用系统调用Kill()向两个子进程发出信号,子进程捕捉到信号后分别输出下列信息后终止: Child Process l is Killed by Parent! Child Process 2 is Killed by Parent! 父进程等待两个子进程终止后,释放管道并输出如下的信息后终止 Parent Process is Killed! 实验实验内容 过Linux多线程与信号灯机制,设计并实现计算机线程与I/O线程共享缓冲区的同步与通信。 程序要求:两个线程,共享公共变量a 线程1负责计算(1到100的累加,每次加一个数) 线程2负责打印(输出累加的中间结果) 实验 实验内容 利用多个共享内存(有限空间)构成的环形缓冲,将源文件复制到目标文件,实现两个进程的誊抄。 实验实验内容 1、(1)Blink程序的编译和下载 (2)给Blink程序加入printf,在每次定时器事件触发点亮LED的同时通过串口显示信息 (3)修改BLink程序,只使用一个Timer,个LED灯作为3位的二进制数表示(亮灯为1,不亮为0),按照0-7的顺序循环显示,同时将数值显示在终端上。
### 嵌入式系统定时器中断实验 #### STM32定时器中断配置概述 在嵌入式开发中,特别是针对基于Cortex-M内核的STM32微控制器,定时器中断是一个非常重要的特性。它不仅能够帮助实现精准的时间管理,还能支持诸如PWM波形生成、捕获外部信号等功能[^2]。 #### 配置步骤说明 要完成一个简单的定时器中断实验,主要分为几个部分: - **初始化定时器**:选择合适的时钟源,并根据所需的溢出周期计算预分频系数和自动重装载值。 - **使能中断**:开启特定事件触发的NVIC (Nested Vectored Interrupt Controller),以便当计数值达到指定条件时产生CPU可响应的异常请求。 - **编写ISR(Interrupt Service Routine)**:定义处理程序来执行预期的任务逻辑;比如更新全局变量状态标志位或是调用其他子函数等。 下面给出一段具体的代码实例,展示如何利用TIM2作为通用定时器,在每秒钟触发一次中断来进行LED闪烁控制的操作。 ```c #include "stm32f10x.h" void TIM2_Configuration(void); void GPIO_Configuration(void); int main(void){ /* System Clock Configuration */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); // Enable the TIM2 peripheral clock /* Configure LED pin as output push-pull mode */ GPIO_Configuration(); /* Initialize and configure Timer 2 */ TIM2_Configuration(); while (1){ } } // 初始化GPIO端口配置 void GPIO_Configuration(){ GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA ,ENABLE ); // 开启PA端口时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; // 设置PA.05脚为输出模式 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出方式 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 最大速度50Mhz GPIO_Init(GPIOA,&GPIO_InitStructure); // 应用上述参数至PA.05引脚 } // 定义并启动TIM2定时器 void TIM2_Configuration(){ TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; // 计算ARR寄存器值以获得大约1秒间隔 uint16_t PrescalerValue = (uint16_t)((SystemCoreClock / 8000) - 1); // Time base configuration TIM_DeInit(TIM2); // 复位TIM2外设寄存器到默认状态 TIM_TimeBaseStructInit(&TIM_TimeBaseStructure); // 使用默认参数填充结构体成员 TIM_TimeBaseStructure.TIM_Period = 7999 ; // 自动重载值设置为7999对应于约1s周期 TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue ; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); // 将配置应用于TIM2 // NVIC configuration for TIM2 update interrupt enable. NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); // 启用TIM2更新中断通道 // Enable IT Update Request Source during upward counting from ARR to 0 TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE ); // Start counter of timer instance TIM_Cmd(TIM2, ENABLE ); } // 中断服务例程(ISR) void TIM2_IRQHandler(void){ if(TIM_GetITStatus(TIM2, TIM_IT_Update ) != RESET ){ static int count=0; ++count; if(count%2==0){ GPIO_SetBits(GPIOA,GPIO_Pin_5); // 点亮LED灯 }else{ GPIO_ResetBits(GPIOA,GPIO_Pin_5); // 关闭LED灯 } TIM_ClearITPendingBit(TIM2, TIM_IT_Update ); // 清除待处理位 } } ``` 这段代码展示了如何在一个典型的ARM Cortex M系列MCU平台上创建一个基本的定时器中断应用程序。这里选择了STM32F1xx家族的产品为例进行了描述。通过调整`PrescalerValue` 和 `Period` 的大小可以改变实际产生的延迟时间长度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值