代码是按照USART1修改的,USART1通讯正常,但是改为UART5,图中是利用串口调试助手,将收到的70字节数据,一模一样的发送出来,但是串口调试助手收到的数据不对。
在线调试时,UART5接收的数据不对,导致发送出去的数据有误。
各位大神,帮我看看,我这里问题出在哪里,我是直接焊了两根线将UART5的RX和TX与串口工具连接。
void uart_init(u32 pclk2,u32 bound)
{
float temp;
u16 mantissa;
u16 fraction;
temp=(float)(pclk2*1000000)/(bound*16);//得到USARTDIV@OVER8=0
mantissa=temp; //得到整数部分
fraction=(temp-mantissa)*16; //得到小数部分@OVER8=0
mantissa<<=4;
mantissa+=fraction;
RCC->AHB1ENR|=1<<2; //使能PORTC口时钟
RCC->AHB1ENR|=1<<3; //使能PORTD口时钟
RCC->APB1ENR|=1<<20; //使能串口5时钟
RCC->APB1RSTR |= 1<<20; //复位串口5
RCC->APB1RSTR &= ~(1<<20);//停止复位串口5
GPIO_Set(GPIOC,PIN12,GPIO_MODE_AF,0,GPIO_SPEED_50M,GPIO_PUPD_PU);
GPIO_Set(GPIOD,PIN2,GPIO_MODE_AF,0,GPIO_SPEED_50M,GPIO_PUPD_PU);
GPIO_AF_Set(GPIOC,12,8); //PC12,AF8
GPIO_AF_Set(GPIOD,2,8);//PD2,AF8
//波特率设置
UART5->BRR=mantissa; //波特率设置
UART5->CR1&=~(1<<15); //设置OVER8=0
UART5->CR1&=~(1<<12); //1 起始位,8 数据位,n 停止位
UART5->CR1&=~(1<<10); //关闭奇偶校验
UART5->CR2&=~(1<<13);
UART5->CR2&=~(1<<12); //1个停止位
UART5->CR1|=1<<3; //串口发送使能
UART5->CR1|=1<<2; //串口接收使能
UART5->CR1|=1<<5; //接收缓冲区非空中断使能
MY_NVIC_Init(2,0,UART5_IRQn,1);//组2,最低优先级
UART5->CR1|=1<<13; //串口使能
USART_RX_STA=0; //清零
}
void Usart_Send_Data(u8 *buf,u16 len)
{
u8 t;
for(t=0;t<len;t++) //循环发送数据
{
while((UART5->SR&0X40)==0);//等待发送结束
UART5->DR=buf[t];
}
while((UART5->SR&0X40)==0);//等待发送结束
}
void UART5_IRQHandler(void)
{
u8 res;
if(UART5->SR&(1<<5))//接收到数据
{
TIM3->SR&=~(1<<0);//清除中断标志位
USART_RX_BUF[USART_RX_STA]=UART5->DR;
TIM3->ARR = 500; //50ms
MY_NVIC_Init(1,0,TIM3_IRQn,1); //抢占1,子优先级3,组2
TIM3->CR1|=0x01; //使能定时器3
USART_RX_STA++;
if(USART_RX_STA==70)
{
Usart_Send_Data(USART_RX_BUF,USART_RX_STA);
USART_RX_STA = 0;
UART5->SR &= ~(1<<5);
}
}
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
已经找到原因了,UART5是用的PCLK1,USART1用的PCLK2,导致波特率设置错误。
一周热门 更多>