stm32F1串口4寄存器操作的bug

2019-07-21 06:16发布

本帖最后由 sbkd123 于 2018-12-31 10:28 编辑

串口4仿照例程操作不能工作,经反复调试终于发现解决办法。直接上程序。[mw_shl_code=c,true]void UART4_Init(u32 pclk1,u32 bound)
{           
        float temp;
        u16 mantissa;
        u16 fraction;
  uint32_t usartxbase = USART1_BASE+0x14;//USART1->CR3地址
          USART1->CR1 |= 0x4;                      //打开了USART1的RX
        *(__IO uint32_t*)usartxbase  |= 0x20;//打开了USART1的RXNE
        
        temp=(float)(pclk1*1000000)/(bound*16);//得到USARTDIV
        mantissa=temp;                                 //得到整数部分
        fraction=(temp-mantissa)*16; //得到小数部分         
  mantissa<<=4;
        mantissa+=fraction;
                 
        RCC->APB2ENR|=1<<4;           //使能PORTC口时钟
        RCC->APB1ENR|=1<<19;          //使能串口4时钟
        
        GPIOC->CRH&=0XFFFFF0FF;
        GPIOC->CRH|=0X00000B00;
        GPIOC->CRH&=0XFFFF0FFF;
        GPIOC->CRH|=0X00004000;
        
        MY_NVIC_Init(0,0,UART4_IRQn,4);//组4,最低优先级
        
        RCC->APB1RSTR|=1<<19;   //复位串口4
        RCC->APB1RSTR&=~(1<<19);//停止复位        
        
        UART4->CR1|=0X0C;          //1位停止,无校验位.
#ifdef EN_USART4_RX                          //如果使能了接收
        //使能接收中断  
        UART4->CR1|=1<<8;            //PE中断使能
        UART4->CR1|=1<<5;            //接收缓冲区非空中断使能
        UART4->CR1 |= 0x20;

#endif
        UART4->BRR=mantissa;         // 波特率设置
        
  UART4->CR1 |= 0x2000;
}[/mw_shl_code]

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
2条回答
sbkd123
1楼-- · 2019-07-21 07:49
6,7,8行操作了串口1,但是不加这三行,串口4就不能运行。个人认为是bug。还请高手指点。
peng1554
2楼-- · 2019-07-21 10:34
帮顶~~

一周热门 更多>