推荐阅读最新更新时间:2026-03-19 10:46
STM32中DMA传输中断功能的关闭方法详解
一、为什么我们要关中断功能呢? 1.在撰写类似DMA相关串口传输程序时,我们会使用到队列指针的操作,而这个操作绝对不可以被任何行为打断,打断就寄。 2. 因此我们要在进行队列指针的数据处理时,将全局的中断全部关闭。(很快,就一瞬间开关一下) 3.举个例子: 例如在某一串口传输函数中,以下操作需原子性: ENTER_CRITICAL(); if (队列未满) { txHead = next_head; // 更新队列头 if (UART空闲) { 启动DMA发送(); // 更新txTail和isUART3Busy } } EXIT_CRITICAL(); 若此处不关闭中断,DMA完成回
[单片机]
[国嵌笔记][035][关闭中断]
关闭中断 1.设置cpsr中的I位和F位为1,屏蔽中断和快速中断。在设置svc模式时已经设置了这两位 2.设置中断屏蔽寄存器,屏蔽中断 3.产生的中断会被保存在SRCPND中,通过MASK(屏蔽中断寄存器)决定是否被CPU感知。如果关闭MASK,则产生的中断不会被CPU感知,可以中datasheet中的INTERRUPT CONTROLLER找到相关描述 4.屏蔽中断寄存器INTMSK(0x4A000008),中有32位,每一位对应一个中断,设置相应位为1表示屏蔽该中断。在这里需要设置该中断为全1。 5.在6410和210中的屏蔽中断分别有两组和四组,每组分别由中断使能和中断屏蔽两个寄存器控制,所以屏蔽
[单片机]
22.核心初始化之看门狗
看门狗定时器,在嵌入式领域,有些设备需要工作一些极端的环境,就是人很少到或者很难到的地方。在长期的运作中,难免会出现故障死机的情况,这时,如果派人去查看情况,耗费耗时等,所以人们就设置了一种机制,就是系统里有一个重启的机制叫看门狗定时器。它工作的方式:就是系统的watchdog在硬件上实现了计时功能,启动计时后,用户(软件)必须在计时结束前重新开始计时,俗称 喂狗 ,如果到了超时的时候,还没有重新开始计时,那么就认为系统死机了,进行自动重启系统。 芯片手册:6410的34章里: 看门狗的工作流程: 由于我们现在使用的日常里的操作系统,没那么容易死机,所以为了避免系统老是重启,因为没喂狗。所以干脆把它给关闭掉。 关闭的操作: 看
[单片机]
25.核心初始化之中断屏蔽-210
在210中屏蔽中断的机制和6410是一样的。而且两者都是向量中断,很多中断都是硬件实现的,不像2440。 但是在210中的中断屏蔽寄存器有4个: 四组屏蔽寄存器的地址: 所以屏蔽中断就是把上面的四个屏蔽寄存器设置为全1,设置为0仍是没有影响。 代码实现: 编译:
[单片机]
基于S3C6410的ARM11学习(七) 核心初始化之关闭MMU和CACHE
在关闭了所有中断后,就要关闭MMU和CACHE了。因为这个时候,还在初始化环境,这两个东西是用不到的。所以就需要把他们都关闭,免得影响我们的初始化。 MMU是Memory Management Unit的缩写,中文名是存储器管理单元。主要是两个功能: 1、虚拟地址转换为物理地址 2、实现内存的保护 至于具体的MMU的一些知识,等后面用到了在说明了。目前,只需要将MMU给关掉即可。 这个时候,我们需要查看S3C6410的核ARM1176JZFS手册。在这里,我们要接触到一个系统控制处理器,CP15。也叫做协处理器。 手册中说明了,CP15系统控制处理器的作用,主要是6个: 1、整个系统的控制和配置 2、CACHE的
[单片机]
基于S3C6410的ARM11学习(八) 核心初始化之设置外设基地址
下面就是核心初始化的最后一个了。外设基地址初始化。这个操作是告诉CPU外设的基地址是多少。 之前,对这个很疑惑,外设的基地址对于芯片来说,不是已经固定了,还要告诉他基地址是多少干嘛了。STM32就不用这一步操作。这个时候,就要去研究这两种芯片的内核了。S3C6410用的是ARM11的核,而STM32用的是CORTEX-M3的内核。 对于cortex-m3内核,外设的地址就已经是固定了,从0x40000000开始,大小是0.5G。所以不管你是什么芯片,只要你使用了cortex-m3内核,你的外设的基地址就变不了,变的是外设地址对应的外设不一样。所以,就没有必要告诉CPU外设的基地址了,直接操作这些地址即可。CPU会自
[单片机]
STM32F103对于固件库V3.5.0打开和关闭总中断
#define CLI() __set_PRIMASK(1) //关闭总中断 #define SEI() __set_PRIMASK(0) //打开总中断 __set_PRIMASK()在V3.5.0库中的core_cm3.h中,定义如下 static __INLINE void __set_PRIMASK(uint32_t priMask) { register uint32_t __regPriMask __ASM( primask ); __regPriMask = (priMask); }
[单片机]
STM32_总中断关闭
STM32在使用时有时需要禁用全局中断,比如MCU在升级过程中需禁用外部中断,防止升级过程中外部中断触发导致升级失败。 ARM MDK中提供了如下两个接口来禁用和开启总中断: __disable_irq(); // 关闭总中断 __enable_irq(); // 开启总中断 但 测试 发现这样一个问题,在关闭总中断后,如果有中断触发,虽然此时不会引发中断,但在调用__enable_irq()开启总中断后,MCU会立即处理之前触发的中断。这说明__disable_irq()只是禁止CPU去响应中断,没有真正的去屏蔽中断的触发,中断发生后,相应的寄存器会将中断标志置位,在__enable_irq()开启中断后,由于相应的中断
[单片机]