前段时间刚刚拿到原子战舰版的STM32开发版,在配置串口4和串口5时,接收不到数据,发送没有测试,程序如下:
//串口4
void UART4_IRQHandler(void)
{
u16 res,temp;
if(UART4->SR&(1<<5))//接收到数据
{
res=UART4->DR;
temp=res&0xf0;
if(temp==0x80)
{
}else if(temp==0x00)
{
temp=res&0x0f;
temp<<=4;
EAST_L&=0xff0f;
EAST_L|=temp;
}else if(temp==0x10)
{
temp=res&0x0f;
temp<<=6;
EAST_H&=0xfC3f;
EAST_H|=temp;
}
}
}
//初始化IO 串口4
//pclk2 CLK2时钟频率(Mhz)
//bound:波特率
//CHECK OK
void uart4_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<<4; //使能PORTC口时钟
RCC->APB1ENR|=1<<19; //使能串口3时钟
GPIOC->CRH&=0XFFFF00FF;//IO状态设置 PC10->TX PC11->RX
GPIOC->CRH|=0X00004B00;//IO状态设置
RCC->APB1RSTR|=1<<19; //复位串口4
RCC->APB1RSTR&=~(1<<19);//停止复位
//波特率设置
UART4->BRR=mantissa; // 波特率设置
UART4->CR1|=0X200C; //1位停止,无校验位.
#ifdef EN_USART1_RX //如果使能了接收
//使能接收中断
UART4->CR1|=1<<8; //PE中断使能
UART4->CR1|=1<<5; //接收缓冲区非空中断使能
MY_NVIC_Init(2,2,UART4_IRQChannel,2);//组2,最低优先级
#endif
}
//串口5
void UART5_IRQHandler(void)
{
u16 res,temp;
if(UART5->SR&(1<<5))//接收到数据
{
res=UART5->DR;
temp=res&0xf0;
if(temp==0x80)
{
}else if(temp==0x00)
{
temp=res&0x0f;
temp<<=4;
NORTH_L&=0xff0f;
NORTH_L|=temp;
}else if(temp==0x10)
{
temp=res&0x0f;
temp<<=6;
NORTH_H&=0xfC3f;
NORTH_H|=temp;
}
}
}
//初始化IO 串口5
//pclk2 CLK2时钟频率(Mhz)
//bound:波特率
//CHECK OK
void uart5_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<<4; //使能PORTC口时钟
RCC->APB2ENR|=1<<5; //使能PORTD口时钟
RCC->APB1ENR|=1<<20; //使能串口3时钟
GPIOC->CRH&=0XFFF0FFFF;//IO状态设置 PC12->TX PD2->RX
GPIOC->CRH|=0X000B0000;//IO状态设置
GPIOD->CRL&=0XFFFFF0FF;//IO状态设置 PC12->TX PD2->RX
GPIOD->CRL|=0X00000400;//IO状态设置
RCC->APB1RSTR|=1<<20; //复位串口4
RCC->APB1RSTR&=~(1<<20);//停止复位
//波特率设置
UART5->BRR=mantissa; // 波特率设置
UART5->CR1|=0X200C; //1位停止,无校验位.
#ifdef EN_USART1_RX //如果使能了接收
//使能接收中断
UART5->CR1|=1<<8; //PE中断使能
UART5->CR1|=1<<5; //接收缓冲区非空中断使能
MY_NVIC_Init(3,3,UART5_IRQChannel,1);//组2,最低优先级
#endif
} |