OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 12381|回复: 0

库函数版本UCOS例程

[复制链接]

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2011-12-9 10:46:31 | 显示全部楼层 |阅读模式

应客户要求,特修改库函数的第一个实验,在上面增加了UCOS支持,实现功能和寄存器版本的ucos一样,轮流点灯.红灯闪烁1秒一次,绿灯闪烁400ms一次.



/**********************************************
File Name: ALIENTEK MINISTM32 实验1 跑马灯(库)
Revision:
Corporation:
Microcontroller Corporation:ST
Microcontroller name:STM32F103RBT6 ARM
Compiler: Keil MDK_ARM 4.11
Author: moweidong
E-mail: moweidongsabbit@21cn.com
Date : 2010.12.05
*********************************************/
//仿真仪器设备:
//ALIENTEK_MiniSTM32_REVB0开发板
//JTAG V7
/*********************************************
//库
//CMSIS:V1.20
//STM32F10x_StdPeriph_Driver:V3.1.1
*********************************************/

//本程序使用了printf用于在LCD和串口显示数据,因些对Option for Target属性有如下更改
//Target选项页:勾中Use MicroLIB(使用微库)

//LED0A8
//LED1D2

//注意:在禁用JTAG接后后可这样恢复:
//1.设置KEIL为JTAG或SW下载模式
//2.给板上电,按下板上的复位按键不放,点击KEIL下的FLASH下载按钮,使JTAG或SW下载工具检测完成接口后立刻放开,
//此目的在于争取IC在上电的时候有控制权,使在未进入禁用JTAG或SW生效的时候取可控制IC进行烧录

#include "stm32f10x.h"
#include "LCD.h"
#include "eval.h"
#include "SysTickDelay.h"
#include "UART_INTERFACE.h"
#include <stdio.h>
#include "includes.h"

//设置任务堆栈大小
#define LED_STK_SIZE     64
#define LED1_STK_SIZE    64
#define START_STK_SIZE   128

//设置任务优先级
#define LED_TASK_Prio       9
#define LED1_TASK_Prio      5
#define START_TASK_Prio     10

//任务堆栈
OS_STK  TASK_LED1_STK[LED_STK_SIZE];
OS_STK  TASK_LED_STK[LED_STK_SIZE];
OS_STK  TASK_START_STK[START_STK_SIZE];
//任务申明
void TaskStart(void *pdata);
void TaskLed(void *pdata);
void TaskLed1(void *pdata);

//系统时钟配置函数
void SysTick_Configuration(void);

 


//GPIO引脚配置
void GPIO_Configuration(void)
{    
 STM_EVAL_LEDInit(LED1);
 STM_EVAL_LEDInit(LED2);
}

//系统中断管理
void NVIC_Configuration(void)
{
 //NVIC_InitTypeDef NVIC_InitStructure;
  /* Configure the NVIC Preemption Priority Bits */ 
 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); //设置优先级分组:先占优先级0位,从优先级4位
  //设置向量表的位置和偏移
 #ifdef  VECT_TAB_RAM 
  /* Set the Vector Table base location at 0x20000000 */
  NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);   //向量表位于RAM
 #else  /* VECT_TAB_FLASH  */
  /* Set the Vector Table base location at 0x08000000 */
  NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);   //向量表位于FLASH
 #endif
}

//配置系统时钟,使能各外设时钟
void RCC_Configuration(void)
{
 SystemInit();  
}
//配置所有外设
void Init_All_Periph(void)

 RCC_Configuration(); 
  NVIC_Configuration();
  GPIO_Configuration();
  USART_Configuration(9600);
}

//开始任务
void TaskStart(void * pdata)
{
 pdata = pdata;
 OS_ENTER_CRITICAL();  
 OSTaskCreate(TaskLed, (void * )0, (OS_STK *)&TASK_LED_STK[LED_STK_SIZE-1], LED_TASK_Prio);
 OSTaskCreate(TaskLed1, (void * )0, (OS_STK *)&TASK_LED1_STK[LED1_STK_SIZE-1], LED1_TASK_Prio);
 OSTaskSuspend(START_TASK_Prio); //suspend but not delete
 OS_EXIT_CRITICAL();
}
//任务1
//控制DS0的亮灭.
void TaskLed(void *pdata)
{
 while(1)
 {
  STM_EVAL_LEDOn(LED1);
  OSTimeDlyHMSM(0,0,0,500); 
  STM_EVAL_LEDOff(LED1);
  OSTimeDlyHMSM(0,0,0,500); 
 }
}
//任务2
//控制DS1的亮灭.
void TaskLed1(void *pdata)
{
 while(1)
 {
  STM_EVAL_LEDOn(LED2);
  OSTimeDlyHMSM(0,0,0,200); 
  STM_EVAL_LEDOff(LED2);
  OSTimeDlyHMSM(0,0,0,200); 
 }

 
//系统时钟中断服务函数
void SysTick_Handler(void)
{
 OS_ENTER_CRITICAL(); /* Tell uC/OS-II that we are starting an ISR  */
 OSIntNesting++;
 OS_EXIT_CRITICAL();
 OSTimeTick();        /* Call uC/OS-II's OSTimeTick()               */
 OSIntExit();         /* Tell uC/OS-II that we are leaving the ISR  */
}

//系统时钟配置,设计1ms产生一次中断
void SysTick_Configuration(void)
{
  SysTick->CTRL&=~(1<<2);//SYSTICK使用外部时钟源
 SysTick->CTRL|=1<<1;   //开启SYSTICK中断
 SysTick->LOAD=9000;    //产生1ms中断
 //bit2清空,选择外部时钟  HCLK/8
  SysTick->CTRL|=1<<0;   //开启SYSTICK
}

    
//主函数
//正点原子修改.
//本实验主要将寄存器版本的ucos移植到库函数上,给需要的朋友使用.
int main(void)

 Init_All_Periph();
 SysTick_Initaize();
 SysTick_Configuration();//配置systick时钟,系统滴答时钟为1ms,每秒钟中断次数为1000次
 OSInit();
 OSTaskCreate( TaskStart, //任务指针
     (void *)0, //任务参数
     (OS_STK *)&TASK_START_STK[START_STK_SIZE-1], //堆栈栈顶指针
     START_TASK_Prio ); //任务优先级
 OSStart(); //开始任务调度
 return 0; 
}

 

 

 



 

ALIENTEK MINISTM32 实验1 跑马灯(库_ucos).rar

386.94 KB, 下载次数: 1095

我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-24 16:45

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表