本帖最后由 鹤斌 于 2019-2-28 14:10 编辑
由官方程序修改而来改用串口2没问题,串口2代码如下
void uart2_init(u32 pclk1,u32 bound)
{
float temp;
u16 mantissa;
u16 fraction;
temp=(float)(pclk1*1000000)/(bound*16);//得到USARTDIV
mantissa=temp; //得到整数部分
fraction=(temp-mantissa)*16; //得到小数部分
mantissa<<=4;
mantissa+=fraction;
RCC->APB2ENR|=1<<2; //使能PORTA口时钟
RCC->APB1ENR|=1<<17; //使能串口2时钟
GPIOA->CRL&=0XFFFF00FF;
GPIOA->CRL|=0X00008B00;//IO状态设置
RCC->APB1RSTR|=1<<17; //复位串口1
RCC->APB1RSTR&=~(1<<17);//停止复位
//波特率设置
USART2->BRR=mantissa; // 波特率设置
USART2->CR1|=0X200C; //1位停止,无校验位.
//使能接收中断
USART2->CR1|=1<<8; //PE中断使能
USART2->CR1|=1<<5; //接收缓冲区非空中断使能
MY_NVIC_Init(3,3,USART2_IRQChannel,2);//组2,最低优先级
}
但改成串口3就不行了,初始化通过了,但在发送数据的时候会卡死在while((USART3->SR&0X40)==0);这一句上。
感觉还是初始化过程出错了。但检查了很多遍都没找到问题。串口3初始化的代码如下
void uart3_init(u32 pclk1,u32 bound)
{
float temp;
u16 mantissa;
u16 fraction;
temp=(float)(pclk1*1000000)/(bound*16);//得到USARTDIV
mantissa=temp; //得到整数部分
fraction=(temp-mantissa)*16; //得到小数部分
mantissa<<=4;
mantissa+=fraction;
RCC->APB2ENR|=1<<3; //使能PORTB口时钟
RCC->APB1ENR|=1<<18; //使能串口3时钟
GPIOB->CRH&=0XFFFF00FF;
GPIOB->CRH|=0X00008B00;//IO状态设置
RCC->APB1RSTR|=1<<18; //复位串口3
RCC->APB1RSTR&=~(1<<18);//停止复位
//波特率设置
USART3->BRR=mantissa; // 波特率设置
USART3->CR1|=0X200C; //1位停止,无校验位.
//使能接收中断
USART3->CR1|=1<<8; //PE中断使能
USART3->CR1|=1<<5; //接收缓冲区非空中断使能
MY_NVIC_Init(3,3,USART3_IRQChannel,2);//组2,最低优先级
}
补充:用jlink调试,在USART2_IRQHandler、USART1_IRQHandler、USART3_IRQHandler下中断,分别用串口助手发送数据来触发接收终端,发现串口3的中断无法触发,所以应该还是串口3初始化时候哪里有错误。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
难怪,我看你程序写得也是挺好的,不应该有问题才对。
一周热门 更多>