stm32——ucos的中断使用

发布者:清新天空最新更新时间:2024-10-08 来源: cnblogs关键字:stm32  ucos  中断使用 手机看文章 扫描二维码
随时随地手机看文章

uCosII移植到stm32上的文章和demo已经很多了,细节上建议大家可以看官方的移植文档(难过当 然是E文的)。网上流传的各种移植版本基本都是基于官方的移植版本做了小改进。这些改进基本都限制在更适合自己的项目或自己的使用习惯上。当然我也一样, 我的改进是为了搭建一个平台,只要stm32+ucos平台都使用这个版本,无论是我使用或是一起开发者,能更快上手。

  uCosII V2.86版本在cortex-m3的移植上面有bug,具体可以自己google一下。我目前使用的是V2.91版本,建立在stm32 V3.40的库基本上。我是强烈要求(或是强制要求)协同开发者使用库函数,除非在速度要求高的情况下或中断里需要直接操作寄存器,也必须使用库的地址定 义,并要求在后面注明对应的库函数。因为程序不是你一个人看的……例如:


/* Clear the selected DMA interrupt pending bits */  

DMA1->IFCR = DMA1_IT_TC4;  //DMA_ClearITPendingBit(DMA1_IT_TC4);  

/* Disable the selected DMAy Channelx */  

DMA1_Channel4->CCR &= (u16)(~DMA_CCR1_EN);//DMA_Cmd(DMA1_Channel4, DISABLE);  


好了,进入正题。uCos在stm32上的移植官方的版本是默认不支持中断嵌套的(个人理解),因为其没有调用 NVIC_PriorityGroupConfig这一函数或使用相同的功能语句。stm32在复位的状态下默认进去 NVIC_PriorityGroup_0,即只要子优先级没有主优先级,即先到先处理,同时到达再按优先级处理。 官方在这上面也是留有空间,因为NVIC_PriorityGroupConfig只能调用一次,采用默认状态,开发者可以加入并完善使用中断嵌套。 


官方的移植把所有的应用中断入口都指向了 BSP_IntHandler这个函数,并定义了一个函数数组static  CPU_FNCT_VOID  BSP_IntVectTbl[BSP_INT_SRC_NBR];因此,如果要加入自己的中断函数的话,只需把自己写的中断函数的指针存入这个数组就 OK了,在初始化中断前调用这函数BSP_IntVectSet。官方的中断优先级设置方式,我全删除了,使用库函数来设置将更直接,但这种中断方式保存 下来,这样中断函数更自由,写中断函数时也不用考虑太多东西,只负责自己要做的东西。


/* 

********************************************************************************************************* 

*                                             INCLUDE FILES 

********************************************************************************************************* 

*/  

  

#define  BSP_INTERRUPT_MODULE  

  

#include   

#include  //STM32芯片内部寄存器定议  

  

#include   

  

#include   

  

/* 

********************************************************************************************************* 

*                                            LOCAL DEFINES 

********************************************************************************************************* 

*/  

#define  BSP_INT_SRC_NBR                                 60  

  

  

/* 

********************************************************************************************************* 

*                                            LOCAL TABLES 

********************************************************************************************************* 

*/  

  

static  CPU_FNCT_VOID  BSP_IntVectTbl[BSP_INT_SRC_NBR];  

  

  

/* 

********************************************************************************************************* 

*                                      LOCAL FUNCTION PROTOTYPES 

********************************************************************************************************* 

*/  

  

static  void  BSP_IntHandler(u16  int_id);  

static  void  BSP_IntHandlerDummy(void);  

  

  

/* 

********************************************************************************************************* 

*                                            BSP_IntVectSet() 

* Description : Assign ISR handler. 

* Argument(s) : int_id      Interrupt for which vector will be set. 

*               isr         Handler to assign 

* Return(s)   : none. 

* Caller(s)   : Application. 

* Note(s)     : none. 

********************************************************************************************************* 

*/  

  

void  BSP_IntVectSet (u16       int_id,  

                      CPU_FNCT_VOID  isr)  

{  

  

#if OS_CRITICAL_METHOD == 3u                            /* Allocate storage for CPU status register    */  

    OS_CPU_SR     cpu_sr = 0u;  

#endif  

      

  

    if(int_id < BSP_INT_SRC_NBR){  

        OS_ENTER_CRITICAL();  

        BSP_IntVectTbl[int_id] = isr;  

        OS_EXIT_CRITICAL();  

    }  

}  


  

/* 

********************************************************************************************************* 

********************************************************************************************************* 

*                                           INTERNAL FUNCTIONS 

********************************************************************************************************* 

********************************************************************************************************* 

*/  

  

