【小黑嵌入式系统第十三课】PSoC 5LP第二个实验——中断控制实验

上一课:
【小黑嵌入式系统第十二课】μC/OS-III程序设计基础(二)——系统函数使用场合、时间管理、临界区管理、使用规则、互斥信号量

文章目录

    • 1 实验目的
    • 2 实验要求
    • 3 实验设备
    • 4 实验原理
      • 4.1 中断
        • (1) 中断机制概述
        • (2) 中断源
        • (3) 中断系统的功能
      • 4.2 定时器/计数器
    • 5 硬件设计
      • 整体硬件仿真图:
      • 基本思路:
      • 组件设置:
    • 6 软件设计
      • 6.1 总体设计
      • 6.2 详细设计
    • 7 测试与分析
      • 初始时:
      • 中断:
    • 8 结论与问题讨论


1 实验目的

  • 熟悉PSoC 5LP 中断系统的工作机制;
  • 熟悉PSoC 5LP 端口中断单元(PICU)的工作机制,掌握其控制方法;
  • 掌握基于中断的应用的基本设计实现方法;
  • 学会使用Creator调试器进行程序调试;
  • 设计实现一个由独立按键、定时器及字符型LCD构造的基本秒表。

2 实验要求

  1. 通过应用笔记AN54460,学习并熟悉PSoC 5LP 中断系统的结构及基本控制方法;理解示例项目A,掌握基于中断的定时器控制方法;
  2. 通过应用笔记AN54460和AN72382,学习并熟悉PSoC 5LP端口中断单元(PICU)的工作机制;理解AN54460中的示例项目B,掌握引脚组件的中断设置及编程控制方法;
  3. 设计一个秒表项目,实现以下功能
    a. 按键SW2为“停止/重新运行”,按键SW3为“暂停/恢复运行”,LCD用作秒表时间显示,秒表的时间分辨率为0.1秒,秒表的计时应精确;
    b. 系统复位后,LCD计时显示停止在“0.0”秒;
    c. SW2在LCD计时显示停止期间按下时,LCD从“0.0”秒重新开始计时显示;SW2在计时期间按下时,LCD的计时显示停止在当前值;
    d. SW3在计时期间按下时,LCD的计时显示停止在当前值,并且LCD显示内容以1Hz的频率闪烁;SW3在LCD计时显示停止期间再次按下时,LCD从当前值开始继续进行计时显示(不闪烁)。
  4. 设计实现秒表项目时,要求:
    a. 按键按下时产生中断,使用定时器在达到TC值时产生中断(或者使用时钟信号作为中断源);
    b. 由于针对LCD的操作函数很耗时,并且可能会发生主程序和中断服务程序同时操作LCD的情形,因此不得在中断服务程序中调用LCD操作函数;
    c. 应消除按键动作时抖动的影响。

3 实验设备

  • CY8CKIT-050实验板
  • 安装了PSoC Creator软件的PC机

4 实验原理

4.1 中断

(1) 中断机制概述

问题的提出:

有一类事件,它们一定会发生,但又无法预测什么时候发生,比如说火灾等故障事件、键盘有按键按下、通信接有数据发来等突发事件。此时可以采取以下两种方式进行处理:

  • 定时查询方式,定期检测是否有事件发生。这将消耗大量的CPU时间来完成查询工作,从而降低CPU的工作效率。
  • 中断方式,当突发事件发生时提出请求,CPU可以暂时停止当前正在处理的程序,转去处理突发事件,如故障处理、按键字符数据的接收、通信接口数据的接收,等处理这些事务的程序执行完毕后,再回到原先程序被打断的地方去继续执行后续程序。

在这里插入图片描述
 
应注意,这个运作流程是由中断系统硬件来实现的,用户程序仅仅是配置中断及编写中断服务程序。中断服务程序并不能由用户调用。中断请求一般允许用户程序发起。

中断包括三个过程:

在这里插入图片描述

  • 请求过程:中断控制器检测到中断事件发生时,向CPU提出中断请求,同时提供给CPU该中断事件对应的中断矢量 。
  • 响应过程:CPU在合适的时候向中断控制器返回响应告知将进入中断处理。 CPU执行完当前指令,保存下一条本应执行的指令的地址(断点)至栈中,转入中断矢量处执行中断服务程序。
  • 服务过程:执行请求事件的服务程序。结束时向中断控制器返回响应告知将退出中断,从栈中取出之前保存的指令地址,CPU转到该指令地址处执行(即在原被中断的程序位置之后继续执行)。

中断的基本概念:

  • 中断源:引发中断的事件称为中断源。
  • 中断断点(地址):CPU转入中断服务程序前,原来程序将被暂停,暂停点为将执行但没被执行的下一条指令的地址。
  • 中断服务程序:为中断事件服务的程序段称为中断服务程序。因此由不同中断源引发的中断需要转到各自对应的中断服务程序来执行。
  • 中断向量/中断矢量:中断服务程序的入口地址。
  • 中断服务程序与子程序区别:子程序由某个指令调用,而跳入子程序模块执行,因此,它的调用是由程序设定的。中断服务程序由某个事件的发生而引发,它是随机和不确定的,由硬件自动控制CPU转入,而不由用户主动调用。

使用中断的优点:

  • 同步操作
  • 实现实时处理
  • 故障处理

(2) 中断源

引起中断的原因,或者能够发出中断申请的来源,称为中断源。

分类:

  • 硬件和软件相关的中断源
  • 软件错误相关的硬件中断
  • 实时时钟
  • 为调试程序而设置的中断源

(3) 中断系统的功能

为了实现各种中断请求,中断系统应具有以下功能:

  • 实现中断及返回
  • 能够实现优先级排队
  • 高级中断源能够中断低级的中断处理

4.2 定时器/计数器

  1. 所有的嵌入式处理器都集成了定时器/计数器模块。
  2. 系统中至少有一个定时器,用作系统时钟。
  3. 定时器和计数器都是由带有保存当前值的寄存器和向当前寄存器值加1(或减1)的一个增量输入的加法器逻辑电路组成。或者说是一种能够累计输入脉冲的个数的数字电路。它由触发器构成,具有记忆功能,除了能够完成计数外,还能够用作分频和定时。

下降沿动作的异步二进制加法计数器:

在这里插入图片描述

三位加法计数器时序图:

在这里插入图片描述

定时器、计数器的区别:

  • 定时器的计数装置是连到已知的周期性时钟信号上的,用来测量时间间隔;
  • 计数器的计数装置是连到非周期性信号上的,用来计外部事件的发生次数。
    因为同样的逻辑电路可以有这两种使用方式,所以该设备经常被称为“定时器/计数器”。
    嵌入式处理器上的定时器/计数器具有的作用:
  • 嵌入式操作系统的任务调度,特别是具有时间片轮转调度功能的操作系统必须使用定时器产生时间片。
  • 嵌入式操作系统的软件时钟需要基于硬件定时器产生定时信号。
  • 通信电路的波特率发生器。
  • 实时时钟电路。
  • 集成的片上A/D转换和D/A转换电路。
    ……

定时器的扩展——脉宽调制(PWM)器:

通过在定时器电路中增加比较器等额外电路,容易构成脉宽调制(PWM)器,用于输出一个频率和占空比可调的矩形波。典型地用于电机调速、LED亮度调节、简易数/模转换等等。

在这里插入图片描述

定时器/计数器的扩展——捕获(Capture):

通过在定时器/计数器电路中增加锁存器等额外电路,容易实现捕获功能。此时向定时器提供已知频率的时钟,用户通过设置捕获的(硬件)触发条件,可在触发条件发生时刻将当前计数值锁存到捕获寄存器中。
捕获机制典型地用于硬件事件发生时刻的精确定时。可以避免“事件发生时刻→软件获取到计数值”这段时间的计时不准确性。

在这里插入图片描述


5 硬件设计

整体硬件仿真图:

在这里插入图片描述


