应客户要求,特修改库函数的第一个实验,在上面增加了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(使用微库)
//LED0 A8
//LED1 D2
//注意:在禁用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;
}
|