MM32W

本章我们将对软件架构进行简单的讲解。

阻塞式例程介绍

对于大部分的低功耗设备来说,CPU都是处在休眠模式中,只在接收到特定数据的时候被唤醒处理少量数据,这种应用场景比较适合阻塞方式运行,这种方式配置简单,CPU大部分时间都被蓝牙服务占用,在收到来自射频模块的IRQ信号时需要及时处理,因此,用户的代码不允许出现阻塞。

我们先看一下例程中的main函数:

int main(void)

{

unsigned long temp=0x800000;

SystemClk_HSEInit();               //系统时钟配置为48MHz

            

#ifdef USE_UART                    //目前只支持UART接收与发送AT指令

#ifdef USE_AT_CMD    //开启AT指令功能

SleepStop = 0x01;       //空闲时低功耗,0x00不休眠,0x01睡眠,0x02停机模式

#endif

#endif

            

#ifdef USE_UART                    //开启UART功能,修改全局宏定义改变UART和对应引脚

uart_initwBaudRate();               //波特率默认9600,可以修改uart.c中的BaudRate变量

#endif

            

#ifdef USE_I2C                        //开启I2C功能

IIC_Init(I2C1);               // I2C1,标准模式,SCL PB6 ,SDA PB7 ,SendDataFlag PA10

#endif

 

#ifdef USE_USB                      //开启USB功能

usb_test();                    //使用PA11、PA12,枚举为USB HID设备

#endif

 

//SysTick_Count每1ms加一,系统时钟改变时应调用SysTick_Config()函数

SysTick_Configuration();           

            

//启用SPI2,在芯片内部与射频模块通信,速度应不低于6Mhz

SPIM_Init(SPI2,/*0x06*/0x06); 

            

IRQ_RF();         //配置PB8的IRQ 功能处理射频模块信号,用于低功耗唤醒

            

while(temp--);                //延时,方便烧录程序

radio_initBle(0x48, &ble_mac_addr);   //初始化射频模块(3dBm),并获取MAC地址

printf("\r\nMAC:%02x-%02x-%02x-%02x-%02x-%02x\r\n", ble_mac_addr[5],
ble_mac_addr[4],ble_mac_addr[3],
ble_mac_addr[2],ble_mac_addr[1],
ble_mac_addr[0]);

            

ble_run(160*2); //广播间隔320*0.625=200 ms,

}

对于蓝牙,必要的系统资源有:用于计时的Systick和与射频模块通信的SPI2,Systick使用SysTick_Count变量计时,也可以使用这个变量主动避开与IRQ处理任务的冲突;

目前程序支持RUN MODE,SLEEP MODE,STOP MODE模式,其中,在stop模式下MCU可以通过任意一个外部中断线唤醒,比如MM32W073NTB封装,在芯片设计上将IRQ与PB8共用一个GPIO口,在MM32W073PFB封装上,IRQ是独立的GPIO,需要用户在设计时将IRQ连接到任意一个GPIO口修改外部中断唤醒源即可实现stop唤醒模式;

例程中通过修改全局宏定义,可以启用UART、IIC和USB,目前都支持AT指令方式;

蓝牙的广播间隔由ble_run()中的参数决定,单位为0.625ms;

与中断式例程不同的地方:

① 蓝牙服务会定时调用接口函数McuGotoSleepAndWakeup();

② ble_run()是一个阻塞函数,后续程序将不会执行,中断模式中ble_run参数为0,且不是阻塞函数;

③ 中断式例程中蓝牙广播间隔由ble_run_interrupt_start()函数的参数决定,阻塞式例程中蓝牙广播间隔由ble_run()的参数决定;


图2 阻塞式程序流程

阻塞式程序流程如上图。实际使用中,蓝牙服务将定时调用UsrProcCallback()函数,在连接后允许时调用gatt_user_send_notify_data_callback()。两个函数的处理时间应尽可能短,不能影响IRQ信号的处理,否则可能出现蓝牙连接断开、无蓝牙广播等问题。

我们可以将用户程序放在callback.c的UsrProcCallback()函数中定时执行,如例程中的AT指令的处理CheckAtCmdInfo()函数,注意不要阻塞。可以将发送自身状态的程序放在gatt_user_send_notify_data_callback()函数中,同样不得阻塞。

来源:灵动MM32MCU

围观 14

本章我们将对软件架构进行简单的讲解。


图1 蓝牙通信框图

MM32W0控制模块通过SPI通信对射频模块进行控制,MM32W0的蓝牙程序提供以库的形式提供给大家使用,用户无需了解蓝牙协议栈,只需要对MCU进行控制即可实现蓝牙控制。在协议栈中为方便用户使用预留接口函数,用户通过调用相关接口的方式实现对应功能。

以下几点需要注意:

1)控制模块SPI2 仅且只能用于与射频模块的通信。

2)IRQ 信号引脚用于射频模块与控制模块的唤醒,且PB8 引脚只能用于控制模块唤醒。

3)AVDD 供电电压为2.2V ~ 3.6V

目前蓝牙控制程序有两种类型:中断式和阻塞式,中断方式是是以中断服务的方式运行,适合于实现用户某功能需要占用较长CPU 时间但可以被任意打断的应用场景;阻塞方式是蓝牙协议运行的入口函数为ble_run(),该函数不会返回,两种方式调用的接口函数都相同。

中断式例程介绍

中断服务程序方式运行的软件架构如下图所示。


图2 中断方式软件构架
main()函数:

int main(void)

{

unsigned long temp=0x800000;

unsigned long i=0; 

while(temp--);

SystemClk_HSEInit();

PWM_Init();



#ifdef USE_UART

#ifdef USE_AT_CMD

SleepStop = 0x02;

#endif

#endif



#ifdef USE_UART

uart_initwBaudRate();

#endif



#ifdef USE_I2C

IIC_Init(I2C1);

#endif    

SysTick_Configuration();



SPIM_Init(SPI2,/*0x06*/0x06); //6Mhz

 

IRQ_RF();

 

SetBleIntRunningMode(); 

radio_initBle(TXPWR_0DBM, &ble_mac_addr); 

SysTick_Count = 0;

while(SysTick_Count < 5){}; //delay at least 5ms between radio_initBle() and ble_run...

 

//ble_set_adv_data(pld_adv, LEN_ADV);

 

ble_run_interrupt_start(160*2); //320*0.625=200 ms

   

while(1)

{

//do sometging and sleep

//delay_ms(50);

IrqMcuGotoSleepAndWakeup();

}

}

 

在IRQ中断服务中的常用配置如下:

void EXTI4_15_IRQHandler(void)

{

EXTI_ClearITPendingBit(EXTI_Line8);//确认是PB8引起的中断

if(2 == SleepStatus)           //从STOP模式唤醒,重新启动HSI,配置系统时钟

{

RCC->CR|=RCC_CR_HSION;

RCC->CR |= RCC_CR_PLLON;

RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;

SysTick_Config(48000);

}

SleepStatus = 0;         //设置当前状态为唤醒

ble_run(0); 

}

中断式例程需要用到两个中断服务程序,一个是蓝牙IRQ 中断PB8对应的外部中断线,一个是实现SysTick 对应的中断。IRQ 对应的中断服务程序用以运行蓝牙协议,需要有较高的中断优先级(针对所有系统中断来说)。

UART,SPI,IRQ,USB等控制模块上的配置同阻塞方式。

SPIM_Init(SPI2,0x06)是控制模块和射频模块间通信的初始化,SPI2只能用于与射频模块的通信。

IRQ_RF将PB8设置为外部中断,用于实现IRQ外部唤醒功能,通过一个下降沿唤醒MCU。PB8 引脚只能用于控制模块唤醒。

uart_initwBaudRate()是UART的初始化,对于两种封装对应的UART和GPIO接口不同。

不同点:

① 初始化蓝牙配置函数radio_initBle()之前,需要先调用SetBleIntRunningMode()函数。

②启动蓝牙调用ble_run_interrupt_start()而不是ble_run(),后面需要一个while(1)循环,可以将用户程序放在这里。

③ 进入休眠模式的函数需要主动调用IrqMcuGotoSleepAndWakeup()函数,函数McuGotoSleepAndWakeup()不再被调用。根据启动蓝牙时的参数,射频模块将定时触发IRQ的外部中断唤醒MCU。

来源: 灵动MM32MCU

围观 35

在文章中使用到了MM32 BLE_TestBoard和蓝牙模组,该蓝牙开发板是为了用户快速上手、了解、学习及评估MM32无线系列MCU性能的一块入门级开发板,本章节将会针对开发板及两款模组差异做详细介绍。

MM32W0系列主要有QFN32和LQFP48两种封装,支持32k\64k\128k flash容量,支持UART、I2C、SPI、USB device、CAN等通信接口。目前都是提供模组和开发板的方式供大家评估、测试。

MM32W0系列蓝牙模块是灵动微电子专为智能低功耗蓝牙数据传输而打造,遵循BLEV4.1蓝牙规范。支持蓝牙SPP 协议,可与所有版本安卓手机收发数据,可与支持BLE 的IOS 设备配对连接,无需额外授权费用,支持后台程序常驻运行;支持AT 指令,用户可根据需要更改串口波特率、设备名称、配对密码等参数,使用灵活。

本模块支持UART 接口、I2C 接口和USB 接口,具有成本低、体积小、功耗低、收发灵敏性高等优点,只需配备少许的外围元件就能实现其强大无线数据传输功能。

模组资源介绍


图1 QFN32封装模组资源


图2 LQFP48封装模组资源


图3 模组尺寸封装

开发板介绍

对于两种模块,大小规格是一样的,所以官方的开发板兼容这两种模块,只需要配置好对应的引脚即可正常使用。


图4 BLE开发板

如上图,这是一个官方的开发板,模块上的芯片是一颗LQFP48封装的MM32W0芯片。开发板的左边画框的部分需要连接跳帽,从上到下分别是UART,USB,和供电。

① UART部分连接有LED指示灯。

配置时需要注意的是,

LQFP48:UART2、PA2、PA3;

QFN32:UART1、PA9、PA10。

②USB部分使用的是PA11和PA12,可以向上连接使用USB功能,也可以向下连接使用UART的硬件流控功能。

③供电部分工作电压为2.3V ~ 3.6V

④在开发板下方是标准的SWD烧录接口

⑤在模块的周围,可以看到用丝印将对应的引脚名称或常用功能标注出来了。其中右上角标注了两种模块的不同,从上到下依次是:

LQFP48:PB9(Pin34)、PB0、PB1、PA0、PA1、IRQ

QFN32:PA8(Pin34)、PB0、PB1、PB2、PA0、IRQ

⑥在开发板最右边(以LQFP48为例)

LED2:PB9,低电平点亮

LED2:PB1,低电平点亮

变阻器:PB0,10K

Key2:Reset,按下为低电平

Key1:PA0,按下为高电平

来源:灵动MM32MCU

围观 35

在物联网的大趋势下,智慧城市和智能家居也随之兴起。而物联网的发展离不开无线技术,众所周知蓝牙是目前物联网产业中使用最广泛的无线通讯技术,特别是像蓝牙这种低功耗技术,更是众所瞩目的焦点。

BLE的优点主要包括:高可靠性、高安全性、低成本、低功耗。

灵动微电子有基于ARM® CortexTM-M3 和ARM® CortexTM-M0为内核的无线连接功能的MM32W系列(集成MCU+RF射频芯片的单芯片),MM32W0xxB 产品提供LQFP48 和QFN32 封装形式;根据不同的封装形式,器件中的外设配置不尽相同。这些丰富的外设配置,使得MM32W0xxB 产品微控制器适合于多种应用场合。

下面是MM32W0系列的选型表,可以根据所需的外设来选择合适的型号。


图1 MM32W0系列选型表


图2 MM32W3系列选型表

为了方便客户的使用,灵动微电子设计了几种蓝牙模块及配套的蓝牙开发板,只需配备少许的外围元件就能实现其强大无线数据传输功能,,搭载了MM32W0xxB是超低功耗的单模蓝牙芯片,工作电压为2.3V ~ 3.6V,多种省电工作模式保证低功耗应用的要求。支持多种数据通信接口(UART\USB\IIC\SPI等),支持AT 指令,用户可根据需要更改串口波特率、设备名称、配对密码等参数,使用灵活。该模块主要用于短距离的数据无线传输领域,可以实现与手机间一对一互连。


图3 两种常用的模块


图4 模组物理特性

模组主要应用领域:

1)蓝牙无线数据采集、传输;
2)工业遥控、遥测;
3)无线键盘、鼠标;
4)汽车检测设备、交通、井下定位、报警;
5)智能家居、楼宇自动化、安防、机房设备无线监控、门禁系统;
6)蓝牙操纵杆、蓝牙游戏手柄;
7)蓝牙遥控玩具;
8)防丢器、LED 灯控、iBeacon

使用AT指令控制模块

下面我们使用蓝牙开发板来演示AT指令控制蓝牙模块,通过Micro-USB线连接电脑,打开串口助手,手机端使用蓝牙APP软件与模块连接。


图5 蓝牙开发板


图6 部分AT指令列表

如图4在程序运行之后,首先在串口输出的是模块的MAC地址,手机连接之后输出已连接信息,在第三行,收到手机端发来的Hello字符串。接着,我们通过串口向模块发送AT指令,AT+BLESEND=10,0x4D696E644D6F74696F6E,在手机端收到发来的字符串”Mindmotion”如图5,最后断开连接,串口输出状态。


图7 模块串口输出


图8 手机端收发数据

对于简单的应用,连接上VDD、GND、TX和RX这四根线之后就可以为项目增加蓝牙通信功能。


图9 QFN32典型应用电路

用户如果有需要重新设计PCB,可以参照上面的原理图,自行设计合适的通信模块,更好地应用在不同的项目中。

来源: 灵动MM32MCU

围观 32

页面

订阅 RSS - MM32W