一,背景介紹
之前通過網上收集資料(資料后期整理之后會在博客分享),在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 &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 } 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初始化的時候一并初始化即可
上一篇:STM32芯片無法正常工作的現象及原因分析集錦
下一篇:ucosii移植到STM32-F0/F1/F2
推薦閱讀
史海拾趣
FIDELIX公司成立于1990年,最初只是一家小型半導體研發公司。在韓國半導體產業蓬勃發展的背景下,FIDELIX憑借其對技術的執著追求和對市場的敏銳洞察,逐漸在NAND FLASH(閃存)和SDR/DDR(單/雙數率同步動態存儲器)等存儲芯片領域取得突破。經過多年的努力,FIDELIX在韓國市場上確立了其存儲芯片研發及銷售的地位,成為僅次于三星、SK海力士的第三大MEMORY(存儲器)生產廠商。
隨著市場需求的不斷變化,Autotrol公司意識到必須不斷進行技術創新和產品升級,以滿足客戶的多樣化需求。于是,公司投入大量研發資源,開發出了一系列特色產品,如為更大轉矩而制的銅或鐵齒輪傳動鏈,以及為安靜運行并省錢而特制的塑料齒輪傳動鏈等。這些創新產品不僅提升了Autotrol在市場上的競爭力,也為公司帶來了可觀的收益。
進入21世紀后,G-Mag意識到單一產品線難以滿足市場多元化需求,于是開始實施并購擴張戰略。2005年,G-Mag成功收購了國內一家領先的電子元器件制造商,這次收購不僅增強了G-Mag在供應鏈上的控制力,還為其帶來了豐富的產品線和技術儲備。隨后幾年,G-Mag又陸續完成了對多家在傳感器、無線通信等領域具有優勢企業的并購,逐步構建起了一個覆蓋電子產業鏈上下游的龐大帝國。通過并購,G-Mag不僅實現了業務的快速增長,還鞏固了其在電子行業中的領先地位。
隨著環保意識的日益增強,CPI積極響應國家號召,將綠色環保理念融入公司的經營發展中。公司加大了對環保技術的研發投入,推出了一系列低能耗、低排放的通信設備和電源產品。同時,CPI還加強了對生產過程的環保管理,通過引進先進的環保設備和技術,實現了生產廢棄物的減量化、資源化和無害化處理。這些舉措不僅提升了CPI的社會形象,也為公司的可持續發展注入了新的動力。
近年來,隨著全球半導體市場的競爭加劇和技術的不斷更新換代,ASM公司也面臨著巨大的挑戰。為了保持競爭優勢,公司不斷調整其戰略和業務結構,加大研發力度,推出更具競爭力的新產品。同時,公司還積極尋求與其他企業的合作與共贏,共同推動半導體產業的發展。
酷宅科技在追求經濟效益的同時,也積極履行社會責任。公司關注環保和可持續發展問題,推動綠色制造和綠色消費。在產品設計和生產過程中,酷宅科技注重節能減排和資源循環利用,努力降低對環境的影響。此外,公司還積極參與公益事業和社會活動,為社會做出積極貢獻。
以上五個故事框架涵蓋了酷宅科技在電子行業中的發展歷程、市場策略、技術創新和社會責任等方面。每個故事都基于事實進行描述,旨在客觀展現酷宅科技在電子行業中的發展軌跡和貢獻。
看到一篇新聞,與大家分享下: 本土芯片商細分市場 部分找到藍海 http://www.nncyjs.com/manufacture/2010/0125/article_2403.html 安凱營業收入已經超過2億元,芯片出貨量超過千萬片,包括好記星、萬虹、諾亞舟等國內教育電子產品前幾大廠 ...… 查看全部問答∨ |
|
ret = request_irq(IRQ_ADC, s3c2410_isr_adc, SA_INTERRUPT,DEVICE_NAME, s3c2410_isr_adc); 申請了adc中斷,但是無論如何無法進入中斷處理程序s3c2410_isr_adc() 我在s3c2410_isr_adc()第一行做了一個printk語句. 請教大概是什么原因?… 查看全部問答∨ |
剛用西門子的 C60加上 移動的飛信 做了個隨機聊天 的東西.... 不過貌似不好玩.. 后來發現這手機貌似還能當GPRS模塊用~ at+cgdcont=1,"ip","cmnet" OK at+cgdcont? +CGDCONT: 1,"IP","cmnet","",0,0 OK 不知道這兩 ...… 查看全部問答∨ |
自己也一直想購買一個開發板,但是對我一個普通的學生而言主要是因為經濟上的承受能力,使自己短時間內無法擁有自己的開發板, 而且自己從大二開始就已經在學習VerilogHDL方面的知識和一些關于硬件的東西。對于一系列的軟件也都比較熟悉,唯一的不 ...… 查看全部問答∨ |
|
MSP430Ware學習筆記 UART ACLK 9600-8-N-1 1.初始化UART0之前需要先初始化ACLK、SMCLK和MCLK。示例代碼中使用XT1,ACLK為32768,SMCLK和MCLK約為8MHZ。2.UART的時鐘可以參考ACLK或者SMCLK,本例參考ACLK。由于參考ACLK時鐘,所以串口速率不能超過32768。選擇9600較為合適。3.MSP430波特率的 ...… 查看全部問答∨ |
設計資源 培訓 開發板 精華推薦
- STM32一文通(6) 外部中斷
- ESP32玩轉MicroPython(一) 燒入固件, 初識
- ESP32玩轉MicroPython(二) 連接WIFI網絡 webperl文件傳輸
- ESP32玩轉MicroPython(三) 延時、計時 和GPIO操作
- 玩轉 ESP32 + Arduino (一) 開發環境搭建
- 玩轉 ESP32 + Arduino (四) 電容按鍵 霍爾傳感器 外部中斷 延時 脈沖檢測
- 玩轉 ESP32 + Arduino (五) platformIO引入類庫 自開發庫 串口打印字符串
- 玩轉 ESP32 + Arduino (六) 硬件定時器, IIC, SPI
- 玩轉 ESP32 + Arduino (八) U8G2驅動OLED