你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

基于STM32L4+BC28(全网通) NBIOT开发板原理图教程源码等开...  

[复制链接]
mmuuss586 发布时间:2020-1-31 18:21
基于STM32L4+BC28(全网通) NBIOT开发板原理图教程源码等开源分享
FCORE_BC28L4 NB-iot原理图、教程和源码
资料下载见附件,电脑登入

源码网盘链接:https://pan.baidu.com/s/18gkI9U1sVvauu_VzuUjauA
提取码:6yd2
1.jpg
2.png

FCORE-BC28L4.zip

下载

12.76 MB, 下载次数: 204

FFCORE_BC28L4教程.pdf

下载

3.36 MB, 下载次数: 95

Quectel_BC28_硬件设计手册_V1.1.pdf

下载

765.89 KB, 下载次数: 45

Quectel_BC35-G&BC28_AT_Commands_Manual_V1.2.pdf

下载

1.97 MB, 下载次数: 36

游名科技产品目录(2020-7-21).pdf

下载

1.05 MB, 下载次数: 21

收藏 6 评论70 发布时间:2020-1-31 18:21

举报

70个回答
mmuuss586 回答时间:2020-1-31 18:39:57
void _BC28_SET_(void);

添加完宏定义后再给自己添加的xxx.c文件添加对应函数如下:
******************************驻网测试函数***************************
void _BC28_SET_(void)
{
        _DEBUGE_FLEG=0;

        //关闭操作标志位;
//                _BC28_RESET_();

        printf("AT+NRB\r\n ");
        HAL_Delay(2000);
        _BC28_CMD_(CMD_ECHO,                             DCT_OK,300,4);
        _BC28_CMD_(CMD_CUFN_ASK,                                                DCT_CUFN_ASK_1,300,4);
        _BC28_CMD_(CMD_CUFN_SET,                                                        DCT_OK,300,4);
        _BC28_CMD_(CMD_EDRX_SET,                                                        DCT_OK,300,4);
        _BC28_CMD_(CMD_NCDP,                                                                        DCT_OK,1000,4);
        _BC28_CMD_(CMD_NCDP_ASK,                                                        DCT_OK,300,4);
        _BC28_CMD_(CMD_CGATT_SET,                                DCT_OK,300,2);
        _BC28_SIGNALASK_();
        if(_BC28_CMD_(CMD_CGATT_ASK,                                DCT_ADCGATT1,2000,4))
        {
                        HAL_GPIO_WritePin(STATE_LED_GPIO_Port, STATE_LED_Pin, GPIO_PIN_SET);
        }
        _BC28_CMD_(CMD_CGPADDR,                                                                DCT_OK,300,4);
        _BC28_CMD_(CMD_NNMI_SET,                                                        DCT_OK,300,4);
        _BC28_CMD_(CMD_NSMI_SET,                                                        DCT_OK,300,4);
        _BC28_CMD_(CMD_NNMI_ASK,                                                        DCT_MNMI_1,300,4);
        _BC28_CMD_(CMD_NSMI_ASK,                                                        DCT_NSMI_1,300,4);
        HAL_Delay(200);
        if(_BC28_CMD_1(CMD_send_TexT,                                        DCT_RCVE,600,3,4))
        {
                _BC28_SET_();
        }
        _BC28_CMD_(CMD_AT,                                                                                DCT_OK,300,20);
HAL_GPIO_WritePin(STATE_LED_GPIO_Port,STATE_LED_Pin,GPIO_PIN_RESET);       
_DEBUGE_FLEG=1;
}
        这个测试函数的基本操作首先使用发送AT+NRB对模块进行重启,重启的过程大概需要2s左右,所以这里需要做相应的延时,防止后面命令发出去后被忽略,重启后使用char _BC28_CMD_(char* pstr_CMD,char* pstr_DCT,int delay_us,int MAXTRY)发送对应命令进行设置,从上图中可以看到基本都是最这个函数的调用,而这个函数实际是将串口的发送函数进行封装了,里面添加了延时,发送次数等参数的设置,熟悉C编程的朋友看到这里也就明白了,我们                    实际也是使用printf函数进行命令的发送,这里涉及到对串口发送函数的重定向。发送函数的重定向可以使用直接用寄存器进行,memset()和strstr()函数需要包含string.h头文件,由于用到printf函数所以还需要xxx.h文件开头添加如下是代码:
