/*********************************************************************
* 函 数 名: uart_init
* 函数说明: 初始化串口通讯引脚 ,串口配置初始化,中断优先级配置
* 输 入: bound 串口通讯波特率
* 返 回: 无
***********************************************************************/
void uart_init(u32 bound)
{
//GPIO端口设置
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE); //使能 USART3 时钟
USART_DeInit(USART3); //复位串口3
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_12; //PB12 max485 R/W Enable
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //复用推挽输出
GPIO_Init(GPIOB, &GPIO_InitStructure);
//USART3_TX PB10
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_Init(GPIOB, &GPIO_InitStructure);
//USART3_RX PB11
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
GPIO_Init(GPIOB, &GPIO_InitStructure);
//USART 初始化设置
USART_InitStructure.USART_BaudRate = bound;//一般设置为4800;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
USART_InitStructure.USART_Mode = USART_Mode_Tx; //发模式
USART_Init(USART3, &USART_InitStructure); //初始化串口
//Usart1 NVIC 配置
NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2 ;//抢占优先级2
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //子优先级0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器
USART_Cmd(USART3, ENABLE); //使能串口
}
/*********************************************************************
* 函 数 名: USARTSendData
* 函数说明: 串口数据发送函数,在发送完数据后,再发送CRC校验码的高低字节
* 输 入: USARTx 串口号 prSendData 发送数据的数组名 leng 长度
* 返 回: 无
***********************************************************************/
void USARTSendData(USART_TypeDef* USARTx,u8 prSendData[],u8 leng)
{
u8 tempcrcH,tempcrcL; //存储CRC校验码的高低字节
u8 i;
tempcrcH= (u8)((usMBCRC16(prSendData,leng)&0xff00)>>8) ;
tempcrcL= (u8)(usMBCRC16(prSendData, leng)&0x00ff) ;
for(i=0;i<leng;i++)
{
USART_SendData(USARTx, prSendData);
while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);//等待发送结束
}
USART_SendData(USARTx,tempcrcL);//计算发送数据的校验码低字节
while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);//等待发送结束
USART_SendData(USARTx,tempcrcH);//计算发送数据的校验码高字节
while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);//等待发送结束
}
main()
{
while(1)
{
GPIO_ResetBits(GPIOB,GPIO_Pin_12); //485设为发送
delay_ms(5);
USART_Cmd(USART3, ENABLE);
USARTSendData( USART3,SendDataBuf2,4); //SendDataBuf2[4]={0x7c,0x00,0x00,0x00}
USART_Cmd(USART3, DISABLE);
USART3->DR=0;
GPIO_SetBits(GPIOB,GPIO_Pin_12); //485设为接收
delay_ms(5);
}
} |