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

2020-02-29 10:46发布

基于STM32L4+BC28(全网通) NBIOT开发板原理图教程源码等开源分享
FCORE_BC28L4 NB-iot原理图、教程和源码资料下载见附件,电脑登入
源码 {MOD}链接:https://pan.baidu.com/s/18gkI9U1sVvauu_VzuUjauA
提取码:6yd2
1.jpg 2.png
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
19条回答
mmuuss586
1楼-- · 2020-03-02 13:07
最后点击右上角GENERATE CODE,然后回弹出是否打开工程或打开对应文件夹,选择Open Project,这样我们就完成了基本配置代码的生成了,并且在keil5中打开了。    用Keil打开代码工程后,首先进行编译,编译后发现是0 error、0 warning的话,说明你的代码已经好了,如果你选择的路径有中文字符,则工程就会出现很多错误,如图14。 1.png
mmuuss586
2楼-- · 2020-03-02 17:26
现在进行添加自己的代码,主要为板卡自动驻网等的检查函数;使用_BC28_CMD_()函数进行对BC28模块命令的发送,使用之前配置的LPUART1串口,驻网成功和数据的发送;在使用程序测试的时候建议发送ATE命令开启命令会回音模式,这样在测试过程中就能知道测试到那一步出问题了。首先在自己添加的xxx.h文件添加命令宏定义,如下:
******************************命令宏定义*****************************
#define CMD_AT_RESET                                                 "AT+NRB "
#define CMD_AT                                                                         "AT "
#define CMD_ATI                    "ATI "
#define CMD_CUFN_RESET                                 "AT+CFUN=0 "
#define CMD_CUFN_ASK                                 "AT+CFUN? "
#define CMD_CUFN_SET                                 "AT+CFUN=1 "
#define CMD_NTSETID                                         "AT+NTSETID=1,863703030570134 "
#define CMD_NCDP                                                                "AT+NCDP=49.4.85.232,5683 "//"AT+NCDP=117.60.157.137,5683 "
#define CMD_NCDP_ASK                                                "AT+NCDP? "
#define CMD_CGPADDR                                                 "AT+CGPADDR "
#define CMD_SINGNALASK                                         "AT+NUESTATS "
#define CMD_ICID                                                                "AT+CIMI "
#define CMD_ECHO                "ATE "

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

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

#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 "
#define DATA_IP                                                                 "AT+NSOST=0,120.24.184.124,8010,%c,%s ",'8',"727394ACB8221234"
#define DATA_SOCKET                                                 "AT+NSOCR=DGRAM,17,3568,1 "
#define DATA_IP                                                                 "AT+NSOST=0,120.24.184.124,8010,%c,%s ",'8',"727394ACB8221234"
#define DATA_SD_IP                                                        "AT+NSOST=0,120.24.184.124,8010"
#define DATA_SD_APN                                                 "AT+CGDCONT=1,42IP42,42HUAWEI.COM42 "
mmuuss586
3楼-- · 2020-03-02 22:23
void _BC28_SET_(void);

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

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

        printf("AT+NRB ");
        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
4楼-- · 2020-03-03 03:25
***********************xxx.c中需添加的定义************************
extern uint8_t                         RX_BUFFER_lp[200];
extern uint8_t                         RX_Conter_lp;
extern __IO char _DEBUGE_FLEG;

在usart.c中添加如下代码
*****************************串口重定向函数**************************
#include "stdio.h"
int fputc(int ch,FILE *f)
{
        while((LPUART1->ISR&0x40)==0);
        LPUART1->TDR=ch;
        return ch;
}
mmuuss586
5楼-- · 2020-03-03 04:49
 精彩回答 2  元偷偷看……
mmuuss586
6楼-- · 2020-03-03 05:33
xxx.h文件开头添加如下代码
*************************需要包含的头文件代码************************
#include "usart.h"
#include "main.h"
#include "string.h"
这里只是对函数示例,因为这个很常用,基本都清楚,但是考虑到初学者可能忘记这一步所以贴这里。

一周热门 更多>