找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2689|回复: 1
收起左侧

STM32F103在uCOSII按键防抖加邮箱传递信息

[复制链接]
ID:253140 发表于 2017-11-29 09:30 | 显示全部楼层 |阅读模式
奉献 STM32F103在uCOS_II操作系统按键防抖加邮箱传递信息 例子

单片机源程序如下:
  1. /******************** (C) COPYRIGHT 2013 STMicroelectronics ********************
  2. * File Name          : main.c
  3. *******************************************************************************/

  4. #include "includes.h"
  5. #include "stm32f10x.h"
  6. #include "stm32f10x_rcc.h"

  7. const uint32_t SystemFrequency         = 72000000;      /*!< System Clock Frequency (Core Clock) */

  8. #define USER1_KEY_PIN                                                                                GPIO_Pin_8                         //PA8
  9. #define        USER2_KEY_PIN                                                                                GPIO_Pin_3                        //PD3
  10. /*神州III号LED灯相关定义*/
  11. #define RCC_GPIO_LED                    RCC_APB2Periph_GPIOF    /*LED使用的GPIO时钟*/
  12. #define LEDn                            4                       /*神舟III号LED数量*/
  13. #define GPIO_LED                        GPIOF                   /*神舟III号LED灯使用的GPIO组*/

  14. #define DS1_PIN                         GPIO_Pin_6              /*DS1使用的GPIO管脚*/
  15. #define DS2_PIN                         GPIO_Pin_7                                /*DS2使用的GPIO管脚*/
  16. #define DS3_PIN                         GPIO_Pin_8                          /*DS3使用的GPIO管脚*/
  17. #define DS4_PIN                         GPIO_Pin_9                                /*DS4使用的GPIO管脚*/

  18. GPIO_InitTypeDef GPIO_InitStructure;

  19. #define START_TASK_PRIO       4
  20. #define        TASK_1_PRIO                        5
  21. #define        TASK_2_PRIO                        6
  22. #define        TASK_3_PRIO                        7
  23. #define        TASK_4_PRIO                        8
  24. #define        TASK_KEY_PRIO                9

  25. /************设置栈大小(单位为 OS_STK )************/
  26. #define START_TASK_STK_SIZE   100  
  27. #define        TASK_1_STK_SIZE                100
  28. #define        TASK_2_STK_SIZE                100
  29. #define        TASK_3_STK_SIZE   100
  30. #define        TASK_4_STK_SIZE   100
  31. #define        TASK_KEY_STK_SIZE   100

  32. uint8_t LEDSTATE=0;
  33. OS_EVENT *Sem;
  34. OS_STK start_task_stk[START_TASK_STK_SIZE];                  //定义栈
  35. OS_STK task_1_stk[TASK_1_STK_SIZE];                  //定义栈
  36. OS_STK task_2_stk[TASK_2_STK_SIZE];                  //定义栈
  37. OS_STK task_3_stk[TASK_3_STK_SIZE];
  38. OS_STK task_4_stk[TASK_4_STK_SIZE];
  39. OS_STK task_key_stk[TASK_KEY_STK_SIZE];

  40. void Task_1_Shenzhou(void *arg)
  41. {
  42.     (void)arg;                                // 'arg' 并没有用到,防止编译器提示警告
  43.     while (1)
  44.     {
  45.                         GPIO_ResetBits(GPIO_LED,DS3_PIN); //点亮LED3
  46.                         OSTimeDlyHMSM(0, 0,0,300);                                  //延时
  47.                         GPIO_SetBits(GPIO_LED,DS3_PIN);          //熄灭LED3
  48.                         OSTimeDlyHMSM(0, 0,0,300);                  //延时  
  49.     }
  50. }

  51. void Task_2_Shenzhou(void *arg)
  52. {
  53.     (void)arg;                                // 'arg' 并没有用到,防止编译器提示警告
  54.     while (1)
  55.     {
  56.                         GPIO_ResetBits(GPIO_LED,DS2_PIN); //点亮LED2
  57.                         OSTimeDlyHMSM(0, 0,0,200);                                          //延时
  58.                         GPIO_SetBits(GPIO_LED,DS2_PIN);          //熄灭LED2
  59.                         OSTimeDlyHMSM(0, 0,0,200);                          //延时
  60.     }
  61. }

  62. void Task_3_Shenzhou(void *arg)
  63. {
  64.                 (void)arg;                                // 'arg' 并没有用到,防止编译器提示警告
  65.     while (1)
  66.     {
  67.                         LEDSTATE=~LEDSTATE;
  68.                        
  69.                         if(LEDSTATE)
  70.                         {
  71.                                 GPIO_ResetBits(GPIO_LED,DS4_PIN);       
  72.                         }
  73.                         else
  74.                         {
  75.                                 GPIO_SetBits(GPIO_LED,DS4_PIN);
  76.                         }
  77.                         OSTaskDel (OS_PRIO_SELF);
  78.     }
  79. }

  80. void Task_4_Shenzhou(void *arg)
  81. {
  82.                 uint8_t err;
  83.        
  84.                 (void)arg;                                // 'arg' 并没有用到,防止编译器提示警告
  85.        
  86.                 Sem = OSSemCreate(0);
  87.        
  88.     while (1)
  89.     {       
  90.                         OSSemPend(Sem,0,&err);
  91.                         LEDSTATE=~LEDSTATE;
  92.                         if(LEDSTATE)
  93.                         {
  94.                                 GPIO_ResetBits(GPIO_LED,DS4_PIN);       
  95.                         }
  96.                         else
  97.                         {
  98.                                 GPIO_SetBits(GPIO_LED,DS4_PIN);
  99.                         }
  100.     }
  101. }

  102. void Task_key_Shenzhou(void *arg)
  103. {
  104.                 uint8_t user1keystate;
  105.                 uint8_t user1key_press=0;
  106.        
  107.                 uint8_t user2keystate;
  108.                 uint8_t user2key_press=0;
  109.        
  110.                 (void)arg;
  111.                 while(1)
  112.                 {
  113.                        
  114.                         OSTimeDlyHMSM(0, 0,0,20);
  115.                         user1keystate = GPIO_ReadInputDataBit(GPIOA,USER1_KEY_PIN);
  116.                         user2keystate = GPIO_ReadInputDataBit(GPIOD,USER2_KEY_PIN);
  117.                         if(user1keystate==0)
  118.                         {
  119.                                         OSTimeDlyHMSM(0, 0,0,20);
  120.                                         user1keystate = GPIO_ReadInputDataBit(GPIOA,USER1_KEY_PIN);
  121.                                         if(user1keystate==0)
  122.                                         {
  123.                                                 user1key_press=1;
  124.                                         }
  125.                         }
  126.                         if(user2keystate==0)
  127.                         {
  128.                                         OSTimeDlyHMSM(0, 0,0,20);
  129.                                         user2keystate = GPIO_ReadInputDataBit(GPIOD,USER2_KEY_PIN);
  130.                                         if(user2keystate==0)
  131.                                         {
  132.                                                 user2key_press=1;
  133.                                         }
  134.                         }
  135.                         if(user1keystate==1 && user1key_press==1)
  136.                         {
  137.                                         user1key_press=0;
  138.                                         OSTaskCreate(Task_3_Shenzhou,(void *)0,&task_3_stk[TASK_3_STK_SIZE-1], TASK_3_PRIO);
  139.                         }
  140.                         if(user2keystate==1 && user2key_press==1)
  141.                         {
  142.                                         user2key_press=0;
  143.                                         OSSemPost(Sem);
  144.                         }
  145.                 }
  146. }

  147. void Task_Shenzhou(void *p_arg)
  148. {
  149.     (void)p_arg;               // 'p_arg' 并没有用到,防止编译器提示警告

  150.         OSTaskCreate(Task_1_Shenzhou,(void *)0,&task_1_stk[TASK_1_STK_SIZE-1], TASK_1_PRIO);//创建任务1

  151.         OSTaskCreate(Task_2_Shenzhou,(void *)0,&task_2_stk[TASK_2_STK_SIZE-1], TASK_2_PRIO);//创建任务2
  152.        
  153.         OSTaskCreate(Task_4_Shenzhou,(void *)0,&task_4_stk[TASK_4_STK_SIZE-1], TASK_4_PRIO);//创建任务2

  154.         OSTaskCreate(Task_key_Shenzhou,(void *)0,&task_key_stk[TASK_KEY_STK_SIZE-1], TASK_KEY_PRIO);
  155.        
  156.     while (1)
  157.     {
  158.                         GPIO_ResetBits(GPIO_LED,DS1_PIN); //点亮LED1
  159.                         OSTimeDlyHMSM(0, 0,0,100);
  160.                         GPIO_SetBits(GPIO_LED,DS1_PIN);          //熄灭LED1
  161.                         OSTimeDlyHMSM(0, 0,0,100);
  162.     }
  163. }

  164. int main(void)
  165. {
  166.         SystemInit();                /* 配置系统时钟为72M */       

  167.         SysTick_Config(SystemFrequency/OS_TICKS_PER_SEC);  /* 初始化并使能SysTick定时器        */

  168.   /* 配置神舟III号LED灯使用的GPIO管脚模式 */
  169.           RCC_APB2PeriphClockCmd(RCC_GPIO_LED, ENABLE);           /*使能LED灯使用的GPIO时钟*/
  170.           GPIO_InitStructure.GPIO_Pin = DS1_PIN|DS2_PIN|DS3_PIN|DS4_PIN;
  171.           GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  172.           GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  173.           GPIO_Init(GPIO_LED, &GPIO_InitStructure);               /*神州III号使用的LED灯相关的GPIO口初始化*/
  174.           GPIO_SetBits(GPIO_LED,DS1_PIN|DS2_PIN|DS3_PIN|DS4_PIN); /*关闭所有的LED指示灯*/
  175.        
  176.                 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //USER1_KEY is PA8
  177.     GPIO_InitStructure.GPIO_Pin = USER1_KEY_PIN;
  178.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  179.     GPIO_Init(GPIOA, &GPIO_InitStructure);
  180.        
  181.                 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE); //USER2_KEY is PD3
  182.     GPIO_InitStructure.GPIO_Pin = USER2_KEY_PIN;
  183.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  184.     GPIO_Init(GPIOD, &GPIO_InitStructure);

  185. /******** UCOSII 操作系统初始化开始 { ***********************************************************/
  186.         OSInit();        /* UCOSII 操作系统初始化 */

  187.         /* UCOSII创建一个任务 */                  
  188.         OSTaskCreate(Task_Shenzhou,(void *)0,&start_task_stk[START_TASK_STK_SIZE-1], START_TASK_PRIO);

  189.         OSStart();                 /* 启动UCOSII操作系统 */
  190. /******** UCOSII 操作系统初始化结束 } ***********************************************************/
  191. }

复制代码

完整代码下载:
STM32F103-uCOS_II按键防抖加邮箱传递信息.zip (3.52 MB, 下载次数: 19)
回复

使用道具 举报

ID:387410 发表于 2019-1-22 10:21 | 显示全部楼层
怎么看不出是邮箱传输啊?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表