当前位置:文档之家› STM32的485最简单例程

STM32的485最简单例程

STM32的485最简单例程
STM32的485最简单例程

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);

}

}

相关主题
文本预览
相关文档 最新文档