xxx.c文件中添加如下代码
***************************xxx.c中命令发送函数**********************
char _BC28_CMD_1(char* pstr_CMD,char* pstr_DCT,int delay_us,int MAXTRY,int MAXWAT)
{
        char *strx;
        int i=0,j=0;
        memset(RX_BUFFER_lp, NULL, 200);
        strx=NULL;
        while(strx==NULL && j < MAXTRY)
        {
                memset(RX_BUFFER_lp, NULL, 50);
                HAL_Delay(50);
                printf("%s",pstr_CMD);
                j++;
                i=0;
                while(strx==NULL && i < MAXWAT)
                {
                        strx=strstr((const char*)RX_BUFFER_lp,(const char*)pstr_DCT);
                        HAL_Delay(delay_us);
                        i++;
                }
        }
        if(strx==NULL )
        {
                return 0;
        }
        else
        {
                return 1;
        }
}

char _BC28_CMD_(char* pstr_CMD,char* pstr_DCT,int delay_us,int MAXTRY)
{
        char *strx;
        int i=0;
        memset(RX_BUFFER_lp, NULL, 200);
        strx=NULL;
        HAL_Delay(50);
        while(strx==NULL && i < MAXTRY)
        {
                memset(RX_BUFFER_lp, NULL, 200);
                printf("%s",pstr_CMD);    //???lpuart????????
                HAL_Delay(delay_us);
                strx=strstr((const char*)RX_BUFFER_lp,(const char*)pstr_DCT);
                i++;
        }
        if(strx==NULL )
                {
                        return 0;
                }
                else
                        {
                                return 1;
                        }
}
char _BC28_SIGNALASK_(void)
{
        memset(RX_BUFFER_lp, NULL, 200);
        char CSQ=99;
        char *strx;
        int i=0,j=0;
        strx=NULL;
        HAL_Delay(50);
        while(strx==NULL && i < 30 )
        {
                printf("%s",CMD_CSQ);                                                                               
                HAL_Delay(200);
                strx=strstr((const char*)RX_BUFFER_lp,(const char*)DCT_ADCSQ);
                i++;
                if(strx)
                        {
                                CSQ=(strx[5]-0x30)*10+(strx[6]-0x30);
                                if(CSQ==99)
                                        {
                                                memset(RX_BUFFER_lp, NULL, 50);
                                                while(CSQ==99 && j < 300)
                                                {
                                                        printf("%s",CMD_CSQ);                                                                                ֵ
                                                        HAL_Delay(400);
                                                        strx=strstr((const char*)RX_BUFFER_lp,(const char*)DCT_ADCSQ);
                                                        CSQ=(strx[5]-0x30)*10+(strx[6]-0x30);
                                                        j++;
                                                }
                                        }
                                }
                        }
        if(CSQ==99)
        {
                return 0;
        }
        else
                {
                        return CSQ;
                }
        }
char _BC28_SIGNALASK_(void)
{
        memset(RX_BUFFER_lp, NULL, 200);
        char CSQ=99;
        char *strx;
        int i=0,j=0;
        strx=NULL;
        HAL_Delay(50);
        while(strx==NULL && i < 30 )
        {
                printf("%s",CMD_CSQ);                                                                                //查看获取CSQ值
                HAL_Delay(200);
                strx=strstr((const char*)RX_BUFFER_lp,(const char*)DCT_ADCSQ);
                i++;
                if(strx)
                        {
                                CSQ=(strx[5]-0x30)*10+(strx[6]-0x30);//信号转码
                                if(CSQ==99)
                                        {
                                                memset(RX_BUFFER_lp, NULL, 50);
                                                while(CSQ==99 && j < 300)
                                                {
                                                        printf("%s",CMD_CSQ);                                                                                //查看获取CSQ值
                                                        HAL_Delay(400);
                                                        strx=strstr((const char*)RX_BUFFER_lp,(const char*)DCT_ADCSQ);
                                                        CSQ=(strx[5]-0x30)*10+(strx[6]-0x30);//信号转码
                                                        j++;
                                                }
                                        }
                                }
                        }
        if(CSQ==99)
        {
                return 0;
        }
        else
                {
                        return CSQ;
                }
        }
