一, 全部代码的文件情况
二, 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
关键字:keil contiki系统 stm32移植
引用地址:
基于keil的contiki系统的stm32移植
推荐阅读最新更新时间:2024-03-16 16:10
在STM32上移植FreeModbus RTU的一点经验总结
这几天因为工作需要,移植了modbus RTU到STM32来,之前也听说过modbus,但是没有深入了解过,还以为会像usb 那样复杂的,经过这几天的折腾,发现真的太简单了。为了防止过段时间又忘记了怎么移植,在这里把移植过程记录下来,也为了方便初次接触modbus的人。 废话少说,首先去下载源码,我下载的是freemodbus-v1.5.0,解压后如图所示: 在demo文件夹中有很多移植好的例子,但是没有STM32的,不要紧,我们参考已有的例子来操作就可以了。在demo文件夹下新建一个文件夹,命名为STM32,将BARE文件夹里的文件全部复制过来。 然后,我们建立一个STM32的工程,我用的是mdk4.72,关于怎么建
[单片机]
Keil中Memory Model和Code Rom Size说明
C51中定义变量时如果省略存储器类型,Keil C51编译系统则会按编译模式SMALL、COMPACT和LARGE所规定的默认存储器类型去指定变量的存储区域,无论什么存储模式都可以声明变量在任何的8051存储区范围i,但是把最常用的命令如循环计数器和队列索引放在内部数据区可以显著地提高系统性能。以下介绍一下Keil编译选项Target中的Memory Model和Code Rom Size的设置。 Memory Model(存储器模式) SMALL模式 在本模式中所有的变量在缺省的情况下位于8051系统的内部数据区(这和用data存储类型标识符明确声明的一样,因此对这种变量的访问数据最快),在本模式中,变量访问非常有效,然
[单片机]
【单片机】Keil+Proteus流水灯(模块化编程)
本篇文章: 主要是Keil的模块化编程,同时实现了一个小实验,通过Keil模块化编程来实现流水灯(设计了三种流水方式)。 进入正文: 一、Proteus仿真图 1)在编写代码的时候,我们首先要做的就是绘图,绘制好模型图之后,才可以编写对应的代码。首先,在Proteus创建一个工程(PS:新手请看:Proteus和Keil分别创建单片机工程) 2)根据自己的要求,绘制指定的图形。此次做的是流水灯,请看图: (PS:如果对画图有难度的话,请查看:Proteus画图) 3)绘制好Proteus之后,开始Keil部分。 二、Keil的模块化编程 Keil模块化编程:对代码分开管理,每一部分都是一个完整的代码,需要使用的时候,最
[单片机]
keil c51是如何启动c程序的
汇编是从org 0000h开始启动,那么keil c51是如何启动main()函数的?keil c51有一个启动程序startup.a51,它总是和c程序一起编译和链接。下面看看它和main()函数是如何编译的; //主函数如下; void main(void) { while (1)这是个无条件空循环。 { } } 把上面的main()函数编译后的汇编程序和反汇编代码整理后对照如下; ?C_C51STARTUPSEGMENTCODE ?PR?main?TESTMAINSEGMENT CODE ?STACKSEGMENTIDATA RSEG?STACK DS1 CSEGAT0 ?C_STARTUP:LJMPSTARTUP1 C
[单片机]
基于IAP和Keil MDK的远程升级设计
写在前面:三个周之前,我突然想写一个远程升级的程序。那个时候我只是大概知道IAP的意思是在应用编程,但怎么编,我还一无所知。我给自己定下一个个阶段目标,从最基础的代码一点点写起,解决一个又一个的问题。三个周之后,我用自己设计的方法实验了50多次,无一例升级失败。 三个周来,遇到了很多的不解、困惑,甚至是想放弃,但我现在想说的是:很多未知的困难会挡在我们面前,我们会感觉毫无头绪甚至觉得毫无出路忍不住要放弃,但多坚持一下,那些困难不但能烟消云散还能带给我们进步。 本设计是基于LPC2114和Keil MDK(V4.10),但所有支持IAP的处理器都可借鉴本方案,重要的是思想,而不是用什么。 0 引言 在应用编程(IAP)技术为系统
[单片机]
STM32工程模板简单套用教程(Keil MDK)
在Mdk配置stm32工程是一件很麻烦的事情,故直接套用工程模板,减少时间花费。(此处用野火的m3工程模板) 模板的配置是根据相对路径的,所以模板可以随意复制到任意一个地方。 1.文件夹改名,这里我改为shuoGG_project,打开工程(在USER里),改改output名和文件名什么的,当然不改也没什么影响; 2.选型换一换,这个模板默认是stm32f103ve的; 3.个人习惯:把stm32f10x_conf.h和stm32f10x_it.h加到USER文件夹方便修改; 4.用串口烧写的记得勾上create hex; 5.在stm32f10x_conf.h注释掉用不到的外设,可以减少一点编译时
[单片机]
Keil C51单片机集成开发环境编程与调试教程
同 VC 之类的通用 C 语言集成开发环境(IDE)一样,Keil 也采用“工程” (Project)的方式管理源代码及相关文件,这种管理方式为由多个源代码文件组 成的大型程序开发提供了方便。不管是最简单的 C51程序,还是复杂的多文件 程序都需要以下步骤: 1)先建立新的工程文件; 2)在工程中新建源代码文件,或是将已经存在的源代码文件加入工程; 3)编译; 4)调试,修正错误再编译; 5)将生成的二进制文件*.hex 烧入单片机。 本教程重点介绍上述前 4 个步骤。 二、Keil中新建工程的步骤 1. 单击菜单“Project——New uVision Project……” 出现新建工程对话框: 在此对话框中选择存
[单片机]
Keil模式设置和编程事项
深入理解并应用C51对标准ANSIC的扩展是学习C51的关键之一。因为大多数扩展功能都是直接针对8051系列CPU硬件的。大致有以下8类: 8051存储类型及存储区域 , 存储模式 , 存储器类型声明 , 变量类型声明 , 位变量与位寻址 ,特殊功能寄存器(SFR) ,C51指针 l 函数属性 具体说明如下(8031为缺省CPU)。 第一节 Keil C51扩展关键字 C51 V4.0版本有以下扩展关键字(共19个): _at_ idata sfr16 alien interrupt small bdata large _task_ Code bit pdata using reentrant xdata
[工业控制]