本帖最后由 ZLI 于 2019-4-2 17:20 编辑
//////////////////////////////////////////////////////////////////
//******************************************************************
//串口3接收函数
//****************************************************************
#if EN_USART3_RX //如果使能了接收
u8 USART3_RX_BUF[USART3_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节.
u16 USART3_RX_STA=0; //接收状态标记
void USART3_IRQHandler(void)
{
#if SYSTEM_SUPPORT_OS //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
OSIntEnter();
#endif
if(USART3->SR&(1<<5)) //接收到数据
{
Uart3_Rec(USART3->DR);
}
#if SYSTEM_SUPPORT_OS //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
OSIntExit();
#endif
}
#endif
//**********************************************
//初始化IO 串口3
//pclk2
CLK2时钟频率(Mhz)
//bound:波特率
//***********************************************
void uart3_init(u32 pclk2,u32 bound)
{
float temp;
u16 mantissa;
u16 fraction;
temp=(float)(pclk2*1000000)/(bound*16);//得到USARTDIV
mantissa=temp; //得到整数部分
fraction=(temp-mantissa)*16; //得到小数部分
mantissa<<=4;
mantissa+=fraction;
RCC->APB2ENR|=1<<3; //使能PORTB口时钟 PB10,11
RCC->APB1ENR|=1<<18; //使能串口3时钟
GPIOB->CRH&=0XFFFF00FF;//IO状态设置
GPIOB->CRH|=0X00008B00;//IO状态设置
RCC->APB1RSTR|=1<<18; //复位串口3
RCC->APB1RSTR&=~(1<<18);//停止复位
//波特率设置
USART3->BRR=mantissa; // 波特率设置
USART3->CR1|=0X200C; //1位停止,无校验位.
#if EN_USART3_RX //如果使能了接收
//使能接收中断
USART3->CR1|=1<<5; //接收缓冲区非空中断使能
MY_NVIC_Init(3,3,USART3_IRQn,2);//组2,最低优先级
#endif
}
//***************************************
//
#include"protocol.h"
#include "uart3.h"
u8 Rx3_flag1 = 0;
u8 Cmd,Range;
u8 Cmd_R,Cmd_L,Range_R,Range_L;
u8 Rx3_rec[6] ={0};
void Uart3_Rec(u8 rec)
{
if((Rx3_flag1 == 0)&&(rec == 0xCD))
{
Rx3_rec[Rx3_flag1] = rec;
Rx3_flag1 ++;
}
else if(Rx3_flag1 == 1&&rec == 0xEB )
{
Rx3_rec[Rx3_flag1] = rec;
Rx3_flag1 ++;
}
else if(Rx3_flag1 == 2&&rec == 0xD7 )
{
Rx3_rec[Rx3_flag1] = rec;
Rx3_flag1 ++;
}
else if(Rx3_flag1 == 3&&rec == 0x02 )
{
Rx3_rec[Rx3_flag1] = rec;
Rx3_flag1 ++;
}
else if(Rx3_flag1 >= 4 && Rx3_flag1 < 6)
{
Rx3_rec[Rx3_flag1] = rec;
Rx3_flag1 ++;
}
else
{
Rx3_flag1 =0;
}
}
已解决,又积累一点经验主要是因为我把时钟搞错了,除了串口1的时钟是72M,其他的时钟都是36M,
还有就是我用串口助手发送16进制的数时候没有点选“以16进制”发送
一周热门 更多>