標題:
STM32F103在uCOSII按鍵防抖加郵箱傳遞信息
[打印本頁]
作者:
lql441
時間:
2017-11-29 09:30
標題:
STM32F103在uCOSII按鍵防抖加郵箱傳遞信息
奉獻 STM32F103在uCOS_II操作系統(tǒng)按鍵防抖加郵箱傳遞信息 例子
單片機源程序如下:
/******************** (C) COPYRIGHT 2013 STMicroelectronics ********************
* File Name : main.c
*******************************************************************************/
#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 //PA8
#define USER2_KEY_PIN GPIO_Pin_3 //PD3
/*神州III號LED燈相關定義*/
#define RCC_GPIO_LED RCC_APB2Periph_GPIOF /*LED使用的GPIO時鐘*/
#define LEDn 4 /*神舟III號LED數(shù)量*/
#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_4_PRIO 8
#define TASK_KEY_PRIO 9
/************設置棧大。▎挝粸 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_4_STK_SIZE 100
#define TASK_KEY_STK_SIZE 100
uint8_t LEDSTATE=0;
OS_EVENT *Sem;
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_3_STK_SIZE];
OS_STK task_4_stk[TASK_4_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_4_Shenzhou(void *arg)
{
uint8_t err;
(void)arg; // 'arg' 并沒有用到,防止編譯器提示警告
Sem = OSSemCreate(0);
while (1)
{
OSSemPend(Sem,0,&err);
LEDSTATE=~LEDSTATE;
if(LEDSTATE)
{
GPIO_ResetBits(GPIO_LED,DS4_PIN);
}
else
{
GPIO_SetBits(GPIO_LED,DS4_PIN);
}
}
}
void Task_key_Shenzhou(void *arg)
{
uint8_t user1keystate;
uint8_t user1key_press=0;
uint8_t user2keystate;
uint8_t user2key_press=0;
(void)arg;
while(1)
{
OSTimeDlyHMSM(0, 0,0,20);
user1keystate = GPIO_ReadInputDataBit(GPIOA,USER1_KEY_PIN);
user2keystate = GPIO_ReadInputDataBit(GPIOD,USER2_KEY_PIN);
if(user1keystate==0)
{
OSTimeDlyHMSM(0, 0,0,20);
user1keystate = GPIO_ReadInputDataBit(GPIOA,USER1_KEY_PIN);
if(user1keystate==0)
{
user1key_press=1;
}
}
if(user2keystate==0)
{
OSTimeDlyHMSM(0, 0,0,20);
user2keystate = GPIO_ReadInputDataBit(GPIOD,USER2_KEY_PIN);
if(user2keystate==0)
{
user2key_press=1;
}
}
if(user1keystate==1 && user1key_press==1)
{
user1key_press=0;
OSTaskCreate(Task_3_Shenzhou,(void *)0,&task_3_stk[TASK_3_STK_SIZE-1], TASK_3_PRIO);
}
if(user2keystate==1 && user2key_press==1)
{
user2key_press=0;
OSSemPost(Sem);
}
}
}
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);//創(chuàng)建任務1
OSTaskCreate(Task_2_Shenzhou,(void *)0,&task_2_stk[TASK_2_STK_SIZE-1], TASK_2_PRIO);//創(chuàng)建任務2
OSTaskCreate(Task_4_Shenzhou,(void *)0,&task_4_stk[TASK_4_STK_SIZE-1], TASK_4_PRIO);//創(chuàng)建任務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(); /* 配置系統(tǒng)時鐘為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;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIO_LED, &GPIO_InitStructure); /*神州III號使用的LED燈相關的GPIO口初始化*/
GPIO_SetBits(GPIO_LED,DS1_PIN|DS2_PIN|DS3_PIN|DS4_PIN); /*關閉所有的LED指示燈*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //USER1_KEY is PA8
GPIO_InitStructure.GPIO_Pin = USER1_KEY_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOA, &GPIO_InitStructure);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE); //USER2_KEY is PD3
GPIO_InitStructure.GPIO_Pin = USER2_KEY_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOD, &GPIO_InitStructure);
/******** UCOSII 操作系統(tǒng)初始化開始 { ***********************************************************/
OSInit(); /* UCOSII 操作系統(tǒng)初始化 */
/* UCOSII創(chuàng)建一個任務 */
OSTaskCreate(Task_Shenzhou,(void *)0,&start_task_stk[START_TASK_STK_SIZE-1], START_TASK_PRIO);
OSStart(); /* 啟動UCOSII操作系統(tǒng) */
/******** UCOSII 操作系統(tǒng)初始化結束 } ***********************************************************/
}
復制代碼
完整代碼下載:
STM32F103-uCOS_II按鍵防抖加郵箱傳遞信息.zip
(3.52 MB, 下載次數(shù): 19)
2017-11-29 09:30 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
lls5201
時間:
2019-1-22 10:21
怎么看不出是郵箱傳輸?
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1