tag 标签: efm32

相关博文
  • 热度 11
    2015-1-22 12:33
    1774 次阅读|
    0 个评论
    3)完全采用DMA来实现从串口收数据,把DMA配置成使能回调函数,在回调函数中进行串口数据的分析。具体的配置如下: void LeuartConfig(void) {        LEUART_Init_TypeDef tLeuartInit =        {               .enable   = leuartEnable,               .refFreq  = 0,               .baudrate = 921600,//经过测试LEUART的波特率可以达到921600               .databits = leuartDatabits8,               .parity   = leuartNoParity,               .stopbits = leuartStopbits1        };          CMU_ClockSelectSet(cmuClock_LFB, cmuSelect_CORELEDIV2);          CMU_ClockEnable(cmuClock_CORELE, true);        CMU_ClockEnable(cmuClock_LEUART0, true);        CMU_ClockEnable(cmuClock_GPIO, true);          LEUART_Reset(LEUART0);        LEUART_Init(LEUART0, tLeuartInit);//这里初始化LEUART        LEUART0-ROUTE = LEUART_ROUTE_TXPEN |                         LEUART_ROUTE_RXPEN |                     LEUART_ROUTE_LOCATION_LOC4;        GPIO_PinModeSet(TX_PORT, TX_Pin, gpioModePushPull,  1);        GPIO_PinModeSet(RX_PORT, RX_Pin, gpioModeInputPull, 1); }   DMA_CB_TypeDef cb; DMA_CB_TypeDef cb_txd; void SetupLeuartDma(void) {        DMA_Init_TypeDef   dmaInit;          extern bool is_dma_inited;                     /* Initializing the DMA */        if(is_dma_inited == false)        {               is_dma_inited = true;               dmaInit.hprot = 0;               dmaInit.controlBlock = dmaControlBlock;               DMA_Init(dmaInit);        }          cb.cbFunc = Receive_Data_Completed;        cb_txd.cbFunc = Send_Data_Correction ; //定义了2个回调函数          DMA_CfgChannel_TypeDef chnlRxCfg =        {               .highPri   = false,                     /* Normal priority */               .enableInt = true,                     /* No interupt enabled for callback functions */               .select    = DMAREQ_LEUART0_RXDATAV,    /* Set LEUART1 RX data avalible as source of DMA signals 把LEUART1接收的数据看成DMA的源*/               .cb        = cb,                       /* No callback funtion */        };          /* Setting up channel descriptor */        DMA_CfgDescr_TypeDef descrRxCfg =        {               .dstInc  = dmaDataInc1,       /* Increment destination address by one byte */               .srcInc  = dmaDataIncNone,    /* Do no increment source address  */               .size    = dmaDataSize1,      /* Data size is one byte */               .arbRate = dmaArbitrate1,     /* Rearbitrate for each byte recieved*/               .hprot   = 0,                 /* No read/write source protection */        };          DMA_CfgChannel(RX_CHANNEL, chnlRxCfg);               DMA_CfgDescr(RX_CHANNEL, true, descrRxCfg);     //发送数据的通道设置          DMA_CfgChannel_TypeDef chnlTxCfg =        {               .highPri   = false,                    /* Normal priority */               .enableInt = true,                    /* No interupt enabled for callback functions */               .select    = DMAREQ_LEUART0_TXBL,       /* Set LEUART1 TX data avalible as source of DMA signals,这里吧TX中的数据作为DMA的信号源 */               .cb        = cb_txd,                   /* No callback funtion */        };                      //DMA发送数据回调函数        /* Setting up channel descriptor */        DMA_CfgDescr_TypeDef descrTxCfg =        {               .dstInc  = dmaDataIncNone,      /* Increment destination address by one byte */               .srcInc  = dmaDataInc1,         /* Do no increment source address  */               .size    = dmaDataSize1,        /* Data size is one byte */               .arbRate = dmaArbitrate1,       /* Rearbitrate for each byte recieved*/               .hprot   = 0,                   /* No read/write source protection */        };          DMA_CfgChannel(TX_CHANNEL, chnlTxCfg);        DMA_CfgDescr(TX_CHANNEL, true, descrTxCfg);//DMA通道2  TX        Rdy2DmaRx( FIRST_PHARSE_RX_BUF_SIZE );          //初始化设定WiFi_UART中DMA长度为三个字节 } 一个DMA配置函数: void Rdy2DmaRx(uint16_t RX_DMA_Long) {        DMA_ActivateBasic(RX_CHANNEL,                          true,                          false,                          (void*)wifiRevBuffer,                          (void*) (LEUART0-RXDATA),                          RX_DMA_Long - 1); //次要描述器一次发送的数据,他们的大小都是小于1023. }   2个回调函数定义: void Send_Data_Correction(unsigned int channel, bool primary, void* user)     //DMA发送数据回调函数 {        if((wifiWorkStatus.BUS_TRANSMISSION_PARAMETERS.Second_Count) (Send_Flage))        {               Send_Flage = false ;               DMA_ActivateBasic(TX_CHANNEL,                                 true,                                 false,                                 (void*)(uint32_t) LEUART0-TXDATA,                                 (void*)(uint32_t) wifiWorkStatus.BUS_TRANSMISSION_PARAMETERS.Second_Data_addr,                                 wifiWorkStatus.BUS_TRANSMISSION_PARAMETERS.Second_Count - 1 ); //这是在发送数据。        } } void Receive_Data_Completed(unsigned int channel, bool primary, void* user) {        int64_t msg_hardware;        static bool requireEvent  = false;        static uint16_t eventBodyLength = 0;        if( ! requireEvent )   //假如非事件,收到数据为命令        {               eventBodyLength = (int)(wifiRevBuffer 8) + wifiRevBuffer ;//这里不能设置断点,会超时的。               if( eventBodyLength == 0x01 )               {                      DisableDelayTimer(TIMER_FLAG_WIFI);             //取消500ms超时处理计数                        Rdy2DmaRx( FIRST_PHARSE_RX_BUF_SIZE ) ;       //准备释放总线的时候,设置WiFi_UART中DMA长度为三个字节                        //将配置DMA放在最前,以更快速度。但由于操作系统导致程序不正常。需要放在switch后面。                      //配置接收DMA,接收三个字节,触发中断。                      //接收长度为“1”的四个处理。READ\CMDOK\CMDERR\EVENT但长度为1                      switch(wifiRevBuffer )                      {                             case 0:                                    //获取ready                                      DMA_ActivateBasic(TX_CHANNEL,                                                      true,                                                      false,                                                      (void*)(uint32_t) LEUART0-TXDATA,                                                      (void*)(uint32_t) wifiWorkStatus.BUS_TRANSMISSION_PARAMETERS.First_Data_addr,                                                      wifiWorkStatus.BUS_TRANSMISSION_PARAMETERS.First_Count - 1); //这是在发送数据。                                    //启动5秒超时处理                                    EnableLongTimer(LONG_TIMER_FLAG_WIFI, 3, 5, On_WiFi_Timeout, (void*)WIFI_MOT_WORK_STATUS_TIMEOUT);   //五秒超时处理函数,传入参数。0表示指令;1表示读取事件。                                    break ;                             case 1:                                    //获取CMDOK                                    //如果有未读取中断,发送一次中断读取指令到硬件层。 //        if(EventFlag_Count)                             {                                    msg_hardware = WIFI_ABB_SEND_DATA_OK ;                                    xQueueSend(hEvtQueueWifi, msg_hardware, 0);                             }                             Release_the_bus() ;     //释放WiFi_UART总线                                    //启动5秒超时处理                             EnableLongTimer(LONG_TIMER_FLAG_WIFI, 3, 7, On_WiFi_Timeout, (void*)WIFI_MOT_WORK_STATUS_NO_IRQ);   //五秒超时处理函数,传入参数。0表示指令;1表示读取事件。                             break ;                             case 2:                                    //获取CMDERR                                    On_WiFi_Timeout((void*)WIFI_MOT_WORK_STATUS_CMDERR);                                    EnableLongTimer(LONG_TIMER_FLAG_WIFI, 2, 5, On_WiFi_Timeout, (void*)WIFI_MOT_WORK_STATUS_CMDERR);   //五秒超时处理函数,传入参数。0表示指令;1表示读取事件。                                    break ;                             case 3:                                    msg_hardware = WIFI_ABB_EVENT_DATA_RECEIVED ;                                    xQueueSend(hEvtQueueWifi, msg_hardware, 0);                                    Release_the_bus() ;     //释放WiFi_UART总线                                    break ;                             default :                                    break ;                      }               }               else               {                      //事件响应                      eventBodyLength = (int)(wifiRevBuffer 8) | wifiRevBuffer ;//这里不能设置断点,会超时的。                      eventBodyLength -- ;//这里减1的原因在于,上面计算出来的长度包含了响应类型这个字节,而该字节对我们没有作用                      Rdy2DmaRx(eventBodyLength) ;             //配置DMA,接收WiFi芯片指定长度字节。                      requireEvent = true;                      //启动5秒超时处理                      EnableLongTimer(LONG_TIMER_FLAG_WIFI, 3, 5, On_WiFi_Timeout, (void*)WIFI_MOT_WORK_STATUS_TIMEOUT);   //五秒超时处理函数,传入参数。0表示指令;1表示读取事件。               }        }        else        {               requireEvent = false;               //这里就是DMA搬移完成event数据。收到event数据的消息。然后在消息中分析数据。               Rdy2DmaRx( FIRST_PHARSE_RX_BUF_SIZE ) ;       //准备释放总线的时候,设置WiFi_UART中DMA长度为三个字节               msg_hardware = (long)WIFI_ABB_EVENT_DATA_RECEIVED | ((long)eventBodyLength 16);               xQueueSend(hEvtQueueWifi, msg_hardware, 0);               DisableLongTimer(LONG_TIMER_FLAG_WIFI);            //取消5秒长超时处理计数               Release_the_bus() ;     //释放WiFi_UART总线        } } 这2个回调函数里实现了我们一个串口通信协议。 需要注意的是:在DMA配置结束后,首先调用了Rdy2DmaRx()它首先使能了接收3个字节后就产生中断,即到回调函数中。在回调函数中,程序可以再次设置DMA接收长度,当再次收到设置长度的字节时还会产生回调。(这是接收产生的回调) 上面配置了发送通道也产生回调。它意味着当发送完指定字节后,也会产生中断,即到回调函数,在该回调函数中可以再次设置发送多少个字节结束后又产生中断。(这是发送产生的回调函数)。   这里发送和接收的长度都是在DMA_ActivateBasic()函数的最后一个参数决定。对于接收,应该在初始化完后,首次配置要接收多少个字节,然后接收到才会产生回调,而对于发送则不需要提前配置,就在发送时配置好即可。  
  • 热度 14
    2014-5-12 17:42
    1210 次阅读|
    0 个评论
    使用leuart外设通过蓝牙进行双机收发,两个板子分别设置为主从机,直接上视频
  • 热度 7
    2014-5-9 09:29
    1398 次阅读|
    0 个评论
    找了个时钟的图标,用RTC做了个表,融化时钟,可以看看效果
  • 热度 25
    2013-12-27 02:18
    1584 次阅读|
    0 个评论
    功耗敏感型(对电池寿命有要求的)应用在选择MCU时,为满足超长电池寿命的要求,应尽可能选择功耗小的产品。在这些应用中,MCU可能大部分时间处于休眠状态,当有任务需要处理时,MCU进入工作状态,处理完成后再次进入休眠状态。因此,MCU的总体能耗等于工作模式能耗与休眠模式能耗之和。要做到低功耗,MCU一方面需要降低休眠模式功耗,一方面需要降低工作模式功耗。 为满足低功耗的要求,同时又提供一定处理能力(32位),Silicon Labs旗下Energy Micro设计了一款基于M0+的MCU产品Zero Gecko。为什么取名叫“Gecko(壁虎)”?Silicon Labs亚太地区MCU资深市场经理彭志昌(Alan Pang)(图1)介绍,是因为壁虎是世界上耗能最低的动物。EFM32 Gecko整个系列的MCU产品(在Zero Gecko之前,Energy Micro已有超过200个基于M3和M4的MCU型号)都是针对功耗而开发的,而Zero的含义则是其功耗几乎为0。 图1:Silicon Labs亚太地区MCU资深市场经理彭志昌(Alan Pang)。 彭志昌表示,EFM32 Zero Gecko系列MCU是世界上最节能的ARM MCU,也是EFM32 Gecko家族的最新成员。它是为功耗敏感、电池供电的无线应用而优化的解决方案。如何做到节能?Zero Gecko采用了复杂的功耗管理系统,具有五种功耗模式——不同产品对于功耗的要求以及所使用的模块和方式都不相同,在用户需要使用某个模块时,只需打开包含有该模块的功耗模式,就可减少整体功耗。 此外,Zero Gecko还具有最佳的模拟外设,包括片内IDAC(电流DAC——若需要电压输出,外接电阻即可),适用于无线安全的片内AES加密(提升加解密速度,减轻CPU负担,从而降低功耗),以及完整的Simplicity Studio生态系统(开发平台)。 Zero Gecko MCU的最高频率为24MHz,片内Flash有4、8、16、32kB四种选择,片内RAM为2或4kB。它提供QFN24(5mm×5mm)、QFN32(6mm×6mm)、QFP48(7mm×7mm)三种封装形式。 Zero Gecko内部由CPU和存储、时钟管理、电源管理、串口、IO端口、定时器和触发器、模拟模块和安全几大模块组成,提供EM0(运行模式)、EM1(休眠模式)、EM2(深度休眠模式)、EM3(停止模式)和EM4(关机模式)五种功耗模式(图2)。 图2:EFM32 Zero Gecko架构。 彭志昌解释说,每个模块在打开后都会产生功耗,在EM4模式时,MCU仅提供IO口的一些操作和上电复位操作,使功耗处于最低。若用户需要使用更多的功能,则可以调整工作模式到更高的级别,比如在EM3模式时,除EM4模式支持的功能外,还可以使用RAM存储器、调试接口等模块;在EM2模式时,除EM4、EM3支持的功能外,还可以使用低功耗串口、实时时钟等;以此类推…… 另外,EFM32还具有独特的“外设反射系统(PRS)”。MCU通过软件或指令处理任务,若采用ADC定时转换信号,通常CPU会定时一段时间对信号进行采样,再将数据放入RAM中,然后进入睡眠状态。有了PRS后,CPU可以处于睡眠模式——定时器计时完毕后,将会产生一个触发信号送给ADC,ADC捕获数据转存到RAM中,完全不需要CPU去管理。Zero Gecko具有四通道PRS,支持8输出7输入信号,可以实现定时器与ADC、串口等的互通。 《电子技术设计》网站版权所有,谢绝转载 EFM32 Zero Gecko MCU拥有极低的工作模式功耗(110μAMHz),这在许多8位MCU中都很难实现。虽然其性能不如基于M3的MCU,但其处理速度比8位MCU要强得多(0.93DMIPSMHz,2.07CoreMarkMHz)。另外, MCU从休眠到唤醒所做的功是无用功。Zero Gecko MCU从休眠模式到唤醒所需时间仅为2μs,从而能够有效节省功率浪费。 Zero Gecko MCU具有超低待机电流,在关机(EM4)模式时,其功耗小于20nA;在深度休眠(EM2)模式(保留POR、BOD、RTC、RAM和CPU状态等)时,其功耗仅为900nA。该MCU的所有外设在CPU休眠时都能依旧保持运行;从串口接收数据转存到RAM可通过DMA操作完成,CPU可以处于休眠状态;同时,所有外设都能够自主运行。 Zero Gecko MCU各种功耗模式的电流消耗如图3所示。除5种功耗模式外,该系列MCU还具有超高能效的外设,比如12位模数转换器在1MSps采样率下,电流消耗仅为350μA;低功耗UART电流消耗仅为150nA;电流DAC最低电流消耗仅10nA。 图3:EFM32 MCU设计优良的能耗模式及超高能效的外设。 Zero Gecko适用于能耗敏感型应用,比如水表、气表、电表,智能家居和建筑自动化,报警和安全系统,健康和健身设备,以及智能外设等(图4)。Zero Gecko部分应用实例如图5所示。 图4:Zero Gecko适用的能耗敏感型应用。 图5:Zero Gecko应用实例。 同时,Energy Micro为EFM32提供了开发平台Simplicity Studio。该开发软件适用于Windows、Linux和MacOS X系统开发,提供免费的库、源代码模板和应用笔记,以及特有的代码创建、调试和功耗探测工具。功耗探测工具Advanced Energy Monitoring(AEM)使工程师在调试程序时,无需借助其他测量工具,就可以观察MCU运行每条指令时的功耗(比如驱动ADC时的功耗)。而能耗调试工具energyAware Profiler使用来自AEM的数据可以完成相关对象代码的实时图表绘制和调试。另外,MCU开发少不了烧录器、集成开发环境/编译器等工具,这些在Simplicity生态系统中都有包含(如图6所示)。 图6:完整的Simplicity生态系统。 最后,Silicon Labs提供了完整的低成本入门开发套件EFM32ZG-STK3200。该套件具有的以下特点:加速评估和应用开发;内建SEGGER J-Link调试器,无需其它调试适配器,节省成本;先进的能耗监视系统;无需万用表示波器;Memory LCD和电容式触摸按键;69美元的经济的价格。此外,Energy Micro所有的Gecko系列(基于M0+、M3、M4的MCU)产品软件兼容,并且同种封装引脚兼容,可以很方便地进行移植。 《电子技术设计》网站版权所有,谢绝转载
  • 热度 22
    2012-4-7 10:59
    2294 次阅读|
    0 个评论
    I get tired of hearing from people who have little or no idea of what it takes to bring an innovative idea or product concept to market reality—and I refer mostly to those facile, glib, smooth-talking pundits and politicians out there. Somehow, they are always alluding to some great idea—"magic bullet" and "silver bullet" seems to be the phrase in vogue—which will cut through the clutter and take us directly to a quick solution to some unpleasant problem, and with just a few small details to clean up along the way. While there are many times when a very good or brilliant idea is a real game-changer, making that idea into a workable solution is rarely easy or straightforward as they make it sound. I was reminded of the reality when I met at the recent Design West event with Raman Sharma of Energy Micro AS, about their extremely low-power EFM32 Gecko microcontroller. Besides the energy-usage data he showed me, what caught my attention was his clear exposition of the multiple tactics used to squeeze and squeeze the power/energy consumption further down. (I am sure that other vendors have used some or many of these ideas, but it was instructive to see them all called out in one clear listing by Raman.) In addition to an inherently low-power semiconductor process—that's a "given" for sure—the device uses a combination of topological and operational techniques; sometimes these are called "tricks" but I think that term is dismissive and demeaning. These included: - Low active-power consumption, of course - Minimizing time in any active mode - Very fast wake-up time - Ultra-low standby current - Autonomous peripheral (timers, ADC) operation, to avoid the need for the CPU intervention - Direct signaling between peripherals, again without the CPU - Multiple energy-usage modes - Low power I/O peripherals - ADC and associated support elements can function while CPU is sleeping - Development tools which allow the designer to observe and thus fine-tune energy use It's an old story, but often glossed over: even genuine magic-bullet ideas need fierce, relentless attention to detail, plus working though all the first-, second-, and even third-order problems, to be successful. Consider the steps between the Bell Labs germanium point-contact transistor of 1948 and eventual unbelievably high-volume, pennies-each discrete component we now have, or the first IC and how it became what it is today. Or, for a more bounded lesson, you can carefully study Jim Williams' 1976 EDN article on the high-accuracy scale he built for the MIT Nutrition Lab, "This 30-ppm proves that analog designs aren't dead yet") where he systematically identified, understood, and minimized the many subtle error sources. Have you ever been caught in the "here's the magic bullet—the rest should be no big deal" trap? Was it naively set by you? Or for you, but by others?ÿ  
相关资源
  • 所需E币: 2
    时间: 2023-1-10 14:32
    大小: 279.47KB
    上传者: 张红川
    EFM32应用方案之智能温控器
  • 所需E币: 4
    时间: 2019-12-25 03:10
    大小: 249.88KB
    上传者: 2iot
    EFM32产品的特性说明最节能的微控制器-EFM32系列随着节能环保的理念越来越受到大家的重视,各大半导体厂商也开始了新一轮的竞争,争先恐后的推出节能型的微控制器。其中来自挪威的EnergyMicro尤为的引人注意,打出了只有现有微控制器1/4的功耗的口号,这不禁引起了大家的好奇心,EFM32到底具有怎么样的性能特点,能达到如此之低的功耗?其实EFM32不但具有超低功耗,还具有丰富的外设,其中包括:一个运行电流约550nA的4X40段式的LCD控制器,一个运行电流约200A的8通道、12位、采样率为每秒1M的ADC,一个2通道、12位、采样速率为每秒500K的DAC,一个运行电流约100nA的模拟比较器,一个AES加密/解密加速器,每128位加密/解密只需54个时钟周期,一个运行电流约150nA的9600bps的UART。EBI(可扩彩色TFTLCD、存储)和八通道DMA等等。高效率和外设自主操作功能能在各种不同的能量模式下有效而且为嵌入式设计人员提供了5种工作模式,并且从睡眠模式到工作模式的唤醒时间只需要2微秒。其中的周边发射系统(PRS)可与标准的32位ARM总线并行。在超低功耗外模式下,各外设之间可以完全没有CPU参与的情况下相互通讯并实现一些高级操作,这样可以延长睡眠时间并节省大量的能源。5种节能工作模式……
  • 所需E币: 3
    时间: 2019-12-25 03:10
    大小: 2.76MB
    上传者: 二不过三
    关于EFM32产品的简单介绍EFM32低功耗ARMCortex-M3微处理器特性:32位ARMCortex-M3内核最高主频32MHz-1.25DMIPS/MHz-强大的数学运算能力-内存保护单元(MPU)最大128KBFlash和16KBRAM内存可达90个GPIO,20mA驱动16个外部中断外扩总线接口(EBI),DMACPU休眠时,各外设自主工作EFM32GeckoMCU延长4倍电池寿命AES128/256位加密/解密最多6个USART,支持UART和SPI模式。低功耗UART在EnergyMicroEFM32GeckoMCU系列产品提供新的节能技术,并且32位EFM32集成许多低功耗的外设去实现比其他低功耗8位,16位和32位微控制器多4倍的电池9600bps接收模式下仅100nA寿命。2/3个16位的计数器/定时器,低功耗定时器,支持脉冲输出、脉EFM32系列具有超低功耗和丰富外设两个特别亮点。主要包括:一个运行电流冲计数约550nA的4X40段式的LCD控制器;一个运行电流约200μA的8通道、12位、采样灵活的24位实时时钟计数器率为每秒1M的ADC;一个2通道、12位、采样率为每秒500K的……
  • 所需E币: 5
    时间: 2020-1-6 17:41
    大小: 2.58MB
    上传者: rdg1993
    EFM32微控制器包含最节能的外围设备和能量模式,EFM32为全球最节能的微控制器系列的十大理由……