基本思路:

  1. 定义一个计数器变量,用于记录秒表当前的计时时间,初始值为0。
  2. 定义一个标志变量,用于记录秒表的状态,包括“运行中”、“暂停中”和“停止”三种状态。
  3. 定义一个定时器,设置定时器的周期为0.1秒,用于产生中断。在中断服务程序中,更新计数器变量的值,并将计数器的值转换为时分秒的格式,然后将时间显示在LCD上。注意,在中断服务程序中不要直接调用LCD操作函数,而是将需要更新的数据传递给主程序,由主程序在主循环中更新LCD上的显示内容。
  4. 定义两个外部中断,分别用于处理按键SW2和SW3的按下事件。在外部中断服务程序中,根据按键的状态进行相应的操作。
  5. 在系统复位时,将计数器变量的值清零,并将标志变量设置为“停止”状态。然后在主循环中更新LCD上的显示内容,将计数器变量的值转换为时分秒的格式,并将时间显示在LCD上。
  6. 处理按键SW2的按下事件。如果当前秒表状态为“停止”或者“暂停中”,则将计数器变量的值清零,并将标志变量设置为“运行中”状态。如果当前秒表状态为“运行中”,则将标志变量设置为“暂停中”状态。
  7. 处理按键SW3的按下事件。如果当前秒表状态为“运行中”,则将标志变量设置为“暂停中”状态,并在主循环中将LCD上的显示内容以1Hz的频率闪烁。如果当前秒表状态为“暂停中”,则将标志变量设置为“运行中”状态,并在主循环中将LCD上的显示内容恢复正常。
    8.为了消除按键动作时抖动的影响,可以在外部中断服务程序中使用软件延时或者硬件去抖动电路来处理按键的按下事件。例如,在按键按下时,先进行一个短暂的延时,然后再检测按键的状态,如果按键仍然处于按下状态,则认为按键的按下事件有效。

组件设置:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


6 软件设计

6.1 总体设计

在这里插入图片描述


  1. 主程序 main:包含了系统的主要逻辑,根据秒表的状态进行不同的操作,并控制LCD的显示。
  2. LCD显示函数 lcd_printtime:用于将秒表计时的数值转换为时分秒的格式,并在LCD上进行显示。
  3. 定时器中断服务程序 isr_tmr_Interrupt:处理定时器中断,并根据按键状态更新全局中断标志 flag_int
    接下来,描述一下程序中各模块(函数)的功能、入口参数、返回值、调用与被调用情况:
  4. main 函数:主要逻辑控制,不接受参数,不返回数值。调用了 lcd_printtime 函数进行LCD显示,同时根据秒表状态和全局中断标志进行逻辑判断。
  5. lcd_printtime 函数:将秒表计时的数值转换为时分秒的格式,并在LCD上进行显示。入口参数为行号、列号和计时数值,不返回数值。
  6. isr_tmr_Interrupt 函数:处理定时器中断,更新全局中断标志 flag_int。不接受参数,不返回数值。

在这里插入图片描述


6.2 详细设计


