[应用相关] 基于STM32F103+涂鸦三明治的宠物自动喂食器

[复制链接]
3388|73
 楼主| 高级安全大使 发表于 2022-2-28 22:50 | 显示全部楼层
先在串口的.h文件中进行宏定义。然后开始USART1的初始化,串口接收中断的初始化。
  1. /**
  2.   * [url=home.php?mod=space&uid=247401]@brief[/url]  配置嵌套向量中断控制器NVIC
  3.   * @param  无
  4.   * @retval 无
  5.   */
  6. static void NVIC_Configuration(void)
  7. {
  8.   NVIC_InitTypeDef NVIC_InitStructure;
  9.   
  10.   /* 嵌套向量中断控制器组选择 */
  11.   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  12.   
  13.   /* 配置USART为中断源 */
  14.   NVIC_InitStructure.NVIC_IRQChannel = DEBUG_USART_IRQ;
  15.   /* 抢断优先级*/
  16.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  17.   /* 子优先级 */
  18.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  19.   /* 使能中断 */
  20.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  21.   /* 初始化配置NVIC */
  22.   NVIC_Init(&NVIC_InitStructure);
  23. }

  24. /**
  25.   * [url=home.php?mod=space&uid=247401]@brief[/url]  USART GPIO 配置,工作参数配置
  26.   * @param  无
  27.   * @retval 无
  28.   */
  29. void USART_Config(void)
  30. {
  31.         GPIO_InitTypeDef GPIO_InitStructure;
  32.         USART_InitTypeDef USART_InitStructure;

  33.         // 打开串口GPIO的时钟
  34.         DEBUG_USART_GPIO_APBxClkCmd(DEBUG_USART_GPIO_CLK, ENABLE);
  35.         
  36.         // 打开串口外设的时钟
  37.         DEBUG_USART_APBxClkCmd(DEBUG_USART_CLK, ENABLE);

  38.         // 将USART Tx的GPIO配置为推挽复用模式
  39.         GPIO_InitStructure.GPIO_Pin = DEBUG_USART_TX_GPIO_PIN;
  40.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  41.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  42.         GPIO_Init(DEBUG_USART_TX_GPIO_PORT, &GPIO_InitStructure);

  43.   // 将USART Rx的GPIO配置为浮空输入模式
  44.         GPIO_InitStructure.GPIO_Pin = DEBUG_USART_RX_GPIO_PIN;
  45.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  46.         GPIO_Init(DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStructure);
  47.         
  48.         // 配置串口的工作参数
  49.         // 配置波特率
  50.         USART_InitStructure.USART_BaudRate = DEBUG_USART_BAUDRATE;
  51.         // 配置 针数据字长
  52.         USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  53.         // 配置停止位
  54.         USART_InitStructure.USART_StopBits = USART_StopBits_1;
  55.         // 配置校验位
  56.         USART_InitStructure.USART_Parity = USART_Parity_No ;
  57.         // 配置硬件流控制
  58.         USART_InitStructure.USART_HardwareFlowControl =
  59.         USART_HardwareFlowControl_None;
  60.         // 配置工作模式,收发一起
  61.         USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  62.         // 完成串口的初始化配置
  63.         USART_Init(DEBUG_USARTx, &USART_InitStructure);
  64.         
  65.         // 串口中断优先级配置
  66.         NVIC_Configuration();
  67.         
  68.         // 使能串口接收中断
  69.         USART_ITConfig(DEBUG_USARTx, USART_IT_RXNE, ENABLE);        
  70.         
  71.         // 使能串口
  72.         USART_Cmd(DEBUG_USARTx, ENABLE);            
  73. }

 楼主| 高级安全大使 发表于 2022-2-28 22:50 | 显示全部楼层
