单片机 > 单片机程序设计 > 详情

基于keil的contiki系统的stm32移植

发布时间:2024-08-12 发布时间:
|

一, 全部代码的文件情况

二,  keil中文件包含情况

三,源文件的修改情况

1,contiki-2.5(基于这个版本内核),在cpu/arm/stm32f103文件夹下面修改clock.c文件中的函数

void

clock_init()

{

if (SysTick_Config(SystemCoreClock /CLOCK_SECOND)) 

    while(1); 

}

 

void

SysTick_handler(void)

{current_clock++;

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

   etimer_request_poll();

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

 

  }

  if(--second_countdown == 0) {

   current_seconds++;

   second_countdown = CLOCK_SECOND;

  }

}

2,在contiki-2.5/platform/stm32test建立工程文件(这里以野火的工程建立方式为例)


将圈红的两个文件复制到user目录下面

其他文件的填写参考野火建立工程的方式

3,修改contiki-main.c文件如下


#include "stm32f10x.h"
#include "led.h" 
#include  
#include  
//#include  //这个在需要串口调试的时候加上
#include  
#include  
#include  
#include  
#include  
#include "contiki.h"


unsigned int idle_count = 0; 
//事件的声明 
static process_event_t event_ledoff;
static process_event_t event_ledon;


//函数声明 
void Delay(__IO u32 nCount);


//两个进程的声明
PROCESS(led_on, "led_on");
PROCESS(led_off, "led_off");   
//将两个进程加入AUTOSTART_PROCESSES
AUTOSTART_PROCESSES(&led_on, &led_off);  
//进程1的函数主体 
PROCESS_THREAD(led_on, ev, data)  
{   
//进程开始
PROCESS_BEGIN();
//获得一个事件或者是初始化
event_ledoff = process_alloc_event(); 
while(1)  
{  
//等待事件发生进入,若没有事件发生系统调度到其他地方
PROCESS_WAIT_EVENT_UNTIL(ev == event_ledon);
//打开LED 注意延时  
LED1(ON); 
//Delay(0xFFFEF);
Delay_us(2);
//发送一个事件,这里是唤醒了第二个进程
process_post(&led_off, event_ledoff, NULL);  

//进程结束
PROCESS_END();  
}  


PROCESS_THREAD(led_off, ev, data)  
{  
PROCESS_BEGIN();
event_ledon = process_alloc_event();
while(1)  
{  
PROCESS_WAIT_EVENT_UNTIL(ev == event_ledoff);
//打开LED 注意延时  
LED1(OFF);
//Delay(0xFFFEF);
Delay_us(2);
process_post(&led_on, event_ledon, NULL); 

PROCESS_END();  



int main(void)
{
LED_GPIO_Config();
//做指示灯 
LED2(ON);
clock_init();  
process_init();  
//etimer_process 是系统进程 
process_start(&etimer_process,NULL);  
//下面这句后面的都不能执行,加锁就可以 
autostart_start(autostart_processes);
event_ledon = process_alloc_event();
process_post(&led_on, event_ledon, NULL); 


while(1) {  
do  
{  
  }  
  while(process_run()> 0);  
  idle_count++;  
  }  
return 0;  
}  


void Delay(__IO u32 nCount)
{
for(;nCount != 0; nCount--);
}


4,将相应的头文件更改一下

例:在clock.c 中添加

#include "stm32f10x.h"

#include "stm32f10x_it.h"

删除原来的

#include

#include

5,如果头文件提示找不到,搜索一下,到对应平台(例stm32)下面的文件夹里面找(很重要)

四,说明

1,没有加入uart调试,可参考网络其他教程

2,强烈推荐网址

http://blog.chinaunix.net/uid-9112803-id-2978041.html



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
MSP430低功耗模式-while循环失效