基于keil的contiki系统的stm32移植

一, 全部代码的文件情况

二,  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 <stdint.h>  
#include <stdio.h>  
//#include <debug-uart.h>  //这个在需要串口调试的时候加上
#include <clock.h>  
#include <sys/process.h>  
#include <sys/procinit.h>  
#include <etimer.h>  
#include <sys/autostart.h>  
#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 <stm32f10x_map.h>

#include<nvic.h>

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

四,说明

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

2,强烈推荐网址

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

 


  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值