【Contiki学习】01.Contiki-stm32系统下实现serial-shell功能

发布者:JoyfulSerenade最新更新时间:2020-04-07 来源: eefocus关键字:Contiki学习  Contiki  stm32系统  serial-shell功能 手机看文章 扫描二维码
随时随地手机看文章

一,背景介绍


之前通过网上收集资料(资料后期整理之后会在博客分享),在stm32上面跑通了,就是实现了简单的点灯程序,以及串口输出。


但是后期开发使用肯定需要用到shell,经过一番折腾后小有收获。


在这说一下开发环境:IAR+stm32vet6(ST官方库3.5+contiki3.0)


二,准备工作


1,在contiki源码中按照目录提取以下文件:

ps. stm32_shell.c是自行添加的代码


三,源码分析


1,先看一下main函数:


int main()

{

  dbg_setup_uart();

  led_init();

  printf("Initialisingrn");

  

  clock_init();

  process_init();

  //shell serial_line 初始化

  uart1_set_input(serial_line_input_byte);

  serial_line_init();

  //

  process_start(&etimer_process, NULL);

  autostart_start(autostart_processes);

  printf("Processes runningrn");

  while(1) {

    do 

    {

    } 

    while(process_run() > 0);

    idle_count++;

    /* Idle! */

    /* Stop processor clock */

    /* asm("wfi"::); */ 

  }

  return 0;

}


需要注意的是:


  //shell serial_line 初始化

  uart1_set_input(serial_line_input_byte);

  serial_line_init();

  //


2,usrt1_set_input定义在串口底层驱动里面

static int (* uart1_input_handler)(unsigned char c);


void uart1_set_input(int (* input)(unsigned char c))

{

    uart1_input_handler = input;

}

先建立一个函数指针:


static int (* uart1_input_handler)(unsigned char c);

再通过

uart1_set_input(serial_line_input_byte);

将(*uart1_input_handler)指向 serial_line_input_byte()函数,

这样就可以通过调用uart1_input_handler();将串口接到的数据导入serial_line中,从而可以通过serial_line_process进程进行命令分析做出相应处理。


uart1_input_handler();的调用写在串口中断中即可:


void USART1_IRQHandler(void)

{

      ENERGEST_ON(ENERGEST_TYPE_IRQ);

      if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)

    {

if(uart1_input_handler != NULL)

{

  /* Read one byte from the receive data register */

uint8_t buf = USART_ReceiveData(USART1);

uart1_input_handler(buf);

}

    }

ENERGEST_OFF(ENERGEST_TYPE_IRQ);

}


3,通过上面的处理已经把串口接收到的数据导入serial_line中了,当然串口配置初始化在这就不用多说了,接下来就是要把shell进程加入系统了:


调用serial_shell_init()函数即可


定义:


void

serial_shell_init(void)

{

  process_start(&serial_shell_process, NULL);

}

就是开启serial_shell_process进程,但是我这边新建立一个进程,用于后续其他自定义的shell命令的初始化:


#include "contiki.h"

#include "shell.h"

#include "serial-shell.h"


PROCESS(stm32_shell_process, "STM32 Contiki Shell");


PROCESS_THREAD(stm32_shell_process, ev, data)

{

    PROCESS_BEGIN();


    serial_shell_init();//初始化shell


    PROCESS_END();

}


然后再将改进程加入main函数即可,

到这边就已经完成了shell的功能,可以通过串口看见

发送 help(加回车)

这是一些默认的命令,你也可以自己定义一些命令,通过阅读shell部分的源码进一步了解原理。


4,在shell.c中可以看见关于上面打印出来的命令的定义,其实每个shell命令对应一个process,


PROCESS(help_command_process, "help");

SHELL_COMMAND(help_command, "help", "help: shows this help",

      &help_command_process);

SHELL_COMMAND(question_command, "?", "?: shows this help",

      &help_command_process);

PROCESS(shell_killall_process, "killall");

SHELL_COMMAND(killall_command, "killall", "killall: stop all running commands",

      &shell_killall_process);

PROCESS(shell_kill_process, "kill");

SHELL_COMMAND(kill_command, "kill", "kill : stop a specific command",

      &shell_kill_process);

PROCESS(shell_null_process, "null");

SHELL_COMMAND(null_command, "null", "null: discard input",

      &shell_null_process);

PROCESS(shell_exit_process, "exit");

SHELL_COMMAND(exit_command, "exit", "exit: exit shell",

      &shell_exit_process);

SHELL_COMMAND(quit_command, "quit", "quit: exit shell",

      &shell_exit_process);

PROCESS_THREAD(shell_kill_process, ev, data)

