[原创] Atmel SAM D21开发板试用心得 ——利用Keil和spf,实现按键控制

sjtitr   2014-11-2 20:57 楼主
最近实在是忙得很,太突然了——做了一些东西,却没有时间来分享。 今天太累了,借着休息的机会,分享一下。 之前在别的版块,楼主写了一个spf——sjtitr platform,正好移植到D21上来,也有利于我之后使用这块板子做些啥。 这次呢,就先做一个利用按键控制LED的简单功能。 其实移植也很简单,接着上一篇:全速运行,我们在这个基础上,对Tick进行适当的设置,作为spf的系统时钟。
  1. /*******************************************************************************
  2. * 函数名: timer_init
  3. * 描 述: 启动硬件定时器
  4. *******************************************************************************/
  5. void timer_init(void)
  6. {
  7. SystemCoreClockUpdate();
  8. SysTick_Config(SystemCoreClock/1000);
  9. }
于是就实现了一个1ms的系统时钟。 把spf的内容加入到Keil工程中,建立一个Task来监视按键
  1. /*******************************************************************************
  2. * 段 落: Key扫描
  3. * 描 述: 主要进行按键扫描检测
  4. *******************************************************************************/
  5. void key_scan(void)
  6. {
  7. static u8_t keyRecord = 0x0A;
  8. keyRecord = (keyRecord << 1) | ((PORT->Group[0].IN.reg & PORT_PA15) ? 1 : 0);
  9. if((keyRecord & 0x0F) == 0x0C)
  10. {
  11. spf_call_proc(PROC_LED, LED_ARG_SWITCH);
  12. }
  13. }
  14. u8_t key_proc(arg_t arg)
  15. {
  16. if(arg == PROC_INIT)
  17. {
  18. PORT->Group[0].PINCFG[15].bit.PULLEN = 1;
  19. PORT->Group[0].OUTSET.reg = PORT_PA15;
  20. PORT->Group[0].PINCFG[15].bit.INEN = 1;
  21. set_timer(PROC_KEY, 3, key_scan, CYCLE);
  22. }
  23. return TRUE;
  24. }
至于控制LED就更轻松了,
  1. /*******************************************************************************
  2. * 段 落: Led控制处理
  3. * 描 述: 主要管理Led的blink模式
  4. *******************************************************************************/
  5. #define LED_ARG_SWITCH 0x02
  6. static u16_t led_arg = 500;
  7. void LED_Init(void)
  8. {
  9. PORT->Group[1].DIRSET.reg = PORT_PB30;
  10. PORT->Group[1].OUTSET.reg = PORT_PB30;
  11. }
  12. void led_timeout(void)
  13. {
  14. PORT->Group[1].OUTTGL.reg = PORT_PB30;
  15. }
  16. u8_t led_proc(arg_t arg)
  17. {
  18. switch(arg)
  19. {
  20. case PROC_INIT:
  21. {
  22. LED_Init();
  23. set_timer(PROC_LED, 500, led_timeout, CYCLE);
  24. }
  25. break;
  26. case LED_ARG_SWITCH:
  27. {
  28. switch(led_arg)
  29. {
  30. case 500:
  31. led_arg = 1000;
  32. break;
  33. case 1000:
  34. led_arg = 125;
  35. break;
  36. case 125:
  37. led_arg = 1500;
  38. break;
  39. case 1500:
  40. default:
  41. led_arg = 500;
  42. break;
  43. }
  44. set_timer(PROC_LED, led_arg, led_timeout, CYCLE);
  45. }
  46. break;
  47. default:
  48. break;
  49. }
  50. return TRUE;
  51. }
得到的效果呢,就像这样 这次出于需要,仔细阅读了有关Pin的输入输出的有关事宜,了解到pin输出时还有一个toggle寄存器,这就意味着进行blink动作的时候,根本不需要在意前一个状态了,只要向相应的位置写1,LED就会自动闪烁了。 这种寄存器以前也遇到过,不过在这里遇到,还是觉得十分贴心的,毕竟没有使用Atmel官方的IDE,开发不太容易,就需要各种阅读手册了——这一过程能更多地了解硬件的开发者在实用性上的许多想法。 最后,仍然坚持一贯传统,把我的工程分享给大家。
SAMD21J18A.rar (20.46 KB)
(下载次数: 50, 2014-11-2 20:35 上传)
本帖最后由 sjtitr 于 2014-11-2 20:57 编辑

回复评论

暂无评论,赶紧抢沙发吧
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复