zoukankan      html  css  js  c++  java
  • zju(11)在IAR中移植ucos到msp430

    准备材料

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

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

    下载后解压得到

    clip_image002

    image

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

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

    clip_image006

    下载安装后得到

    image

    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固件库slaa448bF5xx_F6xx_Core_Lib目录下的所有文件拷贝到工程目录下的F5xx_F6xx_Core_Lib文件夹中,这个是msp430cpu操作的一些函数。我们要初始化cpu时钟用。

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

    4.将ucos安装目录MicriumSoftwareuCOS-IIPortsMSP430XIARMSP430x5xx下的所有文件复制到工程目录下的ports文件夹中

    5.将ucos安装目录MicriumSoftwareuCOS-IISource下的所有文件复制到工程目录下的source文件夹中

    clip_image010

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

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

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

    clip_image012

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

     clip_image016

    9.配置这个工程

        9.1.选取相应的芯片型号

    clip_image018

        9.2.添加工程包含目录

    $PROJ_DIR$F5xx_F6xx_Core_Lib

    $PROJ_DIR$

    $PROJ_DIR$ucosiiports

    $PROJ_DIR$ucosiisource

    clip_image020

        9.3.仿真模式改成debug

    clip_image022

    保存

    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中:

    clip_image024

    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(); 
    
    }

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

    clip_image026

    效果图:

    121

  • 相关阅读:
    面试题
    iOS 对overflow:scroll使用
    iOS微信页面 长按图片出现【存储图像】和【拷贝】不出现【发送朋友】【保存图片】
    cookie设置和读取以及获取超链接参数
    学习资源链接
    gulp中文乱码问题
    原生ajax基础知识笔记
    Visual Studio Code 插件推荐
    前端开发中一些容易混淆的概念汇总
    jq中的类样式操作与html5中的类样式操作的对比
  • 原文地址:https://www.cnblogs.com/shenerguang/p/3438761.html
Copyright © 2011-2022 走看看