⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 stm32ucos.c

📁 STM32 中ucos的编写程序,系统时钟配置函数,主任务
💻 C
字号:
 
* Includes ------------------------------------------------------------------*/ 

#include "config.h"
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
//定义 堆栈大小
//#define TASK_STK_SIZE 128
#define TASK_STK_SIZE 128
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
//堆栈定义
INT32U STK_TASK_MAIN[TASK_STK_SIZE]; //主任务


INT32U STK_TASK_LED[TASK_STK_SIZE];
INT32U STK_TASK_LCD[TASK_STK_SIZE];
INT32U STK_TASK_RTC[TASK_STK_SIZE];
INT32U STK_TASK_USART[TASK_STK_SIZE];
INT32U STK_TASK_KEY[TASK_STK_SIZE];


/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/
//创建一个同步机制
OS_EVENT  *sem;
OS_EVENT  *KEY;
OS_EVENT  *RTC_Read;
OS_EVENT  *RTC_Write;
OS_EVENT  *Time;
OS_EVENT  *Time_write_Lcd;


char display;
INT8U TimeD[]={0x08,0x0C,0x0A,0x03,0x1C,0x00};


 void sleep(INT32U cnt)
{
INT32U i = 0;


for(i = 0; i < cnt; i++);
}


/***************************************************************************************
** 函数名称: InitSysTick
** 功能描述: 系统时钟配置函数  ,OS系统运行时钟
** 参    数: None
** 返 回 值: None 
** 日   期: 2008年11月27日
****************************************************************************************/
void InitSysTick(void)
{
    RCC_ClocksTypeDef  rcc_clocks;
    INT32U         cnts;
//第一种方法产生10ms
/*
  //设置重装值为900 
  SysTick_SetReload(900);
  //使能中断
  SysTick_ITConfig(ENABLE); 
  //计数使能 
  SysTick_CounterCmd(SysTick_Counter_Enable); */


//第二种访法
//得到RCC时钟
    RCC_GetClocksFreq(&rcc_clocks);
//设置计数值   72M/100
    cnts = (INT32U)rcc_clocks.HCLK_Frequency / OS_TICKS_PER_SEC;
//将cnts设置成为重装值
    SysTick_SetReload(cnts);
//配置系统时钟源为HCLK
    SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);
//计数使能
    SysTick_CounterCmd(SysTick_Counter_Enable);
   //使能中断
    SysTick_ITConfig(ENABLE);
}


