03 2015 档案
摘要:LWIP是一款开源的嵌入式网络协议栈,支持的功能很多,而且能在多任务环境下和单任务裸机环境下跑,今天说说他的移植过程,芯片为STM32,网卡为ENC28J60,无操作系统 首先下载LWIP的源代码,我下载的是1.4.1的源码,下载后解压,文件结构如图 将这四个目录中的文件全部拷贝到工程中,API是...
阅读全文
摘要:UIP是单片机界联网的一个很好地选择,移植这个库有点复杂,首先是第一步,网卡驱动要写好,使用的网卡芯片为ENC28J60,驱动可以再工程包里面找到//配置网卡硬件,并设置MAC地址 //返回值:0,正常;1,失败;u8 tapdev_init(u8* macaddr){ u8 ...
阅读全文
摘要:使用FATFS只是完成了一个基本的文件读写,有时候我们需要扩展一些功能,比如MP3实验,需要上一曲下一曲的切换,扩展的代码如下//显示目录下所有文件u8 ShowFileList(u8* dirPath){ u8 *pname; //带路径的文件名,最终生成的文件名 ...
阅读全文
摘要:图片解码首先是最简单的bmp图片解码,关于bmp的结构可自行查阅,代码如下#ifndef __BMPDECODE_H_#define __BMPDECODE_H_#include "ff.h"#include "lcd.h"#include "stdlib.h"#include "usb_type....
阅读全文
摘要:USB设备可以定义一个复合设备,复合设备分两种,一种是一个设备多个配置,还有一种是一个配置多个接口,在本例中采用一个配置多个接口的方式 首先修改设备描述符,标准设备描述符和报告描述符都不需要修改,只需要修改配置描述符即可//usb配置描述符const u8 DinkUsbConfigDescrip...
阅读全文
摘要:LIBUSB是一款简单好用的USB通讯开发库,一般HID设备用该库通讯能大大降低开发周期,使用如下,首先需要为设备安装驱动在libusb的bin目录下有一个inf_wirzed.exe的文件,该文件是生成驱动所用,具体步骤可以网上百度,很是傻瓜式操作,安装好驱动之后就可以使用其通讯函数了,安装好驱动...
阅读全文
摘要:首先在之前鼠标的基础上修改设备描述符#include "usbdesc.h"//usb标准设备描述符const U8 USB_DeviceDescriptor[] = { USB_DEVICE_DESC_SIZE, //bLength字段。设备描述符的长度为18(0x12)字节 USB_DEVICE...
阅读全文
摘要:该文档使用USB固件库,在其基础上进行了自己的定制,完成了一个USB-HID设备,首先是usb_desc.c文件,里面存放了usb各种描述符的存在#include "usb_desc.h"//usb标准设备描述符const u8 DinkUsbDeviceDescriptor[DINK_USB_SI...
阅读全文
摘要:李仲篇 从少林藏经阁地牢逃出来的第二年,我离开西域,再一次来到了长安. 当时,基本风头已经过去了,虽然江湖上还在流传着我的通缉令,但是关注的人没有那么多,毕竟这世上坏人太多了,总是层出不穷,而我作为一个二十年前的坏人,关注度其实并没有那么高,长安城墙下的通缉令张贴处我的画像我也去看了,那是我二十...
阅读全文
摘要:血眼龙王传-初章 我要死了. 说这句话之前我仔仔细细看了一下周围的山崖结构以及山下的植被情况,经过详细的推算得到了这个结果,理论上应该很准确,跳崖这个事情我做过一次,上次没事,而且还能遇到陆危楼,陆危楼天下只有一个,所以下面应该就没有陆危楼了,其实这是废话,有事现在也不会还能说这句话,但是我想说...
阅读全文
摘要:首先是对于端点的数据处理#ifndef __USBEP2_H_#define __USBEP2_H_#include "usb.h"#include "usbhw.h"#include "msc.h"#include "mscuser.h"void usb_ep2_in_process(void);...
阅读全文
摘要:u8 nandflash_write_buffer[NAND_SERECT_FULL_SIZE];static int currentBlock = -1;static int currentPage = -1;//带缓冲的nand读取,不支持跨扇区void NAND_Read_Addr_Mal(u...
阅读全文
摘要:#ifndef __LCD_H_#define __LCD_H_#include "common.h"#include "debugserial.h"#include "delay.h"#include "sdram.h"#define White 0xFFFFFF#define Black 0x0...
阅读全文
摘要:#include "led.h"void led_init(void){ //p1.14 p0.16 p1.13 p4.27 LPC_SC->PCONP |= (1P1_14 = 0x00;//选择gpio功能,禁止迟滞 不反向 正常推挽 LPC_IOCON->P1_14 |= (2P0_16 = ...
阅读全文
摘要:#ifndef __TIM_H_#define __TIM_H_#include "common.h"extern u8 tim1_mr0_flag;void tim0_ch0_count_int_init(u32 pr,u32 count);//定时器0 通道0 计数模式 中断模式 初始化#end...
阅读全文
摘要:#ifndef __SYS_H_#define __SYS_H_#include "common.h"#define SystemCoreClock 120000000 //cpu时钟频率,计算时有用#define ApbClock 120000000 //120M#define EmcClock ...
阅读全文
摘要:#ifndef __IIC0_H_#define __IIC0_H_#include "common.h"#include "delay.h"//IIC通讯过程中的指定状态#define STATUS_SENDSTART 0X08 //已经发送起始条件#define STATUS_REPEATSTA...
阅读全文
摘要:Sdram型号为hy57v256#ifndef __SRAM_H_#define __SRAM_H_#include "common.h"#include "delay.h"#include "stdlib.h"#include "debugserial.h"#define SDRAM_DEBUG#...
阅读全文
摘要:Lpc1788内置有eeprom使用代码#ifndef __E2PRONINCHIP_H_#define __E2PROMINCHIP_H#include "common.h"#include "sys.h"#include "debugserial.h"#define EEPROM_CLOCK 3...
阅读全文
摘要:#ifndef __SPI_H_#define __SPI_H_#include "common.h"#include "delay.h"// cs p1.21//sck p1.20//miso p1.23//mosi p1.24#define SPI_CLOCK 12000000void spi0...
阅读全文
摘要:首先是gpio中断,这一点和1768不同,1768使用的中断时和eint3共用中断通道,到了1788,专门为gpio开辟了中断#ifndef __JOYPAD_H_#define __JOYPAD_H_#include "sys.h"#include "delay.h"#define JOYPAD_...
阅读全文
摘要:Norflash型号为sst39vf32#ifndef __NORFLASH_H_#define __NORFLASH_H_#include "common.h"#include "delay.h"#include "debugserial.h"#define NOR_FLASH_BASE 0x80...
阅读全文
摘要:#ifndef __ADC1_H_#define __ADC1_H_#include "common.h"#include "delay.h"void adc_init(u8 ch,u8 div);u16 adc_cover(u8 ch);#endif#include "adc1.h"void ad...
阅读全文
摘要:#ifndef __DEBUGSERIAL_H_#define __DEBUGSERIAL_H_#include "sys.h"#include "stdio.h"extern u8 serialBuffer[256];extern u16 serialStatus;//ڰvoid Debug_Se...
阅读全文
摘要:#ifndef __MYIIC_H_#define __MYIIC_H_#include "common.h"#include "delay.h"#include "debugserial.h"//sda 027 scl 028//IO方向设置#define IIC1_SDA_IN() P0dir(...
阅读全文
摘要:#ifndef __USBCFG_H__#define __USBCFG_H__//#define USB_IF_NUM 1#define USB_MAX_PACKET0 64#define USB_DMA_EP 0x00000000//尽量不要是能太多时间//这里每一个事件都代表着一个回调函数,使...
阅读全文
摘要:#ifndef __USBEP1_H_#define __USBEP1_H_#include "usb.h"#include "usbhw.h"extern s8 sendBuffer[4]; //鼠标数据发送缓冲区extern u8 mouse_connect; //鼠标连接标志void usb_...
阅读全文
摘要:#ifndef __USBREG_H#define __USBREG_H/* usb设备中断定义 usb_devintst usb_devinten usb_devintclr usb_devintdet*/#define FRAME_INT 0x00000001 //每隔1MS产生一次帧中断,该中...
阅读全文
摘要:枚举过程如下#ifndef __USBCORE_H__#define __USBCORE_H__/* USB端点0 发送数据结构体*/typedef struct _USB_EP_DATA{ U8 *pData; U16 Count;} USB_EP_DATA;/* USB全局变量 */extern...
阅读全文
摘要:#ifndef __USB_H__#define __USB_H__//usb传输数据的宏定义描述#include "sys.h"typedef __packed union { U16 W; __packed struct { U8 L; U8 H; } WB;} U16_8;//定义一个16位长...
阅读全文
摘要:LPC1768芯片带有USB设备控制器,前面写的文章都是在说比较简单的设备驱动,今天来说复杂一点的 首先是硬件层的配置#ifndef __USBHW_H__#define __USBHW_H__#include "debugSerial.h"#include "usbreg.h"#inclu...
阅读全文
摘要:#define XTAL_FREQ 12000000#define VECT_TAB_OFFSET 0x0000void SystemInit(void){ //PLL0时钟配置 LPC_SC->SCS = 0X00000020; /*使能外部主晶振,频率范围1-20M*/ if (LPC_SC->...
阅读全文
摘要://其他通道的基本定时功能都能在这里实现void Time0Mr0Init(u32 arr,u32 psc){ LPC_SC->PCONP |= (1TCR |= (1MR0 = psc; //匹配寄存器与定时器计数器值相比较 LPC_TIM0->IR |= 0XFF; //清所有中断标志位 LPC...
阅读全文
摘要://p2.0 pwm1.1void ALS_Init(void) //初始化{ LPC_SC->PCONP |= (1PCLKSEL0 &= ~(3PCLKSEL0 &= ~(3PINSEL4 &= ~(0X03LPINMODE4 &= ~(0X03LPINMODE_OD2 &= ~(0X01TCR...
阅读全文
摘要:void wwdg_init(void){ LPC_SC->PCLKSEL0 |= (3WDCLKSEL &= ~(3WDCLKSEL |= (1WDCLKSEL |= (1WDTC = 0xffff;//设定重载值 LPC_WDT->WDMOD |= (1WDFEED = 0xaa; LPC_WD...
阅读全文
摘要:SPI是一种全双工串行接口,可处理多个连接到指定总线上的主机和从机。在数据传输过程中总线上只能有一个主机和一个从机通信。在数据传输中,主机总是会向从机发送一帧8到16个位的数据,而从机也总会向主机发送一帧字节数据使用代码如下void SpiInit(SPI_SPEED speed){ u8 div=...
阅读全文
摘要:IIS是飞利浦公司定义的一种用于音频传输的数字总线,LPC1768支持该总线, I2S接口为一条3线串行总线,含有1根数据线、1根时钟线和1根字选择信号线。基本的I2S连接具有一个主机(其总是为主机)和一个从机。LPC1700系列Cortex—M3微控制器的I2S提供了彼此独立的发送和接收通道,每个...
阅读全文
摘要:LPC1768在系统滴答定时器和通用定时器之外还引入了一个定时器,叫做重复定时器RIT,该定时器只能用于定时操作,带有一个中断,我个人的感觉,这似乎是为了延时函数设计的一个定时器那么使用该定时器时遵循什么流程?第一,打开时钟第二,我们要确定定时器从pclk分频数值,这要靠另外一个寄存器第三,先关闭定...
阅读全文
摘要:LPC1768有三路IIC,其中IIC0支持高速模式和plus模式,另外两路是普通IIC,使用IIC的过程如下 首先依然是打开IIC时钟,同时打开GPIO时钟然后配置引脚为IIC功能另外,因为iic0支持plus结构,所以gpio控制的时候还有这个寄存器需要设置接下来设置IIC的高低电平占空比最后使...
阅读全文
摘要:Lpc1768内置有一个ad外设,该外设有八路复用输入,所以,可以同时接八路ad设备,同时还支持触发转换模式,由外部端口进行ad触发,ad转换完成之后可以产生中断 Lpc1768支持的转换模式有两种,分别会连续转换模式和软件单次转换模式,连续转换模式可以自动的按照我们选择的转换位进行ad的依次转换,...
阅读全文
摘要:Lpc1768内置了四个串口通讯模块,都是异步通讯模块,其中,串口0/2/3是普通串口通讯,串口1与 UART0/2/3 基本相同,只是增加了一个 Modem 接口和 RS-486/EIA-486 模式,不支持IrDA,我们今天以串口0来演示串口的使用. 首先,使用串口0要打开串口0的时钟然后要配置...
阅读全文
摘要:LPC1768的外部中断严格来说只有四个,分别是EINT0,EINT1,EINT2,EINT3,技术手册上有如下说明控制这四个外部中断靠以下寄存器这三个寄存器的0 1 2 3位分别代表中断的0 1 2 3,EXTINT寄存器表示中断是否发生,在发生中断的时候该寄存器会置位,可以通过写1清零,EXTM...
阅读全文
摘要:LPC1788通用IO口的控制包含了一些基本的组件,比如设置推挽输出,开漏输出,上拉电阻等,我们今天来看看. 首先使用GPIO要打开GPIO的系统时钟 LPC_SC->PCONP |= (1>第五章(87页~92页).//IO口操作宏定义#define BITBAND(addr, bit...
阅读全文
摘要:之前说了stm32的iap编程,今天天气真好,顺手就来说说lpc1788的iap编程(没看前面的请查看stm笔记下的内容) 首先是flash的算法,lpc1768并没有寄存器来让我们操作flash,他内置了iap的flash算法,在技术手册的525页有如下说明 其支持的iap命令有这些这...
阅读全文
摘要:Iap,全名为in applacation programming,即在应用编程,与之相对应的叫做isp,in system programming,在系统编程,两者的不同是isp需要依靠烧写器在单片机复位离线的情况下编程,需要人工的干预,而iap则是用户自己的程序在运行过程中对User Fla...
阅读全文
摘要:Ucos2.86版本有一个任务调度的漏洞,该漏洞在2.88之后的版本已经修改过来了,今天我们来看看这个漏洞, 漏洞在官方2.88的文档中如下 这两个函数都是调度器函数,也就是说调度器有漏洞,但是看官方文档的说明,只有cortex-m3有这个bug,那我们就将2.88的代码和2.91的代码对比看看改...
阅读全文
摘要:Ucos在任务调度中经常使用的技术为任务就绪表,在之前的文章中使用的例子是低于64个优先级的任务就绪表查找方法,现在ucos将任务扩展到256优先级之后,任务就绪表的查找也做了一定的修改,今天来讲讲 首先我们看任务就绪表的设置过程,当任务创建的时候需要设置一次任务就绪表,所以我们先看oscr...
阅读全文
摘要:在可剥夺性的内核中,当任务以独占方式使用共享资源的时候,会出现低优先级任务高于高优先级任务运行的情况,这种情况叫做优先级反转,对于实时操作系统而言,这是一场灾难,下面我们来说说优先级反转的典型环境. 我们假设有三个任务a,b,c,a优先级高于b,b优先级高于c,a和c都需要访问一个共享资源...
阅读全文
摘要:在实际的应用之中,一个任务经常需要等待多个信号量的同时生效,或者说任务需要根据多个信号量的组合作用的结果来决定任务的运行方式,为了实现这种多信号量组合的功能,ucos实现了信号量集的特殊结构. 信号量集的基础仍然是信号量,它如同一个多个信号量组成的与非门来构成逻辑结果控制任务的执行. 信号量...
阅读全文
摘要:应用程序中为了某种特殊需要,经常需要动态的分配内存,而操作系统的特质置一,就是能不能保证动态内存分配的时效性,也就是说分配时间是可确定的 Ucos提供内存分配功能,它将内存空间分为两级管理,将一块连续的内存空间分为若干个分区,每个分区单位又分成大小相同的若干个内存块,分区时操作系统的管理单位,...
阅读全文
摘要:之前说到事件,讲了事件,信号量和互斥信号量,还有一个队列没说,今天说说队列. 队列是用在任务之间传送多个消息的时候,a任务发送消息,b任务发送消息,然后c任务可以依次去提取出b和a传递的消息,不会造成系统的阻塞,他的实现结构如下在队列的实现中,也是使用事件ecb,OSEventType为OS_EV...
阅读全文
摘要:这一片谈谈关于ucos调度器的相关知识.ucos的调度器的实现主要靠一个函数OS_Sched该函数将调度器的行为分为了两个部分,第一是调度部分,第二是任务切换部分,如下void OS_Sched (void){#if OS_CRITICAL_METHOD == 3u OS_CPU_SR cpu_sr...
阅读全文
摘要:Ucos的事件分为时钟,信号量,互斥性信号量,消息队列,以及消息邮箱首先说信号量 信号量在ucos中的类型定义为OS_EVENT_TYPE_SEM,在任务控制块ecb中,主要是用到的是信号量计数器OSEventCnt,当有任务申请信号量的时候,如果信号量OSEventCnt的值大于0,则将OSEve...
阅读全文
摘要:Ucos为了任务之间的通讯定义了信号量,互斥性信号量,消息对象 消息队列等结构以及api,为了统一的管理这些同步,定义了一个结构叫做时间控制块OS_EVENT,如下 typedef struct os_event { INT8U OSEventType; void *OSEventPtr; INT1...
阅读全文
摘要:之前在ucos多任务切换中漏掉了一个变量,OSCtxSwCtr标识系统任务切换次数主要应该还是用在调试功能中Ucos系统初始化函数为OSInit(),主要完成以下功能全局变量初始化就绪任务表初始化空任务控制块初始化事件控制块链表初始化信号量集初始化存储器管理初始化Qs队列控制初始化系统空闲任务初始化...
阅读全文
摘要:之前我们说到,系统在运行的时候会直接依靠任务的优先级来找到任务的控制块从而实现任务的调用切换等功能,那么接下来的问题就是,系统是怎么找到并确定某一个特定的最高优先级任务并确定他的优先级的呢 为了解决这个问题,ucos采用了一种比较巧妙地方式,叫做就绪任务表,定义如下 OS_EXT OS_PRIO ...
阅读全文
摘要:Ucos实现多任务的基础包括几个方面:任务控制块,任务堆栈,中断,任务优先级,一一说起 首先,任务控制块的结构如下//系统在运行一个任务的时候,按照任务的优先级获取任务控制块,再在任务堆栈中获得任务代码指针typedef struct os_tcb {//任务控制块 OS_STK *OSTCBStk...
阅读全文
摘要:1. 指定堆栈数据类型(宽度) typedef unsigned int OS_STK;2. 指定Ucos移植方法3中保存cpu状态寄存器的变量的宽度 typedef unsigned int OS_CPU_SR;3. 指定堆栈的生长方向,cortex-m3的生长方向是高地址...
阅读全文

浙公网安备 33010602011771号