打印
[STM32L0]

大家帮看看直接寄存器配置STM32L05X的USART2对不对

[复制链接]
1619|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
mochou|  楼主 | 2017-10-11 09:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
__INLINE void Configure_GPIO_USART2(void)
{
  /* Enable the peripheral clock of GPIOA */
  RCC->IOPENR |= RCC_IOPENR_GPIOAEN;
       
  /* GPIO configuration for USART1 signals */
  /* (1) Select AF mode (10) on PA2 and PA3 */
  /* (2) AF4 for USART2 signals */
  GPIOA->MODER = (GPIOA->MODER & ~(GPIO_MODER_MODE2|GPIO_MODER_MODE3))\
                 | (GPIO_MODER_MODE2_1 | GPIO_MODER_MODE3_1); /* (1) */
  GPIOA->AFR[0] = (GPIOA->AFR[0] &~ (0x0000FF00))\
                  | (4 << (2 * 4)) | (4 << (3 * 4)); /* (2) */
}
/**
  * Brief   This function configures USART2.
  * Param   None
  * Retval  None
  * add by ljy 171002
  */
__INLINE void Configure_USART2(void)
{
  /* Enable the peripheral clock USART1 */
  RCC->APB1ENR |= RCC_APB1ENR_USART2EN;

  /* Configure USART2 */
  /* (1) oversampling by 16, 9600 baud */
  /* (2) Enable DMA in reception and transmission */
  /* (3) 8 data bit, 1 start bit, 1 stop bit, no parity, reception and transmission enabled */
  USART2->BRR = 160000 / 96; /* (1) */
  //USART2->CR3 = USART_CR3_DMAT | USART_CR3_DMAR; /* (2) */  暂时不使用DMA
  
  USART2->CR1 = USART_CR1_TE | USART_CR1_RXNEIE| USART_CR1_RE | USART_CR1_UE; /* (3) */
  
  while((USART2->ISR & USART_ISR_TC) != USART_ISR_TC)/* polling idle frame Transmission */
  {
    /* add time out here for a robust application */
  }
  USART2->ICR = USART_ICR_TCCF;/* Clear TC flag */
  
  // interrupt mode 1002 ljy
  USART2->CR1 |= USART_CR1_TCIE;/* enable TC interrupt */
  
  /* Configure IT */
  /* (4) Set priority for USART1_IRQn */
  /* (5) Enable USART1_IRQn */
  NVIC_SetPriority(USART2_IRQn, 0); /* (4) */
  NVIC_EnableIRQ(USART2_IRQn); /* (5) */
}

以上是基于STM32L05X系统寄存器库直接配置USART2,通过测试发现没有数据发出,也没有数据接收,大家帮看下配置哪里有问题。
沙发
wanduzi| | 2017-10-11 10:00 | 只看该作者
没有数据,肯定是不对了。

使用特权

评论回复
板凳
wanduzi| | 2017-10-11 10:02 | 只看该作者
一、STM32L05x 中断串口注意事项




一、总进UART中断

1、问题描述:

没有向单片机发数据,但接收中断中
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)         
          {   
           RxData = USART_ReceiveData(USART2);
        USART_ClearFlag(USART2,USART_FLAG_RXNE);        
                  }
每次可以到if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
这一句,但是到不了RxData = USART_ReceiveData(USART2);这一句。也就是进入了中断。

2、解决方法

在中断最前面加上

if((USART1->ISR & USART_ISR_ORE) == USART_ISR_ORE){
USART1->ICR = USART_ICR_ORECF;/* clear OverRun flag */
}

使用特权

评论回复
地板
wanduzi| | 2017-10-11 10:02 | 只看该作者
网上找的相关资料,不知道对你这个有用没啊

使用特权

评论回复
5
wanduzi| | 2017-10-11 10:11 | 只看该作者
二、DMA中断使用注意事项




一、总进DMA中断

1、问题描述

DMA在使用循环取数据(DMA_CIRCULAR)的时候会一直进中断把主函数拖住

2、解决方法

在中断服务函数里面最后增加HAL_ADC_Stop(&AdcHandle)函数,在主程序中增加HAL_ADC_Start(&AdcHandle)函数

使用特权

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

本版积分规则

58

主题

1426

帖子

8

粉丝