/* 

********************************************************************************************************* 

*                                              BSP_IntInit() 

* Description : Initialize interrupts: 

* Argument(s) : none. 

* Return(s)   : none. 

* Caller(s)   : BSP_Init(). 

* Note(s)     : none. 

********************************************************************************************************* 

*/  

  

void  BSP_IntInit (void)  

{  

    u16  int_id;  

    OS_CPU_SR  cpu_sr;  

  

  

    OS_ENTER_CRITICAL();                         /* Tell uC/OS-II that we are starting an ISR          */  

    OSIntNeedSW = OSIntSW_Disable;               // 需退出中断时进行任务调度切换  

    OS_EXIT_CRITICAL();  

  

    for (int_id = 0; int_id < BSP_INT_SRC_NBR; int_id++) {  

        BSP_IntVectSet(int_id, BSP_IntHandlerDummy);  

    }  

}  

  

  

/* 

********************************************************************************************************* 

*                                        BSP_IntHandler####() 

* Description : Handle an interrupt. 

* Argument(s) : none. 

* Return(s)   : none. 

* Caller(s)   : This is an ISR. 

* Note(s)     : none. 

********************************************************************************************************* 

*/  

void  BSP_IntHandlerWWDG          (void)  { BSP_IntHandler(WWDG_IRQn);            }  

void  BSP_IntHandlerPVD           (void)  { BSP_IntHandler(PVD_IRQn);             }  

void  BSP_IntHandlerTAMPER        (void)  { BSP_IntHandler(TAMPER_IRQn);          }  

void  BSP_IntHandlerRTC           (void)  { BSP_IntHandler(RTC_IRQn);             }  

void  BSP_IntHandlerFLASH         (void)  { BSP_IntHandler(FLASH_IRQn);           }  

void  BSP_IntHandlerRCC           (void)  { BSP_IntHandler(RCC_IRQn);             }  

void  BSP_IntHandlerEXTI0         (void)  { BSP_IntHandler(EXTI0_IRQn);           }  

void  BSP_IntHandlerEXTI1         (void)  { BSP_IntHandler(EXTI1_IRQn);           }  

void  BSP_IntHandlerEXTI2         (void)  { BSP_IntHandler(EXTI2_IRQn);           }  

void  BSP_IntHandlerEXTI3         (void)  { BSP_IntHandler(EXTI3_IRQn);           }  

void  BSP_IntHandlerEXTI4         (void)  { BSP_IntHandler(EXTI4_IRQn);           }  

void  BSP_IntHandlerDMA1_CH1      (void)  { BSP_IntHandler(DMA1_Channel1_IRQn);        }  

void  BSP_IntHandlerDMA1_CH2      (void)  { BSP_IntHandler(DMA1_Channel2_IRQn);        }  

[1] [2] [3]
关键字:stm32  ucos  中断使用 引用地址:stm32——ucos的中断使用

上一篇:STM32 启动步骤和升级方式以及代码跳转的实现
下一篇:stm32和同类单片机用ADC采集多通道信号量

推荐阅读最新更新时间:2026-03-18 11:01

