准备材料

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中的所有内容,写如下代码:

  1. #ifndef __APP_CFG_H__
  2.  
  3. #define __APP_CFG_H__
  4.  
  5. #define OS_TASK_TMR_PRIO (OS_LOWEST_PRIO - 4)
  6.  
  7. /* task stack size */
  8.  
  9. #define STARTUP_TASK_STK_SIZE 128
  10.  
  11. #define TASK1_STK_SIZE 128
  12.  
  13. #define TASK2_STK_SIZE 128
  14.  
  15. #define TASK3_STK_SIZE 128
  16.  
  17. #define TASK4_STK_SIZE 128
  18.  
  19. #define STARTUP_TASK_PRIO 4
  20.  
  21. #define TASK1_PRIO 5
  22.  
  23. #define TASK2_PRIO 6
  24.  
  25. #define TASK3_PRIO 7
  26.  
  27. #define TASK4_PRIO 8
  28.  
  29. #endif

 

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

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

  1. OS_STK startup_stk[STARTUP_TASK_STK_SIZE];
  2.  
  3. OS_STK task1_stk[TASK1_STK_SIZE];
  4.  
  5. OS_STK task2_stk[TASK2_STK_SIZE];
  6.  
  7. OS_STK task3_stk[TASK3_STK_SIZE];
  8.  
  9. OS_STK task4_stk[TASK4_STK_SIZE];
  10.  
  11. unsigned char os_err;
  12.  
  13. static void task1(void *p_arg)
  14.  
  15. {
  16.  
  17. for (;;)
  18.  
  19. {
  20.  
  21. P1OUT |= BIT1;
  22.  
  23. OSTimeDly(500);
  24.  
  25. P1OUT &= ~BIT1;
  26.  
  27. OSTimeDly(500);
  28.  
  29. }
  30.  
  31. }
  32.  
  33. static void task2(void *p_arg)
  34.  
  35. {
  36.  
  37. for (;;)
  38.  
  39. {
  40.  
  41. P1OUT |= BIT2;
  42.  
  43. OSTimeDly(500);
  44.  
  45. P1OUT &= ~BIT2;
  46.  
  47. OSTimeDly(500);
  48.  
  49. }
  50.  
  51. }
  52.  
  53. static void task3(void *p_arg)
  54.  
  55. {
  56.  
  57. for (;;)
  58.  
  59. {
  60.  
  61. P1OUT |= BIT3;
  62.  
  63. OSTimeDly(500);
  64.  
  65. P1OUT &= ~BIT3;
  66.  
  67. OSTimeDly(500);
  68.  
  69. }
  70.  
  71. }
  72.  
  73. static void task4(void *p_arg)
  74.  
  75. {
  76.  
  77. for (;;)
  78.  
  79. {
  80.  
  81. P1OUT |= BIT4;
  82.  
  83. OSTimeDly(500);
  84.  
  85. P1OUT &= ~BIT4 ;
  86.  
  87. OSTimeDly(500);
  88.  
  89. }
  90.  
  91. }
  92.  
  93. static void startup(void *p_arg)
  94.  
  95. {
  96.  
  97. P1DIR |= BIT1+BIT2+BIT3+BIT4; // P1.0 set as output
  98.  
  99. OS_CPU_SysTickInit();
  100.  
  101. #if (OS_TASK_STAT_EN > 0)
  102.  
  103. //----统计任务初始化函数
  104.  
  105. OSStatInit();
  106.  
  107. #endif
  108.  
  109. os_err = OSTaskCreate(task1, //任务1
  110.  
  111. (void *)0, //不带参数
  112.  
  113. (OS_STK *)&task1_stk[TASK1_STK_SIZE - 1],//堆栈指针
  114.  
  115. (INT8U)5); //优先级
  116.  
  117. os_err = OSTaskCreate(task2, //任务2
  118.  
  119. (void *)0, //不带参数
  120.  
  121. (OS_STK *)&task2_stk[TASK2_STK_SIZE - 1],//堆栈指针
  122.  
  123. (INT8U)6); //优先级
  124.  
  125. os_err = OSTaskCreate(task3, //任务3
  126.  
  127. (void *)0, //不带参数
  128.  
  129. (OS_STK *)&task3_stk[TASK3_STK_SIZE - 1],//堆栈指针
  130.  
  131. (INT8U)7); //优先级
  132.  
  133. //
  134.  
  135. os_err = OSTaskCreate(task4, //任务4
  136.  
  137. (void *)0, //不带参数
  138.  
  139. (OS_STK *)&task4_stk[TASK4_STK_SIZE - 1],//堆栈指针
  140.  
  141. (INT8U)8);
  142.  
  143. OSTaskDel(OS_PRIO_SELF);
  144.  
  145. }

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

  1. void OS_CPU_SysTickInit()
  2.  
  3. {
  4.  
  5. WDTCTL = (WDTPW+WDTTMSEL+WDTCNTCL+WDTIS_4); /*20M/32768=1.6384ms */
  6.  
  7. SFRIE1 |= 1; /* Enable WDT interrupts */
  8.  
  9. }

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

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

  1. #include <msp430f5528.h>
  2.  
  3. #include "HAL_PMM.h"
  4.  
  5. #include "HAL_UCS.h"
  6.  
  7. #include "ucos_ii.h"
  8.  
  9. #define SYS_MCLK_FREQ 20000000
  10.  
  11. void Init_Clock(void)
  12.  
  13. {
  14.  
  15. SELECT_FLLREF(SELREF__REFOCLK); // Set DCO FLL reference = REFO
  16.  
  17. SELECT_ACLK(SELA__REFOCLK); // Select REFO as ACLK source
  18.  
  19. Init_FLL(SYS_MCLK_FREQ/1000, SYS_MCLK_FREQ/32768);
  20.  
  21. }
  22.  
  23. void InitSys()
  24.  
  25. {
  26.  
  27. /*PMM全部关闭********************************************************/
  28.  
  29. DISABLE_SVSL(); // SVS Low side is turned off
  30.  
  31. DISABLE_SVML(); // Monitor low side is turned off
  32.  
  33. DISABLE_SVMH(); // Monitor high side is turned off
  34.  
  35. DISABLE_SVSH(); // SVS High side is turned on
  36.  
  37. //DISABLE_SVSH_RESET(); // Enable POR on SVS Event
  38.  
  39. while (((PMMIFG & SVSMLDLYIFG) == 0)&&((PMMIFG & SVSMHDLYIFG) == 0));
  40.  
  41. // SVSH turns off in LPM3,power-save
  42.  
  43. CLEAR_PMM_IFGS();
  44.  
  45. __disable_interrupt(); // Disable global interrupts
  46.  
  47. SetVCore(PMMCOREV_3); // USB core requires the VCore set to 1.8 volt, independ of CPU clock frequency
  48.  
  49. Init_Clock();
  50.  
  51. __enable_interrupt(); // enable global interrupts
  52.  
  53. }

 

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

  1. void main(void)
  2.  
  3. {
  4.  
  5. volatile unsigned int i;
  6.  
  7. WDTCTL = WDTPW+WDTHOLD; // Stop WDT
  8.  
  9. InitSys();
  10.  
  11. OSInit();
  12.  
  13. OSTaskCreate(startup, (void *)0, &startup_stk[STARTUP_TASK_STK_SIZE-1], 4);
  14.  
  15. OSStart();
  16.  
  17. }

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

