新手入门
- 积分
- 8
- 金钱
- 8
- 注册时间
- 2020-3-10
- 在线时间
- 1 小时
|
#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ÄüPORTB¿úê±Öó
GPIO_Set(GPIOB,PIN5,GPIO_MODE_OUT,GPIO_OTYPE_PP,GPIO_SPEED_50M,GPIO_PUPD_PU);//PB5,¸′óÃ1|Äü,éÏà-êä3ö
}
#if EN_USART1_RX //èç1ûê1Äüá˽óêÕ
//½óêÕ»o′æÇø
u8 RS485_RX_BUF[USART_REC_LEN]; //½óêÕ»o3å,×î¶àSART_REC_LEN¸ö×Ö½ú.
//½óêÕμ½μÄêy¾Y3¤¶è
u8 RS485_RX_CNT=0;
//bit15, ½óêÕíê3é±ê×¼
//bit14, êÕμ½0x0d
//bit13~0, óDD§êy¾YêyÄ¿
//u16 USART_RX_STA=0;
void USART1_IRQHandler(void)
{
u8 res;
if(USART1->SR&(1<<5))//½óêÕμ½êy¾Y
{
res=USART1->DR;
if(res!=0x0d||res!=0x0a)
{
RS485_RX_BUF[RS485_RX_CNT]=res; //¼Ç¼½óêÕμ½μÄÖμ
RS485_RX_CNT++; //½óêÕêy¾YÔö¼ó1
}
}
/*
RS485_RX_CNT=0;
if(USART1->SR&(1<<5))//½óêÕμ½êy¾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; //¼Ç¼½óêÕμ½μÄÖμ
RS485_RX_CNT++; //½óêÕêy¾YÔö¼ó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õê¼»ˉIO ′®¿ú1
//pclk1 CLK1ê±ÖóÆμÂê(Mhz),APB1ò»°ãÎa48Mhz
//bound:2¨ìØÂê
void RS485_Init(u32 pclk1,u32 bound)
{
float temp;
u16 mantissa;
u16 fraction;
temp=(float)(pclk1*1000000)/(bound*16);//μÃμ½USARTDIV@OVER8=0
mantissa=temp; //μÃμ½Õûêy2¿·Ö
fraction=(temp-mantissa)*16; //μÃμ½D¡êy2¿·Ö@OVER8=0
mantissa<<=4;
mantissa+=fraction;
RS485_RTS_Init();
RCC->AHB1ENR|=1<<1; //ê1ÄüPORTB¿úê±Öó
GPIO_Set(GPIOB,PIN6|PIN7,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_50M,GPIO_PUPD_PU);//PB6,PB7¸′óÃ1|Äü,éÏà-êä3ö
// GPIO_Set(GPIOB,PIN7,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_50M,GPIO_PUPD_PU);//PB7,¸′óÃ1|Äü,éÏà-êä3ö
GPIO_AF_Set(GPIOB,6,7); //PB6,AF7
GPIO_AF_Set(GPIOB,7,7);//PB7,AF7
RCC->APB2ENR|=1<<4; //ê1Äü′®¿ú1ê±Öó
RCC->APB2ENR|=1<<4; //¸′λ′®¿ú1ê±Öó
RCC->APB2RSTR&=~(1<<4);
//2¨ìØÂêéèÖÃ
USART1->BRR=mantissa; //2¨ìØÂêéèÖÃ
USART2->CR1|=0X200C; //
USART1->CR1&=~(1<<15); //éèÖÃOVER8=0
USART1->CR1|=1<<3; //′®¿ú·¢Ëíê1Äü
#if EN_USART1_RX //èç1ûê1Äüá˽óêÕ
//ê1Äü½óêÕÖD¶Ï
USART1->CR1|=1<<2; //′®¿ú½óêÕê1Äü
USART1->CR1|=1<<5; //½óêÕ»o3åÇø·Ç¿ÕÖD¶Ïê1Äü
MY_NVIC_Init(3,3,USART1_IRQn,2);//×é2£¬×îμíóÅÏè¼¶
#endif
USART1->CR1|=1<<13; //′®¿úê1Äü
RS485_TX_Set(0); //ĬèÏéèÖÃÎa½óêÕÄ£ê½
}
//RS485·¢Ëílen¸ö×Ö½ú.
//buf:·¢ËíÇøê×μØÖ·
//len:·¢ËíμÄ×Ö½úêy(ÎaáËoí±¾′úÂëμĽóêÕÆ¥Åä,Õaàィòé2»òa3¬1y64¸ö×Ö½ú)
void RS485_Send_Data(u8 *buf,u8 len)
{
u8 t;
RS485_TX_Set(1); //éèÖÃÎa·¢ËíÄ£ê½
for(t=0;t<len;t++) //Ñ-»··¢Ëíêy¾Y
{
while((USART1->SR&0X40)==0);//μè′y·¢Ëí½áêø
USART1->DR=buf[t];
}
while((USART1->SR&0X40)==0);//μè′y·¢Ëí½áêø
RS485_RX_CNT=0;
RS485_TX_Set(0); //éèÖÃÎa½óêÕÄ£ê½
}
//RS4852éÑˉ½óêÕμ½μÄêy¾Y
//buf:½óêÕ»o′æê×μØÖ·
//len:¶áμ½μÄêy¾Y3¤¶è
void RS485_Receive_Data(u8 *buf,u8 *len)
{
u8 rxlen=RS485_RX_CNT;
u8 i=0;
*len=0; //ĬèÏÎa0
delay_ms(10); //μè′y10ms,á¬Dø3¬1y10msûóD½óêÕμ½ò»¸öêy¾Y,ÔòèÏÎa½óêÕ½áêø
if(rxlen==RS485_RX_CNT&&rxlen)//½óêÕμ½áËêy¾Y,Çò½óêÕíê3éáË
{
for(i=0;i<rxlen;i++)
{
buf=RS485_RX_BUF;
}
*len=RS485_RX_CNT; //¼Ç¼±¾′Îêy¾Y3¤¶è
RS485_RX_CNT=0; //Çåáã
}
}
//RS485Ä£꽿ØÖÆ.
//en:0,½óêÕ;1,·¢Ëí.
void RS485_TX_Set(u8 en)
{
PBout(5)=en;
}
|
|