STM32 HAL库使用中断实现串口接收不定长数据
以前用DMA实现接收不定长数据,DMA的方法接收串口助手的数据,全部没问题,不过如果接收模块返回的数据,而这些数据如果包含回车换行的话就会停止接收,例如接收:ATrnOKrn,就只能接收到ATr,导致没有接收完成,具体原因还没搞懂,有了解的,希望可以告知一下,DMA不定长接收方法传输门:https://www.cnblogs.com/xingboy/p/9714907.html。 好了,不多说了,现在进入正文。首先建立一个STM32Cumebx的工程,打开串口中断,完成配置,具体的配置流程就不细说了,没什么难度就只是打开串口跟中断而已。 生成工程代码后,先定义好一些变量: //串口4中断接收定义 #define MAX
[单片机]
<font color='red'>STM32</font> HAL库<font color='red'>使用</font><font color='red'>中断</font>实现串口接收不定长数据
STM32中断使用笔记
1.GPIO 的正确设置 GPIO_InitTypeDef GPIO_InitStructure; /* Enable GPIOD clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE); /* Configure PD.03, PC.04, as input floating */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 ; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOD, &GPI
[单片机]
STM32 SysTick中断使用方法
SysTick中断属于核内外设中断器,中断号为-1。想要使用SysTick中断,只需在SysTick查询定时上进行稍微的修改。需要添加开启中断,直接用中断函数对计数标志位进行清零,不再使用查询方式判断计数是否结束去清零。中断函数接口SysTick_Handler在汇编文件中已经给出定义,直接到文件中查找即可。 本来NVIC提供了中断使能的函数,但是要求中断号要大于0(Value cannot be negative.),所以就不能调用NVIC中断使能函数了,直接在操作寄存器开启中断就可以了。 修改如下: #include delay.h #include led.h void Systick_Delayus
[单片机]
<font color='red'>STM32</font> SysTick<font color='red'>中断</font><font color='red'>使用</font>方法
STM32单片机使用定时器中断方式实现毫秒级延时的设计
因为STM32 HAL库中仅有对HAl_Delay()毫秒级的延时,为实现精确的微秒级延时,就不得不修改Systick,但由于HAL库内部使用其作为超时判断等操作,对其修改会发生不可预期的错误,不建议修改。因此,使用通用定时器进行定时操作。 参考网上例程,使用定时器中断方式实现延时,代码如下: TIM3溢出时间=72MHz/(71+1)/(0+1)=1Mhz=1us 计数模式:向上计数模式 使能TIM3中断 */ __IO static uint32_t usDelay=0; void Delayms(uint32_t ms) { Delayus(ms*1000); } void Delayus(uint32_t us) {
[单片机]
<font color='red'>STM32</font>单片机<font color='red'>使用</font>定时器<font color='red'>中断</font>方式实现毫秒级延时的设计
STM32的IO外部中断EXTI的使用
一、前言 在之前针对 STM32 的G PI O相关API函数及配置使用进行了详细的介绍,GPIO作为输入引脚时,调用相关读 信号 引脚函数接口就可以在程序的循环中,轮询的对输入信号进行读取 检测 操作,除了轮询的方式访问输入引脚,还可以通过另外一种叫做外部中断的方式来对引脚的输入信号进行检测,本篇首先介绍下EX TI 的结构,接着介绍外部中断的相关概念,对STM32的IO外部中断EXTI有个初步的了解,在此基础上重点围绕IO外部中断EXTI的使用展开分析。 图1 外部中断设计 二、EXTI结构 EXTI(Ex te rnal interrupt/event controller)—外部中断/事件 控制器 ,管理了控制器的
[单片机]
<font color='red'>STM32</font>的IO外部<font color='red'>中断</font>EXTI的<font color='red'>使用</font>
STM32学习笔记(2) 使用外部中断控制按键
中断概述 中断:打断CPU正常程序运行,转去执行中断服务函数的内容,然后再回来执行原来的程序 NVIC:嵌套向量中断控制器,属于内核外设,管理怎与中断相关的功能 typedef struct { uint8_t NVIC_IRQChannel; //中断源 uint8_t NVIC_IRQChannelPreemptionPriority; //抢占优先级 uint8_t NVIC_IRQChannelSubPriority; //子优先级 FunctionalState NVIC_IRQChannelCmd; //使能或失能 } NVIC_InitTypeDef;
[单片机]
<font color='red'>STM32</font>学习笔记(2) <font color='red'>使用</font>外部<font color='red'>中断</font>控制按键
STM32外部中断事件控制器EXTI概念及使用方法
前言 EXTI: External interrupt / event controller 外部中断/事件控制器 提示:以下是本篇文章正文内容 一、EXTI功能框图 二、使用方法 1.EXTI_InitTypeDef 初始化结构体 1-EXTI_Line:用于产生中断/事件线 2-EXTI_Mode : EXTI模式(中断/事件) 3-EXTI_Trigger:触发(上/下/上下) 4-EXTI_LineCmd:使能或者失能(IMR/EMR) 2.实现步骤 1-初始化要连接到EXTI的GPIO 2-初始化EXTI用于产生中断/事件 3-初始化NVIC,用于处理中断 4-编写中断服务函数 5-main函数 三、
[单片机]
<font color='red'>STM32</font>外部<font color='red'>中断</font>事件控制器EXTI概念及<font color='red'>使用</font>方法
STM32学习笔记(2):外部中断使用
中断对于开发嵌入式系统来讲的地位绝对是毋庸置疑的,在C51单片机时代,一共只有5个中断,其中2个外部中断,2个定时/计数器中断和一个串口中断,但是在STM32中,中断数量大大增加,而且中断的设置也更加复杂。今天就将来探讨一下关于STM32中的中断系统。 1 基本概念 ARM Coetex-M3内核共支持256个中断,其中16个内部中断,240个外部中断和可编程的256级中断优先级的设置。STM32目前支持的中断共84个(16个内部+68个外部),还有16级可编程的中断优先级的设置,仅使用中断优先级设置8bit中的高4位。 STM32可支持68个中断通道,已经固定分配给相应的外部设备,每个中断通道都具备自己的中断优先级控制字
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved