tag 标签: coocox

相关博文
  • 热度 14
    2013-3-9 21:46
    1474 次阅读|
    0 个评论
    今天终于调好了新唐m0516LAN的coocox的中断INT1的回调函数,好开心。虽然对于回调函数还是有很多疑问,但是至少会应用了现在,所以赶紧分享下。 新唐的m0616LAN芯片有两个中断INT0和INT1,但都是复用的引脚P3.2和P3.3。之前虽然是在电路中把一个按键接到了p3.3之上,但是对于回调函数不懂,所以以为和普通io一样可以最中断控制使用。在DRV_GPIO.c 中发现了函数原型中的说明: “************************************************************************* if ((port == E_PORT3) ((pin == E_EINT0_PIN) || (pin == E_EINT1_PIN)))     {         //         // P32 is EINT0, P33 is EINT1. Both of them can't be assigned to gereral P3         //  interrupt  *********************************************************************** 这次发现服用的io不能调用此函数,而是要单独调用int1的中断函数。找了好久终于找到了这个函数:int32_t DrvGPIO_EnableEINT(E_DRVGPIO_EXT_INT_PIN pin, E_DRVGPIO_INT_TYPE Type, E_DRVGPIO_INT_MODE Mode, EINT_CALLBACK pfEINTCallback) 其中pfEINTCallback为INT1回调函数的指针,在程序中调用此函数并且初始化p3.3为int1,程序成功执行。 DrvGPIO_InitFunction(E_FUNC_EXTINT1); DrvGPIO_EnableEINT(3,E_IO_FALLING,E_MODE_EDGE,EINT1CallBack);   void EINT1CallBack(void) { CoEnterISR();               //   Tell CooCox that we are starting an ISR. isr_SetFlag(KEY_***1); CoExitISR(); } 中断服务程序中的操作其实就是当INT1有中断时,置一个信号变量,传递给任务task_KEY1,然后控制GREEN LED点亮,继续等待下一次按键,这样的话就不用查询当前按键的状态了,可以中断执行按键的响应操作,提高效率。 附件中为当前的程序。  
  • 热度 21
    2013-3-7 16:24
    1138 次阅读|
    0 个评论
    现在正在做一个嵌入式的项目,由于之前参加新唐的推广活动获得nu-tiny-051和120各一块,就打算使用新唐的nuc130系列cotex-m0 muc来开发项目。但在寻找相关开发资料的时候发现问题还是比较多的,首先nuc130的芯片手册(包括详细的寄存器相关定义和解释)找不到更加丰富的文档,其次由于是新系列的m0 mcu,网上的开发资料比较少,大部分都是STM的开发相关资料,这就会产生一个风险,到时开发遇到问题该怎么能快速方便可靠的解决。 为了验证系统的一些儿性能,现在我在原开发板的基础上开发新的应用,包括增加按键,pc串口通信,使用iic,wdt,spi,还有adc等相关外设,就是为了对器件更加丰富了解。在原来的开发板上面一个外设一个外设的累加起来,慢慢的也快成了一个全部功能的开发板了。 利用coide开发程序,系统集成了coocox操作系统,可以支持多系列的cpu。CooCox CoOS 是一款针对ARM Cortex-M系列芯片而设计的实时系统内核。 CoOS特征:   免费并开源 ARM Cortex M3及M0定制操作系统 高度可裁剪性,最小系统内核仅974Byte 支持优先级抢占和时间片轮转 自适应任务调度算法 中断延时时间趋近于零 堆栈溢出检测 信号量、邮箱、队列、事件标志、互斥等同步通信方式 支持多种编译器:ICCARM、ARMCC、GCC   官方网站:http://www.coocox.org 我现在扩展了一个小板子,实验每一个功能模块并仿真。附件为现在正在做的4个任务管理的程序,加入两个串口和两个按键及测试等的小程序。  
  • 热度 19
    2012-9-14 09:44
    1951 次阅读|
    0 个评论
        近年来,ARM越来越流行,cortex M3、M0系列更有取代8位、16位处理器的势头;与此同时,学习Arduino的人越来越多,许多人都用arduino来做自己的创意产品;为了将两者很好的结合起来,coocox推出了基于ARM系列的arduino兼容板——cookie系列。   Cookie特性   cookie系列的第一版是 Cookie Numicro ,也就是基于新塘M051的cookie板,下面简略说下这个板子的特性: 1.      提供硬件设计的原理图和PCB 2.      完全兼容arduino,arduino中的几百个Shields都可以兼容使用 3.      使用32位的单片机,速度快 4.      板载colinkex调试器 5.      coocox提供一系列的免费开发工具 6.      coocox的组件平台便于分享代码   cookie的价值 coocox发布arduino兼容开发板具有得天独厚的优势,首先,有cox外设库为其提供坚强的后盾,基于cox的一切cookie是兼容的,基于cox的一切Shields都是轻松可移植的;其次,coocox提供全套的开发工具,编码、编译、调试、下载一应俱全;再次,coocox提供组件分享平台,任何代码可以轻易的分享给所有人,组件平台有客户端版本(COIDE)和网页版本。   相比arduino。Cookie具有很多优势,首先是处理器的优势,cookie是用的32位ARM Cortex MCU最高时钟能达到50+Mhz。相对丰富的外设,使得cookie在接口上可以提出更多扩展功能,比如CAN、USB、Ethernet、RPI等,同时还提供调试接口可以用来调试代码。   但是,常用ARM的arduino兼容板子,也有个缺点,那就是,入门门槛比arduino要高一点点,所幸,cookie不存在这个问题,因为有coide和组件平台的支持,可以方便的入门!   Cookie Numicro Cookie NuMicro是基于Nuvoton Cortex M0处理器M0516LBN的板子,图片如下: 图 板子外观   IO管脚分布图 图 arduino兼容示意图 IO管脚说明: Arduino 引脚 Arduino 外设功能 MCU IO Map MCU 外设功能 D0 UART.RX PA1 UART1.RTS/UART1.RX D1 UART.TX PA0 UART1.CTS/UART1.TX D2 EXT.INT PE0 PWM0/T2.EX D3 EXT.INT / PWM PE1 PWM1/T3.EX D4   PE2 PWM2 D5 PWM PE3 PWM3 D6 PWM PC4 PWM4 D7   PD2 NINT0/T0.EX D8   PD3 NINT1/T1.EX D9 PWM PC5 PWM5 D10 SPI.CS PA4 SPI1.CS PWM PC6 PWM6/CMP1.O D11 SPI.MOSI PA5 SPI1.MOSI PWM PC7 PWM7 D12 SPI.MISO PA6 SPI1.MISO D13 SPI.CLK PA7 SPI1.CLK AREF   NC   SDA I2C.SDA PD4 TIM***0/I2C0.SDA SCL I2C.SCL PD5 TIM***0/I2C0.SCK A0 AIN PB0 ADC0/TIM***2 A1 AIN PB1 ADC1/TIM***3 A2 AIN PB2 ADC2/UART1RX A3 AIN PB3 ADC3/UART1TX A4 AIN PB4 ADC4/SPI0.CS/CMP0N I2C.SDA PD4 TIM***0/I2C0.SDA A5 AIN PB5 ADC5/SPI0.MOSI/CMP0P I2C.SCL PD5 TIM***1/I2C0.SCK ICSP.1 SPI.MISO PB6 ADC6/SPI0.MISO ICSP.3 SPI.SCK PB7 ADC7/SPIO.CLK ICSP.4 SPI.MOSI PB5 ADC5/SPI0.MOSI/CMP0P   关于更多关于cookie的基本信息,请参考: http://www.coocox.org/downloadfile/cookie/numicro/Cookie%20User%20Manual.pdf   在了解上述基本信息之后,我们可以开始cookie的应用了。 打开coide,选择厂商Novoton,选择芯片M0516LBN,进入组件页面,可以看到一下页面: 图 组件页面 Cookie可用的组件就是CoX组件和CoX驱动,其中,CoX.Cookie.M051.config就是coide对于Cookie板的配置支持,勾选这个组件。 然后勾选xGPIO组件,可以在左上角看到如下图片:   图 组件结构图   点击xGPIO,在新出来的窗口,可以看到所有适用于xGPIO的例子:   图 例子列表   选择Cookie_blink点击add即可将这个例子添加到工程。然后编译,配置调试下载器为colinkex即可下载调试。 完成下载之后,你就能见到Cookie板上的LED闪烁了,是不是很简单,也许你会说,这只是控制一个LED灯,本来就简单,我们下面再演示其他模块,UART、PWM、LCD等。 为了方便,注释掉main.c中main函数中的Cookie_blink(),   回到组件页面,勾选UART组件,按照上述方法在xUART中,添加例子Cookie_printf:   图 例子列表 编译,下载。 将通过com9串口线,将Cookie和电脑连接。打开电脑的超级终端,如果你看到“hello Cookie!”,恭喜你,串口打印成功,如果没有反映,先不要着急: 1.      试着按下Cookie的复位按键,看看是不是有反映 2.      检查线路连接是否牢固 3.      检查串口配置是否正确,包括端口号、波特率等 一般情况,做了这三个步骤,你可以看到打印出来“hello Cookie!”如果依然没有打印输出,你再看看Cookie板子上的led等是否在闪烁,如果闪烁表示程序已经下载成功了,问题在于线路连接和PC端。否则的话,你就需要调试来跟踪问题了。   也许有人会说,Arduino好用,主要是arduino提供了几百个可复用的Shield,那么Cookie也可以轻松支持Shield。 以LCDShield为例,在组件页面的右下方点击driver,进入driver页面,勾选LCDshield,再回到peripherals页面勾选xPWM组件,同样的方法,在例子窗口中添加LCDMotor的例子。   图 例子列表 这个例子是两个Shield的结合,一个是LCDShield,这个Shield可以用来显示和按键输入,一个是电机模块,可以控制直流电机、步进电机等。 这个例子中用到的Shield都是 http://shieldlist.org/ 中标准的Shield。具体链接如下: LCDshield: http://shieldlist.org/dfrobot/lcd Motor: http://shieldlist.org/adafruit/motor 例子的功能就是实时显示当前的按键,并通过按键控制电机转动的方向和速度。下面是所用到的Shield图: 以下是演示效果图: 图片1,是没有按键按下的情况,LCD显示无任何按键!电机以默认的方式转动。 图片2,是按住UP按键时候的显示,LCD显示“UP”,电机转动速度加快! 从上面的例子可以看出,coide的组件平台大大简化了Cookie的入门和开发,后续,还会提供更多的Shield、驱动模块,甚至方案等,这里将是海量代码的汇集之处,这里将是一个嵌入式开发的在线社区,这里将聚集全世界优秀的嵌入式开发工程师。所以,抓住机遇,加入coocox一起开始嵌入式开发之旅吧,现在加入还可以享受预定优惠! 从 http://www.coocox.org/Cookie.html 获取更多信息。
  • 热度 22
    2012-9-12 09:26
    2148 次阅读|
    2 个评论
    转载请注明出处! 1.GPIO接口设计思想 1.1CoX.GPIO发展过程,历史版本      CoX第一版从2009年开始,从CoX诞生开始,CoX的目标就是要做到在M系列的CPU上实现平滑移植。所以,GPIO的实现,第一版首先实现了,IO的模式配置(输入、输出)和管脚的上拉、下拉配置;然后,实现了IO管脚的状态读写。具体可以从接口定义清晰的看出来: typedef struct {   COX_Status (*Init) (COX_PIO_Dev pio);   COX_Status (*Dir)  (COX_PIO_Dev pio, uint8_t dir);   uint8_t     (*Out)  (COX_PIO_Dev pio, uint8_t level);   uint8_t     (*Read) (COX_PIO_Dev pio);   COX_Status (*Cfg)  (COX_PIO_Dev pio, uint8_t index, uint32_t arg, uint32_t*pre_arg); } COX_PIO_PI_Def; typedef const COX_PIO_PI_Def COX_PIO_PI; 这样的实现,确实可以大大减小IO操作的移植,因为我们在每个厂商实现一套API,以新唐为例: COX_PIO_PI pi_pio = {        NUC_GPIO_Init,        NUC_GPIO_SetDir,        NUC_GPIO_Out,        NUC_GPIO_Read,        NUC_GPIO_Cfg }; 在使用的时候,我们仅仅需要使用pi_pio的指针就可以调用GPIO的API操作了,而且这个指针还可以被驱动嵌套使用。有兴趣的可以参考NUC140-LB Board的CoOS例程,这个在 www.coocox.org 官网可以下载到。 然而,第一版有几个明显的不足: 1.                实现的功能很少,只有IO的基本配置和读写操作,没有外部中断实现,没有多功能配置实现,以及一些其他特殊的功能。 2.                采用了结构体的形式,代码的可读性大大降低,效率也不高。 3.                CoX代码不能搞定所有基本的事情,在使用CoX库的使用还必须和厂商库配套使用。 4.                CoX在第一版更多的注重外设模块的移植,而忽略了系统。     所以,CoX需要改进、升级。经常一年多时间的积累,在2011年开始推出CoX 2.0版本,这个版本解决了上述所有的缺点的同时,保留了CoX设计的初衷——那就是在M系类CPU上面的通用性。下面,详细介绍2.0版的CoX.GPIO接口。 1.2通用强制接口 通用强制接口是提取的一套ARM Cortex M0/M3所有厂商系列MCU都具有的功能接口。本篇以新唐M051为例讲解CoX.GPIO,其他系列大同小异, 提取GPIO通用接口的时候,是从以下角度出发考虑的: u      配置一个GPIO管脚线 l        方向配置: n        输入  n        输出 n        硬件功能 l        外围功能配置: l        Pad配置: n        驱动能力大小(电流) n        开源/推挽 n        弱上拉/下拉电阻 u      GPIO管脚数据控制 l        输出高/低电平 l        获取管脚输入值 u      输入中断(EXTI) l        上升沿检测 l        下降沿检测 l        上/下沿检测 l        低电平检测 l        高电平检测   APIs分组完成以下几大功能: u      配置GPIO管脚线的函数: l        xGPIODirModeSet l        xGPIOSPinDirModeSet l        xGPIOPinConfigure u      读回GPIO管脚线模式配置的函数: l        xGPIODirModeGet u      还有很方便的函数,可以将GPIO配置成想要的功能: l        xGPIOSPinTypeGPIOInput l        xGPIOSPinTypeGPIOOutput l        xSPinTypeADC l        xSPinTypeI2C l        xSPinTypeSPI l        xSPinTypeTimer l        xSPinTypeUART l        xSPinTypeACMP u      处理GPIO中断的APIs l        xGPIOPinIntCallbackInit l        xGPIOPinIntEnable l        xGPIOSPinIntEnable l        xGPIOPinIntDisable l        xGPIOSPinIntDisable l        xGPIOPinIntStatus l        xGPIOPinIntClear l        xGPIOSPinIntClear u      处理GPIO Pin状态的APIs l        xGPIOPinRead l        xGPIOSPinRead l        xGPIOPinWrite l        xGPIOSPinWrite   1.3通用非强制接口  通用非强制接口是一部MCU通有的功能,而不是所有MCU都具有的功能接口: l        xGPIOSPinTypeGPIOOutputOD l        xGPIOSPinTypeGPIOOutputQB l        xSPinTypePWM l        xSPinTypeEXTINT l        xSPinTypeEBI   CoX的宏定义的参数和APIs都是以' x '开头的, 体现出CoX接口的特征。比如将 GPIOA Pin0配置成输出模式, 代码如下: xGPIODirModeSet(xGPIO_PORTA_BASE, xGPIO_PIN_0, xGPIO_DIR_MODE_OUT); 函数和形式参数都是x开头。 1.4厂商库特色接口 特色接口是包括了通用性接口,和MCU特有功能的接口。比如: void GPIOPinDebounceEnable(unsigned long ulPort, unsigned long ulPins);并不是通用强制型或者通用非强制型,而是MCU特有的功能,就是在厂商库特色接口这一组。   另外厂商库接口也实现了MCU其他所有的功能,比如: void GPIOPinWrite(unsigned long ulPort, unsigned long ulPins,                       unsigned char ucVal); 也实现了GPIO管脚线模式的配置,这个在CoX接口的xGPIOPinWrite也是这个功能。其实这个时候xGPIOPinWrite的实现方式如下: #define xGPIOPinWrite(ulPort, ulPins, ucVal)                                  \         GPIOPinWrite(ulPort, ulPins, ucVal) 进行了一次宏定义包装罢了,对应的参数也是进行的一次宏定义比如: #define xGPIO_PIN_0             GPIO_PIN_0   2.设计技巧简介 GPIO的CoX接口创新性的提出了Short Pin,比如PA0 是GPIOA的Pin0脚,它的定义如下: #define PA0                     PA0   自从有了Short Pin之后,对GPIO的操作简单多了,例如比如将GPIOA Pin0配置成输出模式,并输出高电平, 代码如下: xGPIODirModeSet(xGPIO_PORTA_BASE, xGPIO_PIN_0, xGPIO_DIR_MODE_OUT); xGPIOPinWrite(xGPIO_PORTA_BASE, xGPIO_PIN_0, 1); 现在用Short Pin作为参数,上面的功能可以这样实现: xGPIOSPinTypeGPIOOutput(PA0); xGPIOSPinWrite(PA0, 1); 上面的Short Pin到底是如何实现的呢?看起来很神奇,以xGPIOSPinWrite为例说明它的实现过程: #define xGPIOSPinWrite(eShortPin, ucVal)                                      \         GPIOSPinWrite(eShortPin, ucVal) #define GPIOSPinWrite(eShortPin, ucVal)                                       \         GPIOPinWrite(G##eShortPin, ucVal) 关于##, 其实是宏定义里面的高级用法,它是一个连接符,遇到此连接符,宏会一直展开下去,直到不能展开为止。G##eShortPin其实会连接为GPA0,而GPA0同样是个宏定义,如下: #define GPA0                    GPIO_PORTA_BASE, GPIO_PIN_0 GPIOPinWrite(GPA0, ucVal)会进一步展开为 GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_0, ucVal),这个函数在厂商库里面定义了的,所以实现了Pin写的功能。   另外Short Pin对GPIO管脚的外设多功能复用操作也带来了极大的方便,比如配置PD5为I2C的clock脚功能,如下: xSPinTypeI2C(I2C0SCK, PD5); 是不是很简单!!!上面的实现如下: #define xSPinTypeI2C(ePeripheralPin, eShortPin)                              \ do                                                                    \ {                                                                     \          GPIOSPinConfigure(ePeripheralPin, eShortPin);                      \          GPIOSPinFunctionSet(GPIO_FUNCTION_I2C,eShortPin);             \ }                                                                    \ while(0)     #define GPIOSPinConfigure(ePeripheralPin, eShortPin)                          \        GPIOPinConfigure(GPIO_##eShortPin##_##ePeripheralPin) 上面的会连接成这样GPIOPinConfigure(GPIO_PD5_I2C0SCK), GPIO_PD5_I2C0SCK宏定义如下: #define GPIO_PD5_I2C0SCK        0x00003510 这个是根据多功能复用进行的编码,视不同的芯片,这个编码方式灵活多变。   还有一些接口完全是为了移植方便性而产生的,比如xGPIOSPinToPort, 这个接口是由Short Pin就可以得到这个Pin所对应的PORT Base,而在CoX.SYSCTL中有一个接口xSysCtlPeripheralEnable2是使用外设地址Base为参数使能这个外设(在SYSCTL中维护了一个外设BASE-ID-INT的表),它实现的时候,是进行了一个Base到外设ID的一个转换,最终还是调用xSysCtlPeripheralEnable使能外设的。但是有了这个功能,也很利于基于CoX驱动组件的移植性,例如在AD7415温度传感器是通过I2C接口进行数据通信的,在这个驱动组件头文件中, 只需要考虑一下四个元素就可以平滑的使得这个驱动组件移植到其他的MCU上(比如NUC1xx,或者STM32F1xx): // //! Config the device i2c Address // #define AD7415_I2C_ADDRESS      0x48   // //! Config the devide i2c bus master // #define AD7415_MASTER_BASE     xI2C0_BASE   // //! Config the i2c SDA pin // #define AD7415_PIN_I2CSDA        PA8   // //! Config the i2c SCL pin // #define AD7415_PIN_I2CSCK        PA9 因为有了xI2C0_BASE在驱动中就可以使能这个I2C外设,有了连接的管脚也就可以使能对应的GPIO PORT, 如xSysCtlPeripheralEnable2(AD7415_MASTER_BASE); 这里不在需要给出I2C0的外设使能ID,或者GPIOA的外设使能ID, 用户移植的时候只需要从硬件连接角度出发,用了那个I2C, 管脚是怎么连接的,而不需要考虑其他的元素。 3. GPIO接口使用示例与移植 下面给出一个CoX.GPIO的示例,都是使用的通用强制型的接口,因此下面的例子在所有Cortex M0/M3上都是平滑移植的, 类似一个简单的电灯程序。 void Blinky(void) {     unsigned long i;           //     // Initionalize system clock.     //     xSysCtlPeripheralClockSourceSet( 12000000,  xSYSCTL_XTAL_12MHZ );           //     // Set GPIO port c pin 0 , 1 output mode.     //     xGPIODirModeSet( xGPIO_PORTC_BASE, xGPIO_PIN_0, xGPIO_DIR_MODE_OUT );     xGPIODirModeSet( xGPIO_PORTC_BASE, xGPIO_PIN_1, xGPIO_DIR_MODE_OUT );           while (1)     {             //         // Delay some time.         //         for( i = 0; i 0x1FFFF; i++ )                          //         // Output high level.         //         xGPIOPinWrite( xGPIO_PORTC_BASE, xGPIO_PIN_0 | xGPIO_PIN_1, 1 );                         for( i = 0; i 0x1FFFF; i++ )                         //         // Output low level.         //         xGPIOPinWrite( xGPIO_PORTC_BASE, xGPIO_PIN_0 | xGPIO_PIN_1, 0 );        }       }   更多请访问: http://www.coocox.org/COX.html