#include <project.h>
#include <stdio.h>#define COUNTING 0 //正常计时
#define STOP 1 //停止计时
#define LCDSAN 2 //LCD闪烁#define INT_NONE 0 
#define INT_TIMER_MASK 0x01 //计时标记二进制0001
#define INT_SW2ON_MASK 0x02 //SW2开启标记二进制0010
#define INT_SW3ON_MASK 0x04 //SW3开启标记二进制0100
#define INTERVAL_BLINK 10   // LCD闪烁的100微秒的半周期
#define SW_ON 0 
#define SW_OFF 1unsigned char flag_int = INT_NONE;//全局中断void lcd_printtime(unsigned char row, unsigned char col, unsigned int value); extern unsigned char flag_int;//输入标记
/* `#END` */ 
CY_ISR(isr_tmr_Interrupt) 
{ #ifdef isr_tmr_INTERRUPT_INTERRUPT_CALLBACK isr_tmr_Interrupt_InterruptCallback(); #endif /* isr_tmr_INTERRUPT_INTERRUPT_CALLBACK */ /* Place your Interrupt code here. *//* `#START isr_tmr_Interrupt` */static unsigned char sw2_status_prev = SW_OFF, sw3_status_prev = SW_OFF; unsigned char sw2_status_cur, sw3_status_cur; Timer_1_ReadStatusRegister(); flag_int |= INT_TIMER_MASK; sw2_status_cur = SW_2_Read(); if((sw2_status_prev == SW_OFF) && (sw2_status_cur == SW_ON)) { flag_int |= INT_SW2ON_MASK; } sw2_status_prev = sw2_status_cur; sw3_status_cur = SW_3_Read();if((sw3_status_prev == SW_OFF) && (sw3_status_cur == SW_ON)) { flag_int |= INT_SW3ON_MASK; } sw3_status_prev = sw3_status_cur; 
}int main(void) 
{ unsigned int value=0;  unsigned char stopwatch_status;//状态unsigned char flag_blink;//LCD闪烁标志unsigned char tmr_blink;//LCD闪烁时长标志LCD_Start();Timer_1_Start(); isr_1_Start(); CyGlobalIntEnable; LCD_Position(0,0); LCD_PrintString("StopWatch:"); lcd_printtime(1, 3, value); stopwatch_status = STOP; flag_blink = 0; tmr_blink = 0; value=0; isr_1_StartEx(isr_tmr_Interrupt);for(;;) { /* Place your application code here. */switch(stopwatch_status) { case COUNTING://计时状态if((flag_int & INT_SW2ON_MASK) != 0)//进入STOP状态计时停止{ stopwatch_status=STOP; LED4_Write(0); } else if((flag_int & INT_SW3ON_MASK) != 0)//进入STOP状态计时停止,LCD闪烁标志位开启{ stopwatch_status=STOP; flag_blink = 1; } else if((flag_int & INT_TIMER_MASK) != 0)//计时的状态的功能{ value++; LED4_Write(1); LCD_DisplayOn(); lcd_printtime(1, 3, value); } else//在定时器中断周期退出{ break; } flag_int = INT_NONE;//清除全局中断标志break; case STOP://暂停计时if((flag_int & INT_SW2ON_MASK) != 0)//SW2按下,计时初始化{ value=0; stopwatch_status=COUNTING; LED3_Write(1); } else if((flag_int & INT_SW3ON_MASK) != 0)//SW3按下,恢复计时{ stopwatch_status=COUNTING; } else if(((flag_int & INT_TIMER_MASK) != 0))//STOP状态的功能   { if(flag_blink==1)//若有闪烁标志则进入LCD闪烁状态stopwatch_status=LCDSAN; elsestopwatch_status=STOP; } else { break; } flag_int = INT_NONE; break; case LCDSAN://LCD闪烁状态if((flag_int & INT_SW2ON_MASK) != 0)//SW2按下则初始化计时{ value=0; flag_blink = 0; stopwatch_status=COUNTING; } else if((flag_int & INT_SW3ON_MASK) != 0)//SW3退出闪烁,并且恢复计时{ flag_blink = 0; stopwatch_status=COUNTING; } else if((flag_int & INT_TIMER_MASK) != 0)//闪烁程序{ if(tmr_blink < INTERVAL_BLINK-1) { tmr_blink++; LCD_DisplayOff(); lcd_printtime(1, 3, value); } else /* Another blink interval ends. */{ tmr_blink = 0; LCD_DisplayOn(); lcd_printtime(1, 3, value); } }else { break; } flag_int = INT_NONE; break; default: break; } } 
} void lcd_printtime(unsigned char row, unsigned char col, unsigned int value) 
{ unsigned char hour, min, sec, millisec; char disp_str[11]; hour = (value/36000)%24; min = (value%36000)/600; sec = (value%600)/10;millisec = value%10; sprintf(disp_str, "%02u:%02u:%02u.%1u", hour, min, sec, millisec); LCD_Position(row,col); LCD_PrintString(disp_str); 
} 

7 测试与分析

初始时:

在这里插入图片描述

中断:

在这里插入图片描述


8 结论与问题讨论

  1. 定时器精度问题:PSoC 5LP的定时器可能存在精度问题,导致秒表计时不准确。可以通过对定时器进行精确的配置和校准,使用更高精度的定时器模块,或者使用外部时钟源来提高定时器的精度。
  2. 中断处理问题:秒表功能需要使用定时器中断来实现计时,可能会遇到中断处理不及时或者中断嵌套的问题。需要确保中断处理程序的执行时间尽可能短,并避免中断嵌套。可以通过合理的中断优先级设置和中断嵌套的管理来解决中断处理问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/578868.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙开发语言介绍--ArkTS

