打印
[STM32F1]

串口1工作正常~串口2进去之后不能出来了。帮找找问题啊

[复制链接]
1453|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
阮天宇00|  楼主 | 2014-1-26 14:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
主函数:
main{}
{
u8 test_samnum[10] = {0xAA,0xAA,0xAA,0x96,0x69,0x00,0x03,0x12,0xFF,0xEe};
Stm32_Clock_Init(9); //系统时钟设置
        delay_init(72); //延时初始化
        uart1_init(72,115200); //串口初始化为
        uart2_init(72,115200);
        LED_Init(); //初始化与LED连接的硬件接口
        while(1)
        {
                uart1_send(10,test_samnum);

                uart2_send(10,test_samnum);





                while(USART_RX_STA==0x01)
                {
                        if(test_simnum()==success)
                        LED1=!LED1;
                        USART_RX_STA=0x00 ;       
                }

                delay_ms(100);
                LED0=!LED0;
                                               
        }
}
}
沙发
阮天宇00|  楼主 | 2014-1-26 14:04 | 只看该作者
void uart1_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<<2;   //使能PORTA口时钟  
        RCC->APB2ENR|=1<<14;  //使能串口时钟
        GPIOA->CRH&=0XFFFFF00F;
        GPIOA->CRH|=0X000008B0;//IO状态设置
                  
        RCC->APB2RSTR|=1<<14;   //复位串口1
        RCC->APB2RSTR&=~(1<<14);//停止复位                     
        //波特率设置
        USART1->BRR=mantissa; // 波特率设置         
        USART1->CR1|=0X200C;  //1位停止,无校验位.

        #ifdef EN_USART1_RX                  //如果使能了接收
                //使能接收中断
                USART1->CR1|=1<<8;    //PE中断使能
                USART1->CR1|=1<<5;    //接收缓冲区非空中断使能                   
                MY_NVIC_Init(3,3,USART1_IRQChannel,2);//组2,最低优先级
        #endif
}
void uart2_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<<2;   //使能PORTA口时钟  
        RCC->APB1ENR|=1<<17;  //使能串口2时钟
         
        GPIOA->CRL&=0XFFFF00FF;
        GPIOA->CRL|=0X00008B00;//IO状态设置
       
        RCC->APB1RSTR|=1<<17;        //复位串口2
        RCC->APB1RSTR&=~(1<<17);//停止复位,uart3 bit18
       
        USART2->BRR=mantissa; // 波特率设置         
        USART2->CR1|=0X200C;  //1位停止,无校验位.

        #ifdef EN_USART2_RX                  //如果使能了接收
                //使能接收中断
                USART2->CR1|=1<<8;    //PE中断使能
                USART2->CR1|=1<<5;    //接收缓冲区非空中断使能                   
                MY_NVIC_Init(2,2,USART2_IRQChannel,2);//
        #endif
}
u8 uart1_send(u8 clength,u8 *table)
{
        u8 *send;

        send=table;

        if(clength==0)
        return 0;
       
        while(clength--)
        {
                 USART1->DR=*send++;
                while((USART1->SR&0X40)==0);
        }
        return 1;
}
u8 uart2_send(u8 clength,u8 *table)
{
        u8 *send;

        send=table;



        if(clength==0)
        return 0;

        while(clength--)
        {
                 USART2->DR=*send++;
                while((USART2->SR&0X40)==0);
        }
                       
        return 1;
}

使用特权

评论回复
板凳
阮天宇00|  楼主 | 2014-1-26 17:00 | 只看该作者
自己找到原因了~疯了一天~
2个串口用的时钟不一样~
我勒个去~

使用特权

评论回复
地板
tony1113| | 2014-1-30 20:38 | 只看该作者
你看看你使用的启动文件,如果选小了是没有其他的资源。

  这几个是代表Flash容量的
   ld   Low-density         小容量   16-32K         
   md   Medium-density      中容量   64-128K         
   hd   High-density        大容量   256-512K
   xl                       超大容量 512-1024K
   这些都是基本型的,包括STM32F101xx, STM32F102xx 和 STM32F103xx

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

38

主题

592

帖子

3

粉丝