中断优先级

外部中断实验

旧时模样 提交于 2019-12-05 15:03:29
实验目的:通过板载的4个按键控制板载两个LED的亮灭以及蜂鸣器的发声。 一、STM32的每个I/O口都可以作为中断输入,要把I/O口作为外部中断输入,有以下几个步骤。 ①、初始化I/O口为输入 ②、开启 IO 口复用时钟,设置 IO 口与中断线的映射关系。 ③、开启与该 IO 口相对的线上中断/事件,设置触发条件。 ④、配置中断分组(NVIC),并使能中断。 ⑤、编写中断服务函数。 二、软件设计 exti.c文件 #include "exti.h" #include "led.h" #include "key.h" #include "delay.h" #include "usart.h" //外部中断 0 服务程序 void EXTI0_IRQHandler(void) { delay_ms(10); //消抖 if(WK_UP==1) //WK_UP 按键 { LED0=!LED0; LED1=!LED1; } EXTI->PR=1<<0; //清除 LINE0 上的中断标志位 } //外部中断 9~5 服务程序 void EXTI9_5_IRQHandler(void) { delay_ms(10); //消抖 if(KEY0==0) LED0=!LED0; //按键 0 EXTI->PR=1<<5; //清除 LINE5 上的中断标志位 } //外部中断 15~10

I/O管理杂记

纵然是瞬间 提交于 2019-12-04 20:59:14
  这是一篇杂记,记录了操作系统层面与I/O管理的零散知识点,用于温习使用。由于I/O管理是一个很大的范畴,后续会不断按照自己的生产需求来补充用的到的知识点。计算机系统是人造系统,没有绝对的对错(相对于自然系统的绝对性),只有特定场景下的优劣。我们在理解一块知识时应当从它提出的背景以及要解决的问题出发,去理解机制而不是纠结于如何具体的实现。即使目的相同,不同的公司或开发者在不同场景下的实现也不尽相同,了解几个例子加深自己的理解、帮助自己构建起知识体系即可(个人观点)。 设备控制器   设备控制器是计算机中的一个实体,其主要职责是 控制一个或多个I/O设 备,以实现I/O设备和计算机之间的数据交换。它是 CPU与I/O设备之间的接口 ,它接收从CPU发来的命令,并去控制I/O设备工作, 以使处理机从繁杂的设备控制事务中解脱出来 。设备控制器是一个 可编址 的设备,当它仅控制一个设备时,它只有一个唯一的设备地址;若控制可连接多个设备时,则应含有多个设备地址,并使每一个设备地址对应一个设备。设备控制器的复杂性因不同设备而异,相差甚大,于是可把设备控制器分成两类:一类是用于控制 字符设备 的控制器,另一类是用于控制 块设备 的控制器。在微型机和小型机中的控制器,常做成印刷电路卡形式,因而也常称为接口卡,可将它插入计算机。有些控制器还可以处理两个、四个或八个同类设备。   控制器由

ARM7中断的理解

谁说胖子不能爱 提交于 2019-12-04 11:48:16
谈谈对中断的理解? 中断是计算机中处理异步事件的重要机制 中断触发的方式: 1)中断源级设置 按键:(CPU之外的硬件) 设置中断的触发方式 uart控制 (CPU之内的硬件) 不用设置触发方式 中断使能 2)中断控制器级设置 优先级 中断使能 ...设置发往哪个核 3)ARM设置 cpsr.I =0(使能中断) 硬件自动做4件事 1:备份cpsr到spsr_<mode>   2:设置cpsr(主要是设置准备跳转到那个模式下执行代码)   3:将pc-4保存到lr_<mode>(以便下次能够跳转返回)   4;设置pc为某个异常的入口地址 及pc=VECTOR_BASE+0x00/0x04/0x08/0x0C/0x10/0x18/0x1C 若为IRQ异常及pc=baseaddr+0x18; 软件应该做的事 1:建立异常向量表 (产生中断之前就要准备完成) 2:跳转到IRQ异常处理函数(产生中断时候跳转)   IRQ异常处理函数     保护现场     bl c_irq_handler      恢复现场    c_irq_handler     判断哪个硬件触发的      调用对应硬件操作函数     清空中断源 中断控制器pending 注: 保护现场:及将被异常打断任务使用的ARM寄存器的数据保存到栈中。     恢复现场:1)从栈中将之前保存到栈的数据恢复到ARM寄存器中

2019年11月12日

