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

来源:互联网 发布:国家社科期刊数据库 编辑:程序博客网 时间:2024/06/05 08:41

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   :¹Ø±Õ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);    }}

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

1 0
原创粉丝点击