先在串口的.h文件中进行宏定义。然后开始USART1的初始化,串口接收中断的初始化。
  1. /**
  2.   * [url=home.php?mod=space&uid=247401]@brief[/url]  配置嵌套向量中断控制器NVIC
  3.   * @param  无
  4.   * @retval 无
  5.   */
  6. static void NVIC_Configuration(void)
  7. {
  8.   NVIC_InitTypeDef NVIC_InitStructure;
  9.   
  10.   /* 嵌套向量中断控制器组选择 */
  11.   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  12.   
  13.   /* 配置USART为中断源 */
  14.   NVIC_InitStructure.NVIC_IRQChannel = DEBUG_USART_IRQ;
  15.   /* 抢断优先级*/
  16.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  17.   /* 子优先级 */
  18.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  19.   /* 使能中断 */
  20.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  21.   /* 初始化配置NVIC */
  22.   NVIC_Init(&NVIC_InitStructure);
  23. }

  24. /**
  25.   * [url=home.php?mod=space&uid=247401]@brief[/url]  USART GPIO 配置,工作参数配置
  26.   * @param  无
  27.   * @retval 无
  28.   */
  29. void USART_Config(void)
  30. {
  31.         GPIO_InitTypeDef GPIO_InitStructure;
  32.         USART_InitTypeDef USART_InitStructure;

  33.         // 打开串口GPIO的时钟
  34.         DEBUG_USART_GPIO_APBxClkCmd(DEBUG_USART_GPIO_CLK, ENABLE);
  35.         
  36.         // 打开串口外设的时钟
  37.         DEBUG_USART_APBxClkCmd(DEBUG_USART_CLK, ENABLE);

  38.         // 将USART Tx的GPIO配置为推挽复用模式
  39.         GPIO_InitStructure.GPIO_Pin = DEBUG_USART_TX_GPIO_PIN;
  40.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  41.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  42.         GPIO_Init(DEBUG_USART_TX_GPIO_PORT, &GPIO_InitStructure);

  43.   // 将USART Rx的GPIO配置为浮空输入模式
  44.         GPIO_InitStructure.GPIO_Pin = DEBUG_USART_RX_GPIO_PIN;
  45.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  46.         GPIO_Init(DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStructure);
  47.         
  48.         // 配置串口的工作参数
  49.         // 配置波特率
  50.         USART_InitStructure.USART_BaudRate = DEBUG_USART_BAUDRATE;
  51.         // 配置 针数据字长
  52.         USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  53.         // 配置停止位
  54.         USART_InitStructure.USART_StopBits = USART_StopBits_1;
  55.         // 配置校验位
  56.         USART_InitStructure.USART_Parity = USART_Parity_No ;
  57.         // 配置硬件流控制
  58.         USART_InitStructure.USART_HardwareFlowControl =
  59.         USART_HardwareFlowControl_None;
  60.         // 配置工作模式,收发一起
  61.         USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  62.         // 完成串口的初始化配置
  63.         USART_Init(DEBUG_USARTx, &USART_InitStructure);
  64.         
  65.         // 串口中断优先级配置
  66.         NVIC_Configuration();
  67.         
  68.         // 使能串口接收中断
  69.         USART_ITConfig(DEBUG_USARTx, USART_IT_RXNE, ENABLE);        
  70.         
  71.         // 使能串口
  72.         USART_Cmd(DEBUG_USARTx, ENABLE);            
  73. }

 楼主| 高级安全大使 发表于 2022-2-28 22:52 | 显示全部楼层
写一个发送单字节函数,此函数必须,用于向WiFi模组发送数据。
  1. void Usart_SendByte( USART_TypeDef * pUSARTx, uint8_t ch)
  2. {
  3.         /* 发送一个字节数据到USART */
  4.         USART_SendData(pUSARTx,ch);
  5.                
  6.         /* 等待发送数据寄存器为空 */
  7.         while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);        
  8. }
 楼主| 高级安全大使 发表于 2022-2-28 22:52 | 显示全部楼层
(2)移植SDK
基础工程搭建完成后将SDK放入工程,下图是SDK的结构目录:
86761621ce1bb16bc7.png
 楼主| 高级安全大使 发表于 2022-2-28 22:53 | 显示全部楼层
添加进SDK后编译会疯狂报错,因为下载的SDK中有很多未屏蔽的注释,都是很重要的注释,可能怕我们找不到关键点吧。
 楼主| 高级安全大使 发表于 2022-2-28 22:53 | 显示全部楼层
 楼主| 高级安全大使 发表于 2022-2-28 22:59 | 显示全部楼层
确认 protocol.h 宏定义
1.定义 PID。PRODUCT_KEY 为产品 PID 宏定义。PID 即产品 ID, 为每个产品的唯一标识,可在 IoT 平台的产品详情页面获取。
 楼主| 高级安全大使 发表于 2022-2-28 23:00 | 显示全部楼层
 楼主| 高级安全大使 发表于 2022-2-28 23:01 | 显示全部楼层
  1. #define PRODUCT_KEY "gktqnpciyofn****"    //开发平台创建产品后生成的16位字符产品唯一标识
 楼主| 高级安全大使 发表于 2022-2-28 23:02 | 显示全部楼层
