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

sjtitr   2014-8-3 07:57 楼主
俗话说——万丈高楼平地起,用腻了别人提供示例工程,所以今天我们就来从无到有地建立一个自己的工程,这不只是工程的问题,更要紧的是,搭建自己的软件平台,以便于之后,随时利用这平台迅速运行起各种机能。 整个工程的压缩包已经附在本文后面了,有需要的童鞋尽管拿去用,本代码允许被指摘、被学习、被利用甚至做成产品被出售,请保留相关注释信息就好。代码不是本文的核心内容,本文其实重在建立工程,建立自己的运行环境,代码只是一种辅助工具。 IAR是个不错滴工具,我使用的版本是IAR EW for MSP430 5.60.7,关于安装的事情,本文不再讨论了,很简单,根据安装程序上的说明操作即可。 不废话,打开IAR,我们就来建立新工程。 如下图,IAR一打开就是这样了。 2014-07-30_203443.jpg 接下来,当然要来创建一个新工程,如下图: 2014-07-30_203610.jpg 弹出来对话框,我的习惯是使用纯C来开发单片机程序,你呢? 2014-07-30_203633.jpg 找个地方保存工程吧……我把自己的这个平台称为sjtitr_platform,所以我的工程就起名为spf啦,之后全部保存还会提醒保存为工作空间,那么也在相同的地方保存即可。 2014-07-30_203709.jpg 为了保证代码的整洁,在工程中,新建一个代码组,用来存放sjtitr_platform的有关代码 2014-07-30_203740.jpg 给新的代码组起名,我就简单起名叫做splatform啦 2014-07-30_203803.jpg 如果是新建文件,就要从菜单中选择,建立一个新的文件,注意的是,这个文件是一个空白的文件,我们在编辑好其中内容之后,需要保存为C文件。 2014-07-30_203830.jpg 相关的C文件保存好了之后,要将其添加到工程中——在代码组上右击选择add,如果是当前这个文件,可以直接选择,如果有其他文件或者更多文件,可以选择"Add Files...",从弹出的对话框中选择要添加的文件。 2014-07-30_204012.jpg 只多讲一个事情:这里一般不选择H文件,头文件进入工程采用的是包含引入的方式,接下来看看有关的操作。 在工程上右击选择“Options”,可以弹出工程选项对话框 2014-07-30_220728.jpg 在C/C++的相关选项中,有预处理一项内容,向其中添加你增加的头文件路径,将来我们写#include “.....”的时候,就会默认优先从这些路径里查找头文件啦。 如果这里设置不正确,可能就会在编译时提示你找不到头文件。 2014-07-30_220836.jpg 只要上面这些内容合理设置,再把源文件都写好,那么我们的工程就可以顺利编译了。 2014-08-03_072652.jpg 看上图第一个“编译”和第二个“制作”的区别主要在于:编译只针对当前文件进行,所以头文件是不能编译的,这个按钮会灰掉;制作相当于全编译,把整个工程还未编译的文件都编译了,并且产生目标文件,可以用于下载到板子上运行。 说到下载,还有些设置要进行。在这之前我们来实现基本的代码。我的示例程序做了一个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. return TRUE;
  44. }
  45. /*******************************************************************************
  46. * 段 落: Key扫描
  47. * 描 述: 主要进行按键扫描检测
  48. *******************************************************************************/
  49. void key_scan(void)
  50. {
  51. static u8_t keyRecord = 0x0A;
  52. keyRecord = (keyRecord << 1) | ((P1IN & 0x08) ? 1 : 0);
  53. if((keyRecord & 0x0F) == 0x0C)
  54. {
  55. spf_call_proc(PROC_LED, LED_ARG_SWITCH);
  56. }
  57. }
  58. u8_t key_proc(arg_t arg)
  59. {
  60. if(arg == PROC_INIT)
  61. {
  62. P1DIR &= ~0x08;
  63. P1REN |= 0x08;
  64. P1OUT |= 0x08;
  65. set_timer(PROC_KEY, 3, key_scan, CYCLE);
  66. }
  67. return TRUE;
  68. }
编译成功以后,我们进行板子相关设置——首先根据前文的说法打开工程选项:第一个把通用设置中的芯片型号选择正确! 2014-08-03_074524.jpg 接下来在调试选项中,选择FET调试器 2014-08-03_074553.jpg 当然了,在FET具体设置里,也要选择正确是哪一个调试器——USB型的,你也是吧? 2014-08-03_074631.jpg 原则上只要红框位置选择正确了,其他的也都是正确的,如果不放心,就逐个对照一下看看。 最后下图,右面第二个是下载并进入调试模式,右面第一个是不下载只进入调试模式。所以下载调试,运行吧! 2014-08-03_072652.jpg 右面第三个红色圆圆的按钮是什么?设置断点,有了今天的工程做基础,断点这部分,我们下次详聊。 OK,关于小灯闪烁我就不上图片视频了,有兴趣的童鞋自己烧写运行试试。 关于代码和逻辑,不在本文讨论范围内,不过有意了解详情的童鞋们可以跟帖提问,我会尽力答复的。 最后面是代码:
spf.rar (140.78 KB)
(下载次数: 24, 2014-8-3 07:47 上传)
本帖最后由 sjtitr 于 2014-8-3 08:00 编辑

回复评论 (1)

好熟悉的代码啊我也要玩
点赞  2015-11-20 12:38
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复