打印
[STM32F0]

谁有STM32F051的USART2的例程

[复制链接]
8080|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lr2131|  楼主 | 2014-5-5 20:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用的青风的例程,USART1是没问题的,但是改成USART2就不行,调了很长时间还是找不到原因。

先贴出USART1的例程吧,接受我用的是中断,发送没用中断。
int main(void)
{
    unsigned char i = 3;
   
    USART1_Configuration();

  while (1)
  {
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
    UART1_send_byte(i ++);
  }
}

extern void USART1_Configuration(void)//′??ú3?ê??ˉoˉêy
{
    GPIO_InitTypeDef  GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;

    NVIC_SetPriority(USART1_IRQn, 0); /* (4) */
    NVIC_EnableIRQ(USART1_IRQn); /* (5) */

    RCC_AHBPeriphClockCmd( RCC_AHBPeriph_GPIOA, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE );
            
    GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_1);
    GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_1);        
    /*
    *  USART1_TX -> PA9 , USART1_RX ->  PA10
    */                                
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_10;                 
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);        
   
    USART_InitStructure.USART_BaudRate = 115200;//éè??′??ú2¨ì??ê
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;//éè??êy?Y??
    USART_InitStructure.USART_StopBits = USART_StopBits_1;//éè??í£?1??
    USART_InitStructure.USART_Parity = USART_Parity_No;//éè??D§?é??
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//éè??á÷????
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//éè??1¤×÷?£ê?
    USART_Init(USART1, &USART_InitStructure); //????è??á11ì?

    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
   //USART_ITConfig(USART1, USART_IT_TXE, ENABLE);   
   
    USART_Cmd(USART1, ENABLE);//ê1?ü′??ú1
}

extern void UART1_send_byte(uint8_t byte)
{
    while(!((USART1->ISR)&(1<<7)));
    USART1->TDR=byte;   
}

extern volatile uint8_t USART_Data = 0;

extern void USART1_IRQHandler(void)
{
  if((USART1->ISR & USART_ISR_TC) == USART_ISR_TC)
  {
    USART1->ICR |= USART_ICR_TCCF;/* clear transfer complete flag */
  }
  else if((USART1->ISR & USART_ISR_RXNE) == USART_ISR_RXNE)
  {
    USART_Data = USART1->RDR;/* receive data, clear flag */
  }
  else
  {
    NVIC_DisableIRQ(USART1_IRQn);/* Disable USART1_IRQn */
  }
}

上面的代码是可以的,我用仿真器和逻辑分析仪查过,都是没问题的。

但是对着改USART2就是不行,用逻辑分析仪看,TX都没有输出信号。试过做回环测试,发不出数据,自然也不会收到数据,也就进不了接受中断。

int main(void)
{
    unsigned char i = 3;
   
    USART2_Configuration();

  while (1)
  {
    USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
    UART2_send_byte(i ++);
  }
}

extern void USART2_Configuration(void)//′??ú3?ê??ˉoˉêy
{
    GPIO_InitTypeDef  GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;

    NVIC_SetPriority(USART2_IRQn, 0); /* (4) */
    NVIC_EnableIRQ(USART2_IRQn); /* (5) */

    RCC_AHBPeriphClockCmd( RCC_AHBPeriph_GPIOA, ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE );
            
    GPIO_PinAFConfig(GPIOA,GPIO_PinSource2,GPIO_AF_1);
    GPIO_PinAFConfig(GPIOA,GPIO_PinSource3,GPIO_AF_1);        
    /*
    *  USART2_TX -> PA2 , USART2_RX ->  PA3
    */                                
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3;                 
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);        
   
    USART_InitStructure.USART_BaudRate = 115200;//éè??′??ú2¨ì??ê
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;//éè??êy?Y??
    USART_InitStructure.USART_StopBits = USART_StopBits_1;//éè??í£?1??
    USART_InitStructure.USART_Parity = USART_Parity_No;//éè??D§?é??
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//éè??á÷????
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//éè??1¤×÷?£ê?
    USART_Init(USART2, &USART_InitStructure); //????è??á11ì?

    USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
   //USART_ITConfig(USART2, USART_IT_TXE, ENABLE);   
   
    USART_Cmd(USART2, ENABLE);//ê1?ü′??ú1
}

