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);
} 你这样说让人费解啊,是亮一下不亮了呢?还是根本就不亮? 应该是
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语句看看。 首先应该确认移植的是否正确吧, 如果移植没问题的话再看应用程序吧, 本帖最后由 sunkey 于 2012-6-21 20:31 编辑
感觉这块儿有点问题,顺序倒一下
OSTaskSuspend(OS_PRIO_SELF);
OS_EXIT_CRITICAL();
l另外SysTick_Configuration 没有用到啊, 加到第一个建立的任务里面.用来做osii tick #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);
} 现在的情况是灯是常亮,我从新写了下程序,仍然无法让灯闪烁起来,求大家帮忙 延时时间? 中断向量配置了吗?startup_stm32f10x_md.c里的。 和我一样的问题,粗心的原因
OSTaskCreate(Task1Task,
(void *)0,
(OS_STK *)&Task1TaskStk,
7
);
OSTaskCreate(Task2Task,
(void *)0,
(OS_STK *)&Task1TaskStk,
6
);
栈顶指针冲突了,希望可以帮到你 好铁啊,正在学这个
页:
[1]