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);
}这里我们利用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);
}
}uC/OS-III学习2::uC/OS-III LED闪烁实验,布布扣,bubuko.com
uC/OS-III学习2::uC/OS-III LED闪烁实验
原文地址:http://blog.csdn.net/long___fei/article/details/26143187