extern void UART2_send_byte(uint8_t byte)
{
    while(!((USART2->ISR)&(1<<7)));
    USART2->TDR=byte;   
}

extern volatile uint8_t USART_Data = 0;

extern void USART2_IRQHandler(void)
{
  if((USART2->ISR & USART_ISR_TC) == USART_ISR_TC)
  {
    USART2->ICR |= USART_ICR_TCCF;/* clear transfer complete flag */
  }
  else if((USART2->ISR & USART_ISR_RXNE) == USART_ISR_RXNE)
  {
    USART_Data = USART2->RDR;/* receive data, clear flag */
  }
  else
  {
    NVIC_DisableIRQ(USART2_IRQn);/* Disable USART1_IRQn */
  }
}
沙发
mmuuss586| | 2014-5-5 20:33 | 只看该作者
加上:
USART_DeInit(USART1);
USART_DeInit(USART2);

使用特权

评论回复
板凳
lr2131|  楼主 | 2014-5-7 13:08 | 只看该作者
mmuuss586 发表于 2014-5-5 20:33
加上:
USART_DeInit(USART1);
USART_DeInit(USART2);

我试试

使用特权

评论回复
地板
lr2131|  楼主 | 2014-5-7 15:09 | 只看该作者
mmuuss586 发表于 2014-5-5 20:33
加上:
USART_DeInit(USART1);
USART_DeInit(USART2);

试过了,还是不行。

使用特权

评论回复
5
lr2131|  楼主 | 2014-5-19 17:44 | 只看该作者
问题已解决,测试的方法不对。

使用特权

评论回复
6
zhuri_1| | 2014-5-22 13:27 | 只看该作者
lr2131 发表于 2014-5-19 17:44
问题已解决,测试的方法不对。

我也是同样的问题啊, 用示波器看USART2的TX 都没有输出,配置和楼主的一样,请问是怎么解决的,谢谢

使用特权

评论回复
7
lr2131|  楼主 | 2014-5-22 13:45 | 只看该作者
zhuri_1 发表于 2014-5-22 13:27
我也是同样的问题啊, 用示波器看USART2的TX 都没有输出,配置和楼主的一样,请问是怎么解决的,谢谢  ...

我的已经解决了,代码是没有问题的。

我的是测试串口的方法不对,不能在接受中断中加断点,外部串口还不停的发送。

不然的话,在断点处,程序停下来,但硬件的RxFIFO,没有停止,下次进这个中断就变成了FIFO溢出中断。
在接受中断里面用局部静态变量记录下进入的次数就知道,其实每次都是正常的进入。

使用特权

评论回复
8
lr2131|  楼主 | 2014-5-23 16:31 | 只看该作者
zhuri_1 发表于 2014-5-22 13:27
我也是同样的问题啊, 用示波器看USART2的TX 都没有输出,配置和楼主的一样,请问是怎么解决的,谢谢  ...

1.你先查查你用示波器测的是不是TX,另外注意看看电平对不对
2.外部可能没有上拉电阻。

代码的话,应该是没问题,多查查硬件吧

使用特权

评论回复
9
880705lpdhr| | 2015-11-12 14:28 | 只看该作者
mark

使用特权

评论回复
10
xingnaipeng| | 2016-1-19 10:12 | 只看该作者
我的也不能用啊,楼主怎么解决的?

使用特权

评论回复
11
xingnaipeng| | 2016-1-19 10:13 | 只看该作者
zhuri_1 发表于 2014-5-22 13:27
我也是同样的问题啊, 用示波器看USART2的TX 都没有输出,配置和楼主的一样,请问是怎么解决的,谢谢  ...

我的也不能用啊,你是怎么解决的?

使用特权

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

本版积分规则

11

主题

203

帖子

0

粉丝