首页 > 代码库 > uC/OS-III学习2::uC/OS-III LED闪烁实验

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

1 前言:

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

2 硬件部分:

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

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

这样我们在编程时就可以对STM32进行GPIO端口的配置了。

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对应的GPIO端口初始化部分

/*****************************************************
* 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   :1?±?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   :′®?ú3?ê??ˉ
* Input         :
* Output        :
* Other         :
* Date          :
*******************************************************************************/
void USART_Config(USART_TypeDef* USARTx,u32 baud)
{
  USART_InitTypeDef USART_InitStructure;
  GPIO_InitTypeDef GPIO_InitStructure;

  //PA9,PA10 ?′ó?IO?ú1|?üó?óú????′®?ú?£òò′?òaê1?üAFIO£¨?′ó?1|?ü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;              //?′ó?í?íìê?3?
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  
  
  USART_InitStructure.USART_BaudRate =baud;                        //?ù?ê115200bps
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;        //êy?Y??8??
  USART_InitStructure.USART_StopBits = USART_StopBits_1;            //í£?1??1??
  USART_InitStructure.USART_Parity = USART_Parity_No;                //?TD£?é??
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;   //?Tó2?tá÷??
  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;                    //ê?·¢?£ê?

  /* Configure USART1 */
  USART_Init(USARTx, &USART_InitStructure);                            //????′®?ú2?êyoˉêy
 
  
  /* Enable USART1 Receive and Transmit interrupts */
  USART_ITConfig(USARTx, USART_IT_RXNE, ENABLE);                    //ê1?ü?óê??D??
  //USART_ITConfig(USARTx, USART_IT_TXE, ENABLE);                    //ê1?ü·¢?í?o3????D??

  
  /* Enable the USART1 */
  USART_Cmd(USARTx, ENABLE);    

  //USART_ClearFlag(USARTx, USART_FLAG_TXE);     /* ??·¢?ííê3é±ê??£?Transmission Complete flag */
}

BSP初始化

/*******************************************************************************
* Function Name :void BSP_Init(void)
* Description   :ó2?t3?ê??ˉ
* Input         :
* Output        :
* Other         :
* Date          :
*******************************************************************************/
void BSP_Init(void)
{
	NVIC_Configuration();	//?D??ó??è??éè??
	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);
    }
}

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