mmuuss586 回答时间:2020-1-31 18:39:13
现在进行添加自己的代码,主要为板卡自动驻网等的检查函数;使用_BC28_CMD_()函数进行对BC28模块命令的发送,使用之前配置的LPUART1串口,驻网成功和数据的发送;在使用程序测试的时候建议发送ATE命令开启命令会回音模式,这样在测试过程中就能知道测试到那一步出问题了。首先在自己添加的xxx.h文件添加命令宏定义,如下:
******************************命令宏定义*****************************
#define CMD_AT_RESET                                                 "AT+NRB\r\n"
#define CMD_AT                                                                         "AT\r\n"
#define CMD_ATI                    "ATI\r\n"
#define CMD_CUFN_RESET                                 "AT+CFUN=0\r\n"
#define CMD_CUFN_ASK                                 "AT+CFUN?\r\n"
#define CMD_CUFN_SET                                 "AT+CFUN=1\r\n"
#define CMD_NTSETID                                         "AT+NTSETID=1,863703030570134\r\n"
#define CMD_NCDP                                                                "AT+NCDP=49.4.85.232,5683\r\n"//"AT+NCDP=117.60.157.137,5683\r\n"
#define CMD_NCDP_ASK                                                "AT+NCDP?\r\n"
#define CMD_CGPADDR                                                 "AT+CGPADDR\r\n"
#define CMD_SINGNALASK                                         "AT+NUESTATS\r\n"
#define CMD_ICID                                                                "AT+CIMI\r\n"
#define CMD_ECHO                "ATE\r\n"

#define CMD_DUTONET                                         "AT+NCONFIG=AUTOCONNECT,TRUE\r\n"
#define CMD_CGDCONT           "AT+CGDCONT=1,\"IP\",\"psm0.edrx0.ctnb\"\r\n"
#define CMD_CGDCONT_ASK                                 "AT+CGDCONT?\r\n"
#define CMD_NNMI_SET                                                "AT+NNMI=1\r\n"
#define CMD_NSMI_SET                                                 "AT+NSMI=1\r\n"
#define CMD_NNMI_ASK                                                 "AT+NNMI?\r\n"
#define CMD_NSMI_ASK                                                 "AT+NSMI?\r\n"

#define CMD_SEND_DAT                                                 "AT+NMGS=18,980012010001123456785A2608CE00A3E1FF\r\n"
#define CMD_NBAND_ASK                                         "AT+NBAND?\r\n"
#define CMD_NBAND_SET                                         "AT+NBAND=5\r\n"
#define CMD_CIMI                                                                 "AT+CIMI\r\n"
#define CMD_CGATT_SET                                         "AT+CGATT=1\r\n"
#define CMD_CGATT_RESET                                 "AT+CGATT=0\r\n"
#define CMD_CGATT_ASK                                         "AT+CGATT?\r\n"
#define CMD_CSQ                                                                 "AT+CSQ\r\n"
#define CMD_CEREG_ASK                                         "AT+CEREG?\r\n"
#define CMD_CEREG_SET                                         "AT+CEREG=1\r\n"
#define CMD_CSCON_ASK                                         "AT+CSCON?\r\n"
#define CMD_CSCON_SET                                         "AT+CSCON=1\r\n"
#define CMD_PSM_SET                                                 "AT+CPSMS=2\r\n"
#define CMD_EDRX_SET                                                 "AT+CEDRXS=3\r\n"
#define CMD_send_TexT                                         "AT+NMGS=21,9800170100010000000100000001FFFF000100FF47\r\n"

