• uC/OS-III学习2::uC/OS-III LED闪烁实验


    1 前言:

    看完了uC/OS-III的基本介绍之后,大致对这个操作系统有了点了解,但真正的理解还是要通过不断的去使用,在使用中体验uC/OS-III的乐趣和更深的理解其工作原理是非常重要的因此,我在STM32上面移植好uC/OS-III后,就開始了自己的简单实验学习,至于怎么移植,书上还有网上有非常多參考资料,当然你也能够下载别人移植好的干净的项目project直接用也能够。本文主要介绍一下怎么利用uC/OS-III来控制STM32开发板上面的LED闪烁任务。

    2 硬件部分:

    这里并不为某个开发板打广告,我仅仅是刚好手边有个别人不用的STM32开发板拿来使用一下,真正的实验仅仅要知道其硬件的布局就够了,对比着硬件设计去编敲代码就OK了。以下介绍一下,我这个实验用到的硬件连接情况。

    实验的目的是使用uC/OS-III来控制4个LED同一时候闪烁,其硬件连接例如以下图所看到的:

    这样我们在编程时就能够对STM32进行GPIOport的配置了。

    3 软件部分:

    (1)BSP部分

    板级支持部分主要包括一些硬件的基本接口的初始化工作:LED初始化,RCC初始化,串口初始化,系统时钟初始化等。

    系统定时器时间配置

    /*******************************************************************************
    * Function Name :void SysTickInit(void)
    * Description   :系统定时器时间配置
    * Input         :
    * Output        :
    * Other         :
    * Date          :
    *******************************************************************************/
    void SysTickInit(void)
    {
    	SysTick_Config(SystemCoreClock / 1000);			//uCOSʱ»ù1ms
    }
    LED相应的GPIOport初始化部分

    /*****************************************************
    * Function Name :void LED_Init(void)
    * Description   :LED初始化
    * Input         :
    * Output        :
    * Other         :
    * Date          :
    *******************************************************/
    void LED_Init(void)
    {
    	GPIO_InitTypeDef GPIO_InitStructure;
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD , ENABLE);
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_7 ;
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
    	GPIO_Init(GPIOD, &GPIO_InitStructure);
    }
    /*****************************************************
    * Function Name :void led_on(CPU_INT32U n)
    * Description   :µãÁÁLED
    * Input         :
    * Output        :
    * Other         :
    * Date          :
    *******************************************************/
    void led_on(CPU_INT32U n)
    {
        switch (n)
        {
            case LED_1:
            GPIO_SetBits(GPIOD, GPIO_Pin_2);
            break;
            case LED_2:
            GPIO_SetBits(GPIOD, GPIO_Pin_3);
            break;
            case LED_3:
            GPIO_SetBits(GPIOD, GPIO_Pin_4);
            break;
            case LED_4:
            GPIO_SetBits(GPIOD, GPIO_Pin_7);
            break;
            
            default:
            break;
        }
    }
    
    /*****************************************************
    * Function Name :void led_of(CPU_INT32U n)
    * Description   :¹Ø±ÕLED
    * Input         :
    * Output        :
    * Other         :
    * Date          :
    *******************************************************/
    void led_off(CPU_INT32U n)
    {
        switch (n)
        {
            case LED_1:
            GPIO_ResetBits(GPIOD, GPIO_Pin_2);
            break;
            case LED_2:
            GPIO_ResetBits(GPIOD, GPIO_Pin_3);
            break;
            case LED_3:
            GPIO_ResetBits(GPIOD, GPIO_Pin_4);
            break;
            case LED_4:
            GPIO_ResetBits(GPIOD, GPIO_Pin_7);
            break;
    
            default:
            break;
        }
    }
    

    串口初始化

    /*******************************************************************************
    * Function Name :USART_Config(USART_TypeDef* USARTx,u32 baud)
    * Description   :´®¿Ú³õʼ»¯
    * Input         :
    * Output        :
    * Other         :
    * Date          :
    *******************************************************************************/
    void USART_Config(USART_TypeDef* USARTx,u32 baud)
    {
      USART_InitTypeDef USART_InitStructure;
      GPIO_InitTypeDef GPIO_InitStructure;
    
      //PA9,PA10 ¸´ÓÃIO¿Ú¹¦ÄÜÓÃÓÚÅäÖô®¿Ú¡£Òò´ËҪʹÄÜAFIO£¨¸´Óù¦ÄÜIO£©Ê±ÖÓ¡£
      RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); 
      RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);    
      RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
      
      //usart_init----------------------------------------------------
      /* Configure USART1 Rx (PA.10) as input floating */
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;          //¸¡¿ÕÊäÈëģʽ       
      GPIO_Init(GPIOA, &GPIO_InitStructure);                     
      
      /* Configure USART1 Tx (PA.9) as alternate function push-pull */
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;              //¸´ÓÃÍÆÍìÊä³ö
      GPIO_Init(GPIOA, &GPIO_InitStructure);
      
      
      USART_InitStructure.USART_BaudRate =baud;                        //ËÙÂÊ115200bps
      USART_InitStructure.USART_WordLength = USART_WordLength_8b;        //Êý¾Ýλ8λ
      USART_InitStructure.USART_StopBits = USART_StopBits_1;            //ֹͣλ1λ
      USART_InitStructure.USART_Parity = USART_Parity_No;                //ÎÞУÑéλ
      USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;   //ÎÞÓ²¼þÁ÷¿Ø
      USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;                    //ÊÕ·¢Ä£Ê½
    
      /* Configure USART1 */
      USART_Init(USARTx, &USART_InitStructure);                            //ÅäÖô®¿Ú²ÎÊýº¯Êý
     
      
      /* Enable USART1 Receive and Transmit interrupts */
      USART_ITConfig(USARTx, USART_IT_RXNE, ENABLE);                    //ʹÄܽÓÊÕÖжÏ
      //USART_ITConfig(USARTx, USART_IT_TXE, ENABLE);                    //ʹÄÜ·¢ËÍ»º³å¿ÕÖжÏ
    
      
      /* Enable the USART1 */
      USART_Cmd(USARTx, ENABLE);    
    
      //USART_ClearFlag(USARTx, USART_FLAG_TXE);     /* Çå·¢ËÍÍê³É±êÖ¾£¬Transmission Complete flag */
    }
    

    BSP初始化

    /*******************************************************************************
    * Function Name :void BSP_Init(void)
    * Description   :Ó²¼þ³õʼ»¯
    * Input         :
    * Output        :
    * Other         :
    * Date          :
    *******************************************************************************/
    void BSP_Init(void)
    {
    	NVIC_Configuration();	//ÖжÏÓÅÏȼ¶ÉèÖÃ
    	LED_Init();
    	USART_Config(USART1,115200);
    }

    (2)应用程序部分

    这里我们利用UCOSIII来实现4个LED等同一时候闪烁的任务,我们建立5个任务:

       任务                                                                                      优先级

      TaskStart (启动任务)                                           STARTUP_TASK_PRIO   4
      Task1     (LED1闪烁任务)                                         TASK1_PRIO         5

      Task2     (LED2闪烁任务)                                         TASK2_PRIO         6

      Task3    (LED3闪烁任务)                                          TASK3_PRIO         10

      Task4   (LED4闪烁任务)                                           TASK4_PRIO          13

    static void Task1(void *p_arg)
    {
        OS_ERR err;
        
        while (1)
        {
            led_on(LED_1);
            OSTimeDly((OS_TICK)1000, 
                      (OS_OPT)OS_OPT_TIME_DLY, 
                      (OS_ERR*)&err);
            
            led_off(LED_1);
            OSTimeDly((OS_TICK)1000, 
                      (OS_OPT)OS_OPT_TIME_DLY, 
                      (OS_ERR*)&err);
        }
    }                                                                      
    
    static void Task2(void *p_arg)
    {
        OS_ERR err;
        while (1)
        {
            led_on(LED_2);
            OSTimeDly((OS_TICK)1000, 
                      (OS_OPT)OS_OPT_TIME_DLY, 
                      (OS_ERR*)&err);
            
            led_off(LED_2);
            OSTimeDly((OS_TICK)1000, 
                      (OS_OPT)OS_OPT_TIME_DLY, 
                      (OS_ERR*)&err);
        }
    }

    static void Task3(void *p_arg)
    {
        OS_ERR err;
        while (1)
        {
            led_on(LED_3);
            OSTimeDly((OS_TICK)1000, 
                      (OS_OPT)OS_OPT_TIME_DLY, 
                      (OS_ERR*)&err);
            
            led_off(LED_3);
            OSTimeDly((OS_TICK)1000, 
                      (OS_OPT)OS_OPT_TIME_DLY, 
                      (OS_ERR*)&err);
        }
    }
    

    static void Task4(void *p_arg)
    {
        OS_ERR err;
        while (1)
        {
            led_on(LED_4);
            OSTimeDly((OS_TICK)1000, 
                      (OS_OPT)OS_OPT_TIME_DLY, 
                      (OS_ERR*)&err);
            
            led_off(LED_4);
            OSTimeDly((OS_TICK)1000, 
                      (OS_OPT)OS_OPT_TIME_DLY, 
                      (OS_ERR*)&err);
        }
    }

    以上是基本的一些程序代码,完整的project代码见以下链接点击打开链接,因为刚開始学习UCOSIII,仅仅是作为学习笔记之用,欢迎大家一起讨论,有不妥的地方,非常感谢各位指导。希望自己在慢慢的嵌入式学习之路上可以有所收获。好了,今天的小实验就介绍到这里了。

  • 相关阅读:
    javascript 常见的面试题---数组 && 算法
    JavaScript内置一些方法的实现原理--new关键字,call/apply/bind方法--实现
    javascript 数组排序原理的简单理解
    随笔2
    移动端触摸事件
    前端开发模式的思考层面
    webpack & react项目搭建一:环境
    Webpack的学习
    《Soft Skills: the software developer's life manual》
    前端路由实现
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/3762719.html
Copyright © 2020-2023  润新知