




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、智林STM32开发板上实现的简单人机界面之三 1、用于智林STM32开发板2、命令支持 现在共支持四个命令:help、cls、ledon、ledoff。输入help显示系统的可用命令。输入cls清屏。输入ledon,点亮开发板的绿色指示灯。Ledoff将指示灯熄灭。 如果输入其它命令,屏幕显示Bad Command,重新回到提示符下。3、输入方法在开发板上有七个按键:摇杆方向键五个、右下角PB2和PB3。可以用这七个键输入英文和简单命令。摇杆往上按一下输入a,迅速再按一下切换为b,依次可切换为abcdefg。往右推可输入hijklmn,往左是opqrst和?,往下是rstuvw和!。中间键可输
2、入空格、逗号、句号和0123.PB2用于退格,若是退格到提示符,扬声器示警。PB3表示回车,命令输入完成。在测试过程中有一些小BUG,不过正常的操作是不会出现的。系统分类:嵌入式 | 用户分类:智林STM32之人机界面篇 | 标签:智林,STM32,人机交互,shell | 来源:原创 | 点击查看原文发表评论 阅读全文(353) | 回复(0)发表于 2009/10/18 20:25:301 智林STM32人机交互程序的编制计划03 智林STM32人机交互程序的编制计划031、背景智林STM32上只有七
3、个按键,命令的输入比较不方便。今天我仔细研究了一下手机键盘的英文输入方法,觉得可以借鉴一下。2、手机键盘英文输入的特点每一个按键对应多个字符,刚按下去时,字符阴影显示;再接着按一下,显示字符改变。如果停顿一会儿,该字符的输入就确定了,可以输入新的字符。3、编写思路在前面的程序里面,使用了KB_GetChar这个函数,新的程序的编写以此为基础。前面的程序是案件消息驱动的,如果消息队列里没有消息,则KB_GetChar()会一直等待。而新的驱动是时间敏感的,所以必须进行周期性扫描,如果消息队列里没有消息,一定时间内也必须做出相应的反映。4、状态变迁图 为了更清晰地表示出键盘输入的特点,我觉得必须要
4、画一个状态转移图才能更清晰地表达。 以下是按键消息处理KB_GetChar()的状态图上层程序调用KB_GetChar(),并根据返回信息,进行输入字符回显和命令缓冲区的填充。系统分类:嵌入式 | 用户分类:智林STM32之人机界面篇 | 标签:智林,STM32,按键,键盘 | 来源:原创 | 点击查看原文发表评论 阅读全文(289) | 回复(0)发表于 2009/10/18 12:11:081 Keil MDK下的STM32工程 MDK下的STM32工程一、功能分析1、该工程是一个简单的shell,用
5、于智林STM32开发板。在开发板上有七个按键:摇杆方向键五个、右下角PB2和PB3。可以用这七个键输入英文和简单命令。2、使用方法开发板上点复位以后,处于初始模式,最上面一栏显示CPU的使用率(这是ucos统计任务得到的值)和当前模式可输入字符(abcd和空格键)。同时第二行显示命令提示符:sh>。摇杆上推输入a在液晶上回显,右推输入b,左推输入c,下推输入d,按OK输入空格。按PB2可切换输入模式,总共六种模式:初始化是abcd和空格键,按PB2可分别切换为:efgh退格、ijkl逗号、mnop句号、qrstu和vwxyz。包括所有的英文小写和两个标点、空格键和退格键,简单的命令输入已
6、经够了。退格键可清除刚刚输入的字符,当到达命令提示符时,再按退格则扬声器报警提示。3、命令支持 现在共支持四个命令:help、cls、ledon、ledoff。输入help显示系统的可用命令。输入cls清屏。输入ledon,点亮开发板的绿色指示灯。Ledoff将指示灯熄灭。 如果输入其它命令,屏幕显示Bad Command,重新回到提示符下。二、工程源代码组织1、文件的组织 工程目录下共六个目录:startup、lcd、device、ucos_stm32、ucos、userapp。其中startup目录下放着stm32起动文件和库文件、lcd目录下放着液晶驱动文件和shell输出处理文件、de
7、vice目录下放置设备驱动文件(现在就一个speaker.c用于以后扩展设备)、ucos_stm32放置ucos在STM32下移植时需要的两个文件、usos目录放着uscos操作系统源代码。 Userapp目录放着用户主程序,为了方便阅读,每一个任务使用一个c文件。2、工程的组织 组织方式与文件目录的组织基本一致,用Keil MDK的主菜单project/manage/components、enviroments子菜单可进行工程文件组的组织。 经过这两天的整理,我觉得源代码的组织已经比较清晰了。其它的话我也不多说,大家看代码吧。 如果有智林STM32开发板的朋友可以下载、编译使用。系统分类:嵌
8、入式 | 用户分类:智林STM32之人机界面篇 | 标签:智林,STM32,人机交互,shell | 来源:原创 | 点击查看原文发表评论 阅读全文(417) | 回复(1)发表于 2009/10/17 20:52:261 智林STM32程序源代码的分析和整理04 智林STM32程序源代码的分析和整理04一、定时器的配置1、概述 STM32的定时器功能比较多、配置也较复杂,我现在了解不多,边用边学吧。智林开发板上有两个用定时器的地方,一个是液晶的背光电源,要求输出一定的PWM波形,用于整流提供电源;二是用
9、于控制喇叭,也是时钟脉冲输出。 定时器首先的选择是计数、还是定时,我这里用的都是定时,输出模式可以是输入时定时器的捕获,可以是比较匹配时设定输出(经常用到这一种)。2、源程序void TIMx_Config(void) TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; /时基单元配置数据结构 TIM_OCInitTypeDef TIM_OCInitStructure; /输出模式设置数据结构 /* PA2脚接着定时器2 CH3方波脉冲输出,该输出是液晶显示整流电源 */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2
10、;/PA2,复用输出模式 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; /即用于定时2 通道3 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); /* 时基单元配置:TIM2计数频率=36MHz除以3=12MHz,输出频率=12MHz除以2倍周期值。*/ TIM_TimeBaseStructure.TIM_Period = CCR3_Val;/40写入自动装载寄存器,150KHz输出。 TIM_TimeBase
11、Structure.TIM_Prescaler = 2; /分频系数3 TIM_TimeBaseStructure.TIM_ClockDivision = 0;/与什么采样相关,这里用不到 /向上计数的特点是:从0到加载值,产生溢出;然后重新从0计数。 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); /* 输出比较模式配置: 通道3 */ TIM_OCInitStructure.TIM_OCMode = TIM_OCMo
12、de_Toggle; /定时器计数与比较通道匹配时翻转 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;/开启输出通道 TIM_OCInitStructure.TIM_Pulse = CCR3_Val; /比较通道的计数值 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; /低电平有效 TIM_OC3Init(TIM2, &TIM_OCInitStructure); TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_E
13、nable);/自动重装载,预装载 TIM_Cmd(TIM2, ENABLE); /* TIM2定时器工作使能 */TIM_ITConfig(TIM2, TIM_IT_CC3, ENABLE);/* 时钟中断使能 */这里只列出了液晶使用的定时器2通道3的输出,输出150kHz的频率。没用到中断。这个频率是怎么得到的呢?首先是TIM2使用APB1的36M,经过预分频,分频系数为(Prescaler+1)=3,3分频后为12MHz。计数周期为40,计数到40与输出比较寄存器产生匹配,触发输出翻转,然后计数器重新开始计数。故输出通道的频率为12MHz除以80,得到150kHz。二、串口的配置按键输
14、入命令不怎么方便,很快我就要编写串口通信程序,用串口输入命令,控制开发板。串口配置用库函数很方便。void UART_Config(void)/进行串口的初始化配置 USART_InitTypeDef USART_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; /* UART的发送引脚 */ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &
15、GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; /* UART的接收引脚 */ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); USART_InitStructure.USART_BaudRate = 115200;/波特率 USART_InitStructure.USAR
16、T_WordLength = USART_WordLength_8b; /数据位8位 USART_InitStructure.USART_StopBits = USART_StopBits_1; /停止位1 USART_InitStructure.USART_Parity = USART_Parity_No ;/无奇偶校验 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; /无硬件流控 USART_InitStructure.USART_Mode = USART_Mode_Rx | U
17、SART_Mode_Tx; /发送、接受模式有效 USART_Init(USART1, &USART_InitStructure);/* 根据上面结构的参数对串口1进行初始化 */ USART1->BRR =0x0271; /* 库函数的串口波特率计算有些问题,这里重新计算了一下 */ USART_Cmd(USART1, ENABLE); /* 使能串口1 */系统分类:嵌入式 | 用户分类:智林STM32之人机界面篇 | 标签:智林,STM32,源代码,整理 | 来源:原创 | 点击查看原
18、文发表评论 阅读全文(291) | 回复(0)发表于 2009/10/17 17:12:091 智林STM32程序源代码的分析和整理03 智林STM32程序源代码的分析和整理03一、Systick的配置1、简单介绍 这是一个系统定时器,时钟源可以为AHB时钟,也可设置为SysClk/8。使用时先设定初始值,然后每来一个时钟,减去1,计数器为0时标志置位,也可触发中断。 在我的程序中,Systick用作usos的工作时钟。2、我的源程序void SysTick_Config(void) SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK); /* 将AH
19、B始终作为SysTick时钟源 */ SysTick_SetReload(72000*10); /* 每10毫秒发生一次中断,ucos的系统频率为100Hz */ /72MHz的频率下,计数72000需要1ms。 SysTick_ITConfig(ENABLE);/* 使能中断 */下面是中断服务程序void SysTickHandler(void) OS_CPU_SR cpu_sr; OS_ENTER_CRITICAL(); OSIntNesting+; /中断嵌套计数 OS_EXIT_CRITICAL(); OSTimeTick(); /ucos的时钟服务程序 OSIntExit(); /
20、这里可以触发任务切换软中断 二、GPIO的配置1、PA口 PA0对应按键PB3,开发板右下角。PA1用于模拟电位器,JP1在这里。PA2用定时器的PWM产生液晶的背光电源。PA4-PA7用于SPI模式操作SD卡。PA9,PA10用于串口0通信。PA11,PA12是USB差分线。PA13、PA14、PA15是JTAG的三个脚。 PA3、PA8没用到。2、PB口 PB0用于扬声器,PB2与JP4用于Boot1选择。PB3和PB4是JTAG的另外两个脚。PB5控制绿色指示灯,在SD卡上面。PB6、PB7用于I2C的存储器。PB8、PB9用于CAN收发器。PB11-PB15用于摇杆按键。 PB1和PB
21、10没有用到3、PC口 PC0到PC7用于液晶的数据口,PB8-PB12分别用于读、写、命令数据选择、复位和片选。PB13是PB2按键,在PB3左边。PB14-PB15外接32.768KHz晶振。以上是开发板上各个IO口的用途,通用IO口先在这里配置,其它复用功能的在相应的功能里配置,以下是源程序。4、程序void GPIO_Config(void) GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; /* PA0接着按钮PB3 */ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;/浮空输入 GPIO_
22、InitStructure.GPIO_Speed = GPIO_Speed_50MHz;/最大速度50MHz GPIO_Init(GPIOA, &GPIO_InitStructure);/对A口初始化 /* 配置PB5为输出推挽方式,控制一个小绿灯 */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_
23、InitStructure); /* 配置PB11-PB15为输入浮空方式,是摇杆五键输入 */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_13| GPIO_Pin_13| GPIO_Pin_14| GPIO_Pin_15; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_Ini
24、tStructure.GPIO_Pin = GPIO_Pin_13; /* PC13脚接着按钮PB2 */ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure); /*液晶控制的IO口在LCD底层驱动函数中实现直接设置,PC0-PC12*/系统分类:嵌入式 | 用户分类:智林STM32之人机界面篇 | 标签:智林,
25、STM32,源代码,整理 | 来源:原创 | 点击查看原文发表评论 阅读全文(308) | 回复(0)发表于 2009/10/17 16:45:061 智林STM32程序源代码的分析和整理02 智林STM32程序源代码的分析和整理02一、STM32时钟配置程序分析1、RCC RCC是指Reset and Clock Control复位和时钟控制。主要寄存包括控制、配置、中断、外设复位、外设时钟使能、复位状态寄存器。 内核的工作时钟为SysClk,它的来源有三种:外部时钟HSE、内部时钟HSI和PLL输出时钟。当然PLL的时钟也是来自于外部或内部时钟。
26、2、我的源程序void RCC_Config(void) /时钟配置,采用外部时钟和PLL ErrorStatus HSEStartUpStatus; /* 枚举变量,定义高速时钟的起动状态 */ RCC_DeInit();/* RCC 寄存器值复位为初始值 */ RCC_HSEConfig(RCC_HSE_ON); /* 使能外部HSE晶振 */ HSEStartUpStatus = RCC_WaitForHSEStartUp();/* 等待循环直到 HSE时钟起振 */ /如果外部时钟起振成功 if(HSEStartUpStatus = SUCCESS) /* 使能预取指令缓存 */ FL
27、ASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);FLASH_SetLatency(FLASH_Latency_2); /* Flash 2个时钟延时 */ RCC_HCLKConfig(RCC_SYSCLK_Div1); / HCLK = SYSCLK AHB时钟等于系统时钟 RCC_PCLK2Config(RCC_HCLK_Div1); /* PCLK2 = HCLK APB2时钟等于AHB时钟 */ RCC_PCLK1Config(RCC_HCLK_Div2);/ PCLK1 = HCLK/2 APB1时钟等于1/2AHB时
28、钟 /* PLLCLK(锁相环输出时钟) = 12MHz(外部时钟) * 6(倍率) = 72 MHz(系统时钟) */ RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_6); RCC_PLLCmd(ENABLE);/* 使能 PLL */ / 等待PLL准备好 while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) = RESET); RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); / 选择PLL作为系统时钟 while(RCC_GetSYSCLKSource() != 0x08
29、); /* 等待PLL作为系统时钟标志位置位 */ /* 使能外部相关部件的时钟,包括AHB总线、APB2高速外围总线、APB1总线 */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);/使能APB1上的TIM2 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);/使能三个IO口时钟 RCC_APB2PeriphClockCmd(
30、RCC_APB2Periph_AFIO, ENABLE); /使能IO复用功能时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); /使能串口1时钟二、NVIC的配置1、NVIC 它是指嵌套 向量 中断 控制器。中断的数目与向量表的大小相关。加上保留的,每个向量占据4个字节,一共占据0x0000,00EC个字节。NVIC的配置与具体中断相关,都在具体器件里配置,所以程序里的代码很少。2、源代码void NVIC_Config(void)#ifdef VECT_TAB_RAM /* 将向量表设置在RAM 0x20000000 */ N
31、VIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); #else /* VECT_TAB_FLASH */ /* 将向量表设置在Flash ROM 0x08000000 */ NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); #endif /* 配置0位作为抢占优先级,4位子优先级 */ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);/STM32 共有四位数字进行优先级选择系统分类:嵌入式 | 用户分类:智林STM32之人机界面篇 |
32、160;标签:智林,STM32,源代码,整理 | 来源:原创 | 点击查看原文发表评论 阅读全文(335) | 回复(0)发表于 2009/10/17 10:38:571 智林STM32程序源代码的分析和整理01 2009年10月17日星期六 9:13:13智林STM32程序源代码的分析和整理01一、目的1、前些天,编写了开发板上键盘扫描、字符输入和简单shell的程序,该程序的编写是在以前工程的基础上修改而成的,源代码的组织比较乱,也没有很好的注释。这两天,先把代码整理一下,加上比较详细的注释,使得可读性、扩展性更好。2、乘这个机会,也把程序里与S
33、TM32硬件相关的部分好好学习一下。二、开发板配置分析1、PA口 PA0对应按键PB3,开发板右下角。PA1用于模拟电位器,JP1在这里。PA2用定时器的PWM产生液晶的背光电源。PA4-PA7用于SPI模式操作SD卡。PA9,PA10用于串口0通信。PA11,PA12是USB差分线。PA13、PA14、PA15是JTAG的三个脚。 PA3、PA8没用到。2、PB口 PB0用于扬声器,PB2与JP4用于Boot1选择。PB3和PB4是JTAG的另外两个脚。PB5控制绿色指示灯,在SD卡上面。PB6、PB7用于I2C的存储器。PB8、PB9用于CAN收发器。PB11-PB15用于摇杆按键。 PB
34、1和PB10没有用到3、PC口 PC0到PC7用于液晶的数据口,PB8-PB12分别用于读、写、命令数据选择、复位和片选。PB13是PB2按键,在PB3左边。PB14-PB15外接32.768KHz晶振。4、PD口 PD0-PD1外接12MHz晶振,PD2用于USB的连接断开控制,低电平主机能检测到,高电平断开连接,JP3可直接控制连接。另外还有BOOT 0脚,模式受控于JB5。下面还有复位引脚。这里5个脚加上上面48个,共53个引脚。5、电源口 共11个脚,还有电池引脚。到这里,开发板的IO配置基本已经很清晰了。三、初始化配置程序的编写程序中采用ucos操作系统,在调用OS_Init()之前
35、,先调用BSP_Config()进行开发板IO配置工作。下面是程序框架的源代码。/* 下面是包含文件*/#include "stm32f10x_lib.h"#include "bsp_config.h"/* 可以在这里定义一些意义较为清晰地常量,如果不用改变,就放在文件user_conf.h里*/* 用户自己的全局变量在这里定义,按意义进行组合*/static GPIO_InitTypeDef GPIO_InitStructure; /进行GPIO端口设置的数据结构static NVIC_InitTypeDef NVIC_InitStructure; /
36、进行中断设置的数据结构,前面的变量是用typedef在nvic的头文件中定义的。/* 用户实现的函数在这里声明*/void RCC_Config(void);void NVIC_Config(void);void SysTick_Config(void);void GPIO_Config(void);void TIM_Config(void);void USART_Config(void);/* 该函数实现时钟系统、中断、系统时钟和IO口配置的初始化 实现STM32直接外围器件的初始化*/void BSP_Config(void) RCC_Config();/时钟配置 NVIC_Config(
37、);/中断向量配置,主要工作不在这儿做 SysTick_Config(); /系统时钟配置,用于usos的时钟 GPIO_Config(); /通用IO口配置,复用端口单独配置 TIM_Config();/定时器配置 UART_Config( ); /异步串行端口配置 以下就是这些具体配置函数的源代码,我会边修改边发出来。有了这么一个程序框架后,对于不同的应用程序,软件的裁剪就比较方便。系统分类:嵌入式 | 用户分类:智林STM32之人机界面篇 | 标签:智林,STM32,源代码,整理 | 来源:原创 |
38、;点击查看原文发表评论 阅读全文(412) | 回复(0)发表于 2009/10/16 21:42:131 程序调试记录 2009年10月16日星期五19:44:43程序调试一、调试目的在前两天编写的shell程序中,出了这么一个问题:shell程序从消息队列读取按键,当读取到enter键时,进入命令执行状态;命令执行完成后,回到输入态,继续读取按键。但是实际执行过程中发现,如果输入错误命令,程序正常执行;但是输入正确命令执行完成以后,会进入一个读取按键的死循环。通过简单调试发现,是消息队列那里出了问题,今天的调试就从消息队列开始。二、ucos的消息队列1、它是如何创建的? 在操作系统初始化时
39、,调用了OS_QInit(),该函数主要是初始化了OSQFreeList = &OSQTbl0;并且把各个消息队列控制块链接起来。 然后应用程序调用OS_QCreate()创建自己的消息队列,提供的参数两个:一个是事件控制块,事件控制块包括类型、指针、等待任务列表等;一个是消息指针数组。创建的过程大概是这样:取出一个事件控制块,类型设置为消息队列,取出一个队列控制块,让事件控制块的指针指向它。然后队列控制块有读指针、写指针、消息数量、队列容量等参数进行初始化。 pq->OSQStart = start; /* Initialize the queue */ pq->OSQE
40、nd = &startsize; pq->OSQIn = start; pq->OSQOut = start; pq->OSQSize = size; pq->OSQEntries = 0;2、消息发到消息队列 程序调用OS_QPost()函数将消息发送到队列,实际上消息内容需要程序自己提供内存,消息队列接受内容的指针,将它复制到消息指针数字里,同时调整写指针,指向下一个消息指针。 *pq->OSQIn+ = pmsg; /* Insert message into queue */pq->OSQEntries+; 3、从消息队列取数据 程序调用OS
41、_QPend()函数从消息队列取消息,实际上是得到一个指针,然后根据指针取到相应的内容,同时还要调整队列控制块的读指针和有效消息数。 pq = (OS_Q *)pevent->OSEventPtr; /* Point at queue control block */ if (pq->OSQEntries > 0) /* See if any messages in the queue */ pmsg = *pq->OSQOut+; /* Yes, extract oldest message from the queue */ pq->OSQEntries-;
42、当然,如果没有消息,那就在该队列上等待。三、调试过程1、观察事件控制块的参数变化我定义的事件控制块为KeyValueOSQ,先把它加到观察列表。在出问题的地方之前设置一个断点,起动调试。输入一个正确的命令,程序执行输出:输入help,屏幕显示shell支持的其他三个命令。最后观察KeyValueOSQ:它的队列控制块指针为0x2000,0df0.同时把消息指针数组加到观察列表。进入KB_GetChar()函数的内部,调用OS_QPend()从消息队列取数据,一进去,发现 if (perr = (INT8U *)0) /* Validate 'perr' */ return (v
43、oid *)0);是由于这句话因此返回一个无效指针。Perr没有有效地址。解决办法:将它设置为一个全局变量。2、最终的解决方案开始定义 u8 *perr,这个指针由于没有初始化,是一个随即的值。改为u8 Err,然后在调用OS_QPend时采用参数,&Err,程序正常运行。四、收获1、调试过程中要做好计划,先确定故障的范围,一般来说,结合程序的输出表现、单步调试可以确定故障点。2、指针的使用一定要注意:使用之前必须先初始化,比如这个程序中我定义了u8* perr。然后在程序中直接调用KeyPtr=OS_QPend(KeyValueOSQ,0,perr);这是一个还未赋值和初始化的指针,
44、它的值是随机的,当它变为0后,这个程序的运行就不正常了。改为:u8 Err定义,然后这样调用KeyPtr=OS_QPend(KeyValueOSQ,0,&Err),程序的运行就恢复正常了。系统分类:嵌入式 | 用户分类:智林STM32之人机界面篇 | 标签:C语言,指针 | 来源:原创 | 点击查看原文发表评论 阅读全文(232) | 回复(0)发表于 2009/10/16 18:12:021 智林STM32开发板上实现的简单人机界面之二 杨屹的为uCOS51增加Shell界面2009年10月14
45、日星期三 19:51:18人机交互程序编写过程一、参考的文献上次的计划里已经说明了此次编写的目标,这个人机交互程序实际上就是一个简单的Command Shell。参考的文献主要是杨屹的为uCOS51增加Shell界面这篇文章,写得很好。我会把我编写过程中的一些想法记录在此,然后也会上传杨屹的这篇文章,有兴趣的朋友可以阅读参考。二、编写Shell的准备工作1、我这个命令界面要在开发板的按键和液晶显示的基础上实现,而杨屹的Shell是在串口上实现。这里共同的地方是:不管字符来自按键还是来自串口,都是通过同样的函数接口将字符先存储到缓冲区,这样使得Shell接口的可移植性提高。我这里使用KB_Get
46、Char(),以后在使用串口的时候,这个函数可以更名为Uart_GetChar(),对于上层程序来说,它提供了近似的接口。2、shell任务采用软件状态机实现,以下是已详细注释的源代码: switch(CmdState) /根据状态机进行散转 case StateInput:/如果处于输入状态 CharIn=(char)KB_GetChar();/读取输入按键 if(CharIn='n') / 如果按下了Enter键,它是触发软件状态机从输入态 / 进入命令解释执行态的关键。 CmdBufCharCount='0' /CharCount=输入字符的数字,命令缓冲
47、区以0结束Shell_PutChar( CharIn ); /显示器上回显换行if (CharCount=0)/之前没有输入字符,就是平白按了一下Enter Shell_PutString("sh>"); /重新显示命令提示符,仍在输入态下循环 else CmdState="StateExe" /如果输入过字符,进入命令解释态 CharCount=0; else if (CharIn='b') /如果输入退格键 if (CharCount=0)/之前没有输入字符,按退格不能理他 Buzzer_Beep(); /警告,已经退回提示符了
48、,再退就:>了。 else CharCount -=1;/有效字符数减去1. Shell_PutChar(CharIn);/让字符界面自己处理退格键 else /如果是其他键 CmdBufCharCount=CharIn; /将字符存入缓冲区当前位置CharCount +=1; /缓冲区位置向前移动if (CharCount>=CharMaxCount+1)/如果超过了,这个字符现在占据最后一个位置 CharCount="CharMaxCount" /使当前位置保持为最后一个,等待Enter。 Buzzer_Beep(); /这个字符也不向字符界面输出,而是产生
49、警告 else Shell_PutChar(CharIn);/将有效字符输出。 break; case StateExe:/如果处于命令执行态 CmdStr="ParseCmdBuf"(CmdBuf); /解析命令缓冲区,得到命令结构信息,我这里还只支持简单命令 /所以处理很简单,直接获得命令字符串,以后可以扩展。 for(CmdIndex=0; CmdIndex<4; CmdIndex+ ) / 在命令表里搜索对应命令字符串 CompResult=strcmp( CmdStr,CmdStrTableCmdIndex);/命令字符串比较的结果if (CompResul
50、t=0) /如果在字符串表里找到。返回0. break; /此时CmdIndex对应的值为命令在命令表里的索引。 if ( CmdIndex<4) CmdTableCmdIndex.CmdFunc(); /找到对应命令,调用相应函数处理else Shell_PutString("Bad Command!n"); /没有找到对应命令,输出信息。CmdState=StateInput;Shell_PutString("Sh>"); break;三、实际效果最终实现的四个命令是:help-用于显示其他可用命令,cls-用于清屏,ledon-点亮开发
51、板上的绿色指示灯,ledoff-关闭指示灯。 命令都能正确执行,也能识别不正确的命令,但是每次执行一次正确命令,获取按键的程序就进入死循环,再不能输入新的命令。问题正在调试过程中。系统分类:嵌入式 | 用户分类:智林STM32之人机界面篇 | 标签:智林,STM32,人机交互,shell | 来源:原创 | 点击查看原文发表评论 阅读全文(310) | 回复(0)发表于 2009/10/14 20:34:111 人机交互程序的编制计划02 2009年10月14日星期三 19:51:18人机交互程序的编制计
52、划020、前言前面的程序实现英文字符的输入,但是在程序内部没有任何对输入信息的处理,今天编制的这个计划是要做一个很简单的Shell命令接口,能够对用户的简单命令做出处理。1、要达到的目标。(1)能够识别简单的命令:这里先实现这么几条指令,ledon-点亮开发板上的绿色指示灯,ledoff-关闭指示灯,cls-清屏,只显示命令提示符,hello-显示hello,stm32s world.总共这四条指令。2、实现的步骤。(1)首先修改之前工程文件里的按键信息处理任务,task_keyhandler,使之成为一个函数KB_GetChar(),这个函数将由命令回显和执行的任务Task_CmdShell
53、()调用取得按键的输入值。(2)Task_CmdShell()主要需要完成的任务是:不断从键盘获取字符,当接受到ENTER按键时,认为命令的输入已经完成,接下来在能够实现的命令数组里查找相应的命令,若有对应命令,则调用相应的函数完成命令。(3)Task_CmdShell()的主体部分采用状态机实现-这是我比较喜欢的软件处理方式,结合操作系统的时间管理和通信功能,能够实现比较复杂的任务处理。命令解释器有两种状态:一个是输入态,不断地Pend On消息队列,取出按键值,存入命令缓冲字符数组,当收到ENTER时,转入命令态进行处理。一个是命令解释态:首先从命令缓冲字符数组取得命令,进行必要的格式化处理,(暂时不支持参数输入,也不支持括号、斜杠等输入),然后执行相应的命令后,重新回到命令提示符下。系统分类:嵌入式 | 用户分
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025版摄影师职业发展规划聘用合同范本
- 河北省博野县2025年上半年事业单位公开遴选试题含答案分析
- 2025年度高端医疗设备研发及授权使用合同
- 海南省屯昌县2025年上半年公开招聘村务工作者试题含答案分析
- 2025年版店铺转让附带装修权合同范本
- 2025版速记服务保密正本与知识产权保护合同
- 2025年度城乡统筹发展三旧改造合作开发协议
- 2025版体育产业融资合作保密协议
- 2025年度影视作品宣发推广服务合同
- 2025版石材行业产品质量检测服务合同范本
- 2025年苦荞可行性报告()
- 2025年法院书记员招聘考试笔试试题(50题)附答案
- 2024年高考山东物理试题分析及2025届高三复习备考策略
- 2025中国人寿养老笔试题库
- 《浙江省中药饮片炮制规范》 2015年版
- 2025小学音乐新课程标准
- 扶壁式挡土墙专项施工方案
- 人工智能机器学习Deep Learning by Ian Goodfellow,Yoshua Bengio,Aaron Courville (z-lib.org)
- 销售客户跟进培训
- 100以内加法减法口算1000题家庭作业打印
- 2025年四川雅安市川藏工业园区发展有限责任公司招聘笔试参考题库附带答案详解
评论
0/150
提交评论