亡梦爱人 提交于 2019-12-04 06:53:34
一、USART简介   通用同步异步收发器(USART)提供了一种灵活的方法与使用工业标准NRZ异步串行数据格式的外部设备之间进行全双工数据交换。USART利用分数波特率发生器提供宽范围的波特率选择。   STM32 的串口资源相当丰富的,功能也相当强劲。STM32F103ZET6 最多可提供 5 路串口,有分数波特率发生器,支持同步单向通信和半双工单线通信,支持LIN(局部互连网),智能卡协议和IrDA(红外数据组织)SIR ENDEC规范,以及调制解调器(CTS/RTS)操作。它还允许多处理器通信。使用多缓冲器配置的DMA方式,可以实现高速数据通信。 二、USART功能概述   接口通过三个引脚与其他设备连接在一起。任何USART双向通信至少需要两个脚:接收数据输入(RX)和发送数据输出(TX)。   RX:接收数据串行输。通过过采样技术来区别数据和噪音,从而恢复数据。   TX:发送数据输出。当发送器被禁止时,输出引脚恢复到它的I/O端口配置。当发送器被激活,并且不发送数据时,TX引脚处于高电平。在单线和智能卡模式里,此I/O口被同时用于数据的发送和接收。   串口外设主要由三个部分组成,分别是波特率的控制部分、收发控制部分及数据存储转移部分。   1、波特率控制   波特率,即每秒传输的二进制位数,用 b/s (bps)表示,通过对时钟的控制可以改变波特率。在配置波特率时

定时器中断

南楼画角 提交于 2019-12-04 06:34:41
1.定时器介绍 STM32F1的定时器非常多,由2个基本定时器(TIM6、TIM7)、4个通 用定时器(TIM2-TIM5)和2个高级定时器(TIM1、TIM8)组成。基本定 时器的功能最为简单,类似于51单片机内定时器。通用定时器是在基本 定时器的基础上扩展而来,增加了输入捕获与输出比较等功能。高级定 时器又是在通用定时器基础上扩展而来,增加了可编程死区互补输出、 重复计数器、带刹车(断路)功能,这些功能主要针对工业电机控制方面 1.1 通用定时器简介 STM32F1的通用定时器包含一个 16 位自动重载计数器(CNT),该计数器由可编程预分频器(PSC)驱动。STM32F1的通用定时器可用于多种 用途,包括测量输入信号的脉冲宽度(输入捕获)或者生成输出波形(输出 比较和PWM)等。 使用定时器预分频器和 RCC 时钟控制器预分频器,脉 冲长度和波形周期可以在几个微秒到几个毫秒间调整。STM32F1 的每个 通用定时器都是完全独立的,没有互相共享的任何资源。 STM32F1的通用定时器TIMx (TIM2-TIM5 )具有如下功能: (1)16 位向上、向下、向上/向下自动装载计数器(TIMx_CNT)。 (2)16 位可编程(可以实时修改)预分频器(TIMx_PSC),计数器时钟频率的分频系数为 1~65535之间的任意数值。 (3)4个独立通道(TIMx_CH1-4)

STM32的Systick滴答定时器

匿名 (未验证) 提交于 2019-12-03 00:37:01
一、Systick滴答定时器是什么东东? Systick MCU UCOS STM32+UCOS Systick UCOS Systick一般用来做延时,精确延时。 一共 4个Systick寄存器 三、 systick定时器原理 这个定时器是设置一个初值,然后这个初值减数到 0,就是定时完成,完成之后可以产生中断,也可以不使用中断。 第 0位是使能位,可以使能或者使能定时器 第 1位是使能中断位,减数结束之后是否产生中断。 第 2位是时钟选择位,可以选择外部的或者内部时钟作为时钟源。 第 16位是标志位,减数到0之后该位被置位1,读取过后自动清清零。 ------------------------------------------------------------------------------------------------------------ 四、 u 重装载数值寄存器 -LOAD 当当前值寄存器减数到 0,自动会将把这个RELOAD的值赋给当前值寄存器。 if(VAL == 0) VAL就是从初值(RELOAD)一直减一,倒数到0的时候,重新将初值(RELOAD)赋给VAL。 六、滴答定时器的实现 对于 STM32 ,外部时钟源是 HCLK(AHB 总线时钟)的 1/8 内核时钟是 HCLK 时钟 1、选择时钟源 misc.c 初始化 systick,

8259中断控制

匿名 (未验证) 提交于 2019-12-03 00:29:01
8259 1. 掌握8259中断控制器的工作原理。 2. 学习8259的应用编程方法。 3. 掌握8259级联方式的使用方法。 PC机一台,TD-PITE实验装置一套。 Intel 386EX芯片中集成有中断控制单元(ICU),该单元包含有两个级联中断控制器,一个为主控制器,一个为从控制器。该中断控制单元就功能而言与工业上标准的82C59A是一致的,操作方法也相同。从片的INT连接到主片的IR2信号上构成两片8259的级联。 TD-PITE实验系统中,将主控制器的IR6、IR7以及从控制器的IR1开放出来供实验使用,主片8259的IR4供系统串口使用。8259的内部连接及外部管脚引出如图4.5: 图 4.1列出了中断控制单元的寄存器相关信息。 寄存器 口地址 功能描述 ICW1 ICW1 (只写) 0020H 00A0H 初始化命令字 1 决定中断请求信号为电平触发还是边沿触发。 ICW2 ICW2 (只写) 0021H 00A1H 初始化命令字 2 包含了 8259 IR0 1 IR1 ICW3 (只写) 0021H 初始化命令字 3 用于识别从 8259 IR 8259 8259 IR2 ICW3 (只写) 00A1H 初始化命令字 3 表明内部从控制器级联到主片的 IR2 ICW4 ICW4 (只写) 0021H 00A1H 初始化命令字 4 选择特殊全嵌套或全嵌套模式

