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

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

[复制链接]
mmuuss586 发布时间:2020-1-31 18:21
阅读主题, 点击返回1楼
收藏 6 评论68 发布时间:2020-1-31 18:21
68个回答
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

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: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:40:18
***********************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 回答时间:2020-1-31 18:40:36
在usart.h中添加如下代码
*****************************宏定义变量******************************
#define Rcive_size_lp 200
#define Rcive_size_1 10
mmuuss586 回答时间:2020-1-31 18:40:56
xxx.h文件开头添加如下代码
*************************需要包含的头文件代码************************
#include "usart.h"
#include "main.h"
#include "string.h"
这里只是对函数示例,因为这个很常用,基本都清楚,但是考虑到初学者可能忘记这一步所以贴这里。
mmuuss586 回答时间:2020-1-31 18:41:18
现在测试的程序已经完全OK了,但是还差了很重要的一步,就是我们串口通信的服务函数还没有写,在stm32lxx_it.c文件的最后面添加两个串口的中断服务函数,添加完下面函数后,单片机就能及时收到对应信息并作相应处理了。
stm32lxx_it.c文件中添加如下是代码
*************************外部宏定义重申明***************************
extern UART_HandleTypeDef hlpuart1;
extern uint8_t                         RX_Conter_1;

extern uint8_t                         RX_BUFFER_LPTMP[200];
extern uint8_t                         RX_BUFFER_lp[200];
extern uint8_t                         RX_Conter_lp;

extern uint8_t                         RX_BUFFER_1TMP[10];
extern uint8_t                         RX_BUFFER_1[10];
extern uint8_t                         RX_Conter_1;
***********************LPUSAR中断服务函数***************************
void LPUART1_IRQHandler(void)
{
  /* USER CODE BEGIN LPUART1_IRQn 0 */
        char *xstrx=NULL;
  uint32_t tmp_flag = 0;
  uint32_t temp;
  /* USER CODE END LPUART1_IRQn 0 */
  HAL_UART_IRQHandler(&hlpuart1);
  /* USER CODE BEGIN LPUART1_IRQn 1 */
  tmp_flag = __HAL_UART_GET_FLAG(&hlpuart1,UART_FLAG_IDLE);
    if((tmp_flag != RESET))
     {   
      __HAL_UART_CLEAR_IDLEFLAG(&hlpuart1);
      HAL_UART_DMAStop(&hlpuart1);
      temp  = hdma_lpuart_rx.Instance->CNDTR;
      RX_Conter_lp =200- temp;
      }
  HAL_UART_Receive_DMA(&hlpuart1, RX_BUFFER_lp,200);
  }

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

相似分享

官网相关资源

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