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); }
上一篇:STM32 启动步骤和升级方式以及代码跳转的实现
下一篇:stm32和同类单片机用ADC采集多通道信号量
推荐阅读最新更新时间:2026-03-18 11:01
- EVAL-L99UDL01,基于L99UDL01的通用门锁演示板
- 使用 Sanken Electric Co., Ltd 的 SPF8050J 的参考设计
- TCR6DA1525、200mA、1.5V 和 2.5V 输出电压双路输出 CMOS 低压降稳压器的典型应用
- 使用 Alpha and Omega Semiconductor 的 AOZ1960DI 的参考设计
- LT1952EGN-1 18V 至 72V 宽输入、高效率、12V/12A 输出、有源复位正激转换器的典型应用电路
- EVAL-AD7714-3EBZ,使用 AD7714 的评估板,24 位信号调理模数转换器
- NCL30000 功率因数校正可调光 LED 驱动器的典型应用
- 使用 Richtek Technology Corporation 的 RT9014 的参考设计
- MAXREFDES1226:借助MAX17690和MAX17606,效率低至87%的小尺寸,薄型,5V / 1.5A,同步,无光耦反激式DC-DC转换器
- 用于更高输出电流的 LT3066EDE 并联稳压器的典型应用电路



stm32驱动屏IC rm68042
STM32 PMSM FOC 简介
基于STM32G031的测试测量训练平台完成虚拟仪器实现
非常经典的关于LLC的杨波博士论文
1-292148-8






京公网安备 11010802033920号