标题:
STM32F103在uCOS_II操作系统下按键防抖例子
[打印本页]
作者:
lql441
时间:
2017-11-29 08:52
标题:
STM32F103在uCOS_II操作系统下按键防抖例子
奉献 STM32F103在uCOS_II操作系统下按键防抖例子
单片机源程序如下:
/******************** (C) COPYRIGHT 2013 STMicroelectronics ********************
* File Name : main.c
* Version : V2.0.1
* Description : STM32神舟III号开发板 广州
*******************************************************************************/
#include "includes.h"
#include "stm32f10x.h"
#include "stm32f10x_rcc.h"
const uint32_t SystemFrequency = 72000000; /*!< System Clock Frequency (Core Clock) */
#define USER1_KEY_PIN GPIO_Pin_8
/*神州III号LED灯相关定义*/
#define RCC_GPIO_LED RCC_APB2Periph_GPIOF /*LED使用的GPIO时钟*/
#define LEDn 4 /*神舟III号LED数量*/
#define GPIO_LED GPIOF /*神舟III号LED灯使用的GPIO组*/
#define DS1_PIN GPIO_Pin_6 /*DS1使用的GPIO管脚*/
#define DS2_PIN GPIO_Pin_7 /*DS2使用的GPIO管脚*/
#define DS3_PIN GPIO_Pin_8 /*DS3使用的GPIO管脚*/
#define DS4_PIN GPIO_Pin_9 /*DS4使用的GPIO管脚*/
GPIO_InitTypeDef GPIO_InitStructure;
#define START_TASK_PRIO 4
#define TASK_1_PRIO 5
#define TASK_2_PRIO 6
#define TASK_3_PRIO 7
#define TASK_KEY_PRIO 8
/************设置栈大小(单位为 OS_STK )************/
#define START_TASK_STK_SIZE 100
#define TASK_1_STK_SIZE 100
#define TASK_2_STK_SIZE 100
#define TASK_3_STK_SIZE 100
#define TASK_KEY_STK_SIZE 100
uint8_t LEDSTATE=0;
OS_STK start_task_stk[START_TASK_STK_SIZE]; //定义栈
OS_STK task_1_stk[TASK_1_STK_SIZE]; //定义栈
OS_STK task_2_stk[TASK_2_STK_SIZE]; //定义栈
OS_STK task_3_stk[TASK_2_STK_SIZE];
OS_STK task_key_stk[TASK_KEY_STK_SIZE];
void Task_1_Shenzhou(void *arg)
{
(void)arg; // 'arg' 并没有用到,防止编译器提示警告
while (1)
{
GPIO_ResetBits(GPIO_LED,DS3_PIN); //点亮LED3
OSTimeDlyHMSM(0, 0,0,300); //延时
GPIO_SetBits(GPIO_LED,DS3_PIN); //熄灭LED3
OSTimeDlyHMSM(0, 0,0,300); //延时
}
}
void Task_2_Shenzhou(void *arg)
{
(void)arg; // 'arg' 并没有用到,防止编译器提示警告
while (1)
{
GPIO_ResetBits(GPIO_LED,DS2_PIN); //点亮LED2
OSTimeDlyHMSM(0, 0,0,200); //延时
GPIO_SetBits(GPIO_LED,DS2_PIN); //熄灭LED2
OSTimeDlyHMSM(0, 0,0,200); //延时
}
}
void Task_3_Shenzhou(void *arg)
{
(void)arg; // 'arg' 并没有用到,防止编译器提示警告
while (1)
{
LEDSTATE=~LEDSTATE;
if(LEDSTATE)
{
GPIO_ResetBits(GPIO_LED,DS4_PIN);
}
else
{
GPIO_SetBits(GPIO_LED,DS4_PIN);
}
OSTaskDel (OS_PRIO_SELF);
}
}
void Task_key_Shenzhou(void *arg)
{
uint8_t keystate;
uint8_t key_press=0;
(void)arg;
while(1)
{
OSTimeDlyHMSM(0, 0,0,20);
keystate = GPIO_ReadInputDataBit(GPIOA,USER1_KEY_PIN);
if(keystate==1)
{
OSTimeDlyHMSM(0, 0,0,20);
keystate = GPIO_ReadInputDataBit(GPIOA,USER1_KEY_PIN);
if(keystate==1)
{
key_press=1;
}
}
if(keystate==0 && key_press==1)
{
key_press=0;
OSTaskCreate(Task_3_Shenzhou,(void *)0,&task_3_stk[TASK_3_STK_SIZE-1], TASK_3_PRIO);
}
}
}
void Task_Shenzhou(void *p_arg)
{
(void)p_arg; // 'p_arg' 并没有用到,防止编译器提示警告
OSTaskCreate(Task_1_Shenzhou,(void *)0,&task_1_stk[TASK_1_STK_SIZE-1], TASK_1_PRIO);//创建任务1
OSTaskCreate(Task_2_Shenzhou,(void *)0,&task_2_stk[TASK_2_STK_SIZE-1], TASK_2_PRIO);//创建任务2
OSTaskCreate(Task_key_Shenzhou,(void *)0,&task_key_stk[TASK_KEY_STK_SIZE-1], TASK_KEY_PRIO);
while (1)
{
GPIO_ResetBits(GPIO_LED,DS1_PIN); //点亮LED1
OSTimeDlyHMSM(0, 0,0,100);
GPIO_SetBits(GPIO_LED,DS1_PIN); //熄灭LED1
OSTimeDlyHMSM(0, 0,0,100);
}
}
int main(void)
{
SystemInit(); /* 配置系统时钟为72M */
SysTick_Config(SystemFrequency/OS_TICKS_PER_SEC); /* 初始化并使能SysTick定时器 */
/* 配置神舟III号LED灯使用的GPIO管脚模式 */
RCC_APB2PeriphClockCmd(RCC_GPIO_LED, ENABLE); /*使能LED灯使用的GPIO时钟*/
GPIO_InitStructure.GPIO_Pin = DS1_PIN|DS2_PIN|DS3_PIN|DS4_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
STM32F103-uCOS_II按键防抖例子.rar
(506.67 KB, 下载次数: 55)
2017-11-29 19:11 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
albert51
时间:
2017-12-25 17:13
感谢分享
作者:
w0can
时间:
2018-11-5 08:54
感谢分享
作者:
aslkdfjhg
时间:
2018-11-7 22:49
感谢分享。。。。。
作者:
hellowC8051
时间:
2019-11-29 08:31
感谢分享
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1