{

  struct shell_command *c;

  char *name;

  PROCESS_BEGIN();


  name = data;

  if(name == NULL || strlen(name) == 0) {

    shell_output_str(&kill_command,

     "kill : command name must be given", "");

  }



  for(c = list_head(commands);

      c != NULL;

      c = c->next) {

    if(strcmp(name, c->command) == 0 &&

       c != &kill_command &&

       process_is_running(c->process)) {

      command_kill(c);

      PROCESS_EXIT();

    }

  }


  shell_output_str(&kill_command, "Command not found: ", name);

  

  PROCESS_END();

}


5,添加自定义命令通过一下方式即可:


#include "contiki.h"

#include "shell.h"


#include "stdio.h"

#include "string.h"

#include "stm32f10x.h"


PROCESS(shell_blink_process, "shell blink");

SHELL_COMMAND(blink_command, "blink",

              "blink on/off : led on/off", &shell_blink_process);

static void

led_init()

{

    GPIO_InitTypeDef GPIO_InitStructure;


    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF,ENABLE);


    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;



    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_7;

    GPIO_Init(GPIOF, &GPIO_InitStructure);

}



/**

 * brief

 * param

 *

 */

static void

led_on()

{

    GPIO_SetBits(GPIOF, GPIO_Pin_7);

}


static void

led_off()

{

    GPIO_ResetBits(GPIOF, GPIO_Pin_7);

}


PROCESS_THREAD(shell_blink_process, ev, data)

{

    PROCESS_BEGIN();

    if(data != NULL)

    {

        if(strcmp(data, "on"))

        {

            led_on();

        }

        else if(strcmp(data, "off"))

        {

            led_off();

        }

        else

        {

            printf("Invalid param!n");

        }

    }



    PROCESS_END();

}


void

shell_blink_init(void)

{

    led_init();

    shell_register_command(&blink_command);

}


a,通过SHELL_COMMAND(blink_command, "blink",

              "blink on/off : led on/off", &shell_blink_process);定义shell命令;

b,通过shell_register_command(&blink_command);在shell初始化的时候一并初始化即可


关键字:Contiki学习  Contiki  stm32系统  serial-shell功能 引用地址:【Contiki学习】01.Contiki-stm32系统下实现serial-shell功能

上一篇:STM32芯片无法正常工作的现象及原因分析集锦
下一篇:ucosii移植到STM32-F0/F1/F2

推荐阅读最新更新时间:2024-11-13 20:17