1.编程语言介绍 ArkTS是HarmonyOS主力应用开发语言。它在TypeScript (简称TS)的基础上&#xff0c;匹配ArkUI框架&#xff0c;扩展了声明式UI、状态管理等相应的能力&#xff0c;让开发者以更简洁、更自然的方式开发跨端应用。 2.TypeScript简介 自行补充TypeScript知识吧。h…

鸿蒙列表,item组件封装传参问题?@ObjectLink 和@Observerd

鸿蒙列表渲染&#xff0c;封装内容组件&#xff0c;进行item传参会报错&#xff1f; class FoodClass {order_id: number 0food_name: string ""food_price: number 0food_count: number 0 }Entry Component struct Demo07 {State message: string Hello World…

ElasticSearch 架构设计

介绍 ElasticSearchMySQLIndexTableDocumentRowFieldColumnMappingSchemaQuery DSLSQLaggregationsgroup by&#xff0c;avg&#xff0c;sumcardinality去重 distinctreindex数据迁移 参考博客 [1]

ZooKeeper Client API 安装及使用指北

下载 wget https://archive.apache.org/dist/zookeeper/zookeeper-3.5.4-beta/zookeeper-3.5.4-beta.tar.gz解压 tar -zxf zookeeper-3.5.4-beta.tar.gz安装 cd zookeeper-3.5.4-beta/src/c/ ./configure make sudo make install到 make 这一步大概率会出现报错&#xff1a;…

【数据结构初阶】二叉树(2)

二叉树顺序结构 1.二叉树的顺序结构及实现1.1二叉树的顺序结构 1.2 堆的概念及结构1.3 堆的实现1.3.1向上调整1.3.2向下调整1.3.3交换函数1.3.4打印1.3.5初始化1.3.6销毁1.3.7插入1.3.8删除1.3.9获得堆顶元素1.3.10判断是否为空1.3.6 堆的代码实现 1.3.2堆的创建1.3.3 建堆时间…

怎么修复MSVCR110.dll文件?全面解析MSVCR110.dll缺失修复方法

MSVCR110.dll文件缺失问题在Windows操作系统用户中相当普遍&#xff0c;经常导致应用程序启动失败或崩溃。MSVCR110.dll是Microsoft Visual C Redistributable for Visual Studio 2012的一部分&#xff0c;且应用程序通常依赖这个DLL文件来执行C库中的代码。文件的丢失可能源自…

【代码随想录】刷题笔记Day39

前言 下午答疑课过于无聊了&#xff0c;后台在跑代码也写不了作业&#xff0c;再刷点题吧~难得一天两篇 56. 合并区间 - 力扣&#xff08;LeetCode&#xff09; 和之前重叠区间是同个类型&#xff0c;和res里的元素比较&#xff0c;重叠就更新res里最后元素的最右边界 class…

VS2020使用MFC开发一个贪吃蛇游戏

背景&#xff1a; 贪吃蛇游戏 按照如下步骤实现:。初始化地图 。通过键盘控制蛇运动方向&#xff0c;注意重新设置运动方向操作。 。制造食物。 。让蛇移动&#xff0c;如果吃掉食物就重新生成一个食物&#xff0c;如果会死亡就break。用蛇的坐标将地图中的空格替换为 #和”将…

常用JavaScript库

一、认识前端工具库 1.前端工具类库 jQuery是一个快速、小型且功能丰富的 JavaScript 库&#xff0c;它使HTML文档遍历和操作、事件处理、动画和 AJAX 之类的事情变得 更加简单。当时jQuery库不但简化了代码&#xff0c;而且提供出色的跨浏览器支持&#xff0c;其极大的提高了…

黑马头条-day10-xxl-job热点文章计算

目录 一.需求分析 实现思路 定时计算 定时任务框架-xxljob 二. 学习目录 分布式任务调度 1 xxl-Job简介 2 XXL-Job-环境搭建 2.1调度中心环境要求 2.2源码仓库地址 2.3 初始化“调度数据库” 2.4配置部署“调度中心” 3.配置部署调度中心-docker安装 4.简单实例 创建…

