历史上的今天
返回首页

历史上的今天

今天是:2024年08月25日(星期日)

正在发生

2021年08月25日 | STM32 485通信 自我学习总结 控制380V变频器去控制380V电机

2021-08-25 来源:eefocus

        准备总结一下学习过程中的485通信知识!----------------------------------------------------


        先描述一下学习STM32与485通信的时候想实现的功能--------


        首先是完成双机通信中的双向通信----这里定义A为主机发送指令给从机B,从机B在接收到主机A的指令后,判断有效位的正确性,如果正确将这个指令通过RS232串口显示到串口助手里,观察整个指令是否接收正确-----同时在从机B接收到主机A指令后,向主机A发送指定数据----主机A在接收到从机B数据后判断有效位的正确性,如果正确则通过RS232打印到串口助手,然后观察完整数据。--------这里的判断比较简单------只是判断接收数据的最后一位是否是规定的字符----为了数据的准确性,可以增加判断方法。


        


        第一步是配置RS232的串口,这里使用USART1,测试printf函数的输出是否正常----------这里就不叙述了!


注意在主机的USART1中要打开接收中断-- USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//打开接收终端


        第二步是配置RS485,这里使用USART2,配置如下---------


void USART2_Config(void)

{

        GPIO_InitTypeDef GPIO_InitStructure;

        USART_InitTypeDef USART_InitStructure;

  

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);


        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;

        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

        GPIO_Init(GPIOA, &GPIO_InitStructure);

       


        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;

        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

        GPIO_Init(GPIOA, &GPIO_InitStructure);

      


        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;

        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;

         //GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

        GPIO_Init(GPIOB, &GPIO_InitStructure);

 

        USART_InitStructure.USART_BaudRate = 115200;

        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(USART2, &USART_InitStructure); 

        USART_Cmd(USART2, ENABLE);

  

        USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//打开接收终端

        USART_ClearFlag(USART2, USART_FLAG_TC);

}


void MyPrintfByte(unsigned char byte)//发送一个字节

{

        USART_SendData(USART2, byte);  

        while( USART_GetFlagStatus(USART2,USART_FLAG_TC)!= SET);       

}

void MyPrintfStr(unsigned char *s)//发送字符串

{

        uint8_t i=0;


        while(s[i]!='')

        {

                USART_SendData(USART2,s[i]); 

                while( USART_GetFlagStatus(USART2,USART_FLAG_TC)!= SET);  

                i++;   

        }

}

void MyPrintfArray(uint8_t send_array[],uint8_t num)//发送数组中指定个数

