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 ->PB11GPIO_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_ART_BaudRate = 115200; // 1200;USART_ART_WordLength = USART_WordLength_8b;USART_ART_StopBits = USART_StopBits_1;USART_ART_Parity = USART_Parity_No; //USART_Parity_Even;USART_ART_HardwareFlowControl = USART_HardwareFlowControl_None;USART_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_DMAUSART_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);#endifUSART_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 enableRCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);// reset timerTIM_DeInit(TIM3);// Time base configuration// value to reloadTIM_TimeBaseStructure.TIM_Period = (tcon - 1);// pre-scaler value against system clockTIM_TimeBaseStructure.TIM_Prescaler = (psc - 1);// scaler value against system clockTIM_TimeBaseStructure.TIM_ClockDivision = 0;// counting modeTIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;// init timerTIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);// Clear TIM3 update pending flagTIM_ClearITPendingBit(TIM3, TIM_IT_Update);// TIM IT enable of over-countingTIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);// config timer's interruption functionNVIC_TIM3Configuration();// Enable TIM3 counterTIM_Cmd(TIM3, ENABLE);}void TIM3_DeInit(void){// Disable TIM3 counterTIM_Cmd(TIM3, DISABLE);// Reset timerTIM_DeInit(TIM3);// Disable TIM3 clockRCC_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);}}。