求一种基于STM32的智能加油系统设计方案
毕设介绍 针对当前汽车加油需求的日益增多,基于STM32开发技术和传感器技术开发一款智能加油系统。 题目要求 智能加油系统应具备油量控制、根据油费计价、加油环境检测的功能。该系统能模拟汽车加油的全过程,并具备远程控制功能。 题目分析 本次毕业设计是智能加油系统的设计与实现,设计所包含的模块主要有oled显示电路、电磁阀驱动电路、可燃气体传感器模块、ds18b20数字温度传感器、蜂鸣器报警模块、WIFI模块、按键电路模块及电源模块。 通过模块之间的配合实现智能加油系统,一旦有温度异常或可燃气体浓度超标将会通过wifi模块对管理人员发出警告。 stm32f103c8t6实时采集ds18b20温度传感器获取温度,如果温度
[单片机]
求一种基于<font color='red'>STM32</font>的智能加油<font color='red'>系统</font>设计方案
基于STM32的智能电梯控制系统设计
电梯自动控制系统一般是基于PLC,但是在一些干扰较少,层数较少,且控制精度要求不高的情况下,使用单片机是十分适合的。虽然它在抗干扰及稳定性上比不上PLC,但是它的价格、体积及灵活性是PLC所不及的。 1、系统硬件设计 1.1、系统总体组成 如图1系统总体结构,本系统将基于ARMCortex-M3内核的STM32F103ZET6芯片作为主控芯片,连接电机控制、压力传感、液晶显示、光感检测、按键输入模块,通过程序控制组成了一个智能电梯控制系统。其中,电机控制模块用于模拟电梯门的开关和电梯的上下运动;压力传感模块用于模拟电梯门关闭时受到阻力的情况及超重警告;光感模块用于模拟电梯抵达楼层时的位置检测;液晶显示模块用于模拟电梯内部的楼层
[单片机]
基于<font color='red'>STM32</font>的智能电梯控制<font color='red'>系统</font>设计
STM32学习笔记之基础介绍(一)(时钟源,系统时钟)
这是我第一次在CSDN上写博客,准备把自己学习STM32的内容记录下来。 因为最近在复习,所以就当作是巩固学习吧。 首先我用的具体型号是STM32F407ZGT6,属于M4系列的,使用Keil平台开发,ST-LINK下载。 第一篇的话,就先简单介绍一下开发环境,以及一些相应的问题。 1、我学习的是寄存器版本,相对于库函数版本来说,学习起来比较困难;不过学习寄存器版本优点是能更深入的了解单片机的运行原理,而且寄存器版本学会了,库函数也就能会了。 STM32 有两种操作方式: 方式1:库函数操作 ----ST为了用户编写方便,把MCU中的外设功能全部封装成
[单片机]
基于STM32设计的四轴飞行器飞控系统
引言 四轴飞行器是一种结构紧凑、飞行方式独特的垂直起降式飞行器,与普通的飞行器相比具有结构简单,故障率低和单位体积能够产生更大升力等优点,在军事和民用多个领域都有广阔的应用前景,非常适合在狭小空间内执行任务。因此四旋翼飞行器具有广阔的应用前景,吸引了众多科研人员,成为国内外新的研究热点。 本设计主要通过利用惯性测量单元(IMU)姿态获取技术、PID电机控制算法、2.4G无线遥控通信技术和高速空心杯直流电机驱动技术来实现简易的四轴方案。整个系统的设计包括飞控部分和遥控部分,飞控部分采用机架和控制核心部分一体设计增加系统稳定性,遥控部分采用模拟摇杆操作输入使操作体验极佳,两部分之间的通信采用2.4G无线模块保证数据稳定传输。飞行控制板
[单片机]
基于<font color='red'>STM32</font>设计的四轴飞行器飞控<font color='red'>系统</font>
基于STM32的数字PDA系统软件系统设计
数字PDA系统整体由硬件电路和软件系统2部分组成,硬件电路由低功耗ARM微控制器STM32ZET6控制的PDA外围电路组成,软件系统则由硬件驱动程序、μC/OS-Ⅱ实时操作系统、FATFS文件系统、GUI等部分组成。数字PDA系统将整个软件系统进行了整合,提供一种基于页的机制方法,即每页都是一个线程,利用μC/OS-Ⅱ的信号量、邮箱机制实现多线程之间的任务切换。PDA系统采用页机制的设计,旨在减少增加应用程序时代码的修改量和提高整个PDA软件系统的稳定性,以及提高应用程序的开发速度。 以Cortex-M3为内核的处理器由于其低功耗以及低成本并且是32位处理器,越来越多的研究人员已经从51处理器、AVR等处理器开始转移到这个领域
[单片机]
基于<font color='red'>STM32</font>的数字PDA<font color='red'>系统</font>软件<font color='red'>系统</font>设计
STM32系统时钟配置
STM32的SYSCLK(系统时钟)可由三种不同的时钟源来驱动,分别是HSI振荡器时钟、HSE振荡器时钟、PLL时钟。这些设备还拥有2种二级时钟源: 1、低速内部RC(LSI RC)振荡器,频率在30~60KHZ之间变化,为了方便计算我们一般估算为40KHZ,它主要为独立看门狗提供时钟源,或通过相关寄存器配置驱动RTC(RTCCLK),用于从停机/待机模式下自动唤醒系统。 2、使用32.768KHZ的低速外部晶体时钟来驱动RTC(RTCCLK)。 为减小功耗,STM32的任一时钟源都可以独立地开启或关闭。 注意:1、当HSI(高速内部时钟)作为PLL时钟输入时,SYSCLK得到的最大频率为36MHZ(有些写的是64MHZ)。SD
[单片机]
<font color='red'>STM32</font><font color='red'>系统</font>时钟配置
STM32 时钟系统
众所周知,时钟系统是 CPU 的脉搏,就像人的心跳一样。所以时钟系统的重要性就不言而喻了。 STM32 的时钟系统比较复杂,不像简单的 51 单片机一个系统时钟就可以解决一切。于是有人要问,采用一个系统时钟不是很简单吗?为什么 STM32 要有多个时钟源呢? 因为首先STM32 本身非常复杂,外设非常的多,但是并不是所有外设都需要系统时钟这么高的频率,比如看门狗以及 RTC 只需要几十 k 的时钟即可。同一个电路,时钟越快功耗越大,同时抗电磁干扰能力也会越弱,所以对于较为复杂的 MCU 一般都是采取多时钟源的方法来解决这些问题。首先让我们来看看 STM32 的时钟系统图吧: 在 STM32 中,有五个时钟源,为 HSI、H
[单片机]
<font color='red'>STM32</font> 时钟<font color='red'>系统</font>
STM32系统时钟的监控和切换
在前一段时间的公司的项目中要求用到STM32这款处理器在外部晶振异常的情况下自动的切换到内部晶振,在网上找了N多的资料终于在网上找到了一个官方的研讨会的PPT里面简单的介绍了一下,于是顺着这个思路试着去编写代码,没想到官方提供的思路还蛮靠谱! —————————————————我是华丽的分割线——————————————————— —————————————————我是华丽的分割线——————————————————— 函数一、 void INIT_CLOCK(void) { #if 1 ErrorStatus HSEStartUpStatus; RCC_DeInit(); //复位RCC寄存器 RCC
[单片机]
<font color='red'>STM32</font><font color='red'>系统</font>时钟的监控和切换
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved