STM32
直播中

倪love

11年用户 870经验值
私信 关注
[问答]

关于GD32F450单片机的IrDA时钟初始化问题

为什么GD32F450单片机的IrDA时钟初始化的函数没有被调用呢?是什么原因?怎样去解决?

回帖(1)

王慕涛

2021-11-9 09:11:57
  关于GD32IrDA问题
  最近因为项目涉及到国产化,所以用到了兆易的GD32F450单片机。
  其中用到了串行IrDA(SIR),折腾了几天时间,为了避免大家踩坑,所以总结一下我遇到的问题。
  项目中用到红外收发数据,使用的TFBS4652 收发器。
  一开始我先初始化串口,确保能够正常收发数据之后,然后调用了usart_irda_mode_enable(com);函数使能红外。初始化之后 我用 USB转IrDA 工具,通过我主控板收发数据,发现数据能够正确发送,但是不能接收(进入不了接收中断,RXNE标志位也没有置位)问题就出现再这里,我以为是红外模块部分有问题,所以通过查询资料,利用示波器,发现模块也没有问题,那么问题应该就是在单片机初始化上。
  对照初始化函数,发现有一个IrDA时钟初始化的函数没有调用,调用之后能够正确接收。
  代码如下:
  void gd_eval_com_init(uint32_t com)
  {
  /* enable GPIO clock */
  uint32_t COM_ID;
  if(EVAL_COM1 == com)
  {
  COM_ID = 0U;
  }
  rcu_periph_clock_enable( EVAL_COM_GPIO_CLK);
  /* enable USART clock */
  rcu_periph_clock_enable(COM_CLK[COM_ID]);
  /* connect port to USARTx_Tx */
  gpio_af_set(EVAL_COM_GPIO_PORT, EVAL_COM_AF, COM_TX_PIN[COM_ID]);
  /* connect port to USARTx_Rx */
  gpio_af_set(EVAL_COM_GPIO_PORT, EVAL_COM_AF, COM_RX_PIN[COM_ID]);
  /* configure USART Tx as alternate function push-pull */
  gpio_mode_set(EVAL_COM_GPIO_PORT, GPIO_MODE_AF, GPIO_PUPD_PULLUP,COM_TX_PIN[COM_ID]);
  gpio_output_options_set(EVAL_COM_GPIO_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,COM_TX_PIN[COM_ID]);
  /* configure USART Rx as alternate function push-pull */
  gpio_mode_set(EVAL_COM_GPIO_PORT, GPIO_MODE_AF, GPIO_PUPD_PULLUP,COM_RX_PIN[COM_ID]);
  gpio_output_options_set(EVAL_COM_GPIO_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,COM_RX_PIN[COM_ID]);
  /* USART configure */
  usart_deinit(com);
  usart_baudrate_set(com,9600U);
  usart_stop_bit_set(com, USART_STB_1BIT);
  usart_receive_config(com, USART_RECEIVE_ENABLE);
  usart_transmit_config(com, USART_TRANSMIT_ENABLE);
  usart_irda_lowpower_config(com, USART_IRLP_NORMAL);
  /* 这一句一定要加 */
  usart_prescaler_config(com, 0x01);
  usart_irda_mode_enable(com);
  usart_enable(com);
  /* USART interrupt configuration */
  nvic_irq_enable(UART3_IRQn, 1, 1);
  /* enable USART0 receive interrupt */
  usart_interrupt_enable(UART3, USART_INTEN_RBNEIE);
  // /* enable USART0 transmit interrupt */
  // usart_interrupt_enable(USART0, USART_INTEN_TBEIE);
  }
  第一次发文章,有点啰嗦,希望文章对大家有用,减少大家开发时间。谢谢!
举报

更多回帖

发帖
×
20
完善资料,
赚取积分