关于stm32的uart问题,stm32的串口都是ttl的吧?能和232的直接通信吗?

2019-08-19 16:35发布

是这么个情况:stm32f103rct6使用串口跟另外一个模块通信,这个模块是232的电平,按理说应该不能直接通信的,但是确实是成功了。stm32的tx接的模块的tx。rx接的是模块的rx1、我想问一下ttl和232通信一定要加转换模块?
2、不知道stm32的串口2输出的是232电平还是ttl的,如果这两种电平都能输出,那初始化有什么不同?
3、我老是感觉是串口初始化的问题,stm32的接收中断函数老是不执行(也可能是stm发送指令没成功),
4、求各位大神看看这两个初始化函数有什么不一样,一个是库函数版本的,一个是寄存器版本的。
找了一天了没有找到原因,跪求各位大神了
[mw_shl_code=c,true]void uart2_init(u32 bound){
  //GPIO¶Ë¿úéèÖÃ
  GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
         
        RCC_APB2PeriphClockCmd(RCC_APB1Periph_USART2|RCC_APB2Periph_GPIOA, ENABLE);        //ê1ÄüUSART1£¬GPIOAê±Öó
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
       
                USART_DeInit(USART2);
  
        //USART2_TX   GPIOA.2
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PA.2
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;        //¸′óÃíÆíìêä3ö
  GPIO_Init(GPIOA, &GPIO_InitStructure);//3õê¼»ˉGPIOA.2
   
  //USART2_RX          GPIOA.33õê¼»ˉ
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//PA3
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//éÏà2êäèë
  GPIO_Init(GPIOA, &GPIO_InitStructure);//3õê¼»ˉGPIOA.10 */
       
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);         // éèÖÃÖD¶ÏóÅÏ輶·Ö×é2
  //Usart1 NVIC ÅäÖÃ
  NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2 ;//ÇàÕ¼óÅÏ輶3
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;                //×óóÅÏ輶3
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //IRQí¨μàê1Äü
        NVIC_Init(&NVIC_InitStructure);        //¸ù¾YÖ¸¶¨μÄ2Îêy3õê¼»ˉVIC¼Ä′æÆ÷

       
   //USART 3õê¼»ˉéèÖÃ

        USART_InitStructure.USART_BaudRate = bound;//′®¿ú2¨ìØÂê
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;//×Ö3¤Îa8λêy¾Y¸ñê½
        USART_InitStructure.USART_StopBits = USART_StopBits_1;//ò»¸öí£Ö1λ
        USART_InitStructure.USART_Parity = USART_Parity_No;//ÎTÆæżD£Ñéλ
        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//ÎTó2¼têy¾Yá÷¿ØÖÆ
        USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;        //êÕ·¢Ä£ê½[mw_shl_code=c,true]










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

  USART_Init(USART2, &USART_InitStructure); //3&#245;ê&#188;&#187;ˉ′&#174;&#191;ú1
  USART_ITConfig(USART2,USART_IT_RXNE, ENABLE);//&#191;a&#198;&#244;′&#174;&#191;ú&#189;óêü&#214;D&#182;&#207;
        //USART_ITConfig(USART2,USART_IT_PE, ENABLE);
       
  USART_Cmd(USART2, ENABLE);                    //ê1&#196;ü′&#174;&#191;ú1

}[/mw_shl_code]
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
Sun_Fly
1楼-- · 2019-08-19 16:42
 精彩回答 2  元偷偷看……
北一766炮灰
2楼-- · 2019-08-19 19:11
最下面出来的这几行是库函数版本里的程序,不知道怎么就跑出来了,是我失误
北一766炮灰
3楼-- · 2019-08-19 21:18
顶下
zhanming1990
4楼-- · 2019-08-19 23:15
STM32的串口跟232间通信肯定要经过电平转换的。

一周热门 更多>