我是用MINI STM32版的开发板,用寄存器版重新完成挂起和恢复任务功能。
出现以下错误现象:
1.当除去LCD和触摸功能,只保留LED0,LDE1,KEY功能时,LED0,LED1能正常显示,但是当按下key0,key1,wk_up当中任一个按键时(哪怕任何返回的按键值没有设置其他功能),LED0,LED1就会停止闪烁,再次按任何按键都没有用,key的延时函数删掉了
2.当添加LCD和触摸功能时(LED0,LED1,key功能都在),LCD显示的画面,触摸屏的画面,LED0,LED1都会出现,但是就是不变化,感觉操作执行完每个任务后直接一直运行空闲任务了,按键也没有。
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "led.h"
#include "key.h"
#include "24cxx.h"
#include "lcd.h"
#include "touch.h"
#include "includes.h"
//Mini STM32开发板扩展实例 8
//ucos 实验
//正点原子@ALIENTEK
//技术支持:www.openedv.com
//设置任务堆栈大小
#define LED_STK_SIZE 64
#define LED1_STK_SIZE 64
//#define LCD_STK_SIZE 64
#define KEY_STK_SIZE 64
//#define TOUCH_STK_SIZE 64
#define START_STK_SIZE 512
//设置任务优先级
//注意:在设置优先级时,应该先在os_cfg.h中设置OS_LOWEST_PRIO的值
#define LED_TASK_Prio 6
#define LED1_TASK_Prio 5
//#define LCD_TASK_Prio 4
#define KEY_TASK_Prio 2
//#define TOUCH_TASK_Prio 7
#define START_TASK_Prio 10
//任务堆栈
OS_STK TASK_LED1_STK[LED_STK_SIZE];
OS_STK TASK_LED_STK[LED1_STK_SIZE];
//OS_STK TASK_LCD_STK[LCD_STK_SIZE];
OS_STK TASK_START_STK[START_STK_SIZE];
OS_STK TASK_KEY_STK[KEY_STK_SIZE];
//OS_STK TASK_TOUCH_STK[TOUCH_STK_SIZE];
//任务申明
void TaskStart(void *pdata);
void TaskLed(void *pdata);
void TaskLed1(void *pdata);
//void TaskLCD(void *pdata);
void TaskKey(void *pdata);
//void TaskTouch(void *pdata);
//系统时钟配置函数
void SysTick_Configuration(void);
////加载触摸画板函数
// void Load_Drow_Dialog(void)
//{
// LCD_Fill(0, 180,240,320,WHITE);
//  OINT_COLOR=BLUE;//设置字体为蓝色
// LCD_ShowString(216,304,"RST");//显示清屏区域
// LCD_DrawLine(0, 158, 240, 158);
//  OINT_COLOR=RED;//设置画笔蓝色
//}
////进入触摸屏校准函数
// void Load_Adjust_Panel()
// {
// LCD_Clear(WHITE);//清屏
// Touch_Adjust(); //屏幕校准
// Save_Adjdata();
// Load_Drow_Dialog();
// }
int main(void)
{
Stm32_Clock_Init(9); //系统时钟设置
delay_init(72); //延时初始化
uart_init(72,9600); //串口初始化为9600
LED_Init(); //LED端口初始化
KEY_Init(); //KEY按键端口初始化
//LCD_Init();
SysTick_Configuration();
//删除了SPI_Flash_Init();
//AT24CXX_Init(); //IIC初始化
//Touch_Init();
//Load_Drow_Dialog();
//POINT_COLOR=RED;
OSInit();
OSTaskCreate( TaskStart, //task pointer
(void *)0, //parameter
(OS_STK *)&TASK_START_STK[START_STK_SIZE-1], //task stack top pointer
START_TASK_Prio ); //task priority
OSStart();
return 0;
}
//开始任务
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);
//OSTaskCreate(TaskLCD, (void * )0, (OS_STK *)&TASK_LCD_STK[LCD_STK_SIZE-1], LCD_TASK_Prio);
OSTaskCreate(TaskKey, (void * )0, (OS_STK *)&TASK_KEY_STK[KEY_STK_SIZE-1], KEY_TASK_Prio);
//OSTaskCreate(TaskTouch, (void * )0, (OS_STK *)&TASK_TOUCH_STK[TOUCH_STK_SIZE-1], TOUCH_TASK_Prio);
OSTaskSuspend(START_TASK_Prio); //挂起自身任务,进入等待状态,暂停但不删除suspend but not delete
OS_EXIT_CRITICAL(); //注意,当挂起的任务是自身任务时,参数必须是OS_PRIO_SELF
}
//任务1
//控制DS0的亮灭.
void TaskLed(void *pdata)
{
while(1)
{
if(OSTaskDelReq(OS_PRIO_SELF)==OS_TASK_DEL_REQ) //判断是否有删除请求
OSTaskDel(OS_PRIO_SELF); //删除任务本身TaskLed
LED0=!LED0;
OSTimeDlyHMSM(0,0,0,500);
}
}
//任务2
//控制DS1的亮灭.
void TaskLed1(void *pdata)
{
while(1)
{
LED1=!LED1;
OSTimeDlyHMSM(0,0,0,200);
}
}
//任务3
//按键检测
void TaskKey(void *pdata)
{ u8 key=0;
while(1){
key=KEY_Scan();
key=key;
if(key==1)
{
LED1=0;
LED0=0;
OSTaskSuspend(LED_TASK_Prio); //Key0挂起任务
}
else if(key==2)
{
OSTaskResume(LED_TASK_Prio); //Key1恢复任务
}
else if(key==3)
{
OSTaskDelReq(LED_TASK_Prio); //请求删除任务
}
OSTimeDlyHMSM(0,0,0,20);
}
}
////液晶显示
// void TaskLCD(void *pdata){
// u8 colorIndex=0;
// u16 colorTable[]={BLACK,YELLOW,RED,GREEN};
// LCD_ShowString(10,4,"LCD Display Panel");
// while(1)
// {
// if(OSTaskDelReq(OS_PRIO_SELF)==OS_TASK_DEL_REQ)
// OSTaskDel(OS_PRIO_SELF);
// if(colorIndex==4)
// colorIndex=0;
// LCD_Fill(80,40,160,120,colorTable[colorIndex]);
// colorIndex++;
// OSTimeDlyHMSM(0,0,0,400);
// }
// }
//
//
//
//
// //触摸功能
//void TaskTouch(void *pdata)
// { LCD_ShowString(10,160,"Touch Panel");
// while(1)
// { MY_NVIC_Init(2,0,EXTI1_IRQChannel,2);
// if(Pen_Point.Key_Sta==Key_Down)//触摸屏被按下
// {
//  en_Int_Set(0);//关闭中断
// Convert_Pos();
//  en_Point.Key_Sta=Key_Up;
// if(Pen_Point.X0>216&&en_Point.Y0>304)Load_Drow_Dialog();//清除
// else if(Pen_Point.Y0>180)
// {
// Draw_Big_Point(Pen_Point.X0,Pen_Point.Y0);//画图
//
// }
//  en_Int_Set(1);//开启中断
// }
// OSTimeDlyHMSM(0,0,0,2);
// };
// }
//系统时钟中断服务函数
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
}
KEY文件
#include "key.h"
#include "delay.h"
//////////////////////////////////////////////////////////////////////////////////
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//Mini STM32开发板
//按键输入 驱动代码
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//修改日期:2010/11/28
//版本:V1.1
//版权所有,盗版必究。
//Copyright(C) 正点原子 2009-2019
//All rights reserved
//********************************************************************************
//V1.1修改说明
//修改按键扫描函数,使整个代码可以支持SWD下载。
//////////////////////////////////////////////////////////////////////////////////
//按键初始化函数
//特别注意:在该函数之后,JTAG将无法使用(SWD也无法使用)
//如果想JTAG仿真,可以屏蔽该函数。
//PA0.13.15 设置成输入
void KEY_Init(void)
{
RCC->APB2ENR|=1<<2; //使能PORTA时钟
GPIOA->CRL&=0XFFFFFFF0;//PA0设置成输入
GPIOA->CRL|=0X00000008;
GPIOA->CRH&=0X0F0FFFFF;//PA13,15设置成输入
GPIOA->CRH|=0X80800000;
GPIOA->ODR|=1<<13; //PA13上拉,PA0默认下拉
GPIOA->ODR|=1<<15; //PA15上拉
}
//按键处理函数
//返回按键值
//0,没有任何按键按下
//1,KEY0按下
//2,KEY1按下
//3,KEY2按下 WK_UP
//注意此函数有响应优先级,KEY0>KEY1>KEY2!!
u8 KEY_Scan(void)
{
static u8 key_up=1;//按键按松开标志
//JTAG_Set(JTAG_SWD_DISABLE);
if(key_up&&(KEY0==0||KEY1==0||KEY2==1))
{
key_up=0;
if(KEY0==0)
{
//JTAG_Set(SWD_ENABLE);
return 1;
}
else if(KEY1==0)
{
//JTAG_Set(SWD_ENABLE);
return 2;
}
else if(KEY2==1)
{
//JTAG_Set(SWD_ENABLE);
return 3;
}
}else if(KEY0==1&&KEY1==1&&KEY2==0)key_up=1;
//JTAG_Set(SWD_ENABLE);
return 0;// 无按键按下
}
|