[N32G45x] [N32G45x] +阿里云上云测试

[复制链接]
1826|17
 楼主| wuxiubo 发表于 2022-4-30 00:35 | 显示全部楼层 |阅读模式
#申请原创#@21小跑堂
我们在测试完其内部外设之后,我们可以连接其外围设备进行其他外设功能测试,今天我就连接一款NB-IOT模块,进行阿里云的通信测试。我们使用安信可的ec616模块。模块通过AT指令进行操作,完成阿里云的接入也很简单,下面就一起看下吧。
图片1.jpg
图片2.jpg
模块通过串口1接入到开发板的串口2PA2,PA3)上。
之后工程模板我通过自己新建了一个。
图片3.png
风格上就是按照我自己的风格进行设置的,主要在Drives目录下添加上我们外部设备的驱动。
图片4.png
整体程序还是按照之前的LED灯的基础上修改的。因为其最基础,所以我们可以按照我们方式添加东西。
  1. #include "usart.h"

  2. #include "EC616S.h"





  3. #pragma import(__use_no_semihosting)            

  4. //标准库需要支持的函数

  5. struct __FILE

  6. {

  7.        int handle;

  8. };



  9. FILE __stdout;      

  10. //定义_sys_exit()以避免工作在半主机状态

  11. void _sys_exit(int x)

  12. {

  13.        x = x;

  14. }

  15. //重定义fputc函数

  16. //这个需要根据MCU和我们希望printf从哪个串口输出来确认 __WAIT_TODO__

  17. int fputc(int ch, FILE *f)

  18. {

  19.        //注意:USART_FLAG_TXE是检查发送缓冲区是否为空,这个要在发送前检查,检查这个提议提高发送效率,但是在休眠的时候可能导致最后一个字符丢失

  20.        //USART_FLAG_TC是检查发送完成标志,这个在发送后检查,这个不会出现睡眠丢失字符问题,但是效率低(发送过程中发送缓冲区已经为空了,可以接收下一个数据了,但是因为要等待发送完成,所以效率低)

  21.        //不要两个一起用,一起用效率最低

  22.       

  23.        //循环等待直到发送缓冲区为空(TX Empty)此时可以发送数据到缓冲区

  24.   while (USART_GetFlagStatus(USART1, USART_FLAG_TXDE) == RESET)

  25.   {}

  26.        USART_SendData(USART1, (uint8_t) ch);



  27.   /* 循环等待直到发送结束*/

  28.   while (USART_GetFlagStatus(USART1, USART_FLAG_TXC) == RESET){}



  29.        return ch;

  30. }



  31. void uart2_Init(u32 bound)//串口2  引脚为PA2(Tx)  PA3(Rx)

  32. {

  33.        USART_InitType USART_InitStructure;

  34.        GPIO_InitType GPIO_InitStructure;

  35.         NVIC_InitType NVIC_InitStructure;

  36.       

  37.        RCC_EnableAPB1PeriphClk(RCC_APB1_PERIPH_USART2, ENABLE);

  38.        RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOA, ENABLE);        //使能指定端口时钟

  39.       

  40.        GPIO_InitStructure.Pin = GPIO_PIN_2;

  41.        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  42.        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽输出

  43.        GPIO_InitPeripheral(GPIOA, &GPIO_InitStructure);      //初始化GPIO

  44.       

  45.        GPIO_InitStructure.Pin = GPIO_PIN_3;

  46.        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;

  47.        GPIO_InitPeripheral(GPIOA, &GPIO_InitStructure);      //初始化GPIO

  48.       

  49.        //Usart2 NVIC 配置

  50.        NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;

  51.        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;

  52.        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;     

  53.        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;        

  54.        NVIC_Init(&NVIC_InitStructure);



  55.       

  56.        //USART2配置

  57.        USART_InitStructure.BaudRate = bound;       //设置串口波特率

  58.        USART_InitStructure.WordLength = USART_WL_8B;   //字长为8

  59.        USART_InitStructure.StopBits = USART_STPB_1; //1个停止位

  60.        USART_InitStructure.Parity = USART_PE_NO;      //无奇偶校验

  61.        USART_InitStructure.HardwareFlowControl = USART_HFCTRL_NONE;     //无流控

  62.        USART_InitStructure.Mode = USART_MODE_RX | USART_MODE_TX;     //收发模式

  63.        USART_Init(USART2, &USART_InitStructure); //配置USART参数

  64.       

  65.        USART_ConfigInt(USART2, USART_INT_RXDNE|USART_INT_IDLEF, ENABLE);//配置了接收中断和总线空闲中断

  66.       

  67.        USART_Enable(USART2, ENABLE);                    //使能USART

  68. }



  69. void USART2_IRQHandler(void)

  70. {  

  71.     u8 ucCh;



  72.     if(USART_GetFlagStatus( USART2, USART_FLAG_RXDNE ) != RESET )

  73.     {

  74.         ucCh  = USART_ReceiveData( USART2 );

  75. //                     USART_SendData(USART3,ucCh);

  76.         if(EC616S_Fram_Record_Struct .InfBit .FramLength < ( RX_BUF_MAX_LEN - 1 ) )

  77.         {



  78.             EC616S_Fram_Record_Struct .Data_RX_BUF[ EC616S_Fram_Record_Struct .InfBit .FramLength ++ ]  = ucCh;  

  79.         }                     

  80.     }



  81.     if( USART_GetFlagStatus( USART2, USART_FLAG_IDLEF ) == SET )                                         //如果总线空闲

  82.     {

  83.         EC616S_Fram_Record_Struct .InfBit .FramFinishFlag = 1;



  84.         ucCh = USART_ReceiveData( USART2 );                                                              //由软件序列清除中断标志位(先读USART_SR,然后读USART_DR)

  85. //                          USART_SendData(USART3,ucCh);

  86.     }  



  87. }





  88. void uart1_Init(u32 bound)//串口1  引脚为PB10(Tx)  PB11(Rx)

  89. {



  90.     GPIO_InitType GPIO_InitStructure;

  91.     USART_InitType USART_InitStructure;

  92.     NVIC_InitType NVIC_InitStructure;



  93.     RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_USART1, ENABLE);

  94.     RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOA, ENABLE);



  95.     GPIO_InitStructure.Pin = GPIO_PIN_9; //PB10

  96.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  97.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

  98.     GPIO_InitPeripheral(GPIOA, &GPIO_InitStructure);





  99.     GPIO_InitStructure.Pin = GPIO_PIN_10;//PB11

  100.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入

  101.     GPIO_InitPeripheral(GPIOA, &GPIO_InitStructure);//初始化GPIO



  102.     //Usart3 NVIC 配置

  103.     NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;

  104.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;//抢占优先级0

  105.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;      //响应优先级0

  106.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;         //USART_IRQn通道使能

  107.     NVIC_Init(&NVIC_InitStructure); //初始化NVIC



  108.     //USART3 配置

  109.     USART_InitStructure.BaudRate = bound;//波特率

  110.     USART_InitStructure.WordLength = USART_WL_8B;//数据长度

  111.     USART_InitStructure.StopBits = USART_STPB_1;//停止位1

  112.     USART_InitStructure.Parity = USART_PE_NO;//校验位无

  113.     USART_InitStructure.HardwareFlowControl = USART_HFCTRL_NONE;//硬件流控制无

  114.     USART_InitStructure.Mode = USART_MODE_RX | USART_MODE_TX; //使能串口的接收和发送功能

  115.     USART_Init(USART1, &USART_InitStructure); //初始化串口



  116.     USART_ConfigInt(USART1, USART_INT_RXDNE|USART_INT_IDLEF, ENABLE);//配置了接收中断和总线空闲中断



  117.     USART_Enable(USART1, ENABLE);      //串口外设使能   

  118. }



  119. void USART1_IRQHandler( void )

  120. {  

  121.     u8 ucCh;



  122.     if(USART_GetFlagStatus( USART1, USART_FLAG_RXDNE ) != RESET )

  123.     {

  124.         ucCh  = USART_ReceiveData( USART1 );



  125.         if(EC616S_Fram_Record_Struct .InfBit .FramLength < ( RX_BUF_MAX_LEN - 1 ) )

  126.         {

  127.             //留最后一位做结束位

  128.             EC616S_Fram_Record_Struct .Data_RX_BUF[ EC616S_Fram_Record_Struct .InfBit .FramLength ++ ]  = ucCh;  

  129.         }                     

  130.     }



  131.     if( USART_GetFlagStatus( USART1, USART_FLAG_IDLEF ) == SET )                              //如果总线空闲

  132.     {

  133.         EC616S_Fram_Record_Struct .InfBit .FramFinishFlag = 1;

  134.         ucCh = USART_ReceiveData( USART1);                                                              //由软件序列清除中断标志位(先读USART_SR,然后读USART_DR)

  135.     }  



  136. }

这部分是串口代码,里面主要是放置了初始化串口设备的功能。以及把串口1作为printf输出进行了重定向,也就是其中的fputc()函数。之后就是两个串口初始化,串口1作为打印设备是应为其接在了我们仿真器口上,由仿真器提供虚拟串口可以直接在电脑上查看数据。
图片5.png
图片6.png
之后就是每个串口的中断服务函数编写,利用了串口的空闲中断接受不定长数据。
图片7.png
EC616S中就是我们模块的AT指令功能。需要对接阿里云的AT指令都列出来了。
图片8.png
之后就需要在阿里云物联网平台上创建我们需要的设备接入信息。
图片9.png
具体步骤如上。
图片10.png
我们选择需要的产品功能。联网方式是蜂窝(2g,3g,4g)选项。
之后创建设备。查看设备的信息。
图片11.png
如上,这些都是要在后面代码中使用的。
图片12.png
如图,到这里我们再看下底层代码。
图片13.png
我们需要修改AccessCloud.c文件,复制就好了。
图片14.png
之后就是测试数据了。
图片15.png
使用sprintf连接。完成数据上云工作。
此次还是模拟,下次我们接入真实的传感器,获得真实值上传。
图片16.png
图片17.png
修改成float型数据更真实。
my_demo.zip (1.09 MB, 下载次数: 46)