#define DCT_SIGNALASK                 "Signal power"
#define DCT_RCVE                                   "+NNMI:18,"
#define DCT_RST                                                                 "Neul"
#define DCT_OK                                                                         "OK"
#define DCT_MNMI_1                                                  "+NNMI:1"
#define DCT_NSMI_1                                             "+NSMI:1"
#define DCT_CUFN_ASK_1                                         "+CFUN:1"
#define DCT_CUFN_ASK_0                                         "+CFUN:0"
#define DCT_CGDCONT                                                 "+CONT:1"
#define DCT_BAND5                                                         "+NBAND:5"
#define DCT_ADCGATT1                                                 "+CGATT:1"
#define DCT_ADCGATT0                                                 "+CGATT:0"
#define DCT_ADCSQ                                                         "+CSQ"
#define DCT_CSCON1                                                         "+CSCON:0,1"
#define DCT_CSCON0                                                         "+CSCON:0,0"
#define DCT_NSONMI                                                         "+NSONMI:"
#define DCT_CEREG1                                                         "+CEREG:0,1"
#define DCT_CEREG0                                                         "+CEREG:0,1"
#define DCT_SOCKET_OFF                                        "AT+NSOCL=0\r\n"
#define DATA_IP                                                                 "AT+NSOST=0,120.24.184.124,8010,%c,%s\r\n",'8',"727394ACB8221234"
#define DATA_SOCKET                                                 "AT+NSOCR=DGRAM,17,3568,1\r\n"
#define DATA_IP                                                                 "AT+NSOST=0,120.24.184.124,8010,%c,%s\r\n",'8',"727394ACB8221234"
#define DATA_SD_IP                                                        "AT+NSOST=0,120.24.184.124,8010"
#define DATA_SD_APN                                                 "AT+CGDCONT=1,\042IP\042,\042HUAWEI.COM\042\r\n"
mmuuss586 回答时间:2020-1-31 18:43:59
其余返回值请查看命令手册这里不做详细复述。
到这里我们的板卡联网就成功了,接下来就是将设备连接到自己开发的云平台了,我们这里只对华为云平台进行介绍。最开始做的当然是注册和实名认证,如果是个人学习使用建议使用个人认证,送的发布信息等足够个人用户使用。在认证完后再进行下一步操作。
认证完后,在左上角产品中找到Iot物联网,点击后在右侧子菜单左上角的物联网平台(云)栏找到设备接入并点击,然后就能看到图14界面,点击立即使用;

图14
        进入后在左侧可以看到六个板块,这里点击最下面的开发中心;进入开发中心后,找到如图15板块,点击新建项目;