2.定义 Wi-Fi 模块工作模式。CONFIG_MODE 为配网方式,支持默认模式(AP 和 SmartConfig 互相切换)、安全模式、防误触模式。建议选择防误触模式。
3.定义模块工作方式(必选)
如果配网按键和 LED 接在 MCU 端,即选择模块和 MCU 配合处理工作模式(常用),保持 WIFI_CONTROL_SELF_MODE 宏定义处于被注释状态。

  1. //#define         WIFI_CONTROL_SELF_MODE                       //Wi-Fi 自处理按键及LED指示灯,如为MCU外接按键/LED指示灯请关闭该宏
 楼主| 高级安全大使 发表于 2022-2-28 23:03 | 显示全部楼层
如果配网指示灯和按键是接在 Wi-Fi 模块上的,即选择模块自处理工作模式,开启 WIFI_CONTROL_SELF_MODE 宏定义,然后根据实际的硬件连接,将指示灯和按键所连接的 GPIO 脚位填入下面两个宏定义。
  1. #ifdef          WIFI_CONTROL_SELF_MODE                        //模块自处理
  2.     #define     WF_STATE_KEY            14                    //Wi-Fi 模块状态指示按键,请根据实际 GPIO 管脚设置
  3.     #define     WF_RESERT_KEY           0                     //Wi-Fi 模块重置按键,请根据实际 GPIO 管脚设置
  4. #endif
 楼主| 高级安全大使 发表于 2022-2-28 23:05 | 显示全部楼层
这三项是很重要的配置,因为篇幅原因,其他配置不再此赘述,代码中均有注释。可自行开放。
 楼主| 高级安全大使 发表于 2022-2-28 23:06 | 显示全部楼层
移植 protocol.c 文件及函数调用
1.将wifi.h 文件保存至存放 Wi-Fi 相关文件的文件夹中,例如 main.c文件夹。而我是创建了一个WiFi文件夹,WiFi.c只是引用了wifi.h这个头文件,其他为空。

2.在 MCU 串口及其他外设初始化后调用 mcu_api.c 文件中的 wifi_protocol_init() 函数。

3.将 MCU 串口单字节发送函数填入 protocol.c 文件中 uart_transmit_output 函数内,并删除 #error。此步骤在上文已介绍。不赘述。

4.在串口接收中断服务函数里面调用 mcu_api.c 文件内的 uart_receive_input 函数,并将接收到的字符作为参数传入。示例如下
 楼主| 高级安全大使 发表于 2022-2-28 23:09 | 显示全部楼层
  1. // 串口中断服务函数
  2. void DEBUG_USART_IRQHandler(void)
  3. {
  4.   uint8_t ucTemp;
  5.         if(USART_GetITStatus(DEBUG_USARTx,USART_IT_RXNE)!=RESET)
  6.         {               
  7.                 ucTemp = USART_ReceiveData(DEBUG_USARTx);
  8.                 uart_receive_input(ucTemp);   
  9.         }        
  10.         USART_ClearFlag(USART1,USART_FLAG_RXNE);        
  11. }

 楼主| 高级安全大使 发表于 2022-2-28 23:10 | 显示全部楼层
5.在主函数的while(1) 循环后调用 mcu_api.c 文件内的 wifi_uart_service() 函数。该函数用于wifi串口数据处理服务,同时维持心跳。此函数无需任何判断条件,直接调用。在使用该函数时最好不要关闭总中断或串口中断,防止数据丢失,如必要,尽可能短的时间关闭。
50480621ce5cb9134d.png
 楼主| 高级安全大使 发表于 2022-2-28 23:11 | 显示全部楼层
至此,SDK移植便已完成,此时可将单片机的串口接到电脑进行调试。此时调试助手选择模组模拟。

为了便于观察,我们在protocol.c文件中将all_data_update() 函数中的所有DP点上传函数打开,默认为0。

77244621ce612b0c5b.png
 楼主| 高级安全大使 发表于 2022-2-28 23:11 | 显示全部楼层
此时MCU接到调试助手,打开串口,添加DP点文件,启动调试,便会看到所有DP点的上报。
 楼主| 高级安全大使 发表于 2022-2-28 23:13 | 显示全部楼层
 楼主| 高级安全大使 发表于 2022-2-28 23:13 | 显示全部楼层
进入DP CMD添加一个开启小夜灯的指令并下发,便可看到模组成功接收,说明MCU的SDK移植成功。
10375621ce6af9ad11.png
 楼主| 高级安全大使 发表于 2022-2-28 23:15 | 显示全部楼层
到此为止,一个完整的自动喂食器的MCU工程便已搭建完成,后续我们只需要解析wifi模组下发的消息,并进行相应的外设控制便可。当然,每次MCU完成动作后也要上传数据给模组。完成服务器和手机APP端的数据刷新。


您需要登录后才可以回帖 登录 | 注册

本版积分规则

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