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,仅仅是作为学习笔记之用,欢迎大家一起讨论,有不妥的地方,非常感谢各位指导。希望自己在慢慢的嵌入式学习之路上可以有所收获。好了,今天的小实验就介绍到这里了。
uC/OS-III学习2::uC/OS-III LED闪烁实验的更多相关文章
- ubuntu下30天自制os 的学习计划
30天自制os的学习也告一段落,由于有其他更重要的事情要集中精力去处理.书本从15天開始就是多任务了.可是不得不停下一阵子. 以下总结下学习中遇到的一些问题. 1:学习这前14天中.问题最大的是关于G ...
- os模块学习小随笔
os模块为python解释器与操作系统交互的接口 os.popen() -------Open a pipe to or from command. The return value is an ...
- python os模块学习
一.os模块概述 Python os模块包含普遍的操作系统功能.如果你希望你的程序能够与平台无关的话,这个模块是尤为重要的. 二.常用方法 1.os.name 输出字符串指示正在使用的平台.如果是wi ...
- os模块学习+open行数
os模块的使用https://www.cnblogs.com/juandx/p/4962089.html 注意:新建和关闭文件,可以直接用,无需os模块 python中对文件.文件夹(文件操作函数)的 ...
- day5模块学习 -- os模块学习
python基础之模块之os模块 os模块 os模块的作用: os,语义为操作系统,所以肯定就是操作系统相关的功能了,可以处理文件和目录这些我们日常手动需要做的操作,就比如说:显示当前目录下所有文件/ ...
- python os库学习笔记
os.getcwd(): 获取当前目录 os.name: 获取当前使用的操作系统 eg: print os.name os.remove(): 删除指定文件 eg: os.remove('test.t ...
- os模块学习(转)
python 文件操作 一.python中文件管理 文件管理是很多应用程序的基本功能和重要组成部分.Python可以使文件管理极其简单,特别是和其它语言相对比. 1.介绍 几乎以任何语言编写的众多 ...
- Python学习日记(十七) os模块和sys模块
os模块 1.os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 import os print(os.getcwd()) #C:\Users\Administrator\ ...
- 吴裕雄--python学习笔记:os模块函数
os.sep:取代操作系统特定的路径分隔符 os.name:指示你正在使用的工作平台.比如对于Windows,它是'nt',而对于Linux/Unix用户,它是'posix'. os.getcwd:得 ...
随机推荐
- android学习——MeasureSpec介绍及使用
一.MeasureSpc类说明 SDK的介绍:MeasureSpc类封装了父View传递给子View的布局(layout)要求.每个MeasureSpc实例代表宽度或者高度 它有三种模式:①.UNSP ...
- VB6.0编程笔记——(2)开发环境准备&学习前导入
工欲善其事必先利其器,着手开始学习写代码之前,我们需要先准备好需要用到的工具.这篇文章会教大家部署好环境,同时会告知前期我们需要知道的一点内容(可以不用特别理解,只要记住用法就行,后续会深入展开介绍) ...
- Java魔法类:sun.misc.Unsafe
Unsafe类在jdk 源码的多个类中用到,这个类的提供了一些绕开JVM的更底层功能,基于它的实现可以提高效率.但是,它是一把双刃剑:正如它的名字所预示的那样,它是Unsafe的,它所分配的内存需要手 ...
- Go 语言做的几个验证码
1.http://www.oschina.net/code/snippet_173630_12006 : 效果: 源代码: 1: package main 2: 3: import ( 4: cra ...
- 【quick-cocos2d-x】Lua 面向对象(OOP)编程与元表元方法
版权声明:本文为博主原创文章,转载请注明出处. 面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物. 早期的计算机编程是基于面向过程的方法,通过设计一个算法就可以解决当时 ...
- EIGRP汇总
转自:http://myhat.blog.51cto.com/391263/193189/ 实验目的:1.理解EIGRP的自动汇总的缺点2.配置EIGRP手工汇总的方法A>>>还是老 ...
- 【LeetCode】107 - Binary Tree Level Order Traversal II
Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from left ...
- 在VS2103环境中集成Doxygen工具
自己已将学习了两三次了吧,差不多这次该总结一下: Doxygen是一种开源跨平台的,以类似JavaDoc风格描述的文档系统,完全支持C.C++.Java.Objective-C和IDL语言,部分支持P ...
- django 搭建自己的博客
原文链接:http://www.errdev.com/post/4/ 每一个爱折腾的程序员都有自己的博客,好吧,虽然我不太喜欢写博客,但是这样骚包的想法却不断涌现.博客园虽好,可以没有完全的掌控感,搭 ...
- Numpy中的矩阵计算
矩阵初始化 支持matlab语句初始化,支持narray和array初始化. >>> import numpy as np >>> M = np.matrix(&q ...