STM32L073移植Contiki系统

    Contiki系统完全采用C语言开发,可移植性好,能够在各种微处理器上运行,在ARM硬件平台的运行也得到验证。目前,contiki相关的资料不是很多,对于初学者来说。可以参考Jelline大神的博客:http://blog.chinaunix.net/uid-9112803-id-2978041.html;也可以参考http://www.iotdev.net/forum.php上的一些资料。本篇只实现了在STM32L073单片机移植contiki系统后控制LED灯的闪烁。

   首先新建一个流水灯工程。在此工程基础上进行Contiki系统移植。找到Contiki源码,源码可以在http://www.contiki-os.org/下载,或通过其他途径下载。将解压后的整个contiki的源码复制到新建的工程中。

STM32L073移植Contiki系统_第1张图片

  在工程中新建一个USER文件夹,用来存放Contiki的配置文件。

    1)将contiki-3.0\platform\stm32test目录下的contiki-conf.h头文件复制到USER文件夹下。

    2) 将contiki-3.0\cpu\arm\stm32f103目录下的clock.c文件和rtimer-arch.h头文件复制到USER文件夹下。

开始在工程中添加文件以及包含头文件。添加Contiki_SYS和Contiki_LIB。由于只实现流水灯功能,需要添加的文件较少。

   1)将Contiki-3.0\core\sys文件下的arg.c、autostart.c、energest.c、etimer.c、process.c、timer.c文件添加到Contiki_SYS.

   2)将Contiki-3.0\core\lib目录下的list.c添加到Contiki_LIB。

STM32L073移植Contiki系统_第2张图片

STM32L073移植Contiki系统_第3张图片

然后将头文件路径包含以下:

STM32L073移植Contiki系统_第4张图片

相关的文件已复制完成,接下来要进行一些代码的更改。先编译下工程,报错提示没有clock_time()函数,这个函数

的主要作用是获取当前的滴答定时器值。在stm32l0xx_hal.c中,已有定义

__weak uint32_t HAL_GetTick(void)

{

  return uwTick;

}

因此,用HAL_GetTick()函数代替clock_timer 函数。

STM32L073移植Contiki系统_第5张图片

    要将Contiki_SYS 下etimer.c文件和timer.c文件中的clock_time()函数全部替换为HAL_GetTick()函数。全部替换完成后,再次编译没有出错。

添加定时器任务处理函数。在Stm32l0xx_hal.c文件中,添加几个头文件。

#include

#include

#include

接着在HAL_IncTick()函数中uwTick++;后面添加如下代码:

if(etimer_pending() && etimer_next_expiration_time() <= uwTick) {

etimer_request_poll();

/* printf("%d,%d\n", clock_time(),etimer_next_expiration_time ()); */

}

STM32L073移植Contiki系统_第6张图片

再次编译,没有出错。接下来,在main.c中添加头文件

#include

#include

#include

#include

然后添加LED循环闪烁任务:

PROCESS(blink_process, "Blink");

 AUTOSTART_PROCESSES(&blink_process);

 PROCESS_THREAD(blink_process,ev,data)

 {

PROCESS_BEGIN();

 while(1)

 {

 static struct etimer et;

 etimer_set(&et,1000);

 PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et));

 HAL_GPIO_TogglePin(GPIOA,  GPIO_PIN_5);

 }

    PROCESS_END();

 }

在main函数中,while(1)循环开始之前添加contiki有关的初始化函数,并启动任务。

   process_init();

   process_start(&etimer_process,NULL);

   process_start(&blink_process,NULL);

在while(1)中,调用process_run()函数。至此,移植工作已完成,编译下载后,在ST开发板NUCLEO-L073RZ开发板上验证成功。

 

你可能感兴趣的:(Contiki)