[现代操作系统] I/O之硬件原理

匿名 (未验证) 提交于 2019-12-03 00:28:02
I/O 硬件原理 把信息存储在固定大小的块中, 每个块都有自己的地址. 每个块可以独立于其他块读写. 如 硬盘, CD-ROM , USB 盘 … 字符设备以字符为单位发送或接收一个字符流, 而不考虑任何块结构. 它是不可寻址的. 如打印机, 网络接口, 鼠标 (用作指点设备)… I/O 设备一般由两部分组成: 机械部分和电子部分. 电子部分就是设备控制器. 常以插入 (PCI) 扩展槽中的印刷电路板的形式出现. 控制器与设备之间的接口是很低层次的接口. 它的任务就是把串行的位流转换为字节块, 并进行必要的错误校正. 每个控制器有几个寄存器, OS 可以读写来了解, 更改设备的状态信息. 控制器还有 OS 可以读写的 数据缓冲区 . 问题来了: CPU 如何与设备的控制寄存器和数据缓冲区通信. 方法一: 每个控制寄存器被分配一个 I/O 端口 (所有端口形成端口空间, 受保护不被普通用户访问). 然后可以设置指令来读写, 如 IN REG, PORT 将读取控制器寄存器 PORT 中的内容到 CPU 寄存器 REG 方法二: 内存映射 I/O. 将所有控制寄存器映射到内存空间, 都被分配唯一的地址, 且这些内存地址不会再分配. CPU 读入一个字时, 不论是从内存还是 I/O 端口, 都将目的地址放在总线的地址线上, 总线控制线置 READ 信号看. 还要用一条线表明是 I/O

FREERTOS队列

匿名 (未验证) 提交于 2019-12-03 00:21:02
http://forum.armfly.com/forum.php 本章节为大家讲解 FreeRTOS 的一个重要的通信机制----消息队列,初学者要熟练掌握,因为消息队 消息队列的概念及其作用 消息队列就是通过 RTOS 内核提供的服务,任务或中断服务子程序可以将一个消息( 注意,FreeRTOS 消息队列传递的是实际数据,并不是数据地址,RTX,uCOS-II 和 uCOS-III 是传递的地址 )放入到队列。 同样,一个或者多个任务可以通过 RTOS 内核服务从队列中得到消息。通常,先进入消息队列的消息先传 给任务,也就是说,任务先得到的是最先进入到消息队列的消息,即先进先出的原则(FIFO),FreeRTOS 的消息队列支持 FIFO 和 LIFO 两种数据存取方式。 也许有不理解的初学者会问采用消息队列多麻烦,搞个全局数组不是更简单,其实不然。在裸机编程 时,使用全局数组的确比较方便,但是在加上 RTOS 后就是另一种情况了。 相比消息队列,使用全局数组 使用消息队列可以让 RTOS 内核有效地管理任务,而全局数组是无法做到的,任务的超时等机制需要用户自己去实现。 使用了全局数组就要防止多任务的访问冲突,而使用消息队列则处理好了这个问题,用户无需担心。 使用消息队列可以有效地解决中断服务程序与任务之间消息传递的问题。 FIFO 机制更有利于数据的处理。 FreeRTOS

关于STM32F中按键中断分析

匿名 (未验证) 提交于 2019-12-03 00:09:02
  在按键学习中,我们有用到查询的方法来判断按键事件是否发生,这种查询按键事件适用于程序工作量较少的情况下,一旦程序中工作量较大较多,则势必影响程序运行的效率,为了简化程序中控制的功能模块的执行时间,引入中断控制就很有必要,,一旦有中断时间发生,则程序立马跳转到中断向量的执行程序中,执行完成后就恢复到正常的程序状态。   在STM32F中采用中断控制器NVIC来设定中断。按照中断初始化配置的结构体文件,我们需要在NVIC初始化结构体配置如下:   void EXti_PB12_Config(void)   {   //定义结构体   GPIO_InitTypeDef GPIO_InitStructure;   EXTI_InitTypeDef EXTI_InitStructure;   //开启外设时钟   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);   NVIC_Configuration();   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;   GPIO_Init(GPIOB, &GPIO_InitStructure);   //