2956|1

603

帖子

1

TA的资源

纯净的硅(中级)

楼主
 

【MSP430 编译器使用经验】用IAR建立自己的代码大厦 [复制链接]

本帖最后由 sjtitr 于 2014-8-3 08:00 编辑

俗话说——万丈高楼平地起,用腻了别人提供示例工程,所以今天我们就来从无到有地建立一个自己的工程,这不只是工程的问题,更要紧的是,搭建自己的软件平台,以便于之后,随时利用这平台迅速运行起各种机能

整个工程的压缩包已经附在本文后面了,有需要的童鞋尽管拿去用,本代码允许被指摘、被学习、被利用甚至做成产品被出售,请保留相关注释信息就好。代码不是本文的核心内容,本文其实重在建立工程,建立自己的运行环境,代码只是一种辅助工具。

IAR是个不错滴工具,我使用的版本是IAR EW for MSP430 5.60.7,关于安装的事情,本文不再讨论了,很简单,根据安装程序上的说明操作即可。

不废话,打开IAR,我们就来建立新工程。
如下图,IAR一打开就是这样了。


接下来,当然要来创建一个新工程,如下图:


弹出来对话框,我的习惯是使用纯C来开发单片机程序,你呢?


找个地方保存工程吧……我把自己的这个平台称为sjtitr_platform,所以我的工程就起名为spf啦,之后全部保存还会提醒保存为工作空间,那么也在相同的地方保存即可。


为了保证代码的整洁,在工程中,新建一个代码组,用来存放sjtitr_platform的有关代码


给新的代码组起名,我就简单起名叫做splatform啦


如果是新建文件,就要从菜单中选择,建立一个新的文件,注意的是,这个文件是一个空白的文件,我们在编辑好其中内容之后,需要保存为C文件。


相关的C文件保存好了之后,要将其添加到工程中——在代码组上右击选择add,如果是当前这个文件,可以直接选择,如果有其他文件或者更多文件,可以选择"Add Files...",从弹出的对话框中选择要添加的文件。

只多讲一个事情:这里一般不选择H文件,头文件进入工程采用的是包含引入的方式,接下来看看有关的操作。


在工程上右击选择“Options”,可以弹出工程选项对话框


在C/C++的相关选项中,有预处理一项内容,向其中添加你增加的头文件路径,将来我们写#include “.....”的时候,就会默认优先从这些路径里查找头文件啦。
如果这里设置不正确,可能就会在编译时提示你找不到头文件。


只要上面这些内容合理设置,再把源文件都写好,那么我们的工程就可以顺利编译了。

看上图第一个“编译”和第二个“制作”的区别主要在于:编译只针对当前文件进行,所以头文件是不能编译的,这个按钮会灰掉;制作相当于全编译,把整个工程还未编译的文件都编译了,并且产生目标文件,可以用于下载到板子上运行。

说到下载,还有些设置要进行。在这之前我们来实现基本的代码。我的示例程序做了一个blink,LED以大约2秒的周期闪烁,利用按键来切换闪烁模式:红灯闪、绿灯闪、双闪。

为了支持基本的机能,我的平台需要有基本的事件的处理,所以利用事件来调度处理过程——
  1.   while(1)
  2.   {
  3.     if(spf_get_call(&call))
  4.     {
  5.       if(proc_array[call.pid] != NULL)
  6.       {
  7.         proc_array[call.pid](call.arg);
  8.       }
  9.     }
  10.   }
复制代码


再加上有时间的问题,所以我们暂且利用看门狗作为系统tick计时器(正经场合还是用看门狗复位比较安全,俺在此抛砖引玉了),每隔8ms产生一次tick
  1. void timer_init(void)
  2. {
  3.   IE1 |= WDTIE;
  4.   WDTCTL = WDT_MDLY_8;
  5. }
复制代码


