• 领导讲话
  • 自我介绍
  • 党会党课
  • 文秘知识
  • 转正申请
  • 问题清单
  • 动员大会
  • 年终总结
  • 工作总结
  • 思想汇报
  • 实践报告
  • 工作汇报
  • 心得体会
  • 研讨交流
  • 述职报告
  • 工作方案
  • 政府报告
  • 调研报告
  • 自查报告
  • 实验报告
  • 计划规划
  • 申报材料
  • 当前位置: 勤学考试网 > 公文文档 > 转正申请 > 正文

    嵌入式系统流水灯,按键,定时器实验报告x

    时间:2020-11-19 12:54:45 来源:勤学考试网 本文已影响 勤学考试网手机站

    嵌入式系统应用

    实验报告

    姓 名: 学 号: 学 院: 专 业: 班 级: 指导教师:

    实验 1、流水灯实验

    实验要求

    编程控制实验板上 LED 灯轮流点亮、熄灭,中间间隔一定时间。

    原理分析

    实验主要考察对 STM32F10X 系列单片机 GPIO 的输出操作。

     参阅数据手册可知,通过软件编程, GPIO 可以配置成以下几种模式: ◇输入浮空

    ◇输入上拉

    ◇输入下拉

    ◇模拟输入

    ◇开漏输出

    ◇推挽式输出

    ◇推挽式复用功能

    ◇开漏式复用功能

    根据实验要求,应该首先将 GPIO配置为推挽输出模式。

    由原理图可知,单片机 GPIO输出信号经过 74HC244缓冲器,连接 LED灯。

     由于 74HC244的 OE1和 OE2都接地,为相同电平,故 A端电平与 Y端电平相同且 LED灯共阳,所以,如果要点亮 LED,GPIO应输出低电平。反之, LED灯熄灭。

    程序分析

    软件方面,在程序启动时,调用 SystemInit()函数 (见附录 1),对系统时钟 等关键部分进行初始化,然后再对 GPIO 进行配置。

    GPIO 配置函数为 SZ_STM32_LEDInit() (见附录 2),函数中首先使能 GPIO 时钟:

    RCC_APB2PeriphClockCmd(GPIO_CLK[Led], ENABLE);

    然后配置 GPIO 输入输出模式:

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

    再配置 GPIO 端口翻转速度:

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 最后将配置好的参数写入寄存器,初始化完成: GPIO_Init(GPIO_PORT[Led], &GPIO_InitStructure) 。

     初始化完成后,程序循环点亮一个 LED并熄灭其他 LED,中间通过 Delay() 函数进行延时,达到流水灯的效果 (程序完整代码见附录 3)。

    实验程序流程图如下:

    硬件方面,根据实验指南,将实验板做如下连接:

    实验结果

    实验二、按键实验

    实验要求

    利用 STM32读取外部按键状态, 按键按下一次产生一次外部中断在中断处理 函数中使按键所对应的灯亮起。

    原理分析

    实验主要考察对 STM32F10X 系列单片机 GPIO 外部中断功能的使用。

    STM32F107VCT 一共有 5 组 GPIO,分别是 PA[15:0]、PB[15:0] 、PC[15:0]、 PD[15:0] 、 PE[15:0]。

     STM32 的所有 GPIO 都可以作为中断输入源,单片机通过 复用的方式使其对处理器来说来自 GPIO 的一共有 16 个中断 Px[15:0] 。具体实 现是 PA[0]、PB[0]、PC[0]、PD[0]和 PE[0]共享一个 GPIO 中断; PA[1]、 PB[1] 、 PC[1]、PD[1]和 PE[1]共享一个 GPIO 中断;PA[15]、PB[15]、PC[15]、PD[15] 和 PE[15] 共享一个 GPIO 中断。以下图片为以 EXTI0 为例的外部中断 /事件线路 映像:

    要产生中断,必须先配置好并使能中断线。根据需要的边沿检测设置 2 个触

    发寄存器,同时在中断屏蔽寄存器的相应位写‘ 1'允许中断请求。当外部中断 线上发生了期待的边沿时, 将产生一个中断请求, 对应的挂起位也随之被置 ‘1'。

     在挂起寄存器的对应位写' 1',将清除该中断请求。

    要把 IO 口作为外部中断输入,有以下几个步骤:

    初始化 IO 口为输入。这一步设置要作为外部中断输入的 IO 口的状态, 可以设置为上拉 / 下拉输入,也可以设置为浮空输入,但浮空的时候外部一定要 带上拉,或者下拉电阻。否则可能导致中断不停的触发。在干扰较大的地方,就 算使用了上拉 / 下拉,也建议使用外部上拉 / 下拉电阻,这样可以一定程度防止外 部干扰带来的影响。

    开启 IO 口复用时钟,设置 IO 口与中断线的映射关系。

     STM32的 IO 口与 中断线的对应关系需要配置外部中断配置寄存器 EXTICR,这样我们要先开启复

    用时钟,然后配置 IO 口与中断线的对应关系。才能把外部中断与中断线连接起 来。

    开启与该 IO 口相对的线上中断 / 事件,设置触发条件。这一步,我们要 配置中断产生的条件, STM32可以配置成上升沿触发,下降沿触发, 或者任意 电平变化触发, 但是不能配置成高电平触发和低电平触发。

     这里根据自己的实际 情况来配置。

     同时要开启中断线上的中断, 这里需要注意的是: 如果使用外部中 断,并设置该中断的 EMR位的话, 会引起软件仿真不能跳到中断, 而硬件上是可 以的。而不设置 EMR,软件仿真就可以进入中断服务函数,并且硬件上也是可以 的。建议不要配置 EMR位。

    配置中断分组( NVIC),并使能中断。这一步,我们就是配置中断的分 组以及使能,对 STM32的中断来说,只有配置了 NVIC 的设置,并开启才能被执 行,否则是不会执行到中断服务函数里面去的。

    编写中断服务函数。这是中断设置的最后一步,中断服务函数,是必不 可少的,如果在代码里面开启了中断, 但是没编写中断服务函数, 就可能引起硬 件错误,从而导致程序崩溃。

     所以在开启了某个中断后, 应为该中断编写服务函 数。在中断服务函数里面编写要执行的中断后的操作, 并很据情况判断是否要对 中断产生的标志位进行清零 。

    由原理图可知,按键未按下时, GPIO 读到的为高电平,按键按下后, IO 口 接地,产生一个电平跳变,所以外部中断触发方式应该设置为下降沿触发。

    程序分析

    LED灯的点亮与实验一中相同,不过多赘述。程序首先对按键进行初始化, 初始化函数为 GPIO_KEY_Config()( 见附录 4),配置过程与实验一中 GPIO配置 基本一致。

     由于此处 GPIO需要采集外界按键信号, 故 GPIO模式应该为调整为内 部上拉电阻输入

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU 。

    然后执行 GPIO中断初始化函数 KEY_EXIT_Init() ( 见附录 5),首先将连接 按键的 IO 口与 EXTI 线链接到一起:

    GPIO_EXTILineConfig(GPIO_KEY1_EXTI_PORT_SOURCE,GPIO_KEY1_EXTI_PIN _SOURCE;)

    然后将触发方式设置为下降沿触发并写入中断配置寄存器,并使能中断: EXTI_InitStructure.EXTI_Line = GPIO_KEY1_EXTI_LINE; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;

    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;

    EXTI_InitStructure.EXTI_LineCmd = ENABLE;

    EXTI_Init(&EXTI_InitStructure) 。

     之后进行中断分组配置及中断优先级配置,函数为 InterruptConfig() ( 见 附录 6) 。

    配置过程较为复杂,涉及到抢占优先级和响应优先级的概念。程序首先将所 有外部中断归为 NVIC_PriorityGroup_2, 即 2 位抢占优先级和 2位响应优先级:

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 然后将所有外部中断信号的抢占优先级规定为 0、1、2,使其可以相互区别, 并将配置好的参数写入对应寄存器中,完成配置:

    NVIC_InitStructure.NVIC_IRQChannel = GPIO_KEY1_EXTI_IRQn;

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

    NVIC_Init(&NVIC_InitStructure);

    NVIC_InitStructure.NVIC_IRQChannel = GPIO_KEY2_EXTI_IRQn;

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;

    NVIC_Init(&NVIC_InitStructure);

    NVIC_InitStructure.NVIC_IRQChannel = GPIO_KEY3_EXTI_IRQn;

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;

    NVIC_Init(&NVIC_InitStructure) 。

     初始化完成后,程序进入等待按键中断触发状态,一旦按键按下,则进入中 断服务函数 EXTI9_5_IRQHandler()( 见附录 7)中。在函数中对 LED灯进行点亮、 熄灭操作,并重置中断产生标志位。

    实验流程图如下 (主函数代码见附录 8):

    硬件连接方式如下图所示:

    实验结果

    实验三、定时器实验

    3.1 实验要求

    利用 STM32的通用定时器 TIM5 产生一个 1S 的中断,在中断函数中实现 LED1、LED2、LED3、LED4同时翻转的效果。

    原理分析

    实验主要考察对 STM32F10X 系列单片机定时器的使用。

    实验中使用的 STM32F107 单片机有多达 10个定时器,包括:

    ◇多达 4 个 16 位定时器,每个定时器有多达 4 个用于输入捕获 /输出比较 /PWM 或脉冲计数的通道和增量编码器输入

    ◇1 个 16 位带死区控制和紧急刹车,用于电机控制的 PWM 高级控制定时 器

    ◇2 个独立的看门狗定时器(独立的和窗口型的)

    ◇系统时间定时器: 24 位自减型计数器

    ◇2 个 16 位基本定时器用于驱动 DAC

    根据时钟树可知,系统时钟经过分频之后,进入 TIM5 的时钟模块入口,在 经过预分频处理,才供给 TIM5 作时钟使用。预分频器的系数为: TIMx_PSC , 当 TIMx_PSC = 0 时表示不分频,则 TIM5 定时器的时钟 用 CK_CNT =模块入口时钟 72MHz;当 TIMx_PSC = 1 时表示不分频,则 TIM5 定时器的时钟用 CK_CNT= 模块入口时钟 36MHz;以此类推。公式为: CK_CNT =fCK_PSC/(PSC[15:0]+1),其中 PSC 最大为 65535。

    其次是 TIM5 计数器计数值的设置, TIM5 计数器以 CK_CNT 为时钟计数,向下 计数到 0 或向上计数到设定值( TIMx_ARR )则产生中断。以向上计数为例,从 0 开始计数到设定值 TIMx_ARR 时产生中断。要产生一秒一次中断则要使计数 器的值乘以预分频的值 =系统时钟 72MHz ,其中计数器的值和预分频值都必须小 于 65535。我们使预分频值为 7200,计数器值为 10000,则 7200 * 10000 = 72,000,000即 72M。其中拆分方法很多 35000*2000 = 72,000,000,只要注意计数 器的值和预分频值都必须小于 65535即可。当计数值溢出后, 会改变计数溢出标 志位,并产生定时器中断,实验中使用其产生中断来进行 LED 灯翻转。

    程序分析

    LED 初始化部分与实验一相同,完成初始化后,点亮所有 LED 灯。定时器 配置函数为 TIM5_Init() (见附录 6)。配置函数首先使能计数器时钟:

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE);

    然后自动装载计数值,计数从 0 开始:

    TIM_TimeBaseStructure.TIM_Period = (100 - 1); 再对计时器进行预分频系数设置: TIM_TimeBaseStructure.TIM_Prescaler = (7200 - 1); 并将计数器设置为向上计数:

    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; 最后写入计时器配置寄存器,完成配置:

    TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure) 。

     配置完成后,还要对计数器溢出标志位进行清零,并打开溢出中断,使能计 数器以开始计数。

    TIM_ClearITPendingBit(TIM5, TIM_IT_Update);

    TIM_ITConfig(TIM5, TIM_IT_Update, ENABLE);

    TIM_Cmd(TIM5, ENABLE) 。

     定时器配置完成并使能后,计数器开始工作,当到达预设的计数值之后,产 生中断信号。

     系统在进行相关配置后可以响应定时器产生的中断, 中断配置函数 为 NVIC_Configuration() ( 见附录 7) 。函数首先将中断向量表首地址置于 0

    NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0000); 然后使能 TIM5 中断:

    NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn;

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 最后将配置参数写入中断控制寄存器,完成配置: NVIC_Init(&NVIC_InitStructure) 。

     一旦中断产生,系统会对中断产生响应,暂停所有正在执行的低优先级任务 且将任务信息和数据压入对应对战区,并进入中断服务函数 TIM5_IRQHandler() (见附录 8) 中进行处理。

    在中断服务函数中判断并清除了中断标志位, 以便定时器下一次计数中断产 生。函数中调用了 LED_Spark()函数 (见附录 9),实现了 LED 的闪烁。

    程序流程图如下:

    硬件连接方式如下图所示:

    实验四、按键中断控制 LED灯定时闪烁

    4.1 实验要求

    综合实验一、二、三,利用 STM32读取外部按键状态,按键按下一次产生一 次外部中断在中断处理函数中使按键所对应的灯闪烁, 闪烁间隔通过定时器定时 控制。其中, SKEY1控制 LED1以 1S为间隔,闪烁 3次, SKEY2控制 LED2以 2S 为间隔闪烁 3次, SKEY3控制 LED3以 3S为间隔,闪烁 3次。

    原理分析

    实验需要用到 STM32的 GPIO输入输出操作, GPIO外部中断和内部定时器中 断。在以上三个实验中,对各个部分都已经进行过详尽的解释,这里不再赘述。

    此实验需要将以上实验做综合,并对时序进行调整。难点为,对 GPIO 外部 中断和定时器内部中断的处理,即如何确定两种不同中断的优先级。

    这里 的使用的方法是,将 所有按键 外部中断 置于中断分组 2,即 NVIC_PriorityGroup_2 中。将所有按键中断抢占优先级置为 0,即最高级别中断, 响应优先级置分别置为 1、 2、 3,相互区别。将定时器中断抢占优先级置为 1, 相应优先级社会中低于按键中断,使其可以被按键信号中断计时,并刷新 LED 闪烁状态。

    程序分析

    这在程序初始化阶段, 分别对 LED、按键外部中断和定时器中断进行初始化。

     主函数如下:

    int main(void)

    {

    /* LED 初始化 */

    LED_config();

    /* LED 闪烁? */

    Led_Turn_on_all();

    Delay(3000000);

    Led_Turn_off_all();

    Delay(3000000);

    Led_Turn_on_all();

    Delay(3000000);

    Led_Turn_off_all();

    Delay(3000000);

    Led_Turn_on_all();

    Delay(3000000);

    Led_Turn_off_all();

    /* 按键初始化 */

    GPIO_KEY_Config();

    /* 按键外部中断初始化 */

    KEY_EXIT_Init();

    /* 外部中断向量初始化 */

    InterruptConfig();

    /* 定时器 5 初始化 */

    TIM5_Init();

    /* 定时器中断初始化 */ NVIC_Configuration();

    /* 等待中断触发 */

    while (1)

    {

    }

    }

    初始化完成后,等待中断触发。一旦按键按下,触发外部中断,则进入外部 中断服务函数, 函数中将判断哪一个按键被按下, 记录按下的按键, 然后给定时 器清零并开始计数,且清零外部中断标志位。

    • 下载文档
    • 收藏
    • 0

    • 考试时间
    • 范文大全
    • 作文大全
    • 课程
    • 试题
    • 招聘
    • 文档大全

    推荐访问