OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2655|回复: 0

stm32F429在485通信时不能通过串口工具发送数据

[复制链接]

1

主题

2

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2020-3-10
在线时间
1 小时
发表于 2020-3-10 15:39:49 | 显示全部楼层 |阅读模式
#include "sys.h"                    
//#include "usart.h"
#include "rs485.h"         
#include "delay.h"
//#include "pcf8574.h"
#include "string.h"

//////////////////////////////////////////////////////////////////////////////////         
//±¾3ìDòÖ»1©Ñ§Ï°ê1óã¬Î′¾-×÷ÕßDí¿é£¬2»μÃóÃóúÆäËüèÎoÎóÃí¾
//ALIENTEK STM32¿a·¢°å
//RS485Çy¶ˉ ′úÂë          
//ÕyμãÔ-×ó@ALIENTEK
//¼¼êõÂÛì3:www.openedv.com
//′′½¨èÕÆú:2015/12/28
//°æ±¾£oV1.0
//°æè¨ËùóD£¬μá°æ±Ø¾¿¡£
//Copyright(C) 1ãÖYêDDÇòíμç×ó¿Æ¼¼óDÏT1«Ë¾ 2014-2024
//All rights reserved                                                                          
//////////////////////////////////////////////////////////////////////////////////          


void RS485_RTS_Init()
{
        RCC->AHB1ENR|=1<<1;           //ê1&#196;üPORTB&#191;úê±&#214;ó  
        GPIO_Set(GPIOB,PIN5,GPIO_MODE_OUT,GPIO_OTYPE_PP,GPIO_SPEED_50M,GPIO_PUPD_PU);//PB5,&#184;′ó&#195;1|&#196;ü,é&#207;à-ê&#228;3&#246;
}

#if EN_USART1_RX                   //è&#231;1&#251;ê1&#196;üá&#203;&#189;óê&#213;             
//&#189;óê&#213;&#187;o′&#230;&#199;&#248;        
u8 RS485_RX_BUF[USART_REC_LEN];          //&#189;óê&#213;&#187;o3&#229;,×&#238;&#182;àSART_REC_LEN&#184;&#246;×&#214;&#189;ú.
//&#189;óê&#213;μ&#189;μ&#196;êy&#190;Y3¤&#182;è
u8 RS485_RX_CNT=0;   
//bit15,        &#189;óê&#213;íê3é±ê×&#188;
//bit14,        ê&#213;μ&#189;0x0d
//bit13~0,        óDD§êy&#190;Yêy&#196;&#191;
//u16 USART_RX_STA=0;      
void USART1_IRQHandler(void)
{
        u8 res;       
       
        if(USART1->SR&(1<<5))//&#189;óê&#213;μ&#189;êy&#190;Y
        {         
                res=USART1->DR;                
                if(res!=0x0d||res!=0x0a)
                 {
                        RS485_RX_BUF[RS485_RX_CNT]=res;                //&#188;&#199;&#194;&#188;&#189;óê&#213;μ&#189;μ&#196;&#214;μ
                        RS485_RX_CNT++;                                                //&#189;óê&#213;êy&#190;Y&#212;&#246;&#188;ó1  
                 }
        }
        /*
        RS485_RX_CNT=0;       
        if(USART1->SR&(1<<5))//&#189;óê&#213;μ&#189;êy&#190;Y
        {         
                res=USART1->DR;                          
                if((USART_RX_STA&0x8000)==0)
                {
                        if(USART_RX_STA&0x4000)//0x0d
                        {
                                if(res!=0x0a)USART_RX_STA=0;
                                else USART_RX_STA|=0x8000;       
                        }else
                        {       
                                if(res==0x0d)USART_RX_STA|=0x4000;
                                else
                                {
                                  RS485_RX_BUF[RS485_RX_CNT]=res;                //&#188;&#199;&#194;&#188;&#189;óê&#213;μ&#189;μ&#196;&#214;μ
                            RS485_RX_CNT++;                                                //&#189;óê&#213;êy&#190;Y&#212;&#246;&#188;ó1        
                                        USART_RX_STA++;        
                                        if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;          
                                }       
                        }                       
                }
        }        */
       
        /*
       
        if((USART_RX_STA&0x8000)==0)
                {
                        if(USART_RX_STA&0x4000)
                        {
                                if(res!=0x0a)USART_RX_STA=0;
                                else USART_RX_STA|=0x8000;       
                        }
                        else
                        {       
                                if(res==0x0d)
                                        USART_RX_STA|=0x4000;
                                else
                                {
                                        USART_RX_BUF[USART_RX_STA&0X3FFF]=res;
                                        USART_RX_STA++;
                                        if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;   
                                }          
                        }
                }

        */
}
#endif                                                                                 
//3&#245;ê&#188;&#187;ˉIO ′&#174;&#191;ú1
//pclk1CLK1ê±&#214;ó&#198;μ&#194;ê(Mhz),APB1ò&#187;°&#227;&#206;a48Mhz
//bound:2¨ì&#216;&#194;ê          
void RS485_Init(u32 pclk1,u32 bound)
{           
        float temp;
        u16 mantissa;
        u16 fraction;          
        temp=(float)(pclk1*1000000)/(bound*16);//μ&#195;μ&#189;USARTDIV@OVER8=0
        mantissa=temp;                                 //μ&#195;μ&#189;&#213;&#251;êy2&#191;·&#214;
        fraction=(temp-mantissa)*16; //μ&#195;μ&#189;D&#161;êy2&#191;·&#214;@OVER8=0
    mantissa<<=4;
        mantissa+=fraction;

        RS485_RTS_Init();
        RCC->AHB1ENR|=1<<1;           //ê1&#196;üPORTB&#191;úê±&#214;ó  

        GPIO_Set(GPIOB,PIN6|PIN7,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_50M,GPIO_PUPD_PU);//PB6,PB7&#184;′ó&#195;1|&#196;ü,é&#207;à-ê&#228;3&#246;
//        GPIO_Set(GPIOB,PIN7,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_50M,GPIO_PUPD_PU);//PB7,&#184;′ó&#195;1|&#196;ü,é&#207;à-ê&#228;3&#246;
        GPIO_AF_Set(GPIOB,6,7);        //PB6,AF7
        GPIO_AF_Set(GPIOB,7,7);//PB7,AF7            
        RCC->APB2ENR|=1<<4;          //ê1&#196;ü′&#174;&#191;ú1ê±&#214;ó        
        RCC->APB2ENR|=1<<4;          //&#184;′&#206;&#187;′&#174;&#191;ú1ê±&#214;ó        
        RCC->APB2RSTR&=~(1<<4);                 
        //2¨ì&#216;&#194;êéè&#214;&#195;
        USART1->BRR=mantissa;         //2¨ì&#216;&#194;êéè&#214;&#195;         
        USART2->CR1|=0X200C; //
        USART1->CR1&=~(1<<15);         //éè&#214;&#195;OVER8=0
        USART1->CR1|=1<<3;          //′&#174;&#191;ú·¢&#203;íê1&#196;ü                                  
#if EN_USART1_RX                          //è&#231;1&#251;ê1&#196;üá&#203;&#189;óê&#213;
        //ê1&#196;ü&#189;óê&#213;&#214;D&#182;&#207;
        USART1->CR1|=1<<2;          //′&#174;&#191;ú&#189;óê&#213;ê1&#196;ü
        USART1->CR1|=1<<5;            //&#189;óê&#213;&#187;o3&#229;&#199;&#248;·&#199;&#191;&#213;&#214;D&#182;&#207;ê1&#196;ü                   
        MY_NVIC_Init(3,3,USART1_IRQn,2);//×é2£&#172;×&#238;μíó&#197;&#207;è&#188;&#182;
#endif
        USART1->CR1|=1<<13;          //′&#174;&#191;úê1&#196;ü
       
        RS485_TX_Set(0);                        //&#196;&#172;è&#207;éè&#214;&#195;&#206;a&#189;óê&#213;&#196;£ê&#189;       
}