{

        uint8_t i=0;


        while(i        {               

                USART_SendData(USART2,send_array[i]); 

                while( USART_GetFlagStatus(USART2,USART_FLAG_TC)!= SET);  

                i++;     

        }        

}


        第三部是在中断里写接收函数--------------


void USART1_IRQHandler(void)//232接收中断函数---主要是在主机中

{        

        if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收到数据

        {        

                USART_ClearITPendingBit(USART1, USART_IT_RXNE);//清标志位

                RS232_RX_BUF[RS232_RX_CNT++]=USART_ReceiveData(USART1);

                if( RS232_RX_CNT==4)

                        RS232_RX_CNT=0;    

        }


void USART2_IRQHandler(void)  //485中断接收函数

{       

        if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)//接收到数据

        {        

                USART_ClearITPendingBit(USART2, USART_IT_RXNE);//清标志位

                RS485_RX_BUF[RS485_RX_CNT++]=USART_ReceiveData(USART2); //将接收到的数据保存到指定数组

                if( RS485_RX_CNT==9)//接收指定长度为9个数据

                        RS485_RX_CNT=0;     

        }


        第四步是对中断的优先级进行配置----


static void NVIC_Configuration(void)

{

      NVIC_InitTypeDef NVIC_InitStructure;

  

      NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

  

      NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;

      NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;

      NVIC_InitStructure.NVIC_IRQChannelSubPriority = ENABLE;

      NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

      NVIC_Init(&NVIC_InitStructure);

  

      NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

  

      NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;

      NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;

      NVIC_InitStructure.NVIC_IRQChannelSubPriority = ENABLE;

      NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

      NVIC_Init(&NVIC_InitStructure);

}


        第五部是主函数----------


---------------------------主机----------------------------------


int main(void)

{

        uint8_t i,flag=0;

  


        USART2_Config(); 

        USART1_Config(); 

        GPIO_Config();

        NVIC_Configuration();


        printf("485主机rn");


        while(1)

        {

                GPIO_SetBits(GPIOB,GPIO_Pin_5);//发送模式

                Delay(50000);  //必要的延时

                if(RS232_RX_BUF[3]=='1')      //通过串口助手发送一组数据,根据不同数据下面向从机发送不同的指令

                        MyPrintfStr("12345678!");

                else if(RS232_RX_BUF[3]=='2')

                        MyPrintfStr("abcdefgh@");

                else if(RS232_RX_BUF[3]=='3')

                       MyPrintfStr("ABCDEFGH#");


                RS485_RX_BUF[8]='-';  //将接收数据的最后一位设置为其它

                Delay(50000);

                GPIO_ResetBits(GPIOB,GPIO_Pin_5);//接收模式

                Delay(50000);

                //USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);

                flag=0;

                while(!(RS485_RX_BUF[8]=='T')&&flag<20)//等待接收到数据,并且最后一位数据位---T---或者超时退出循环---超时数值比较重要,太小会使数据丢失。

                {

                       Delay(0x666ee);

                      flag++;

                }

                for(i=0;i<9;i++)  //打印出接收到从机的数据

                {

                       if(i<8)

                            printf("%c",RS485_RX_BUF[i]); 

                       else

                            printf("%crn",RS485_RX_BUF[i]); 

                } 

                Delay(0x6666ee);

        }

}


------------------------------------------从机--------------------------------------


int main(void)

{

        uint8_t i;

     


        USART2_Config();

        GPIO_Config();


        USART1_Config();

        NVIC_Configuration();

推荐阅读

史海拾趣

Andigilog公司的发展小趣事

Andigilog是一家专注于提供模拟和混合信号集成电路解决方案的公司,以下是该公司发展的相关故事:

  1. 公司成立与早期发展:Andigilog成立于2002年,总部位于美国加利福尼亚州的圣何塞。该公司成立之初,专注于设计和销售模拟和混合信号集成电路(IC),以满足各种市场的需求。最初,公司的产品主要应用于电源管理、温度监测和控制等领域。

  2. 技术创新与产品推出:Andigilog在成立初期就致力于技术创新和产品研发。随着市场需求的不断变化,公司不断推出新型的集成电路产品,包括温度传感器、电源监测芯片等。这些产品具有高精度、低功耗、高集成度等优点,受到了客户的青睐。

  3. 合作伙伴关系与市场拓展:为了扩大市场份额和提升品牌知名度,Andigilog与各种合作伙伴建立了紧密的合作关系。公司与全球各地的分销商、代理商、原始设备制造商(OEM)等进行合作,共同开拓市场,推广公司的产品。此外,Andigilog还与行业内的其他公司进行技术合作和产品整合,共同提供更完整的解决方案。

  4. 全球布局与生产基地:随着业务的不断扩展,Andigilog在全球建立了多个生产基地和销售办事处。除了在美国的总部外,公司还在亚洲、欧洲等地区设立了生产工厂和销售办事处,以更好地服务全球客户。这些生产基地拥有先进的制造设备和技术,能够满足客户对产品质量和交货周期的要求。

  5. 持续发展与未来展望:作为一家专注于模拟和混合信号集成电路的公司,Andigilog将继续致力于技术创新和产品发展。公司将不断推出适应市场需求的新产品,提升生产效率和产品质量,以满足客户不断变化的需求。同时,Andigilog也将继续关注行业的发展趋势和技术变革,不断调整战略,保持在行业内的竞争优势。

Green Solution Technology Co Ltd公司的发展小趣事

对于听音耳机电路,网友可能的问题涉及多个方面,以下是一些常见问题及相应的回答:

一、技术性问题

  1. 耳机电路的工作原理是什么?
    • 回答:耳机电路主要通过音频信号放大器将音频设备(如手机、电脑等)输出的微弱电信号放大,然后驱动耳机的驱动单元(扬声器)产生声音。这个过程中,耳机电路还负责音频信号的传输和转换,确保音质清晰、音量适中。
  2. 为什么耳机电路会出现杂音或失真?
    • 回答:耳机电路出现杂音或失真的原因可能有很多,包括电路接触不良、线路老化、驱动单元故障、音频信号源问题等。此外,电磁干扰、设备不兼容等也可能导致音质问题。解决这类问题通常需要检查电路连接、更换损坏部件或调整设备设置。
  3. 如何判断耳机电路是否损坏?
    • 回答:判断耳机电路是否损坏可以通过以下方法:首先,检查耳机是否能正常发声,如果无声或声音异常,可能是电路问题;其次,使用万用表等工具检测电路中的电阻、电压等参数是否正常;最后,可以尝试将耳机连接到其他音频设备上进行测试,以排除设备问题。

二、维护与保养

  1. 如何保养耳机电路以延长使用寿命?
    • 回答:保养耳机电路的关键在于避免潮湿、防止碰撞和摔落,并定期清洁。使用时应注意避免拉扯耳机线,以免损坏内部电路。此外,在不使用耳机时,应将其存放在干燥、通风的地方,避免阳光直射和高温环境。定期使用软布轻轻擦拭耳机表面和插头,可以去除污垢和灰尘,保持电路清洁。
  2. 耳机电路进水了怎么办?
    • 回答:如果耳机电路进水,应立即停止使用并切断电源。然后,使用干燥的软布或纸巾轻轻擦拭耳机表面和插头上的水分。如果条件允许,可以将耳机放在通风良好的地方自然晾干,避免使用吹风机等热源直接吹干,以免损坏电路。如果进水情况严重或无法自行处理,建议送往专业维修中心进行检修。

三、升级与改造

  1. 如何升级耳机电路以提升音质?
    • 回答:升级耳机电路以提升音质需要一定的专业知识和技术。一般来说,可以通过更换更高品质的音频信号放大器、使用更优质的线路材料、优化电路设计等方式来实现。然而,这些操作可能比较复杂且存在风险,如果不熟悉相关技术,建议寻求专业人员的帮助。
  2. 是否可以自己动手改造耳机电路?
    • 回答:虽然理论上可以自己动手改造耳机电路,但这需要具备较高的电子技术和动手能力。如果操作不当,可能会导致电路损坏甚至耳机报废。因此,在没有足够经验和专业知识的情况下,不建议自己尝试改造耳机电路。

综上所述,针对听音耳机电路的问题,网友可能关心的方面包括技术性问题、维护与保养以及升级与改造等。在解决这些问题时,应根据具体情况采取相应的措施和方法。

B&K Precision公司的发展小趣事

随着电子行业的不断发展,B&K Precision始终保持着创新的步伐。公司不断推出具有创新性和竞争力的新产品,如数字电流表、三路输出直流清洁电源等,满足了市场对于高精度、高可靠性测试仪器的需求。这些产品的推出不仅提升了公司的市场份额,也进一步巩固了公司在电子行业中的地位。

Actel公司的发展小趣事

在1948年,当美国民众开始大量购买电视机时,电视机的维修需求也随之增加。芝加哥的企业家卡尔·科恩(Carl Korn)和菲利普·班(Philip Ban)注意到了这一市场机会。他们发现,当时缺乏能够轻松测试电视组件的设备,于是决定自己动手制作。两位创业者从车库起步,开始制造自己的测试设备,并成立了中央电视服务公司。他们的业务迅速扩展,开始向其他电视维修店销售CRT再生器和真空管测试仪,为公司的后续发展奠定了坚实的基础。

DAICO公司的发展小趣事

随着技术的不断进步,DAICO公司成功研发出一系列高可靠性的定制产品。这些产品以其卓越的性能和稳定性,赢得了客户的广泛认可。DAICO开始将业务扩展到商用飞机和其他高端商业行业,为卫星、雷达、导航、通信、电子战和导弹系统提供复杂操作不可或缺的一部分。

Gang Song Electronics Co Ltd公司的发展小趣事

作为物联网领域的领军企业之一,Telit(包含GainSpan的技术)不仅致力于技术创新和市场拓展,还积极参与行业标准的制定和生态建设的推动。通过与其他企业和组织的合作与交流,Telit推动了物联网技术的标准化和规范化发展。同时,它还积极构建物联网生态系统,与上下游企业建立紧密的合作关系,共同推动物联网产业的繁荣和发展。这些努力不仅提升了Telit在行业内的地位和影响力,也为整个物联网产业的发展做出了重要贡献。

问答坊 | AI 解惑

用于车身控制模块的单片机和本地互连网络的作用

 随着应用的不断扩展,今天和未来的单片机普及和车辆网络正在继续。单片机是车辆内各种电子控制模块的“大脑”,而网络则是“系统互连”。本地互连网络(LIN)是业界第一个提出车内Class A开放多路复用协议标准。它定义了一个支持车辆内 ...…

查看全部问答>

取字模软件

自己买开发板时送的取自摸软件 很好用 只想多换点芯币 来下载东西 要的快下啊 谢谢了…

查看全部问答>

CC1100中,怎么用电磁波激活这个功能

  我现在用CC1100接收模块开发一个项目,用的单片机是MSP430F2274,但相应的电源板只能提供3mA的电流,我现在想用电磁波解决这个问题,想问哪个高手能给我些代码,非常感谢!…

查看全部问答>

寻求AT440芯片的DataSheet

老大要我对比下AT440和S3C2440方案的异同,要我找AT440的DataSheet,不知道那位有,能否帮忙?…

查看全部问答>

求助wintech仿真器问题

手里有一块28335的板子和一个前辈留下的仿真器,各个地方都找遍了就是找不到驱动程序,求各位大侠出手相助。 我的系统是WIN7 32位,已装好CCS3.3。用过的大侠能把驱动发我邮箱么..mashaokang1111@163.com。谢谢啊! [ 本帖最后由 mashaokang 于 20 ...…

查看全部问答>

基于FPGA的数字信号发生器

打算将DSP Builder、matlab、Quartus三个软件结合起来相互调用,可怎么也弄不好,求助!…

查看全部问答>

结婚周年,剥开一颗心愿:ufun群开始使用了~

ufun群开始使用了       感谢朋友们的支持!现在项目资金总额达到了11803元。 令人格外高兴的是,有PCB制板公司的朋友愿意提供免费的PCB加工;焊接也有可能得到免费的支持;器件优惠还在联系…… 大家的支持使最终 ...…

查看全部问答>

大家写程序有没有画流程图的习惯啊

大家写程序有没有画流程图的习惯啊。。。今天在画一个流程图,不知道调用子程序要用哪个来画。。。。 …

查看全部问答>