奉獻 STM32F103在uCOS_II操作系統按鍵防抖加郵箱傳遞信息 例子
單片機源程序如下:
- /******************** (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數量*/
- #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);//創建任務1
- OSTaskCreate(Task_2_Shenzhou,(void *)0,&task_2_stk[TASK_2_STK_SIZE-1], TASK_2_PRIO);//創建任務2
-
- OSTaskCreate(Task_4_Shenzhou,(void *)0,&task_4_stk[TASK_4_STK_SIZE-1], TASK_4_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;
- 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 操作系統初始化開始 { ***********************************************************/
- OSInit(); /* UCOSII 操作系統初始化 */
- /* UCOSII創建一個任務 */
- OSTaskCreate(Task_Shenzhou,(void *)0,&start_task_stk[START_TASK_STK_SIZE-1], START_TASK_PRIO);
- OSStart(); /* 啟動UCOSII操作系統 */
- /******** UCOSII 操作系統初始化結束 } ***********************************************************/
- }
復制代碼
完整代碼下載:
STM32F103-uCOS_II按鍵防抖加郵箱傳遞信息.zip
(3.52 MB, 下載次數: 19)
2017-11-29 09:30 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|