//RS485·¢&#203;ílen&#184;&#246;×&#214;&#189;ú.
//buf:·¢&#203;í&#199;&#248;ê×μ&#216;&#214;·
//len:·¢&#203;íμ&#196;×&#214;&#189;úêy(&#206;aá&#203;oí±&#190;′ú&#194;&#235;μ&#196;&#189;óê&#213;&#198;¥&#197;&#228;,&#213;aà&#239;&#189;¨òé2&#187;òa3&#172;1y64&#184;&#246;×&#214;&#189;ú)
void RS485_Send_Data(u8 *buf,u8 len)
{
        u8 t;
        RS485_TX_Set(1);        //éè&#214;&#195;&#206;a·¢&#203;í&#196;£ê&#189;
          for(t=0;t<len;t++)                        //&#209;-&#187;··¢&#203;íêy&#190;Y
        {
                while((USART1->SR&0X40)==0);//μè′y·¢&#203;í&#189;áê&#248;                  
                USART1->DR=buf[t];
        }         
        while((USART1->SR&0X40)==0);//μè′y·¢&#203;í&#189;áê&#248;       
        RS485_RX_CNT=0;          
        RS485_TX_Set(0);                        //éè&#214;&#195;&#206;a&#189;óê&#213;&#196;£ê&#189;       
}
//RS4852é&#209;ˉ&#189;óê&#213;μ&#189;μ&#196;êy&#190;Y
//buf:&#189;óê&#213;&#187;o′&#230;ê×μ&#216;&#214;·
//len:&#182;áμ&#189;μ&#196;êy&#190;Y3¤&#182;è
void RS485_Receive_Data(u8 *buf,u8 *len)
{       
        u8 rxlen=RS485_RX_CNT;
        u8 i=0;
        *len=0;                                //&#196;&#172;è&#207;&#206;a0
        delay_ms(10);                //μè′y10ms,á&#172;D&#248;3&#172;1y10ms&#195;&#187;óD&#189;óê&#213;μ&#189;ò&#187;&#184;&#246;êy&#190;Y,&#212;òè&#207;&#206;a&#189;óê&#213;&#189;áê&#248;
        if(rxlen==RS485_RX_CNT&&rxlen)//&#189;óê&#213;μ&#189;á&#203;êy&#190;Y,&#199;ò&#189;óê&#213;íê3éá&#203;
        {
                for(i=0;i<rxlen;i++)
                {
                        buf=RS485_RX_BUF;       
                }               
                *len=RS485_RX_CNT;        //&#188;&#199;&#194;&#188;±&#190;′&#206;êy&#190;Y3¤&#182;è
                RS485_RX_CNT=0;                //&#199;&#229;á&#227;
        }
}
//RS485&#196;£ê&#189;&#191;&#216;&#214;&#198;.
//en:0,&#189;óê&#213;;1,·¢&#203;í.
void RS485_TX_Set(u8 en)
{
        PBout(5)=en;
}


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-4 06:32

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表