打印
[应用相关]

基于STM32F103+涂鸦三明治的宠物自动喂食器

[复制链接]
手机看帖
扫描二维码
随时随地手机跟帖
21
先在串口的.h文件中进行宏定义。然后开始USART1的初始化,串口接收中断的初始化。
 /**
  * [url=home.php?mod=space&uid=247401]@brief[/url]  配置嵌套向量中断控制器NVIC
  * @param  无
  * @retval 无
  */
static void NVIC_Configuration(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;
  
  /* 嵌套向量中断控制器组选择 */
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  
  /* 配置USART为中断源 */
  NVIC_InitStructure.NVIC_IRQChannel = DEBUG_USART_IRQ;
  /* 抢断优先级*/
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  /* 子优先级 */
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  /* 使能中断 */
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  /* 初始化配置NVIC */
  NVIC_Init(&NVIC_InitStructure);
}

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

        // 打开串口GPIO的时钟
        DEBUG_USART_GPIO_APBxClkCmd(DEBUG_USART_GPIO_CLK, ENABLE);
        
        // 打开串口外设的时钟
        DEBUG_USART_APBxClkCmd(DEBUG_USART_CLK, ENABLE);

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

  // 将USART Rx的GPIO配置为浮空输入模式
        GPIO_InitStructure.GPIO_Pin = DEBUG_USART_RX_GPIO_PIN;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_Init(DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStructure);
        
        // 配置串口的工作参数
        // 配置波特率
        USART_InitStructure.USART_BaudRate = DEBUG_USART_BAUDRATE;
        // 配置 针数据字长
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;
        // 配置停止位
        USART_InitStructure.USART_StopBits = USART_StopBits_1;
        // 配置校验位
        USART_InitStructure.USART_Parity = USART_Parity_No ;
        // 配置硬件流控制
        USART_InitStructure.USART_HardwareFlowControl =
        USART_HardwareFlowControl_None;
        // 配置工作模式,收发一起
        USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
        // 完成串口的初始化配置
        USART_Init(DEBUG_USARTx, &USART_InitStructure);
        
        // 串口中断优先级配置
        NVIC_Configuration();
        
        // 使能串口接收中断
        USART_ITConfig(DEBUG_USARTx, USART_IT_RXNE, ENABLE);        
        
        // 使能串口
        USART_Cmd(DEBUG_USARTx, ENABLE);            
}

使用特权

评论回复
22
高级安全大使|  楼主 | 2022-2-28 22:50 | 只看该作者
先在串口的.h文件中进行宏定义。然后开始USART1的初始化,串口接收中断的初始化。
 /**
  * [url=home.php?mod=space&uid=247401]@brief[/url]  配置嵌套向量中断控制器NVIC
  * @param  无
  * @retval 无
  */
static void NVIC_Configuration(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;
  
  /* 嵌套向量中断控制器组选择 */
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  
  /* 配置USART为中断源 */
  NVIC_InitStructure.NVIC_IRQChannel = DEBUG_USART_IRQ;
  /* 抢断优先级*/
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  /* 子优先级 */
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  /* 使能中断 */
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  /* 初始化配置NVIC */
  NVIC_Init(&NVIC_InitStructure);
}

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

        // 打开串口GPIO的时钟
        DEBUG_USART_GPIO_APBxClkCmd(DEBUG_USART_GPIO_CLK, ENABLE);
        
        // 打开串口外设的时钟
        DEBUG_USART_APBxClkCmd(DEBUG_USART_CLK, ENABLE);

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

  // 将USART Rx的GPIO配置为浮空输入模式
        GPIO_InitStructure.GPIO_Pin = DEBUG_USART_RX_GPIO_PIN;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_Init(DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStructure);
        
        // 配置串口的工作参数
        // 配置波特率
        USART_InitStructure.USART_BaudRate = DEBUG_USART_BAUDRATE;
        // 配置 针数据字长
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;
        // 配置停止位
        USART_InitStructure.USART_StopBits = USART_StopBits_1;
        // 配置校验位
        USART_InitStructure.USART_Parity = USART_Parity_No ;
        // 配置硬件流控制
        USART_InitStructure.USART_HardwareFlowControl =
        USART_HardwareFlowControl_None;
        // 配置工作模式,收发一起
        USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
        // 完成串口的初始化配置
        USART_Init(DEBUG_USARTx, &USART_InitStructure);
        
        // 串口中断优先级配置
        NVIC_Configuration();
        
        // 使能串口接收中断
        USART_ITConfig(DEBUG_USARTx, USART_IT_RXNE, ENABLE);        
        
        // 使能串口
        USART_Cmd(DEBUG_USARTx, ENABLE);            
}

使用特权

评论回复
23
高级安全大使|  楼主 | 2022-2-28 22:52 | 只看该作者
写一个发送单字节函数,此函数必须,用于向WiFi模组发送数据。
void Usart_SendByte( USART_TypeDef * pUSARTx, uint8_t ch)
{
        /* 发送一个字节数据到USART */
        USART_SendData(pUSARTx,ch);
               
        /* 等待发送数据寄存器为空 */
        while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);        
}

使用特权

