准备材料

1.在TI官网上下载430的固件库,我用的是msp430f5528的板子,下载的是F5xx_F6xx_Core_Lib

地址http://www.ti.com/tool/msp-exp430f5529

下载后解压得到

2.在ucos官网上下载移植430版本的ucos,地址:

http://micrium.com/downloadcenter/download-results/?searchterm=hm-texas-instruments&supported=true

下载安装后得到

3.这一步的资料备用下载地址(14.5.9更新链接):

    1)MSP430固件http://pan.baidu.com/s/1c0hAahq

    2)IAR x x 版http://pan.baidu.com/s/1o618yDk

    3)  我创建的工程http://pan.baidu.com/s/1mgt4Xew

建立和配置工程

1.建立工程目录,并在工程目录下建立F5xx_F6xx_Core_Lib和ucosii两个目录

2.将msp430固件库\slaa448b\F5xx_F6xx_Core_Lib目录下的所有文件拷贝到工程目录下的F5xx_F6xx_Core_Lib文件夹中,这个是msp430cpu操作的一些函数。我们要初始化cpu时钟用。

3.在在工程目录的ucosii下建立ports和source两个目录用来存放ucos系统文件

4.将ucos安装目录\Micrium\Software\uCOS-II\Ports\MSP430X\IAR\MSP430x5xx下的所有文件复制到工程目录下的ports文件夹中

5.将ucos安装目录\Micrium\Software\uCOS-II\Source下的所有文件复制到工程目录下的source文件夹中

6.建立main函数文件,建一个文本文档取名为test.c

7.我们还要借鉴ucos安装的例程给的两个系统配置文件

\Micrium\Software\EvalBoards\TI\MSP-EXP430F5438\IAR\uCOS-II目录里的app_cfg.h和os_cfg.h。将这两个文件拷贝的工程根目录下。app_cfg.h是用户进程的一些配置,比如进程的优先级,进程堆栈的大小等等。os_cfg.h是系统的一些配置,可以开关系统的一些功能,尽量裁剪掉不用的功能可以减少cpu的开销。

8.下面建立一个msp430的空工程并向工程中添加刚才的文件,得到目录如下

 

9.配置这个工程

    9.1.选取相应的芯片型号

    9.2.添加工程包含目录

$PROJ_DIR$\F5xx_F6xx_Core_Lib

$PROJ_DIR$\

$PROJ_DIR$\ucosii\ports

$PROJ_DIR$\ucosii\source

    9.3.仿真模式改成debug

保存

10.然后开始建立任务

10.1 建立4个任务每个任务闪一个灯和一个启动任务,首先删掉app_cfg.h中的所有内容,写如下代码:

#ifndef __APP_CFG_H__

#define __APP_CFG_H__

#define OS_TASK_TMR_PRIO (OS_LOWEST_PRIO - 4)

/* task stack size */

#define STARTUP_TASK_STK_SIZE 128

#define TASK1_STK_SIZE 128 

#define TASK2_STK_SIZE 128

#define TASK3_STK_SIZE 128

#define TASK4_STK_SIZE 128

#define STARTUP_TASK_PRIO 4

#define TASK1_PRIO 5

#define TASK2_PRIO 6

#define TASK3_PRIO 7

#define TASK4_PRIO 8

#endif

 

10.2.这个就是建立的四个任务和一个启动任务的优先级和堆栈大小

下面是任务代码写在test.c中。

OS_STK startup_stk[STARTUP_TASK_STK_SIZE];

OS_STK task1_stk[TASK1_STK_SIZE];

OS_STK task2_stk[TASK2_STK_SIZE];

OS_STK task3_stk[TASK3_STK_SIZE];

OS_STK task4_stk[TASK4_STK_SIZE];

unsigned char os_err;

static void task1(void *p_arg) 

{

for (;;)

{

P1OUT |= BIT1; 

OSTimeDly(500); 

P1OUT &= ~BIT1; 

OSTimeDly(500); 

}

}

static void task2(void *p_arg) 

{ 

for (;;) 

{ 

P1OUT |= BIT2; 

OSTimeDly(500); 

P1OUT &= ~BIT2; 

OSTimeDly(500); 

} 

}

static void task3(void *p_arg) 

{ 

for (;;) 

{ 

P1OUT |= BIT3; 

OSTimeDly(500); 

P1OUT &= ~BIT3; 

OSTimeDly(500); 

} 

}

