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

使用STM32F103制作的无线下载器

[复制链接]
〃聪聪哥哥 发布时间:2024-12-19 19:00

项目设计的前言:作为一个嵌入式的工程师,在编写代码时候,难免会遇到不同电平之间的转换。例如:RS485通讯方式,RS232,TTL信号,为了查看通讯之间数据的正确性,经常使用到不同的电平转换模块,还需要一个USB转串口工具,将数据上传到PC端,这样我们才能将查看控制器或者是负载返回的数据,为了避免调试代码起来方便,让自己的工作变得整洁,方便我们自己的工作,前端时间正好研究SPI通讯方式的NRF24L01这款无线芯片,利用业余时间做了一个无线通讯模块。在这里分享一下开发的经验。

一:部分原理图设计:

12-1.png

二:PCB图展示:

12-2.png

三:软硬件设计的思路:

在本次项目中使用主控为STM32F103C8T6芯片,当时使用该块芯片是因为该款芯片具有USB功能,该芯片可以虚拟一个USB的串口进行数据交互,而且封装也比较小,在PCB布局方面比较简单。

无线模块采用的是一款SPI通讯的NRF24L01芯片,在实际的使用过程中比较稳定,可以满足数据之间的交互。

软件设计思路:利用串口1的引脚的接收发送引脚,使用消息队列的方式,可以将USB下发的的数据发送出去。

使用串口2完成与SPI之间的交互,

软件配置参数:使用STM32cube MX软件生成USB,SPI,串口底层的驱动部分,这样开发起来也比较容易;

cube软件配置图如下,主要是对该项目中使用到的引脚进行配置

12-4.png

部分软件代码:

                if(sd == 0)
                {
                        USART_Cmd(USART2, ENABLE);                    //使能串口 
                        if(        linecoding_old.bitrate != linecoding.bitrate ||
                                        linecoding_old.datatype != linecoding.datatype ||
                                        linecoding_old.format != linecoding.format ||
                                        linecoding_old.paritytype != linecoding.paritytype )
                        {
                                if(        usart2_flag == 0 )
                                {
                                        uart2_config_change(linecoding);
                                        memcpy((void *)(&linecoding_old),(void *)&linecoding,sizeof(linecoding));
                                }
                        }
                        else if(queue_size(&Qusart2Send) > 0 && usart2_flag == 0)
                        {
                                QueueElementByte data_byte;
                                usart2_flag = 1;
                                if(dequene(&Qusart2Send,&data_byte) == 0 )
                                {
                                        USART_SendData(USART2,data_byte.buffer);
                                }
                                USART_ITConfig(USART2, USART_IT_TXE, ENABLE);//开启ENABLE/关闭DISABLE中断
                        }

                        if(GetEPRxStatus(ENDP6) == EP_RX_NAK)
                        {
                                SetEPRxValid(ENDP6);
                        }
                        if(GetEPRxStatus(ENDP4) == EP_RX_NAK)
                        {
                                if(CDC_MAXSIZE - queue_size(&Qusart2Send) >= 64 )
                                        SetEPRxValid(ENDP4);
                        }

                        if(nrf_state == 0)
                                NRF24L01_TxPacket(buffer,1);
                }
                else
                {
                        USART_Cmd(USART2, DISABLE);                    //失能串口 
                        if(nrf_state == 0)
                        {
                                if(dap2nrf_Data() == -1)
                                {

                                        if(GetEPRxStatus(ENDP6) == EP_RX_NAK)
                                        {
                                                SetEPRxValid(ENDP6);
                                        }

                                        if(        linecoding_old.bitrate != linecoding.bitrate ||
                                        linecoding_old.datatype != linecoding.datatype ||
                                        linecoding_old.format != linecoding.format ||
                                        linecoding_old.paritytype != linecoding.paritytype        )
                                        {
                                                buffer[0] = 33;//特殊串口设置指令
                                                memcpy((void *)(buffer+1),(void *)&linecoding,sizeof(linecoding));
                                                NRF24L01_TxPacket(buffer,sizeof(linecoding)+1);
                                        }
                                        else if(queue_size(&Qusart2Send) > 0)
                                        {
                                                QueueElementByte data_byte;
                                                for(i = 1; i < 32; i ++)
                                                {
                                                        if(dequene(&Qusart2Send,&data_byte) == -1 )
                                                                break;
                                                        buffer[i] = data_byte.buffer;
                                                }
                                                buffer[0] = i - 1;
                                                NRF24L01_TxPacket(buffer,buffer[0]+1);
                                        }
                                        else
                                        {
                                                if(GetEPRxStatus(ENDP4) == EP_RX_NAK)
                                                {
                                                        SetEPRxValid(ENDP4);
                                                }
                                                buffer[0] = 0;
                                                NRF24L01_TxPacket(buffer,1);
                                        }

                                }
                        }
                }

实物使用截图如下:

12-6.png

在实际使用中发现,硬件功耗大概在130ma左右,在数据交互的时候功耗会增加至170ma左右,不过并不影响模块的使用。

使用该模块的最大好处就是可以让硬件工程师的桌面更加的整洁。

在软件开发时候,有以下的注意事项:

抗干扰能力:NRF24L01工作在2.4GHz频段,该频段易受到WiFi、蓝牙等设备的干扰。在布局布线时要尽量减少干扰源的影响,并合理设置通信参数以提高抗干扰能力。

功耗管理:在不需要通信时及时将NRF24L01置于待机模式或掉电模式以降低功耗。

距离与障碍物:无线通信距离受环境因素影响较大,障碍物会严重影响通信质量。在实际应用中要考虑通信距离和障碍物的影响并采取相应的措施。

NRF24L01的开发过程需要仔细规划硬件连接、合理配置软件参数、掌握调试技巧并关注实际应用中的注意事项。通过不断的实践和总结可以逐渐提高开发效率和应用效果。

原理图见附件:

PDF.pdf [/i]

收藏 评论0 发布时间:2024-12-19 19:00

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版