521yiyi14 发表于 2012-6-21 09:50:38

STM32 ucos-ii 灯闪烁不起来,大家帮我看看程序,求救

我自己头一次写UCOS-II程序,比较费解,求教


#include "ucos_ii.h"
#include "stm32f10x.h"
#defineTASK_STK_SIZE                512
OS_STKStartTaskStk;
OS_STKTask1TaskStk;
OS_STKTask2TaskStk;

void StartTask(void *pada);
void Task1Task(void *pada);
void Task2Task(void *pada);
void RCC_Configuration(void);
void GPIO_Configuration(void);
void SysTick_Configuration(void);
int main(void)
{
        OSInit(); //初始化uc/os-ii
        RCC_Configuration();
        GPIO_Configuration();
        OSTaskCreate(StartTask,
                                (void*)0,
                                (OS_STK*)&StartTaskStk,
                                5
                               );
        OSStart();
        return 0;
}
void StartTask(void *pada)
{
    OS_CPU_SR cpu_sr;          //必须需要定义
        pada=pada;
        OS_ENTER_CRITICAL();
        OSTaskCreate(Task1Task,
                                (void *)0,
                          (OS_STK *)&Task1TaskStk,
                          6
                          );
        OSTaskCreate(Task2Task,
                                (void *)0,
                          (OS_STK *)&Task1TaskStk,
                          7
                          );
        OSTaskSuspend(OS_PRIO_SELF);
    OS_EXIT_CRITICAL();
}
voidTask1Task(void *pada)
{       
    pada=pada;
        for(;;)
        {
        GPIOA->ODR^=1<<8;
        OSTimeDlyHMSM(0,0,0,500);
        }
}
void   Task2Task(void *pada)
{
    pada=pada;
        for(;;)
        {
        GPIOD->ODR^=1<<2;
        OSTimeDlyHMSM(0,0,1,0);
        }
}
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;             //结构体定义状态
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;      //设置管脚PA8
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //设置输出为推挽式输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; //定义输出速率最高为2MHz
GPIO_Init(GPIOA, &GPIO_InitStructure);         
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;      //设置管脚PD2
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; //定义输出速率最高为2MHz
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //设置输出为推挽式输出
GPIO_Init(GPIOD, &GPIO_InitStructure);
}
voidRCC_Configuration(void)
{
ErrorStatus HSEStartUpStatus;//结构体定义状态,SUCCESS或者error
RCC_DeInit();//将外设RCC寄存器重设为缺省值
RCC_HSEConfig(RCC_HSE_ON);//打开HSE外部高度晶振
HSEStartUpStatus = RCC_WaitForHSEStartUp();//检测外部HSE时钟的工作状态
if(HSEStartUpStatus==SUCCESS)
{
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);//打开预取缓冲器
FLASH_SetLatency(FLASH_Latency_2); //Flash 2 wait state
RCC_HCLKConfig(RCC_SYSCLK_Div1); //设置AHB时钟,其中AHB=系统时钟/分频比
RCC_PCLK2Config(RCC_HCLK_Div1); //设置pclk2的时钟- APB2
RCC_PCLK1Config(RCC_HCLK_Div2); //设置PCLK1的时钟—APB1
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); //设置PLL时钟为72MHz
RCC_PLLCmd(ENABLE);//打开PLL时钟开关
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);//检测PLL是否就绪
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//选择系统时钟SYSCLK为PLL时钟
while(RCC_GetSYSCLKSource() != 0x08);   //判断是否PLL是系统时钟
   }
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |    //打开GPIO口的时钟
                         RCC_APB2Periph_GPIOD ,
                         ENABLE);
}
void SysTick_Configuration(void)
{
RCC_ClocksTypeDef rcc_clocks;
RCC_GetClocksFreq(&rcc_clocks);
SysTick_Config(rcc_clocks.HCLK_Frequency/OS_TICKS_PER_SEC);
}

jeep_jun 发表于 2012-6-21 17:18:40

你这样说让人费解啊,是亮一下不亮了呢?还是根本就不亮?

Eiman 发表于 2012-6-21 18:12:22