效果图:

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. 【MongoDB】1.安装--以及简单使用

    第一次接触MongoDB    参考&粘贴:http://jingyan.baidu.com/article/ed15cb1b52b8661be2698162.html 一.安装 1.首先去官 ...

  2. 【JDK】电脑上安装多个JDK ,修改JAVA_HOME后没有作用

    电脑上装了 C:\Program Files\Java\jdk1.6.0_43      C:\Program Files\Java\jdk1.7.0_80     C:\Program Files\ ...

  3. HDU 4821 String (HASH)

    题意:给你一串字符串s,再给你两个数字m l,问你s中可以分出多少个长度为m*l的子串,并且子串分成m个长度为l的串每个都不完全相同 首先使用BKDRHash方法把每个长度为l的子串预处理成一个数字, ...

  4. jquery笔记(遍历)

    祖先: $("selector").parent().css():返回被选元素的直接父元素,并调用css方法. $("selector").parents(). ...

  5. AngularJs基础(一)

    使用 angularjs首先在页面的<html>里添加一个模块写法: <html lang="en"ng-app="myApp"> my ...

  6. NSDICTIONARY获取内容的CRASH

    NSString *path = [self.dataPath stringByAppendingPathComponent:@"dummy.plist"]; NSMutableD ...

  7. xor方程组消元 UVA 11542 Square

    题目传送门 题意:给n个数,选择一些数字乘积为平方数的选择方案数.训练指南题目. 分析:每一个数字分解质因数.比如4, 6, 10, 15,, , , , 令,表示选择第i个数字,那么,如果p是平方数 ...

  8. Open CV 播放视频(2)

      演示:读取一个视频,然后播放,ESC退出.   #include "stdafx.h"   #include <opencv2/core/core.hpp>   # ...

  9. Codeforces 467C George and Job(DP)

    题目 Source http://codeforces.com/contest/467/problem/C Description The new ITone 6 has been released ...

  10. netty-学习笔记

    零.socket: http://haohaoxuexi.iteye.com/blog/1979837 一.NIO(1.0)非阻塞 NIO的特点: Buffer,缓冲区 Channel,管道 Sele ...