/*实验现象是:烧一次代码时间更新一次,屏幕可以显示当前时间,但是时间不走。两个小灯可以正常闪烁,可是RTC这个任务优先级比小灯高,当执行到小灯的延时时应该回到RTC了啊,结果却停在了小灯闪烁,这是为什么啊?
#include "stm32f10x_lib.h"
#include "ad.h"
#include "lcd.h"
#include "flash.h"
#include "mmc_sd.h"
#include "text.h"
#include "fat.h"
#include "fontupd.h"
#include "rtc.h"
#include "ds18b20.h"
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "led.h"
#include "includes.h"
u8 i;
const u8 *COMPILED_DATE=__DATE__;//获得编译日期
const u8 *COMPILED_TIME=__TIME__;//获得编译时间
/////////////////////////UCOSII任务设置///////////////////////////////////
//START 任务
//设置任务优先级
#define START_TASK_PRIO 10 //开始任务的优先级设置为最低
//设置任务堆栈大小
#define START_STK_SIZE 64
//任务堆栈
OS_STK START_TASK_STK[START_STK_SIZE];
//任务函数
void start_task(void *pdata);
//LED0任务
//设置任务优先级
#define LED0_TASK_PRIO 8
//设置任务堆栈大小
#define LED0_STK_SIZE 64
//任务堆栈
OS_STK LED0_TASK_STK[LED0_STK_SIZE];
//任务函数
void led0_task(void *pdata);
//LED1任务
//设置任务优先级
#define LED1_TASK_PRIO 7
//设置任务堆栈大小
#define LED1_STK_SIZE 64
//任务堆栈
OS_STK LED1_TASK_STK[LED1_STK_SIZE];
//任务函数
void led1_task(void *pdata);
//RTC任务
//设置任务优先级
#define RTC_TASK_PRIO 5
//设置任务堆栈大小
#define RTC_STK_SIZE 64
//任务堆栈
OS_STK RTC_TASK_STK[RTC_STK_SIZE];
//任务函数
void rtc_task(void *pdata);
int main(void)
{
Stm32_Clock_Init(9); //系统时钟设置
delay_init(72); //延时初始化
uart_init(72,9600); //串口1初始化
LCD_Init(); //初始化液晶
SPI_Flash_Init(); //SPI FLASH初始化
Font_Init();
//RTC_Init();
LCD_Clear(BLACK );//清屏
POINT_COLOR=BRRED;
BACK_COLOR= BLACK;
LED_Init();
LED_Init(); //初始化与LED连接的硬件接口
RTC_Init();
OSInit();
OSTaskCreate(start_task,(void *)0,(OS_STK *)&START_TASK_STK[START_STK_SIZE-1],START_TASK_PRIO );//创建起始任务
OSStart();
}
//开始任务
void start_task(void *pdata)
{
OS_CPU_SR cpu_sr=0;
pdata = pdata;
OS_ENTER_CRITICAL(); //进入临界区(无法被中断打断)
OSTaskCreate(led0_task,(void *)0,(OS_STK*)&LED0_TASK_STK[LED0_STK_SIZE-1],LED0_TASK_PRIO);
OSTaskCreate(led1_task,(void *)0,(OS_STK*)&LED1_TASK_STK[LED1_STK_SIZE-1],LED1_TASK_PRIO);
// OSTaskCreate(ds18b20_task,(void *)0,(OS_STK*)&DS18B20_TASK_STK[DS18B20_STK_SIZE-1],DS18B20_TASK_PRIO);
OSTaskCreate(rtc_task,(void *)0,(OS_STK*)&RTC_TASK_STK[RTC_STK_SIZE-1],RTC_TASK_PRIO);
// OSTaskCreate(main_task,(void *)0,(OS_STK*)&MAIN_TASK_STK[MAIN_STK_SIZE-1],MAIN_TASK_PRIO);
OSTaskSuspend(START_TASK_PRIO); //挂起起始任务.
OS_EXIT_CRITICAL(); //退出临界区(可以被中断打断)
}
//LED0任务
void led0_task(void *pdata)
{
while(1)
{
LED0=0;
delay_ms(80);
LED0=1;
delay_ms(920);
}
}
//LED1任务
void led1_task(void *pdata)
{
while(1)
{
LED1=0;
delay_ms(300);
LED1=1;
delay_ms(300);
}
}
void rtc_task(void *pdata)
{
u8 t=0;
while(1)
{
RTC_Init();
Auto_Time_Set();
if(t!=timer.sec)
{
t=timer.sec;
//显示大体的时钟
POINT_COLOR=GBLUE;
BACK_COLOR=BLACK ;
LCD_ShowBigNum(0,100,timer.hour);//显示时
LCD_ShowBigChar(60,100,':'); //"/"
LCD_ShowBigNum(90,100,timer.min);//显示分
LCD_ShowBigChar(150,100,':'); //"/"
LCD_ShowBigNum(180,100,timer.sec);//显示秒
POINT_COLOR=BRRED;
Show_Str24(120,190,"星期",1);
switch(timer.week)
{
case 0:
Show_Str24(170,190,"一",0);
break;
case 1:
Show_Str24(170,190,"二",0);
break;
case 2:
Show_Str24(170,190,"三",0);
break;
case 3:
Show_Str24(170,190,"四",0);
break;
case 4:
Show_Str24(170,190,"五",0);
break;
case 5:
Show_Str24(170,190,"六",0);
break;
case 6:
Show_Str24(170,190,"七",0);
break;
}
POINT_COLOR=GREEN ;
LCD_Show2Num(5,193,(timer.w_year/100)%100,2,16,0);//显示年 20/19
LCD_Show2Num(21,193,timer.w_year%100,2,16,0); //显示年
LCD_ShowString(37,193,"-"); //"-"
LCD_Show2Num(45,193,timer.w_month,2,16,0); //显示月
LCD_ShowString(61,193,"-"); //"-"
LCD_Show2Num(69,193,timer.w_date,2,16,0); //显示日
}
delay_ms(10);
}
}