static void task4(void *p_arg) 

{ 

for (;;) 

{ 

P1OUT |= BIT4; 

OSTimeDly(500); 

P1OUT &= ~BIT4 ;

OSTimeDly(500); 

} 

}

static void startup(void *p_arg) 

{

P1DIR |= BIT1+BIT2+BIT3+BIT4; // P1.0 set as output

OS_CPU_SysTickInit();

#if (OS_TASK_STAT_EN > 0)

//----统计任务初始化函数

OSStatInit();

#endif

os_err = OSTaskCreate(task1, //任务1

(void *)0, //不带参数

(OS_STK *)&task1_stk[TASK1_STK_SIZE - 1],//堆栈指针

(INT8U)5); //优先级

os_err = OSTaskCreate(task2, //任务2

(void *)0, //不带参数

(OS_STK *)&task2_stk[TASK2_STK_SIZE - 1],//堆栈指针

(INT8U)6); //优先级

os_err = OSTaskCreate(task3, //任务3

(void *)0, //不带参数

(OS_STK *)&task3_stk[TASK3_STK_SIZE - 1],//堆栈指针

(INT8U)7); //优先级

//

os_err = OSTaskCreate(task4, //任务4

(void *)0, //不带参数

(OS_STK *)&task4_stk[TASK4_STK_SIZE - 1],//堆栈指针

(INT8U)8); 

OSTaskDel(OS_PRIO_SELF);

}

10.3 我们用的ucos系统时钟是看门狗做的,我们要初始化看门狗滴答函数,添加如文件:

void OS_CPU_SysTickInit()

{

WDTCTL = (WDTPW+WDTTMSEL+WDTCNTCL+WDTIS_4); /*20M/32768=1.6384ms */

SFRIE1 |= 1; /* Enable WDT interrupts */

}

看门狗的中断函数已经写好了在os_cpu_a.s43中:

10.4 下面是初始化cpu时钟 我们把系统时钟初始化到20M用的是内部PLL,(ucos时钟滴答跟这个有直接的关系,最好能保证看门狗可以设置到1ms的时间,当我们用OSTimeDly函数时时间比较直观)函数如下:

#include <msp430f5528.h>

#include "HAL_PMM.h"

#include "HAL_UCS.h"

#include "ucos_ii.h"

#define SYS_MCLK_FREQ 20000000

void Init_Clock(void)

{

SELECT_FLLREF(SELREF__REFOCLK); // Set DCO FLL reference = REFO

SELECT_ACLK(SELA__REFOCLK); // Select REFO as ACLK source

Init_FLL(SYS_MCLK_FREQ/1000, SYS_MCLK_FREQ/32768);

}

void InitSys()

{

/*PMM全部关闭********************************************************/

DISABLE_SVSL(); // SVS Low side is turned off

DISABLE_SVML(); // Monitor low side is turned off

DISABLE_SVMH(); // Monitor high side is turned off

DISABLE_SVSH(); // SVS High side is turned on

//DISABLE_SVSH_RESET(); // Enable POR on SVS Event

while (((PMMIFG & SVSMLDLYIFG) == 0)&&((PMMIFG & SVSMHDLYIFG) == 0));

// SVSH turns off in LPM3,power-save

CLEAR_PMM_IFGS();

__disable_interrupt(); // Disable global interrupts

SetVCore(PMMCOREV_3); // USB core requires the VCore set to 1.8 volt, independ of CPU clock frequency

Init_Clock();

__enable_interrupt(); // enable global interrupts

}

 

10.5 下面是main函数:直接建立启动任务运行

void main(void)

{

volatile unsigned int i;

WDTCTL = WDTPW+WDTHOLD; // Stop WDT

InitSys();

OSInit();

OSTaskCreate(startup, (void *)0, &startup_stk[STARTUP_TASK_STK_SIZE-1], 4);

OSStart(); 

}

这样我们的所有工作完成了,直接编译下载仿真,成功。

效果图:

zju(11)在IAR中移植ucos到msp430的更多相关文章

  1. 在IAR下移植CC2650 contiki工程

    与Instant Contiki相比,在Windows的IAR下开发可以在线仿真,下载也更方便,因此我想把BLEach的工程移植到IAR下.弄了好几天总算编译并且下载成功了,参考了[这篇TI的wiki ...

  2. 第11讲- Android中进程及其优先级

    第11讲Android中进程及其优先级 进程与线程: 进程:操作系统结构的基础,资源分配的最小单元,一个操作系统包括多个进程: 线程:线程存在于进程当中,是操作系统调试执行的最小单元,一个进程包括多个 ...

  3. Android菜鸟的成长笔记(11)——Android中的事件处理

    原文:[置顶] Android菜鸟的成长笔记(11)——Android中的事件处理 Android提供了两种方式来处理事件,一个是基于回调的事件处理,另一个是基于监听的事件处理,举个例子: 基于回调的 ...

  4. 如何在IAR中配置CRC参数(转)

    源:如何在IAR中配置CRC参数 前言 STM32全系列产品都具有CRC外设,对CRC的计算提供硬件支持,为应用程序节省了代码空间.CRC校验值可以用于数据传输中的数据正确性的验证,也可用于数据存储时 ...

  5. Linux课程---11、Linux中软件安装和调试

    Linux课程---11.Linux中软件安装和调试 一.总结 一句话总结: 启动过程:1.安装软件,2.修改配置文件,3.启动服务 查看过程:4.查看进程,5.查看端口 关闭过程:6.关闭软件,7. ...

  6. 妙味css3课程---1-1、css中自定义属性可以用属性选择器么

    妙味css3课程---1-1.css中自定义属性可以用属性选择器么 一.总结 一句话总结:可以的. 1.如何实现用属性选择器实现a标签根据href里面含有的字段选择背景图片? p a[href*=te ...

  7. 斯坦福NLP课程 | 第11讲 - NLP中的卷积神经网络

    作者:韩信子@ShowMeAI,路遥@ShowMeAI,奇异果@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/36 本文地址:http://www. ...

  8. 万答#11,MySQL中char与varchar有什么区别

    万答#11,MySQL中char与varchar有什么区别 1.实验场景 GreatSQL 8.0.25 InnoDB 2.实验测试 2.1 区别 参数 char varchar 长度是否可变 定长 ...

  9. 在IAR(EWARM)中移植STM32固件库

    一.移植环境说明 (1).win10系统 (2).IAR(EWARM)7.7 (3).STM32标准固件库3.5.0 http://www.st.com/content/st_com/en/produ ...

随机推荐

  1. Practical JAVA(二)关于对象的类型和equals函数

    Practice5,6,9,10,11,12,13,14,15 ==判断等号两边两个变量储存的值是否相同,如果是两个对象,则判断两个变量储存的对象地址是否相同. 大多数时候,我们需要判断的不是左右两个 ...

  2. windows主机开启openssl的方法

    转自:http://www.feichang56.com/openssl/

  3. 登录时的"记住我"

    当我们在做各个系统的登录界面时,喜欢在加上一个功能就是“记住我”, 我用js来实现一下看看 function SetCookie(name, value, expires, path, domain, ...

  4. Android拓展系列(12)--使用Gradle发布aar项目到JCenter仓库

    目的 发布自己的android library(也就是aar)到公共的jcenter仓库,所有的人都能用gradle最简单的方式引用. 为什么选择jcenter,它兼容maven,而且支持更多形式仓库 ...

  5. Fibonacci

    20145218 <Java程序设计>第01次实验报告 实验内容 简单使用命令行 撰写简单的Hello.java程序,使用命令行编译.运行.编译命令javac -d Hello.java, ...

  6. DHL 快递跟踪查询

      思路描述:主要使用正则表达式解析. 返回一个跟踪步骤列表. public class TrackingData     {         public string time { get; se ...

  7. LightOJ1017 Brush (III)(DP)

    题目大概说一个平面上分布n个灰尘,现在要用一个宽w的刷子清理灰尘:选择一个起点,往水平线上扫过去这个水平线上的灰尘就消失了.问最多进行k次这样的操作能清理最多多少灰尘. 没什么的DP. 先按垂直坐标给 ...

  8. SQL Prompt激活

    SQL脚本越写越多,总是觉得编写效率太过于低下,这和打字速度无关.在我个人编写SQL脚本时,至少会把SQL的格式排列成易于阅读的,因为其他人会阅读到你的SQL,无论是在程序中或是脚本文件中,良好的排版 ...

  9. 424 - Integer Inquiry

     Integer Inquiry  One of the first users of BIT's new supercomputer was Chip Diller. He extended his ...

  10. django 数据库交互

    修改配置文件 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'USER':'root', 'PASSWORD':'1 ...