把这个tick作为基准,用于其他处理需要的时间——LED闪烁需要定时,Key检测需要定时——把定时机制作为一个PROC,登记在splatform中。
  1. u8_t spf_timer_proc(arg_t arg)
  2. {
  3.   switch(arg)
  4.   {
  5.     case PROC_INIT:
  6.       {
  7.         u8_t  i;
  8.         for(i = 0; i < PROC_MAX_COUNT; i++)
  9.         {
  10.           timer_array[i].handler = NULL;
  11.         }
  12.       }
  13.       timer_init();
  14.       break;
  15.     case TIMER_TICK:
  16.       {
  17.         u8_t  i;
  18.         for(i = 0; i < PROC_MAX_COUNT; i++)
  19.         {
  20.           if(timer_array[i].handler)
  21.           {
  22.             if(timer_array[i].timeout)
  23.             {
  24.               timer_array[i].timeout--;
  25.             }
  26.             else
  27.             {
  28.               timeout_handler handler = timer_array[i].handler;
  29.               if(timer_array[i].interval)
  30.               {
  31.                 timer_array[i].timeout = timer_array[i].interval;
  32.               }
  33.               else
  34.               {
  35.                 timer_array[i].handler = NULL;
  36.               }
  37.               handler();
  38.             }
  39.           }
  40.         }
  41.       }
  42.       break;
  43.     default:
  44.       break;
  45.   }
  46.   return TRUE;
  47. }
复制代码

以上就是所谓软件平台大致的思路了,详细内容请参考示例的代码。
最后利用平台来实现预定的机能:
  1. /*******************************************************************************
  2. * 段  落: Led控制处理
  3. * 描  述: 主要管理Led的blink模式
  4. *******************************************************************************/
  5. #define LED_ARG_SWITCH   0x02

  6. static u8_t led_arg = 0x01;

  7. void led_timeout(void)
  8. {
  9.   P1OUT ^= led_arg;
  10. }

  11. u8_t led_proc(arg_t arg)
  12. {
  13.   switch(arg)
  14.   {
  15.     case PROC_INIT:
  16.       {
  17.         P1DIR |= 0x41;   
  18.         P1OUT &= ~0x41;
  19.         set_timer(PROC_LED, 125, led_timeout, CYCLE);
  20.       }
  21.       break;
  22.     case LED_ARG_SWITCH:
  23.       {
  24.         P1OUT &= ~0x41;
  25.         switch(led_arg)
  26.         {
  27.           case 0x01:
  28.             led_arg = 0x40;
  29.             break;
  30.           case 0x40:
  31.             led_arg = 0x41;
  32.             break;
  33.           case 0x41:
  34.           default:
  35.             led_arg = 0x01;
  36.             break;
  37.         }
  38.       }
  39.       break;
  40.     default:
  41.       break;
  42.   }
  43.   
  44.   return TRUE;
  45. }

  46. /*******************************************************************************
  47. * 段  落: Key扫描
  48. * 描  述: 主要进行按键扫描检测
  49. *******************************************************************************/
  50. void key_scan(void)
  51. {
  52.   static u8_t keyRecord = 0x0A;
  53.   
  54.   keyRecord = (keyRecord << 1) | ((P1IN & 0x08) ? 1 : 0);
  55.   
  56.   if((keyRecord & 0x0F) == 0x0C)
  57.   {
  58.     spf_call_proc(PROC_LED, LED_ARG_SWITCH);
  59.   }
  60. }

  61. u8_t key_proc(arg_t arg)
  62. {
  63.   if(arg == PROC_INIT)
  64.   {
  65.     P1DIR &= ~0x08;
  66.     P1REN |= 0x08;
  67.     P1OUT |= 0x08;
  68.     set_timer(PROC_KEY, 3, key_scan, CYCLE);
  69.   }
  70.   
  71.   return TRUE;
  72. }
复制代码


编译成功以后,我们进行板子相关设置——首先根据前文的说法打开工程选项:第一个把通用设置中的芯片型号选择正确!


接下来在调试选项中,选择FET调试器


当然了,在FET具体设置里,也要选择正确是哪一个调试器——USB型的,你也是吧?

原则上只要红框位置选择正确了,其他的也都是正确的,如果不放心,就逐个对照一下看看。

最后下图,右面第二个是下载并进入调试模式,右面第一个是不下载只进入调试模式。所以下载调试,运行吧!

右面第三个红色圆圆的按钮是什么?设置断点,有了今天的工程做基础,断点这部分,我们下次详聊。

OK,关于小灯闪烁我就不上图片视频了,有兴趣的童鞋自己烧写运行试试。
关于代码和逻辑,不在本文讨论范围内,不过有意了解详情的童鞋们可以跟帖提问,我会尽力答复的。

最后面是代码:
spf.rar (140.78 KB, 下载次数: 24)

最新回复

好熟悉的代码啊我也要玩  详情 回复 发表于 2015-11-20 12:38
 
点赞 关注

回复
举报

493

帖子

1

TA的资源

一粒金砂(高级)

沙发
 
好熟悉的代码啊我也要玩
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表