应该是
voidTask1Task(void *pada)
{      
    pada=pada;
      for(;;)
      {
      GPIOA->ODR^=1<<8;
      OSTimeDlyHMSM(0,0,0,500);
      }
}
void   Task2Task(void *pada)
{
    pada=pada;
      for(;;)
      {
      GPIOD->ODR^=1<<2;
      OSTimeDlyHMSM(0,0,1,0);
      }
这两个任务有问题。在IO口控制之前再加一个OSTimeDlyHMSM语句看看。

huaxin 发表于 2012-6-21 18:41:53

首先应该确认移植的是否正确吧, 如果移植没问题的话再看应用程序吧,

sunkey 发表于 2012-6-21 20:28:08

本帖最后由 sunkey 于 2012-6-21 20:31 编辑

感觉这块儿有点问题,顺序倒一下

OSTaskSuspend(OS_PRIO_SELF);
    OS_EXIT_CRITICAL();


l另外SysTick_Configuration 没有用到啊, 加到第一个建立的任务里面.用来做osii tick

521yiyi14 发表于 2012-6-25 09:58:59

#include "ucos_ii.h"
#include "stm32f10x.h"
#defineTASK_STK_SIZE                128
OS_STKStartTaskStk;
OS_STKTask1TaskStk;
OS_STKTask2TaskStk;
void StartTask(void *pada);
void Task1Task(void *pada);
void Task2Task(void *pada);
void RCC_Configuration(void);
void GPIO_Configuration(void);
void SysTick_Configuration(void);
void NVIC_Configuration(void);
int main(void)
{
        RCC_Configuration();
        GPIO_Configuration();
        OSInit(); //初始化uc/os-ii
        OSTaskCreate(StartTask,
                                (void*)0,
                                (OS_STK*)&StartTaskStk,
                                5
                               );
        OSStart();
        return 0;
}
void StartTask(void *pada)
{       
    OS_CPU_SR cpu_sr;          //必须需要定义
        pada=pada;
        OS_ENTER_CRITICAL();
//        GPIOA->ODR&=0xfeff;      //PA8 输出低
//        GPIOD->ODR |=1<<2;
        OSTaskCreate(Task1Task,
                                (void *)0,
                          (OS_STK *)&Task1TaskStk,
                          7
                          );
        OSTaskCreate(Task2Task,
                                (void *)0,
                          (OS_STK *)&Task1TaskStk,
                          6
                          );   
    OS_EXIT_CRITICAL();
        OSTaskSuspend(OS_PRIO_SELF);
        SysTick_Configuration();
}
voidTask1Task(void *pada)
{       
    pada=pada;
        while(1)
        {
//        OSTimeDlyHMSM(0,0,0,500);
        GPIOD->ODR^=1<<2;
        OSTimeDlyHMSM(0,0,0,500);
        }
}
void   Task2Task(void *pada)
{
    pada=pada;
        while(1)
        {
//        OSTimeDlyHMSM(0,0,0,500);
        GPIOA->ODR^=1<<8;
        OSTimeDlyHMSM(0,0,1,0);
        }
}
void GPIO_Configuration(void)
{
/*GPIO_InitTypeDef GPIO_InitStructure;             //结构体定义状态
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;      //设置管脚PA8
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //设置输出为推挽式输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; //定义输出速率最高为2MHz
GPIO_Init(GPIOA, &GPIO_InitStructure);         
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;      //设置管脚PD2
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; //定义输出速率最高为2MHz
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //设置输出为推挽式输出
GPIO_Init(GPIOD, &GPIO_InitStructure); */
RCC->APB2ENR|=1<<2;    //使能PORTA时钟                  
RCC->APB2ENR|=1<<5;    //使能PORTD时钟
GPIOA->CRH&=0XFFFFFFF0;
GPIOA->CRH|=0X00000003;//PA8 推挽输出          
GPIOA->ODR&=0xfeff;      //PA8 输出低
                                                                                          
GPIOD->CRL&=0XFFFFF0FF;
GPIOD->CRL|=0X00000300;//PD.2推挽输出
GPIOD->ODR&=0xfffb;      //PD.2输出低

}
voidRCC_Configuration(void)
{
ErrorStatus HSEStartUpStatus;//结构体定义状态,SUCCESS或者error
RCC_DeInit();//将外设RCC寄存器重设为缺省值
RCC_HSEConfig(RCC_HSE_ON);//打开HSE外部高度晶振
HSEStartUpStatus = RCC_WaitForHSEStartUp();//检测外部HSE时钟的工作状态
if(HSEStartUpStatus==SUCCESS)
{
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);//打开预取缓冲器
FLASH_SetLatency(FLASH_Latency_2); //Flash 2 wait state
RCC_HCLKConfig(RCC_SYSCLK_Div1); //设置AHB时钟,其中AHB=系统时钟/分频比
RCC_PCLK2Config(RCC_HCLK_Div1); //设置pclk2的时钟- APB2
RCC_PCLK1Config(RCC_HCLK_Div2); //设置PCLK1的时钟—APB1
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); //设置PLL时钟为72MHz
RCC_PLLCmd(ENABLE);//打开PLL时钟开关
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);//检测PLL是否就绪
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//选择系统时钟SYSCLK为PLL时钟
while(RCC_GetSYSCLKSource() != 0x08);   //判断是否PLL是系统时钟
   }
}
void SysTick_Configuration(void)
{
        SysTick->CTRL&=~(1<<2);//SYSTICK使用外部时钟源
        SysTick->CTRL|=1<<1;   //开启SYSTICK中断
        SysTick->LOAD=9000;    //产生1ms中断
        //bit2清空,选择外部时钟HCLK/8
        NVIC_Configuration();
        SysTick->CTRL|=1<<0;   //开启SYSTICK
}
void NVIC_Configuration(void)
{
   NVIC_InitTypeDefNVIC_InitStructure;               //结构体定义
   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);   //1个先占优先级,3个从优先级
   NVIC_InitStructure.NVIC_IRQChannel = SysTick_IRQn ;
   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;                     
   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;   
   NVIC_Init(&NVIC_InitStructure);
}

521yiyi14 发表于 2012-6-25 09:59:54

现在的情况是灯是常亮,我从新写了下程序,仍然无法让灯闪烁起来,求大家帮忙

Ytu-xiaolizig 发表于 2012-6-30 14:39:44

延时时间?            

yiminglei 发表于 2012-7-15 19:42:52

中断向量配置了吗?startup_stm32f10x_md.c里的。

huang_4115 发表于 2012-7-16 20:35:40

和我一样的问题,粗心的原因
OSTaskCreate(Task1Task,
                              (void *)0,
                            (OS_STK *)&Task1TaskStk,
                            7
                            );
      OSTaskCreate(Task2Task,
                              (void *)0,
                            (OS_STK *)&Task1TaskStk,
                            6
                            );
栈顶指针冲突了,希望可以帮到你

19504643 发表于 2012-11-2 21:55:06

好铁啊,正在学这个
页: [1]
查看完整版本: STM32 ucos-ii 灯闪烁不起来,大家帮我看看程序,求救