void LedTask(void *pd)
{ 
    RTC_Read=OSSemCreate(1); //创建一个信号量
while(1)
{
OSTimeDly(OS_TICKS_PER_SEC);
GPIO_WriteBit(GPIOC, GPIO_Pin_9, (BitAction)(1-GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_9)));
OSTimeDly(OS_TICKS_PER_SEC); 
OSSemPost(RTC_Read);
}
}
void LCDTask(void *pd)
{ 
char data[30];
INT8U err;
INT8U *TIME;
u32 TY = 0, TM = 1, TD = 0;
u32 THH = 0, TMM = 0, TSS = 0;
while(1)
{  


 TIME =(INT8U*)OSMboxPend(Time_write_Lcd,OS_TICKS_PER_SEC*2,&err);
 if(err!=OS_TIMEOUT&&err!=OS_ERR_EVENT_TYPE&&err!=OS_ERR_PEND_ISR&&err!=OS_ERR_PEVENT_NULL)
{
  lcd_clear ();
  TY=TIME[0]+2000;
  TM=TIME[1];
  TD=TIME[2];
  THH=TIME[3];
  TMM=TIME[4];
  TSS=TIME[5];
  sprintf1(data,"Date: %0.4d-%0.2d-%0.2d",TY, TM, TD);
       set_cursor(0, 0);
       lcd_print (data); 
       sprintf1(data,"Time: %0.2d:%0.2d:%0.2d",THH, TMM, TSS);
       set_cursor(0, 1);
       lcd_print (data);
 }
  
 OSTimeDly(OS_TICKS_PER_SEC*2);


}
}
void RTC_Task(void *pd)
{ 
    INT8U *data;
INT8U err;
INT8U  TTime[6];
Time_write_Lcd=OSMboxCreate(NULL);   
while(1)
{


GPIO_WriteBit(GPIOC, GPIO_Pin_8, (BitAction)(1-GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_8)));
OSSemPend(RTC_Read,0,&err); 
read_RTC(TTime);
OSMboxPost(Time_write_Lcd,TTime);
OSSemPend(RTC_Write,OS_TICKS_PER_SEC,&err);
data =(INT8U*)OSMboxPend(Time,OS_TICKS_PER_SEC,&err);
 if(err!=OS_TIMEOUT&&err!=OS_ERR_EVENT_TYPE&&err!=OS_ERR_PEND_ISR&&err!=OS_ERR_PEVENT_NULL)
         write_RTC(data);
 OSTimeDly(OS_TICKS_PER_SEC*2);


}
}
void usartTask(void *pd)
{ 
INT8U ch[6]={0x00,},jug=0;
INT8U cn=0;
INT8U err;
INT32U time_cn=0;
OS_CPU_SR  cpu_sr;
   
Time=OSMboxCreate(NULL);
sem=OSSemCreate(1); //创建一个信号量
RTC_Write=OSSemCreate(1); //创建一个信号量   
while(1)
{  
  OS_ENTER_CRITICAL();   // 进入 临界段
    time_cn=SystemTime;
    UASRT1_Input_Index=0;
    OS_EXIT_CRITICAL(); // 退出临界段


OSSemPend(KEY,0,&err);
USART1_PutString("\r\ninput time:");
while((SystemTime-time_cn)<10)
{
 if(UASRTI_Process_Output())
 {
  USART1_PutChar((INT8U*)UASRT1_Input_Buffer,UASRT1_Input_Index);
  jug=1;  
 }
}
USART1_PutString("\r\n");
OSSemPost(sem);
if(jug==1)
{
  
    for(cn=0;cn<6;cn++)
  {
   ch[cn]=atoh((INT8U*)UASRT1_Input_Buffer+2*cn,2);
  }
       
  OSSemPost(RTC_Write);
  OSMboxPost(Time,ch);
}


   OSTimeDly(OS_TICKS_PER_SEC*2);
}
}
/***************************************************************************************
** 函数名称: KEYTask OS_MBOX_DATA
** 功能描述: 任务3
** 参    数: None
** 返 回 值: None 
** 日   期: 2008年11月27日
****************************************************************************************/
void KEYTask(void *pd)
{
  INT8U err;
pd=pd;
     
   KEY=OSSemCreate(1);
while(1)
{  
  OSSemPost(KEY);
  OSSemPend(sem,OS_TICKS_PER_SEC,&err); 
  GPIO_WriteBit(GPIOC, GPIO_Pin_6, (BitAction)(1-GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_6)));   
  OSTimeDly(OS_TICKS_PER_SEC*3);
  
}
}
/***************************************************************************************
** 函数名称: MainTask
** 功能描述: 主任务
** 参    数: None
** 返 回 值: None 
** 日   期: 2008年11月27日
****************************************************************************************/
void MainTask(void *pd)
{
   #ifdef DEBUG
    debug();
   #endif
    RCC_Configuration();
    NVIC_Configuration();
    GPIO_Configuration();
InitSysTick();
TM2_Configuration();
OSStatInit();
lcd_init();
USART1_Initialise();
    lcd_clear ();
RTC_init(TimeD);


  
OSTaskCreate(LedTask,     (void *)0,(OS_STK *)&STK_TASK_LED[TASK_STK_SIZE-1],  18);
OSTaskCreate(LCDTask,      (void *)0,(OS_STK *)&STK_TASK_LCD[TASK_STK_SIZE-1],  17);
OSTaskCreate(RTC_Task,    (void *)0,(OS_STK *)&STK_TASK_RTC[TASK_STK_SIZE-1],  19);
OSTaskCreate(usartTask,    (void *)0,(OS_STK *)&STK_TASK_USART[TASK_STK_SIZE-1],  16);
OSTaskCreate(KEYTask,    (void *)0,(OS_STK *)&STK_TASK_KEY[TASK_STK_SIZE-1],  15); 
while(1)
{
OSTimeDly(100);
OSTaskSuspend(OS_PRIO_SELF);                                // 启动任务在这里被挂起 
//任务可以删除
//OSTaskDel(14);
}
}


/***************************************************************************************
** 函数名称: main
** 功能描述: 主函数
** 参    数: None
** 返 回 值: None 
** 日   期: 2008年11月27日
****************************************************************************************/
int main(void)
{
OSInit();
OSTaskCreate(MainTask,    (void *)0,(OS_STK *)&STK_TASK_MAIN[TASK_STK_SIZE-1],  14);
OSStart();
} 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -