高级会员

- 积分
- 823
- 金钱
- 823
- 注册时间
- 2014-1-15
- 在线时间
- 350 小时
|
5金钱
两个串口分别测试时没有问题,当同时使用时发生异常,串口3接收到数据后一直发数据,而串口2不工作
#include "sys.h"
#include "delay.h"
u8 UART3_RX_BUF[64]; //????????,×??ó64??×???.
u8 UART3_RX_CNT=0; //?????????????¤??
u8 UART2_RX_BUF[64]; //????????,×??ó64??×???.
u8 UART2_RX_CNT=0; //?????????????¤??
u8 uart3_end_sign;
u8 uart1_end_sign;
u8 uart2_end_sign;
u8 mbdata[64];
u8 mblen=0;
void UART2_Init(u32 bound)
{
float temp;
u16 mantissa;
u16 fraction;
temp=(float)(36*1000000)/(bound*16);//????USARTDIV
mantissa=temp; //??????????·?
fraction=(temp-mantissa)*16; //??????????·?
mantissa<<=4;
mantissa+=fraction;
RCC->APB2ENR|=1<<2; //????PORTA???±??
GPIOA->CRL&=0XFFFF000F; //IO×????è??
GPIOA->CRL|=0X00008B30; //IO×????è??
RCC->APB1ENR|=1<<17; //?????®???±??
RCC->APB1RSTR|=1<<17; //?????®??3
RCC->APB1RSTR&=~(1<<17);//????????
USART2->BRR=mantissa; // ?¨?????è??
USART2->CR1|=0X340C; //1??????
USART2->CR1|=1<<8; //PE????????
USART2->CR1|=1<<5; //??????????·???????????
MY_NVIC_Init(1,3,USART2_IRQChannel,2);//×é2??×?????????
}
void UART2_Transmit(u8*buf,u8 len)
{
u8 t;
for(t=0;t<len;t++)
{ //???··???????
while((USART2->SR&0X40)==0)
; //????·????á??
USART2->DR=buf[t];
}
while((USART2->SR&0X40)==0)
; //????·????á??
UART2_RX_CNT=0;
}
/**************************************************************************
**************************************************************************/
void USART2_IRQHandler(void)
{
u8 res2;
if(USART2->SR&(1<<5))
{//??????????
res2=USART2->DR;
uart2_end_sign=0;
if(UART2_RX_CNT<64)
{
UART2_RX_BUF[UART2_RX_CNT]=res2; //??????????????
UART2_RX_CNT++; //????????????1
}
}
}
/**************************************************************************
**************************************************************************/
//?¨?±?÷2????·??????ò
void TIM2_IRQHandler(void)//?¨?±1ms????
{
if(TIM2->SR&0X0001)
{//????????
if(uart3_end_sign<2)
{
uart3_end_sign++;
}
if(uart2_end_sign<2)
{
uart2_end_sign++;
}
}
TIM2->SR&=~(1<<0);//????????±ê????
}
/**************************************************************************
?ù±??¨?±?÷2??????????,arr??×?????×°??,psc???±???¤·?????,1ms????
**************************************************************************/
void TIM2_Init(void)
{
RCC->APB1ENR|=1; //TIM2?±??????
TIM2->ARR=9; //?è?¨?????÷×?????×°??
TIM2-> SC=7199; //?¤·????÷
TIM2->DIER|=1;// ???í?ü??????
TIM2->CR1|=0X01;// TIM2????
MY_NVIC_Init(3,3,TIM2_IRQChannel,2);
}
/**************************************************************************
**************************************************************************/
void UART3_Init(u32 bound)
{
float temp;
u16 mantissa;
u16 fraction;
temp=(float)(36*1000000)/(bound*16);//????USARTDIV
mantissa=temp; //??????????·?
fraction=(temp-mantissa)*16; //??????????·?
mantissa<<=4;
mantissa+=fraction;
RCC->APB2ENR|=1<<3; //????PORTB???±??
GPIOB->CRH&=0XFFFF00FF; //IO×????è??
GPIOB->CRH|=0X00008B00; //IO×????è?? 1000
// RCC->APB2ENR|=1<<2; //????PORTA???±??
// GPIOA->CRL&=0XFFFFff0F; //IO×????è??
// GPIOA->CRL|=0X00000030; //IO×????è??
RCC->APB1ENR|=1<<18; //?????®???±??
RCC->APB1RSTR|=1<<18; //?????®??3
RCC->APB1RSTR&=~(1<<18);//????????
USART3->BRR=mantissa; // ?¨?????è??
USART3->CR1|=0X340C; //1??????
USART3->CR1|=1<<8; //PE????????
USART3->CR1|=1<<5; //??????????·???????????
MY_NVIC_Init(2,3,USART3_IRQChannel,2);//×é2
}
/**************************************************************************
·???len??×???,buf:·??????×???·,len:·?????×?????
**************************************************************************/
void UART3_Transmit(u8*buf,u8 len)
{
u8 t;
for(t=0;t<len;t++)
{ //???··???????
while((USART3->SR&0X40)==0)
; //????·????á??
USART3->DR=buf[t];
}
while((USART3->SR&0X40)==0)
; //????·????á??
UART3_RX_CNT=0;
}
/**************************************************************************
**************************************************************************/
void USART3_IRQHandler(void)
{
u8 res,i;
if(USART3->SR&(1<<5))
{//??????????
res=USART3->DR;
uart3_end_sign=0;
if(UART3_RX_CNT==0)
{
for(i=0;i<64;i++)
{
UART3_RX_BUF=0;
}
}
if(UART3_RX_CNT<64)
{
UART3_RX_BUF[UART3_RX_CNT]=res; //??????????????
UART3_RX_CNT++; //????????????1
}
}
}
int main(void)
{
u8 i;
Stm32_Clock_Init(9); //?????±???è??
delay_init(72); //???±??????
TIM2_Init();
UART2_Init(19200);
UART3_Init(19200);
while(1)
{
if((uart3_end_sign==2)&&(UART3_RX_CNT>4))//指当新帧距上次帧已有2ms,且UART3_RX_CNT的值大于4,防止出现干扰
{
for(i=0;i<UART3_RX_CNT;i++)
{
mbdata=UART3_RX_BUF;
}
mblen=UART3_RX_CNT;
UART3_Transmit(mbdata,mblen);
UART2_Transmit(mbdata,mblen);
UART3_RX_CNT=0;
}
}
}
|
|