基于stm32μcosii贪吃蛇的设计课程设计论文正文--大学毕业论文设计.doc
《基于stm32μcosii贪吃蛇的设计课程设计论文正文--大学毕业论文设计.doc》由会员分享,可在线阅读,更多相关《基于stm32μcosii贪吃蛇的设计课程设计论文正文--大学毕业论文设计.doc(36页珍藏版)》请在咨信网上搜索。
邯郸学院课程设计 题 目 基于STM32--μC/OS-II贪吃蛇的设计 学 生 20120441032028解斐 20120441032025朱利昭 20120441032002徐雷 指导教师 张志来 讲师 年 级 2012级 专 业 电子信息工程 二级学院 (系、部) 信息工程学院 邯郸学院信息工程学院(系、部) 2015年7月 基于STM32--μC/OS-II贪吃蛇的设计 摘 要 进入新世纪的TFT液晶显示屏的技术和产业都取得了长足的发展,作为重要的现代信息,发布媒体之一TFT液晶显示屏在证券交易、金融、交通、体育、广告等领域被广泛的应用。伴随社会化信息的推进,TFT液晶屏技术也在不断地推陈出新,应用领域愈加广泛。现基于STM32的TFT液晶显示可以更好的满足各种需求,也更便于操作和实现。基于STM32在TFT液晶屏幕上可显示文本及图形,包括汉字和时钟显示。 关键词:TFT液晶显示 STM32开发板 μC/OS-II 贪吃蛇 目 录 摘 要 1 前 言 3 1 背景介绍 3 1.1 选题背景 3 1.2 MiniSTM32开发板介绍 3 2 系统硬件设计 4 2.1 开发板简介 4 2.2 LED 灯 6 2.3 按键 10 2.4 TFTLCD 模块 10 3 系统软件设计 14 3.1 LED驱动 14 3.2 按键驱动 14 3.3 TFT-LCD驱动 16 3.4 贪吃蛇实现C语言代码 18 3.5 uC/OS-II软件设计 23 结论 27 参考文献 28 前 言 目前已有超过85%的无线通信设备采用了ARM技术,ARM以其高性能和低成本,在该领域的地位日益巩固。ARM在此方面的应用如:手提式计算机、移动电话、PDA等。 随着宽带技术的推广,采用ARM技术的ADSL芯片正逐步获得竞争优势。此外,ARM在语音及视频处理上进行了优化,并获得广泛支持。 UC/OS-II由Micrium公司提供,是一个可移植、可固化的、可裁剪的、占先式多任务实时内核,它适用于多种微处理器,微控制器和数字处理芯片(已经移植到超过100种以上的微处理器应用中)。同时,该系统源代码开放、整洁、一致,注释详尽,适合系统开发。 UC/OS-II已经通过联邦航空局(FAA)商用航行器认证,符合航空无线电技术委员会(RTCA)DO-178B标准。 1 背景介绍 1.1 选题背景 随着信息技术的飞速发展,形式多样的数字化产品已经开始成为继PC机后的信息处理工具,在这种数字化潮流下,嵌入式系统已成为当前研究和应用的热点之一,嵌入式手持设备的视图多媒体应用也越来越广泛。由于嵌入式系统的应用要求及成本因素决定了嵌入式系统在系统资源, 包括硬件资源和软件资源方面都是非常精简和高效的。 1.2 MiniSTM32开发板介绍 MiniSTM32 设计精良,结构小巧!板子的设计充分考虑了成本与功能这两个矛盾面,再结合实际使用的经验及 STM32 的特点,最终确定了这样的设计。 STM32 的优异性体现在如下几个方面: 以 8 位机的价格,得到 32 位机,是 STM32 最大的优势。 STM32 拥有包括:FSMC、TIMER、SPI、IIC、USB、CAN、IIS、SDIO、ADC、DAC、RTC、DMA 等众多外设及功能,具有极高的集成度。 STM32 仅 M3 内核就拥有 F100、F101、F102、F103、F105、F107、F207、F217 等 8 个系列上百种型号,具有 QFN、LQFP、BGA 等封装可供选择。同时 STM32还推出了 STM32L 和 STM32W 等超低功耗和无线应用型的 M3 芯片。 84 个中断,16 级可编程优先级,并且所有的引脚都可以作为中断输入。STM32 各个外设都有自己的独立时钟开关,可以通过关闭相应外设的时钟来降低功耗。STM32 的开发不需要昂贵的仿真器,只需要一个串口即可下载代码,并且支持 SWD 和 JTAG 两种调试口。SWD 调试可以为你的设计带来跟多的方便,只需要 2 个 IO 口,即可实现仿真调试。 2 系统硬件设计 2.1 开发板简介 ALIENTEK MiniSTM32 开发板是一款迷你型的 STM32F103 开发板,小巧而不小气,简约而不简单。该开发板自推出以来,深得广大 STM32 学习者喜爱,总销量超过 1.6W 套。目前最新版本为 V3.0,最新 MiniSTM32 开发板资源图如图 所示: ALIENTEK MiniSTM32开发板板载资源如下: ◆ CPU:STM32F103RBT6,LQFP64,FLASH:128K,SRAM:20K; ◆ 1个标准的JTAG/SWD调试下载口 ◆ 1个电源指示灯(蓝色) ◆ 2个状态指示灯(DS0:红色,DS1:绿色) ◆ 1个红外接收头,配备一款小巧的红外遥控器 ◆ 1个IIC接口的EEPROM芯片,24C02,容量256字节 ◆ 1个SPI FLASH芯片,W25X16,容量为2M字节 ◆ 1个DS18B20/DS1820温度传感器预留接口 ◆ 1个标准的2.4/2.8寸LCD接口,支持触摸屏 ◆ 1个OLED模块接口 ◆ 1个USB串口,可用于程序下载和代码调试 ◆ 1个USB SLAVE接口,用于USB通信 ◆ 1个SD卡接口 ◆ 1个PS/2接口,可外接鼠标、键盘 ◆ 1组5V电源供应/接入口 ◆ 1组3.3V电源供应/接入口 ◆ 1个启动模式选择配置接口 ◆ 2个2.4G无线通信接口(24L01和JF24C) ◆ 1个RTC后备电池座,并带电池 ◆ 1个复位按钮,可用于复位MCU和LCD ◆ 3个功能按钮,其中WK_UP兼具唤醒功能 ◆ 1个电源开关,控制整个板的电源 ◆ 3.3V与5V电源TVS保护,有效防止烧坏芯片。 ◆ 独创的一键下载功能 ◆ 除晶振占用的IO口外,其余所有IO口全部引出,其中GPIOA和GPIOB按顺序引出,整个板子尺寸为 8cm*10cm*2cm板上除晶振外的所有的 IO 口全部引出,特别还有 GPIOA 和 GPIOB 的 IO 口是按顺序引出的,可以极大的方便大家扩展及使用,另外板载独特的一键下载功能,避免了频繁设置 B0、B1 带来的麻烦,直接在电脑上一键下载。 板载十多种外设及接口,可以充分挖掘 STM32 的潜质。沉金 PCB+全新优质元器件+定制全铜镀金排针/排座+电源 TVS 保护,坚若磐石。各个接口都有丝印标注,使用起来一目了然;接口位置设计安排合理,方便顺手。资源搭配合理,物尽其用。 2.2 LED 灯 ALIENTEK MiniSTM32开发板板载了2个LED,DS0和DS1, STM32的IO口可以由软件配置成8种模式: 1、输入浮空 2、输入上拉 3、输入下拉 4、模拟输入 5、开漏输出 6、推挽输出 7、推挽式复用功能 8、开漏复用功能 每个IO口可以自由编程,单IO口寄存器必须要按32位字被访问。STM32的很多IO口都是5V兼容的,这些IO口在与5V电平的外设连接的时候很有优势,具体哪些IO口是5V兼容的,可以从该芯片的数据手册管脚描述章节查到(I/O Level标FT的就是5V电平兼容的)。 STM32的每个IO端口都有7个寄存器来控制。他们分别是:配置模式的2个32位的端口配置寄存器CRL和CRH;2个32位的数据寄存器IDR和ODR;1个32位的置位/复位寄存器BSRR;一个16位的复位寄存器BRR;1个32位的锁存寄存器LCKR;这里我们仅介绍常用的几个寄存器,我们常用的IO端口寄存器只有4个:CRL、CRH、IDR、ODR。 CRL和CRH控制着每个IO口的模式及输出速率。 端口低配置寄存器CRL的描述,如下图所示: 该寄存器的复位值为0X4444 4444,从上图可以看到,复位值其实就是配置端口为浮空输入模式。从上图还可以得出:STM32的CRL控制着每个IO端口(A~G)的低8位的模式。每个IO端口的位占用CRL的4个位,高两位为CNF,低两位为MODE。这里我们可以记住几个常用的配置,比如0X0表示模拟输入模式(ADC用)、0X3表示推挽输出模式(做输出口用,50M速率)、0X8表示上/下拉输入模式(做输入口用)、0XB表示复用输出(使用IO口的第二功能,50M速率)。 CRH的作用和CRL完全一样,只是CRL控制的是低8位输出口,而CRH控制的是高8位输出口。 IDR是一个端口输入数据寄存器,只用了低16位。该寄存器为只读寄存器,并且只能以16位的形式读出。该寄存器各位的描述如下图所示: 要想知道某个IO口的状态,你只要读这个寄存器,再看某个位的状态就可以了。ODR是一个端口输出数据寄存器,也只用了低16位。该寄存器为可读写,从该寄存器读出来的数据可以用于判断当前IO口的输出状态。而向该寄存器写数据,则可以控制某个IO口的输出电平。该寄存器的各位描述如下图所示: ALIENTEK MiniSTM32开发板板载的LED硬件连接: 2.3 按键 ALIENTEK MiniSTM32 开发板总共有 3 个按键,其原理图如下: KEY0 和 KEY1 用作普通按键输入,分别连接在 PC5 和 PA15 上,其中 PA15 和 JTDI 共用了,所以,在使用 KEY0 和 KEY1 的时候,就不能使用 JTAG 来调试了,但是可以用 SWD 调试,这点在使用的时候要注意。KEY0 和 KEY1 还和 PS/2 的 DAT 和 CLK 线共用。 WK_UP 按键连接到 PA0(STM32 的 WKUP 引脚),它除了可以用作普通输入按键外,还可以用作 STM32 的唤醒输入。该按键是高电平触发的。由于 PA0 还是 DS18B20 的输入引脚,而18B20 是有上拉电阻的,所以在使用 WK_UP 按键的时候,请一定要断开 PA0 和 DS18B20 的跳线帽。 2.4 TFTLCD 模块 TFT-LCD即薄膜晶体管液晶显示器。其英文全称为:Thin Film Transistor-Liquid Crystal Display。TFT-LCD与无源TN-LCD、STN-LCD的简单矩阵不同,它在液晶显示屏的每一个象素上都设置有一个薄膜晶体管(TFT),可有效地克服非选通时的串扰,使显示液晶屏的静态特性与扫描线数无关,因此大大提高了图像质量。TFT-LCD也被叫做真彩液晶显示器。 该模块有如下特点: 1,2.4’/2.8’两种大小的屏幕可选。 2,320×240的分辨率。 3,16位真彩显示。 4,自带触摸屏,可以用来作为控制输入。 5,通用的接口,除了ALIENTEK MiniSTM32开发板,该液晶模块还可以使用在优异特、STMSKY、红牛等开发板上。 ALIENTEK MiniSTM32开发板的该模块采用的是显尚光电的DST2001PH TFTLCD,DST2001PH的控制器为ILI9320,采用26万色的TFTLCD屏,分辨率为320×240,采用16位的80并口。 CS:TFTLCD片选信号。 WR:向TFTLCD写入数据。 RD:从TFTLCD读取数据。 D[15:0]:16位双向数据线。 RST:硬复位TFTLCD。 RS:命令/数据标志(0,读写命令;1,读写数据)。 80并口在上一节我们已经有详细的介绍了,这里我们就不在介绍,需要说明的是,TFTLCD模块的RST信号线和OLED模块一样,也是直接接到STM32的复位脚上,并不由软件控制,这样可以省下来一个IO口。另外我们还需要一个背光控制线来控制TFTLCD的背光。所以,我们总共需要的IO口数目为21个。 模块的控制器为ILI9320(可能为其他型号,但是他们的设置很相似,除了初始化序列有些区别,其他大都是一摸一样的,这里仅以9320为例介绍),该控制器自带显存,其显存总大小为172820(240*320*18/8),即18位模式(26万色)下的显存量。模块的16位数据线与显寸的对应关系为565方式,如下图所示: 最低5位代表蓝色,中间6位为绿色,最高5位为红色。数值越大,表示该颜色越深。 接下来,我们介绍一下ILI9320的几个重要命令,因为ILI9320的命令很多,我们这里不可能一一介绍,有兴趣的大家可以找到ILI9320的datasheet看看。里面对这些命令有详细的介绍。这里我们要介绍的命令列表如下: 这个命令,有两个功能,如果对它写,则最低位为OSC,用于开启或关闭振荡器。而如果对它读操作,则返回的是控制器的型号。这个命令最大的功能就是通过读它可以得到控制器的型号,而我们代码在知道了控制器的型号之后,可以针对不同型号的控制器,进行不同的初始化。因为93xx系列的初始化,其实都比较类似,我们完全可以用一个代码兼容好几个控制器。 R3,入口模式命令。我们重点关注的是I/D0、I/D1、AM这3个位,因为这3个位控制了屏幕的显示方向。 AM:控制GRAM更新方向。当AM=0的时候,地址以行方向更新。当AM=1的时候,地址以列方向更新。 I/D[1:0]:当更新了一个数据之后,根据这两个位的设置来控制地址计数器自动增加/减少1, 其关系如下图: 通过这几个位的设置,我们就可以控制屏幕的显示方向了。 R7,显示控制命令。该命令CL位用来控制是8位彩色,还是26万色。为0时26万色,为1时八位色。D1、D0、BASEE这三个位用来控制显示开关与否的。当全部设置为1的时候开启显示,全0是关闭。我们一般通过该命令的设置来开启或关闭显示器,以降低功耗。 R32,R33,设置GRAM的行地址和列地址。R32用于设置列地址(X坐标,0~239),R33用于设置行地址(Y坐标,0~319)。当我们要在某个指定点写入一个颜色的时候,先通过这两个命令设置到改点,然后写入颜色值就可以了。 R34,写数据到GRAM命令,当写入了这个命令之后,地址计数器才会自动的增加和减少。该命令是我们要介绍的这一组命令里面唯一的单个操作的命令,只需要写入该值就可以了,其他的都是要先写入命令编号,然后写入操作数。 R80~R83,行列GRAM地址位置设置。这几个命令用于设定你显示区域的大小,我们整个屏的大小为240*320,但是有时候我们只需要在其中的一部分区域写入数据,如果用先写坐标,后写数据这样的方式来实现,则速度大打折扣。此时我们就可以通过这几个命令,在其中开辟一个区域,然后不停的丢数据,地址计数器就会根据R3的设置自动增加/减少,这样就不需要频繁的写地址了,大大提高了刷新的速度。 3 系统软件设计 3.1 LED驱动 //初始化PA8和PD2为输出口.并使能这两个口的时钟 //LED IO初始化 void LED_Init(void) { RCC->APB2ENR|=1<<2; //使能PORTA时钟 RCC->APB2ENR|=1<<5; //使能PORTD时钟 GPIOA->CRH&=0XFFFFFFF0; GPIOA->CRH|=0X00000003;//PA8 推挽输出 GPIOA->ODR|=1<<8; //PA8 输出高 GPIOD->CRL&=0XFFFFF0FF; GPIOD->CRL|=0X00000300;//PD.2推挽输出 GPIOD->ODR|=1<<2; //PD.2输出高 } 3.2 按键驱动 //按键初始化函数 //特别注意:在该函数之后,JTAG将无法使用(SWD也无法使用) //如果想JTAG仿真,可以屏蔽该函数。 //PA0.13.15 设置成输入 void KEY_Init(void) { RCC->APB2ENR|=1<<2; //使能PORTA时钟 GPIOA->CRL&=0XFFFFFFF0;//PA0设置成输入 GPIOA->CRL|=0X00000008; GPIOA->CRH&=0X0F0FFFFF;//PA13,15设置成输入 GPIOA->CRH|=0X80800000; GPIOA->ODR|=1<<13; //PA13上拉,PA0默认下拉 GPIOA->ODR|=1<<15; //PA15上拉 } //按键处理函数 //返回按键值 //0,没有任何按键按下 //1,KEY0按下 //2,KEY1按下 //3,KEY2按下 WK_UP //注意此函数有响应优先级,KEY0>KEY1>KEY2!! u8 KEY_Scan(void) { static u8 key_up=1;//按键按松开标志 JTAG_Set(JTAG_SWD_DISABLE); if(key_up&&(KEY0==0||KEY1==0||KEY2==1)) { //delay_ms(10);//去抖动 key_up=0; if(KEY0==0) { JTAG_Set(SWD_ENABLE); return 1; } else if(KEY1==0) { JTAG_Set(SWD_ENABLE); return 2; } else if(KEY2==1) { JTAG_Set(SWD_ENABLE); return 3; } }else if(KEY0==1&&KEY1==1&&KEY2==0)key_up=1; JTAG_Set(SWD_ENABLE); return 0;// 无按键按下 } 3.3 TFT-LCD驱动 //画笔颜色 #define WHITE 0xFFFF #define BLACK 0x0000 #define BLUE 0x001F #define BRED 0XF81F #define GRED 0XFFE0 #define GBLUE 0X07FF #define RED 0xF800 #define MAGENTA 0xF81F #define GREEN 0x07E0 #define CYAN 0x7FFF #define YELLOW 0xFFE0 #define BROWN 0XBC40 //棕色 #define BRRED 0XFC07 //棕红色 #define GRAY 0X8430 //灰色 //GUI颜色 #define DARKBLUE 0X01CF //深蓝色 #define LIGHTBLUE 0X7D7C //浅蓝色 #define GRAYBLUE 0X5458 //灰蓝色 //以上三色为PANEL的颜色 #define LIGHTGREEN 0X841F //浅绿色 //#define LIGHTGRAY 0XEF5B //浅灰色(PANNEL) #define LGRAY 0XC618 //浅灰色(PANNEL),窗体背景色 #define LGRAYBLUE 0XA651 //浅灰蓝色(中间层颜色) #define LBBLUE 0X2B12 //浅棕蓝色(选择条目的反色) extern u16 BACK_COLOR, POINT_COLOR ; void LCD_Init(void); void LCD_DisplayOn(void); void LCD_DisplayOff(void); void LCD_Clear(u16 Color); void LCD_SetCursor(u16 Xpos, u16 Ypos); void LCD_Scan_Dir(u8 dir); void LCD_DrawPoint(u16 x,u16 y);//画点 u16 LCD_ReadPoint(u16 x,u16 y); //读点 void Draw_Circle(u16 x0,u16 y0,u8 r); void LCD_DrawLine(u16 x1, u16 y1, u16 x2, u16 y2); void LCD_DrawRectangle(u16 x1, u16 y1, u16 x2, u16 y2); void LCD_Fill(u16 sx,u16 sy,u16 ex,u16 ey,u16 color); void LCD_ShowChar(u16 x,u16 y,u8 num,u8 size,u8 mode);//显示一个字符 void LCD_ShowNum(u16 x,u16 y,u32 num,u8 len,u8 size); //显示一个数字 void LCD_Show2Num(u16 x,u16 y,u16 num,u8 len,u8 size,u8 mode);//显示2个数字 void LCD_ShowString(u16 x,u16 y,const u8 *p); //显示一个字符串,16字体 u16 LCD_RD_DATA(void);//读取LCD数据 void LCD_WriteReg(u8 LCD_Reg, u16 LCD_RegValue); u16 LCD_ReadReg(u8 LCD_Reg); void LCD_WriteRAM_Prepare(void); void LCD_WriteRAM(u16 RGB_Code); u16 LCD_ReadRAM(void); u16 LCD_BGR2RGB(u16 c); 3.4 贪吃蛇实现C语言代码 #include "snake.h" #include "lcd.h" #include "key.h" extern u8 key_value; u8 key_temp; extern int dir_x,dir_y; #define SNAKE_MAX_LONG 10 //最大长度10 struct{ u8 X[SNAKE_MAX_LONG]; u8 Y[SNAKE_MAX_LONG]; u8 Long; u8 Life; u8 Score; u8 Level; }Snake; //蛇结构体 struct{ u8 X; u8 Y; u8 Yes; }Food; //食物结构体 //绘制小方块,,,8*8 void Turn_Off(u8 x,u8 y) { LCD_Fill((x*8),(y*8),(x*8+8),(y*8+8),BLACK); //8*8小矩形 } void Turn_On(u8 x,u8 y) { LCD_Fill((x*8),(y*8),(x*8+8),(y*8+8),RED); //8*8小矩形 } //初始化贪吃蛇 void Snake_Init(void) { u8 i; //***********初始化蛇参数********************// Snake.Long=2; //定义初始化蛇的长度 Snake.Life=0; //初始化蛇还活着 Snake.Score=0; Food.Yes=1; //放食物标志 for(i=0;i<Snake.Long;i++) //初始化蛇的位置 { Snake.X[i]=i+14; Snake.Y[i]=7; } for(i=0;i<Snake.Long;i++) //将蛇画出来 { Turn_On(Snake.X[i],Snake.Y[i]); } } void Snake_Move(int dir_x,int dir_y) //移动蛇 { u8 i; Turn_Off(Snake.X[0],Snake.Y[0]); //向上 for(i=0;i<Snake.Long-1;i++) //初始化蛇的位置 { //向右 1 0 Snake.X[i]=Snake.X[i+1]; //向左 0 1 Snake.Y[i]=Snake.Y[i+1]; //向下 -1 0 } //向上 0 -1 Snake.X[Snake.Long-1]=Snake.X[Snake.Long-2]+dir_x; Snake.Y[Snake.Long-1]=Snake.Y[Snake.Long-2]+dir_y; //蛇头向你要求的方向移动 for(i=0;i<Snake.Long;i++) //将蛇画出来 { Turn_On(Snake.X[i],Snake.Y[i]); } } void Food_Place(u8 Food_x,u8 Food_y) //放食物 { Food.X=Food_x; Food.Y=Food_y; Turn_On(Food.X,Food.Y); } void Run_Snake(void) //游戏运行 { u8 i; Snake_Move(dir_x,dir_y); //判断是否吃到食物,若吃到长度加1,而且再放一个 if((Snake.X[Snake.Long-1]==Food.X)&&(Snake.Y[Snake.Long-1]==Food.Y)) { Snake.Long++; Snake.X[Snake.Long-1]=Food.X; Snake.Y[Snake.Long-1]=Food.Y; Food.X=0; Food.Y=0; Snake.Score+=1; Food.Yes= 1; //吃完一个后,再放一个食物 LCD_ShowNum(50,300,(u32)Snake.Score,4,16); //显示分数 } if(Food.Yes==0) Food_Place(Food.X,Food.Y); //放食物 if(Food.Yes==1) //获得随机食物坐标 { while(1) { Food.X=rand()%28+1; Food.Y=rand()%28+1; for(i=0;i<Snake.Long;i++) //将蛇画出来 { if((Snake.X[Snake.Long]==Food.X)&&(Snake.Y[Snake.Long]==Food.Y)) { break; //如果放的食物和蛇身重合则跳出来,不放食物 } } Food.Yes=0; break; } } for(i=0;i<Snake.Long;i++) //将蛇画出来 { if(Snake.X[i]==Snake.X[Snake.Long]&&Snake.Y[i]==Snake.Y[Snake.Long]) { Game_Over(); //蛇头碰到蛇身,游戏结束 } } if((Snake.X[Snake.Long-1]<=0)||(Snake.X[Snake.Long-1]>=30)||(Snake.Y[Snake.Long-1]<=0)||(Snake.Y[Snake.Long-1]>=33)) { Game_Over(); } //delay_ms(300); } void Game_Start(void) { //u8 i; POINT_COLOR=WHITE; //画笔颜色 BACK_COLOR=BLACK; //背景色 //***********绘制游戏界面********************// LCD_Fill(0,0,8,280,DARKBLUE);//Rectangle(8,8-1,85,120,0xaa);//绘制一个矩形框, 0-127 LCD_Fill(232,0,240,280,DARKBLUE);// LCD_Fill(0,0,240,8,DARKBLUE);// LCD_Fill(0,272,240,280,DARKBLUE);// LCD_ShowString(20,300,"Score");//Show Score LCD_ShowString(150,300,"LEVEL");//Show Level LCD_ShowNum(50,300,(u32)Snake.Score,4,16); //显示分数 LCD_ShowNum(180,300,(u32)Snake.Level,4,16); } void Game_Over(void) { LCD_Clear(BLACK); LCD_ShowString(60,150,"GAME OVER! "); LCD_ShowString(25,170,"PRESS ENTER TO RESTART"); LCD_ShowString(60,190,"SCORE:"); LCD_ShowNum(100,190,(u32)Snake.Score,4,16); //显示分数 while(1); //Game_Start(); //Snake_Init(); } 3.5 uC/OS-II软件设计 uC/OS II(Micro Control Operation System Two)是一个可以基于ROM运行的、可裁减的、抢占式、实时多任务内核,具有高度可移植性,特别适合于微处理器和控制器,适合很多商业操作系统性能相当的实时操作系统(RTOS)。为了提供最好的移植性能,uC/OS II最大程度上使用ANSI C语言进行开发,并且已经移植到近40多种处理器体系上,涵盖了从8位到64位各种CPU(包括DSP)。 uC/OS II可以简单的视为一个多任务调度器,在这个任务调度器之上完善并添加了和多任务操作系统相关的系统服务,如信号量、邮箱等。其主要特点有公开源代码,代码结构清晰、明了,注释详尽,组织有条理,可移植性好,可裁剪,可固化。内核属于抢占式,最多可以管理60个任务。从1992年开始,由于高度可靠性、移植性和安全性,uC/OS II已经广泛使用在从照相机到航空电子产品的各种应用中。 μC/OS-II可以大致分成核心、任务处理、时间处理、任务同步与通信,CPU的移植等5个部分。 (1) 核心部分(OSCore.c) 是操作系统的处理核心,包括操作系统初始化、操作系统运行、中断进出的前导、时钟节拍、任务调度、事件处理等多部分。能够维持系统基本工作的部分都在这里。 (2) 任务处理部分(OSTask.c) 任务处理部分中的内容都是与任务的操作密切相关的。包括任务的建立、删除、挂起、恢复等等。因为μC/OS-II是以任务为基本单位调度的,所以这部分内容也相当重要。 (3) 时钟部分(OSTime.c) μC/OS-II中的最小时钟单位是timetick(时钟节拍)。任务延时等操作是在这里完成的。 (4) 任务同步和通信部分 为事件处理部分,包括信号量、邮箱、消息队列、事件标志等部分;主要用于任务间的互相联系和对临界资源的访问。 (5) 与CPU的接口部分 是指μC/OS-II针对所使用的CPU的移植部分。由于μC/OS-II是一个通用性的操作系统,所以对于关键问题上的实现,还是需要根据具体CPU的具体内容和要求作相应的移植。这部分内容由于牵涉到SP等系统指针,所以通常用汇编语言编写。主要包括中断级任务切换的底层实现、任务级任务切换的底层实现、时钟节拍的产生和处理、中断的相关处理部分等内容。 uC/OS-II 采用的是可剥夺型实时多任务内核。可剥夺型的实时内核在任何时候都运行就绪了的最高优先级的任务。 uC/os-II的任务调度是完全基于任务优先级的抢占式调度,也就是最高优先级的任务一旦处于就绪状态,则立即抢占正在运行的低优先级任务的处理器资源。为了简化系统设计,uC/OS-II规定所有任务的优先级不同,因而任务的优先级也同时唯一标志了该任务本身。 uC/OS-II 中最多可以支持64 个任务,分别对应优先级0~63,其中0 为最高优先级。63为最低级,系统保留了4个最高优先级的任务和4个最低优先级的任务,所有用户可以使用的任务数有56个。 uC/OS-II提供了任务管理的各种函数调用,包括创建任务,删除任务,改变任务的优先级,任务挂起和恢复等。 系统初始化时会自动产生两个任务:一个是空闲任务,它的优先级最低,该任务仅给一个整型变量做累加运算;另一个是统计任务,它的优先级为次低,该任务负责统计当前cpu的利用率。 uC/OS-II的时间管理是通过定时中断来实现的,该定时中断一般为10毫秒或100毫秒发生一次,时间频率取决于用户对硬件系统的定时器编程来实现。中断发生的时间间隔是固定不变的,该中断也成为一个时钟节拍。 uC/OS-II要求用户在定时中断的服务程序中,调用系统提供的与时钟节拍相关的系统函数,例如中断级的任务切换函数,系统时间函数。 对一个多任务的操作系统来说,任务间的通信和同步是必不可少的。uC/OS-II中提供了4种同步对象,分别是信号量,邮箱,消息队列和事件。所有这些同步对象都有创建,等待,发送,查询的接口用于实现进程间的通信和同步。 uC/OS-II部分代码: 任务的初始化和开始任务的创建: OSInit(); //系统初始化 OSTaskCreate( TaskStart, //task pointer (void *)0, //parameter (OS_STK *)&TASK_START_STK[START_STK_SIZE-1], //task stack top pointer START_TASK_Prio ); //task priority- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 stm32 cosii 贪吃 设计 课程设计 论文 正文 大学毕业
咨信网温馨提示:
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【胜****】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【胜****】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【胜****】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【胜****】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。
关于本文