485最基本的半双工通信配置
采用STM32F103ZET6串口3连接485芯片通信口,485芯片的A,B通过485转串口模块与电脑相连,完成在串口软件上输入输出功能。
串口3,配置函数:
void USART3_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
// USART3_TX -> PB10 , USART3_RX -> PB11
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
USART_https://www.doczj.com/doc/a012935418.html,ART_BaudRate = 115200; // 1200;
USART_https://www.doczj.com/doc/a012935418.html,ART_WordLength = USART_WordLength_8b;
USART_https://www.doczj.com/doc/a012935418.html,ART_StopBits = USART_StopBits_1;
USART_https://www.doczj.com/doc/a012935418.html,ART_Parity = USART_Parity_No; //USART_Parity_Even;
USART_https://www.doczj.com/doc/a012935418.html,ART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_https://www.doczj.com/doc/a012935418.html,ART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART3, &USART_InitStructure);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
#ifdef PDU_USART3_DMA
USART_ITConfig(USART3, USART_IT_IDLE, ENABLE);
#else
// Enable the USART Receive interrupt: this interrupt is generated when the
// USART3 receive data register is not empty
//USART_ClearITPendingBit(USART3, USART_IT_TC);
USART_ClearFlag(USART3,USART_FLAG_TC);
USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);
USART_ITConfig(USART3, USART_IT_TC, ENABLE);
//USART_ITConfig(USART3, USART_IT_TXE, ENABLE);
USART_ClearFlag(USART3,USART_FLAG_TC);
#endif
USART_Cmd(USART3, ENABLE);
USART_ClearFlag(USART3,USART_FLAG_TC);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOE, &GPIO_InitStructure);
RS_485_TX_ENABLE();
}
PUTCHAR_PROTOTYPE
{
/* Place your implementation of fputc here */
/* e.g. write a character to the USART */
USART_SendData(USART3, (uint8_t) ch);
//USART_SendData(USART1,(uint8_t)ch);
/* Loop until the end of transmission */
//while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
while (USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET)
{}
return ch;
}
中断函数:
void USART3_IRQHandler(void)
{
if(USART_GetITStatus(USART3, USART_IT_IDLE) != RESET) {
USART_ClearITPendingBit(USART3, USART_IT_IDLE);
}
if(USART_GetFlagStatus(USART3, USART_FLAG_RXNE)!=RESET) {
USART_ClearFlag(USART3,USART_FLAG_RXNE);
TIM3_Init(1000, 7200);
BLUE_ON();
if(cnt>=32)
{
cnt=0;
}
else{
data[cnt]=USART_ReceiveData(USART3);
cnt++;
}
}
if ((USART_GetITStatus(USART3, USART_IT_TC) != RESET) ||
(USART_GetITStatus(USART3, USART_IT_TXE) != RESET) ){
USART_ClearITPendingBit(USART3, USART_IT_TC);
USART_ClearITPendingBit(USART3, USART_IT_TXE);
// USART_SendData(USART3, 0XFFFF);
}
}
void TIM3_IRQHandler(void)
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) {
TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
TIM3_DeInit();
BLUE_OFF();
// printf("\r\n %x",cnt);
cnt=0;
}
}
static void NVIC_TIM3Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
/* Set the Vector Table base address at 0x08000000 */
//NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0000);
/* Enable the TIM3 gloabal Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
定时器:
void TIM3_Init(uint16_t tcon, uint16_t psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
// TIM3 clock enable
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
// reset timer
TIM_DeInit(TIM3);
// Time base configuration
// value to reload
TIM_TimeBaseStructure.TIM_Period = (tcon - 1);
// pre-scaler value against system clock
TIM_TimeBaseStructure.TIM_Prescaler = (psc - 1);
// scaler value against system clock
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
// counting mode
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
// init timer
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
// Clear TIM3 update pending flag
TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
// TIM IT enable of over-counting
TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
// config timer's interruption function
NVIC_TIM3Configuration();
// Enable TIM3 counter
TIM_Cmd(TIM3, ENABLE);
}
void TIM3_DeInit(void)
{
// Disable TIM3 counter
TIM_Cmd(TIM3, DISABLE);
// Reset timer
TIM_DeInit(TIM3);
// Disable TIM3 clock
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, DISABLE);
//tim3_stat = 0x00;
}
主函数:
#ifdef __GNF__
#ifdef __GNUC__
/* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf set to 'Yes') calls __io_putchar() */
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */
#endif /* __GNF__ */
void Delay(uint32_t tick)
{
while(tick--)
;
}
/* Private function prototypes -----------------------------------------------*/
extern unsigned char data[size];
extern volatile unsigned char cnt;
/************************************************************************** *****
* Function Name : main
* Description : Main program
* Input : None
* Output : None
* Return : None
* Attention : None
*************************************************************************** ****/
int main(void)
{
/*USART configuration*/
USART3_Config();
RED_ON();
BLUE_ON();
GREEN_ON();
Delay(100000);
BLUE_OFF();
RED_OFF();
GREEN_OFF();
/* Infinite loop */
while (1)
{
uint8_t i=0;
RS_485_TX_ENABLE();
printf("\r\n up up day! ");
for(i=0;i<50;i++)
{
GREEN_ON();
Delay(500000);
GREEN_OFF();
Delay(500000);
}
RS_485_RX_ENABLE();
while(data[0]==0x00)
{
RED_ON();
Delay(500000);
RED_OFF();
Delay(500000);
}
memset(data,0,size);
}
}