使用STM32F103C8T6作为主控,价格相对便宜,网上相关资料较多,之前使用过正点原子的战舰开发板,对STM32f1系列编程较熟悉。
通过物联网模块EM3080发送控制指令控制继电器开关,同时获取温湿度传感器值在app显示。
板载OLED显示屏,同步显示温湿度数据及操作过程中的相关提示信息。
温湿度传感器型号:DHT11,一个模块即可获取温度和湿度数据,减少元件使用量和CPU资源使用
其他部分和立创的源方案基本相同
调试过程:
**1.**焊接部分
首先焊接单片机最小系统,及板子的电源部分,以便测试程序是否可以正常下载。
遇到问题:
(1)焊接完这部分后测量发现3.3V_MCU和GND之间短路,排查单片机电源和地相关的引脚并无短路现象,最终发现是使用的晶振问题,该晶振为5*7mm贴片封装32.768Mhz有源晶振如下图所示,在焊接时用锡较多导致3.3V引脚和GND引脚同时与晶振顶盖的金属部分相连接,出去多余的锡后再次测量,无短路现象
(2)确认无短路后上电测试,点源指示灯不亮,触摸单片机无发热现象,但32.768Mhz晶振严重发烫。已确认晶振的VCC和GND未短路,反复检查发现之前焊锡沿顶盖边缘进入晶振内部,可能造成晶振内部短路,晶振亡。拆除。由于STM32F1时钟来源可以是内部RC振荡电路或外部晶振。因此板子单独使用8Mhz晶振,32.768Mhz暂时未焊接。
(3)下载闪烁LED测试程序,由于最开始只焊接了一个LED,而且巧的是这颗LED接的是PB4引脚。程序下载后没反应,以为是板子问题,折腾半天。在百度时偶然看到,PB3,PB4,PA13,PA14,PA15是特殊的IO口,用作JTAG/SWD仿真器的调试接口。其中PA13,PA14分别作为SWD调试的SWIO和SWCLK;PB3,PB4,PA13,PA14,PA15共同用于JTAG。这五个IO引脚非常特殊,正常情况下作为SWJ仿真器的调试引脚,如果要作为普通IO口使用需要特别的配置。不同I/O使用需求配置也不同,如下:
l GPIO_Remap_SWJ_JTAGDisable: /!< JTAG-DP Disabled and SW-DP Enabled / 即能用PB3,PB4,PA15做普通IO,PA13&14用于SWD调试
l GPIO_Remap_SWJ_Disable: /!< Full SWJ Disabled (JTAG-DP + SW-DP) / 5个引脚全为普通引脚,但不能再用JTAG&SWD仿真器调试,只能用st-link调试
l GPIO_Remap_SWJ_NoJTRST: /!< Full SWJ Enabled (JTAG-DP + SW-DP) but without JTRST /PB4可为普通IO口,JTAG&SWD正常使用,但JTAG没有复位
如果你用到所有的五个引脚当做普通IO口,那么上述步骤二中的重映射配置应写为GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE); 如果你用PB3,PB4,PA15做普通IO,PA13&14用于SWD调试,则重映射配置应写为GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); 同理可配置只用PB4可为普通IO口的情况。
工程中使用PA13&14用于SWD调试,其他作为普通I/O因此使用GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
闪烁LED程序测试成功后将剩余元件全部焊接完成。
**2.**软件部分
(1)移植宋工的程序到STM32,测试程序时应分模块分别测试,否则无法判断是那部分程序有问题。
首先测试DHT11,将温湿度显示在OLED上。这部分按照上述重映射操作后正常显示。
测试串口2收发时发现,串口2发送和接收均无反应,一开始以为是字符串发送函数的问题,按照网上的方法进行更改
方法1:
const u8 TEXT_Buffer[]={"AT"};
for(i=0;i<sizeof(TEXT_Buffer);i++)
{
USART2->DR =TEXT_Buffer[i];
delay_ms(10);
}
方法2:
void Send_Str1(char *s)
{
while(*s)
{
USART_SendData(USART1,*s++);//串口1发送数据函数,库函数已提供}
while(*s)
{
while(!USART_GetITStatus(USART1, USART_FLAG_TXE)); //判断是否可以发送
USART_SendData(USART1,*s);
while(USART_GetITStatus(USART1, USART_IT_TC)); //判断是否发送完成,此句必须有,否则会造//成只发送最后一个字符(覆盖)
s++;
}
}
更改之后测试仍然无反应,仔细查看程序分析发现USART2是挂载在APB1总线下的,程序时钟使能部分写错。
(2)3080模块测试,使用USB转串口模块直接连接3080模块,使用格西烽火串口助手测试AT指令,测试结果如下:
进入路由器配网模式成功后,使用云智能APP扫描配网二维码,但配网失败。后面更改阿里云设备配网方式为一键配网,再次调试正常,成功配网。
(3)云端命令下发与设备数据上报问题,注意:数据上报命令格式:AT+ILOPSENDJSON=property,{“temputure:”,28}
.在使用串口2给3080模块发命令时采用操作DR寄存器的方式,提前将要发送的数据缓存在数组中,通过一个循环逐位发送数据,这里要注意缓存数据是否全部发送,可以先用串口助手调试,确认发送数据无误后再修改程序发送给3080模块。
云端命令下发控制继电器,这里偷个懒,直接对接收到的字符串进行判断,看其是否包含powerstate:0子串,是则打开继电器。这个地方后面待优化。
!注意:请使用浏览器自带下载,迅雷等下载软件可能无法下载到有效资源。
欢迎加入EEWorld参考设计群,也许能碰到搞同一个设计的小伙伴,群聊设计经验和难点。 入群方式:微信搜索“helloeeworld”或者扫描二维码,备注:参考设计,即可被拉入群。 另外,如您在下载此设计遇到问题,也可以微信添加“helloeeworld”及时沟通。
EEWorld Datasheet 技术支持