图15
        项目名称自己随便填,符合华为云命名规则就好,所属行业我们选NB-Iot,因为我们的板卡是只支持窄带宽(NB)的,这里还要说明的是选择SIM卡的时候要注意选用NB的专用卡(即窄带宽专用卡,可以去http://www.360wulian.net/上面免费申请试用),否则是识别只能读取到对应的SIM卡ID,但是不能联网而且没有信号,如图16;

图16
项目建好后点击项目右侧进入如图 然后我们就进入了华为OceanConnect开发中心了如图17;

图17
        然后点击左侧开发中心进行创建产品,可以看到如图18界面;点击自定义产品,后再弹窗口填写产品相关信息设备名字、型号、设备类型所属行业随便写应该是没问题的,主要是协议,协议按照模块支持进行选取就好,我这里选择的是CoAP,设备图片的话可以选个自己喜欢的图片传上去,嘿嘿;点击创建,这样你的产品就创建好了,如图19;

图18

图19
额,这两张图有点密集了,大家凑合这看看就好;接下来进入的界面是云端测试的相关事项了,首先是Profile的定义,如图20,点击右侧新建服务;

图20
        然后依次设置服务名称和对应属性和命令如图21所示(图被压缩的有点丑);

图21
        属性的设置就这样了,然后设置命令,第一个open命令我设置的值是只能发0和1,用于打开和关闭led,如图22

图22
        Profile的部分到这儿就结束了,翻到页头,点击图编解码插件开发,如图图23,点击新增消息在弹出窗口添加数据上报填写消息名后点击添加字段再弹出窗口填写对应信息;如图24。

图23
这里的话按照我们设备的属性,有两个状态,所以我们添加两个状态字段;然后添加的下发的命令,实际操作和上报差不多,就不演示了,最后需要做的就是部署插件了点击右上角蓝色的部署两个字就好了

图24
        设置完后点击右侧设备模型并将属性下的各个模块拖到左侧白色区域就好了,不拖过来的话是不能够上报和下发命令的哦,然后点击右侧上方的蓝色部署两个字等待部署好就行,如图25。

图25
        然后我们跳过第三步,直接进行第四步在线调试。在进入界面后点击屏幕中间的新增测试设备在弹出窗口可以看到可以添加虚拟设备和真实谁被两个选项,我们选择添加真实设备,设备名称随便写,设备标识我们填写通过AT+CGSN=1命令调出的编号,点击创建就好,如图26:

图26
        这样我们先回到云平台,左侧菜单栏点击对接信息,然后对模块进行联网,拷贝图26红色框内容;

图27
在串口通信助手发送AT+NCDP= <IP>,<端口>命令,返回OK后,点击左侧产品开发,在以下界面点击图28红色框区域(我们创建的设备)就可以看到我们的产品已经上线了;这样的情况就是我们的板卡已经练到云端了。如图28;

图28

图29
        进入图29后点击右侧红色框区域,便可以调试我们的产品了。进入调试后就需要把我们的设备连接到云平台,并进行数据的上报和下发。如图30为调试界面。

图30
现在我们要做的事是将板卡链接到云平台,这里需要上报信息的命令AT+NMGS=<长度>,<数据>以这个格式发送信息,返回OK后,在云平台右侧效力跟踪里就能看到跟踪信息并且在应用模拟器里看到我们上报的信息如图31和图32.
   
图31                                                                图32
这样我们的上报数据就正常了;如图33和图34为发送命令,图33红色发送数值为4,图34中收到的为04,这样下发命令就成功了。

图33

图34
mmuuss586 回答时间:2020-1-31 18:22:16
基于STM32L433CCUx的NB-Iot物联网开发板教程
基于超低功耗STM32L433系列单片机设计的3G物联网板卡FCORE_BC28L4-EVM的习教程,其物联网模块选用了移远的高性能、低功耗的BC28的NB-Iot模块。支持频段为700MHz,并支持IPv4、IPv6、TCP*、MQTT*等多种通信协议,支持点对点短信的收发及文本和PDU模式,可用于阿里云、天翼云等平台开发。
首先,我们先了解其硬件设计,
板卡大小为:84*52mm;
其引出了BC28的主串口和调试串口;
程序的烧录为STM32通用的SWD口(已引出);
电源指示灯和自定义LED指示灯和网络连接指示灯;
NB网络天线接口;
有MCU RESET按键和BC28 RESET按键供客户使用;
供电方式共有两种,分别为电池供电和USB供电;
支持标准SIM卡和芯片卡;
并将其余接口全部引出,用于给大家自行扩展学习。
详情如图1(SIM卡由于在背面就不进行展示了
2.png
mmuuss586 回答时间:2020-1-31 18:24:08
接下来我们看看软件部分:
       首先是相关环境的搭建:MDK 5的安装和对应MCU的keil固件包的安装,MDK 5网上很多,安装教程一大堆就不做复述;之后便是CubeMX的安装和对应MCU库包的安装;如果不添加对应AliOS或LiteOS系统的话,现在我们就可以对进物联网这个大板块进发了,这次教程暂时也是没有系统的;所以我们开始物联网之旅吧!
    首先,设计基本的程序,无论是自己移植MDK工程文件还是从CubeMX导出,我们只需要按照原理图将对应的串口配置好就可以了,如图2、图3;


1.png
2.png
mmuuss586 回答时间:2020-1-31 18:26:33
看了对应原理图,现在我们开始配置CubeMX(我这里用的是5.4版本):
1、开CubeMX,选择File,选择New Project如图4;
1.png
2、选择对应MCU(在左上角搜索框输入对应MCU型号即可),如图5;
2.png
图5

mmuuss586 回答时间:2020-1-31 18:27:54
3、MCU选好后双击对应MCU,进入系统配置界面,首先需要配置的是系统的时钟,依据原理图,板卡分别使用了外部8MHz高速时钟和32.768KHz的低速时钟,均为无源晶体;所以我们在System Core分类里面找到RCC,或直接在搜索框搜索RCC进行配置,详细配置如图6(这里不能选择BYPASS CLOCK SOURCE哦因为它是有源晶振的配置);
1.png
图6

mmuuss586 回答时间:2020-1-31 18:29:12
3、然后在RCC选项下面有个SYS,点击之后,Debug配置选Serial Wire,TimebaseSource配置中选TIM6,这样我们就可以用SWD调试;如图7;
1.png
图7

mmuuss586 回答时间:2020-1-31 18:30:39
3、接下来配置LPUART1,在Connectivity分类中选择LPUART1,模式选择Asynchronous即异步模式,Baud Rate按BC28支持的波特率填写,我们按其默认波特率9600填写,字节长度为设为8,DataDirection选择Receive and Transmit即收发模式,如图8;
1.png
图8

mmuuss586 回答时间:2020-1-31 18:32:01
3、然后我们在LPUART1 Configuration 中选择DMA Settings,在该选项框中点击Add,将DMA Request栏中选LPUART_RX,其余不用配置,如图9;
1.png
图9

mmuuss586 回答时间:2020-1-31 18:33:33
3、细心的朋友客能发现CubeMX上面的LPUART1对应的引脚和原理图上面是不一样,这里是PA2和PA3而原理图上面是PB10和PB11,所以这里需要我们手动去复用PB10,PB11,在CubeMX右侧的单片机图片中找到PB10,点击鼠标左键,找到LPUART1_RX选项鼠标左键点击该选项,这样就把LPUART1_RX复用到PB10,PB11重复上面步骤即可,如图10;
1.png
图10

mmuuss586 回答时间:2020-1-31 18:34:46
3、这里做个简单的测试LED指示,从原理图中找到LED4的引脚为PA4,我们把它配置为推挽输出,输出为LED非工作状态,即LED为熄灭状态,并命名为STATE_LED,如图11;
1.png

mmuuss586 回答时间:2020-1-31 18:35:46
3、现在到了配置时钟线的时候了,STM32L433最大支持80MHz配置系统时钟80MHz,选择外部时钟源,如图12;
1.png

mmuuss586 回答时间:2020-1-31 18:36:34
到这里程序的配置就完成了,接下来我们需要设置工程路径和工程名字;值得注意的是工程路径是不能包含中文路径的,点击左侧CodeGennerator在该栏中勾选右侧如下图红色区域:


1.png

mmuuss586 回答时间:2020-1-31 18:37:33
然后点击左侧Project在Toolchain(IDE)选择MDK-RAM,如图13;
1.png

mmuuss586 回答时间:2020-1-31 18:38:48
最后点击右上角GENERATE CODE,然后回弹出是否打开工程或打开对应文件夹,选择Open Project,这样我们就完成了基本配置代码的生成了,并且在keil5中打开了。
    用Keil打开代码工程后,首先进行编译,编译后发现是0 error、0 warning的话,说明你的代码已经好了,如果你选择的路径有中文字符,则工程就会出现很多错误,如图14。
1.png

12345下一页

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版