每周一算法:邻值查找

给定一个长度为 n n n的序列 A A A&#xff0c; A A A中的数各不相同。 对于 A A A 中的每一个数 A i A_i Ai​&#xff0c;求&#xff1a; m i n 1 ≤ j < i ∣ A i − A j ∣ min_{1≤j<i}|A_i−A_j| min1≤j<i​∣Ai​−Aj​∣&#xff0c;以及令上式取到最小值的…

40G多模光模块QSFP-40G-SR4优势及应用领域介绍

QSFP-40G-SR4光模块是一种常用的光纤传输解决方案。传输速率40G&#xff0c;SR代表短距离多模光纤&#xff08;Short Range Multimode Fiber&#xff09;&#xff0c;4表示有四个光纤通道。这种光模块采用MPO/MTP多模光纤连接器来实现高速传输&#xff0c;传输距离可以达到300米…

WU反走样算法

WU反走样算法 由离散量表示连续量而引起的失真称为走样&#xff0c;用于减轻走样现象的技术成为反走样&#xff0c;游戏中称为抗锯齿。走样是连续图形离散为想想点后引起的失真&#xff0c;真实像素面积不为 零。走样是光栅扫描显示器的一种固有现象&#xff0c;只能减轻&…

【Echarts】使用echarts和echarts-wordcloud生成词云图

一、下载echarts和echarts-wordcloud 地址&#xff1a;https://download.csdn.net/download/qq_25285531/88663006 可直接下载放在项目中使用 二、词云数据 词云数据是对象的格式&#xff0c;可以从后端获取&#xff0c;这里以下面数据为例 {"visualMap": 199,&…

基于多反应堆的高并发服务器【C/C++/Reactor】(中)EventLoop初始化

这个Dispatcher是一个事件分发模型&#xff0c;通过这个模型,就能够检测对应的文件描述符的事件的时候,可以使用epoll/poll/select,前面说过三选一。另外不管是哪一个底层的检测模型,它们都需要使用一个数据块,这个数据块就叫做DispatcherData。除此之外,还有另外一个部分,因为…

vue3 vue3-print-nb 实现打印功能

vue3 vue3-print-nb 实现打印功能 效果 vue3-print-nb 文档 安装 pnpm add vue3-print-nbtypescript 中 xx.d.ts declare module "vue3-print-nb";配置 全局配置 src/main.ts import print from "vue3-print-nb";const app createApp(App); app.us…

Leetcode2928. 给小朋友们分糖果 I

Every day a Leetcode 题目来源&#xff1a;2928. 给小朋友们分糖果 I 解法1&#xff1a;暴力 枚举 3 位小朋友的糖果数&#xff0c;范围为 [0, limit]&#xff0c;分别记为 i、j、k。 当满足 i j k n 时&#xff0c;答案 1。 代码&#xff1a; /** lc appleetcode.c…

引领制造业迈向智能化新时代,SIA上海智能工厂展助力行业蓬勃发展

当今制造业迎来了数字化革命的潮流&#xff0c;其中智能工厂作为其中的一个关键角色&#xff0c;正在推动着制造业的转型和升级。智能工厂不仅仅是一个集成了先进技术的制造厂房&#xff0c;更是数字化时代制造业发展的崭新范本。本文将探讨智能工厂在现代制造业中的重要作用。…

SecuSphere:一款功能强大的一站式高效DevSecOps安全框架

关于SecuSphere SecuSphere是一款功能强大的一站式高效DevSecOps解决方案&#xff0c;DevSecOps作为一个经过针对性设计的集中式平台&#xff0c;可以帮助广大研究人员管理和优化漏洞管理、CI/CD管道集成、安全评估和DevSecOps实践。 SecuSphere是一个功能全面的DevSecOps平台…

RK3568驱动指南|第八篇 设备树插件-第83章 设备树插件驱动分析实验

瑞芯微RK3568芯片是一款定位中高端的通用型SOC&#xff0c;采用22nm制程工艺&#xff0c;搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码&#xff0c;支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU&#xff0c;可用于轻量级人工…