carpsnow 发表于 2022-5-3 10:34 | 显示全部楼层
安信可的模块可真多
laocuo1142 发表于 2022-5-6 10:23 来自手机 | 显示全部楼层
他家的模块确实多
linfelix 发表于 2022-5-16 09:52 | 显示全部楼层
可以使用rtt系统,集成了。  
jackcat 发表于 2022-5-16 10:05 | 显示全部楼层
那个密钥是怎么计算的?
benjaminka 发表于 2022-5-16 10:27 | 显示全部楼层
发送心跳的函数有吗  
sheflynn 发表于 2022-5-16 10:51 | 显示全部楼层
阿里云的通信怎么样  
 楼主| wuxiubo 发表于 2022-5-16 11:24 | 显示全部楼层
sheflynn 发表于 2022-5-16 10:51
阿里云的通信怎么样

使用模块基本就是发送AT指令即可了,比较简单
lihuami 发表于 2022-5-16 11:25 | 显示全部楼层
阿里云的展示效果很棒。  
youtome 发表于 2022-5-16 11:59 | 显示全部楼层
N32G45x功耗怎么样
pklong 发表于 2022-5-16 12:41 | 显示全部楼层
使用WiFi了吗  
 楼主| wuxiubo 发表于 2022-5-16 13:10 | 显示全部楼层

NB-IOT模块,不是WIFI
cehuafan 发表于 2022-5-16 13:22 | 显示全部楼层
阿里云的功能真是不错呢。
jkl21 发表于 2022-7-8 10:23 | 显示全部楼层
通信的速度怎样
sdlls 发表于 2022-7-8 15:37 | 显示全部楼层
使用wifi的效果怎么样
isseed 发表于 2022-7-8 16:42 | 显示全部楼层
学习一下。  
everyrobin 发表于 2022-7-9 14:29 | 显示全部楼层
阿里云如何配置的呢  
dzfansman 发表于 2022-7-9 16:31 | 显示全部楼层
现在开发上云都很简单了,有固件可以使用。  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

67

主题

259

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部