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,只是作为学习笔记之用,欢迎大家一起讨论,有不妥的地方,很感谢各位指导。希望自己在慢慢的嵌入式学习之路上能够有所收获。好了,今天的小实验就介绍到这里了。
- uC/OS-III学习2::uC/OS-III LED闪烁实验
- uC/OS-III学习1::uC/OS-III介绍
- uC/OS-III Note
- uc/os-iii学习笔记-OSTaskCreate
- uc/os-iii学习笔记-临界段
- uc/os-iii学习笔记-任务管理
- uc/os-iii学习笔记-任务调度
- uc/os-iii学习笔记-任务切换
- uc/os-iii学习笔记-中断管理
- uc/os-iii学习笔记-时间管理
- uc/os-iii学习笔记-消息传递
- uC/OS-III 学习笔记 (X)
- uC/OS-III之学习总结
- uC/OS-III移植基本条件
- uC/OS-III 的特点
- uC/OS-III 函数整理
- uC/OS-III 函数整理
- stm32F103C8T6使用uC/OS-III
- asp购物车源码
- javascript函数,变量声明及作用域详解
- PHP一个公司联系页面
- 编写一函数,由实参数来一个字符串,统计此字符串中字母、数字、空格和其它字符的个数,在主函数中输入字符串以及输出上述的结果
- 【OpenCV】openCV2.4.9+VS2010链接库配置
- uC/OS-III学习2::uC/OS-III LED闪烁实验
- Android+按键事件处理详解
- 设计模式学习--------9.生成器模式学习
- 字符集与编码小论
- 是原生的但带反射的 C++/CX
- python中的数据结构
- 1 iOS概述,MVC,Objective-C(1)
- 九度 1518 :反转链表
- Android的frameworks层键盘事件处理流程分析