你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

查看: 5237|回复: 1

stm32在ucos-II下外部中断无法实现

[复制链接]

1

主题

26

回帖

0

蝴蝶豆

初级会员

最后登录
1970-1-1
发表于 2012-3-2 19:15:30 | 显示全部楼层 |阅读模式
 我想用stm32在ucos-II系统下实现外部中断,ucos-ii移植没问题。但是无法初始化nvic,只要加入NVIC初始化结体的代码系统就无法工作,注释掉后系统又能正常工作了。
main.c
 
#include "ucos_ii.h"
#include "stm32f10x.h"
#include "led.h"
static OS_STK startup_task_stk[STARTUP_TASK_STK_SIZE];
static OS_STK task1_stk[TASK1_STK_SIZE];
 
static void systick_init(void)
{
        RCC_ClocksTypeDef rcc_clocks;
        RCC_GetClocksFreq(&rcc_clocks);
        SysTick_Config(rcc_clocks.HCLK_Frequency / OS_TICKS_PER_SEC);
}
 
static void task1(void *p_arg)
{  
    NVIC_init();
    for (;;)
        {
         GPIO_SetBits(GPIOE, GPIO_Pin_5);
         OSTimeDly(500);
         GPIO_ResetBits(GPIOE, GPIO_Pin_5);
         OSTimeDly(500);               
        }       
}
 
static void startup_task(void *p_arg)
{
        INT8U err;
        systick_init();     /* Initialize the SysTick. */
#if (OS_TASK_STAT_EN > 0)
    OSStatInit();      /* Determine CPU capacity. */
#endif
        /* TODO: create application tasks here */  
 
        err = OSTaskCreate(task1, (void *)0,
                           &task1_stk[TASK1_STK_SIZE-1], TASK1_PRIO);      
 
        if (OS_ERR_NONE != err)
                while(1);
        OSTaskDel(OS_PRIO_SELF);
}
int main(void)
{
    PPP_init();
        OSInit();
        OSTaskCreate(startup_task, (void *)0,
                     &startup_task_stk[STARTUP_TASK_STK_SIZE - 1],
                     STARTUP_TASK_PRIO);
        OSStart();
        return 0;
}
其中GPIO_init()用于初始化GPIO和端口时钟,NVIC_init()用于初始化NVIC和EXTI。
GPIO_init()
void PPP_init(void)
{          
        SystemInit();   
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO, ENABLE); 
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE);
 
         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
        GPIO_Init(GPIOE, &GPIO_InitStructure);
 
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
 
        GPIO_Init(GPIOE, &GPIO_InitStructure);
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;       
        GPIO_Init(GPIOC, &GPIO_InitStructure);
}
 
NVIC_init()
void NVIC_init(void)
{
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);   
        NVIC_InitStructure.NVIC_IRQChannel=EXTI0_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;  
        NVIC_InitStructure.NVIC_IRQChannelSubPriority=0; 
        NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
        NVIC_Init(&NVIC_InitStructure);
 
        EXTI_ClearITPendingBit(EXTI_Line0);
        EXTI_InitStructure.EXTI_Line=EXTI_Line0;   
        EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
        EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling; 
        EXTI_InitStructure.EXTI_LineCmd=ENABLE;
        EXTI_Init(&EXTI_InitStructure);
        EXTI_GenerateSWInterrupt(EXTI_Line0);
}
 
 如果注释掉
 NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
两行代码中的任意一行 系统可以正常运行,也就是task1中的灯可以闪烁,如果没有注释掉,体统不能工作 灯不闪

 有哪位大虾可以为小弟提供正确的代码例程,我将感激不尽,终身难忘!~     QQ 417748195   邮箱:mkkj@live.cn
<
回复

使用道具 举报

134

主题

4489

回帖

239

蝴蝶豆

版主

最后登录
2020-12-9
发表于 2012-3-3 10:40:39 | 显示全部楼层

RE:stm32在ucos-II下外部中断无法实现

这个和你配置的中断是相关的。看不到你的代码,能不能把你的代码贴出来看看。
回复 支持 反对

使用道具 举报

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版