视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
在IAR中移植ucos到msp430
2025-09-29 08:46:34 责编:小OO
文档
昨天搞定了ucos在stm32上的移植,今天继续移植msp430,我用的是IAR6.3编译环境。相比stm32来讲我觉得这个移植更简单一点,官方代码给的已经很好了,所需要的修改很少很少。开始正题。

准备材料

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

地址http://www.ti.com/cn/litv/zip/slaa448b

下载后解压得到

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

http://micrium.com/download/getfile/uCOS-II-MSP-EXP430F5438.exe

下载安装后得到

建立和配置工程

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

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

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

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

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

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

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

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

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

配置这个工程

选取相应的芯片型号

添加工程包含目录

$PROJ_DIR$\\F5xx_F6xx_Core_Lib

$PROJ_DIR$\

$PROJ_DIR$\i\\ports

$PROJ_DIR$\i\\source

仿真模式改成debug

保存

然后开始建立任务

建立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

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

下面是任务代码写在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);

  

}

我们用的ucos系统时钟是看门狗做的,我们要初始化看门狗滴答如下函数

void OS_CPU_SysTickInit()

{

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

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

}

看门狗的中断函数已经写好了在os_cpu_a.s43中,可以自己看一下。

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

#include

#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

}

下面是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(); 

 

}

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

显示全文
专题