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