评论回复
24
高级安全大使|  楼主 | 2022-2-28 22:52 | 只看该作者
(2)移植SDK
基础工程搭建完成后将SDK放入工程,下图是SDK的结构目录:

使用特权

评论回复
25
高级安全大使|  楼主 | 2022-2-28 22:53 | 只看该作者
添加进SDK后编译会疯狂报错,因为下载的SDK中有很多未屏蔽的注释,都是很重要的注释,可能怕我们找不到关键点吧。

使用特权

评论回复
26
高级安全大使|  楼主 | 2022-2-28 22:53 | 只看该作者

使用特权

评论回复
27
高级安全大使|  楼主 | 2022-2-28 22:59 | 只看该作者
确认 protocol.h 宏定义
1.定义 PID。PRODUCT_KEY 为产品 PID 宏定义。PID 即产品 ID, 为每个产品的唯一标识,可在 IoT 平台的产品详情页面获取。

使用特权

评论回复
28
高级安全大使|  楼主 | 2022-2-28 23:00 | 只看该作者

使用特权

评论回复
29
高级安全大使|  楼主 | 2022-2-28 23:01 | 只看该作者
#define PRODUCT_KEY "gktqnpciyofn****"    //开发平台创建产品后生成的16位字符产品唯一标识

使用特权

评论回复
30
高级安全大使|  楼主 | 2022-2-28 23:02 | 只看该作者
2.定义 Wi-Fi 模块工作模式。CONFIG_MODE 为配网方式,支持默认模式(AP 和 SmartConfig 互相切换)、安全模式、防误触模式。建议选择防误触模式。
3.定义模块工作方式(必选)
如果配网按键和 LED 接在 MCU 端,即选择模块和 MCU 配合处理工作模式(常用),保持 WIFI_CONTROL_SELF_MODE 宏定义处于被注释状态。

//#define         WIFI_CONTROL_SELF_MODE                       //Wi-Fi 自处理按键及LED指示灯,如为MCU外接按键/LED指示灯请关闭该宏

使用特权

评论回复
31
高级安全大使|  楼主 | 2022-2-28 23:03 | 只看该作者
如果配网指示灯和按键是接在 Wi-Fi 模块上的,即选择模块自处理工作模式,开启 WIFI_CONTROL_SELF_MODE 宏定义,然后根据实际的硬件连接,将指示灯和按键所连接的 GPIO 脚位填入下面两个宏定义。
#ifdef          WIFI_CONTROL_SELF_MODE                        //模块自处理
    #define     WF_STATE_KEY            14                    //Wi-Fi 模块状态指示按键,请根据实际 GPIO 管脚设置
    #define     WF_RESERT_KEY           0                     //Wi-Fi 模块重置按键,请根据实际 GPIO 管脚设置
#endif

使用特权

评论回复
32
高级安全大使|  楼主 | 2022-2-28 23:05 | 只看该作者
这三项是很重要的配置,因为篇幅原因,其他配置不再此赘述,代码中均有注释。可自行开放。

使用特权

评论回复
33
高级安全大使|  楼主 | 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 函数,并将接收到的字符作为参数传入。示例如下

使用特权

评论回复
34
高级安全大使|  楼主 | 2022-2-28 23:09 | 只看该作者
// 串口中断服务函数
void DEBUG_USART_IRQHandler(void)
{
  uint8_t ucTemp;
        if(USART_GetITStatus(DEBUG_USARTx,USART_IT_RXNE)!=RESET)
        {               
                ucTemp = USART_ReceiveData(DEBUG_USARTx);
                uart_receive_input(ucTemp);   
        }        
        USART_ClearFlag(USART1,USART_FLAG_RXNE);        
}

使用特权

评论回复
35
高级安全大使|  楼主 | 2022-2-28 23:10 | 只看该作者
5.在主函数的while(1) 循环后调用 mcu_api.c 文件内的 wifi_uart_service() 函数。该函数用于wifi串口数据处理服务,同时维持心跳。此函数无需任何判断条件,直接调用。在使用该函数时最好不要关闭总中断或串口中断,防止数据丢失,如必要,尽可能短的时间关闭。

使用特权

评论回复
36
高级安全大使|  楼主 | 2022-2-28 23:11 | 只看该作者
至此,SDK移植便已完成,此时可将单片机的串口接到电脑进行调试。此时调试助手选择模组模拟。

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

使用特权

评论回复
37
高级安全大使|  楼主 | 2022-2-28 23:11 | 只看该作者
此时MCU接到调试助手,打开串口,添加DP点文件,启动调试,便会看到所有DP点的上报。

使用特权

评论回复
38
高级安全大使|  楼主 | 2022-2-28 23:13 | 只看该作者

使用特权

评论回复
39
高级安全大使|  楼主 | 2022-2-28 23:13 | 只看该作者
进入DP CMD添加一个开启小夜灯的指令并下发,便可看到模组成功接收,说明MCU的SDK移植成功。

使用特权

评论回复
40
高级安全大使|  楼主 | 2022-2-28 23:15 | 只看该作者
到此为止,一个完整的自动喂食器的MCU工程便已搭建完成,后续我们只需要解析wifi模组下发的消息,并进行相应的外设控制便可。当然,每次MCU完成动作后也要上传数据给模组。完成服务器和手机APP端的数据刷新。


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则