你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

746 Nucleo板子上添加UART初始化代码,不发生接收中断

[复制链接]
david_wzn 提问时间:2017-10-18 11:03 /
本帖最后由 david_wzn 于 2017-10-18 11:04 编辑

我在用746 Nucleo板子作串口实验,用下面这个工程:

D:\work\STM32CubeF7\STM32Cube_FW_F7_V1.7.0\Projects\STM32F746ZG-Nucleo\Examples\UART\UART_Printf\EWARM

uart初始化代码改成 ,我用UART3:

void HAL_UART_MspInit(UART_HandleTypeDef *huart)
{
  GPIO_InitTypeDef  GPIO_InitStruct;

  RCC_PeriphCLKInitTypeDef RCC_PeriphClkInit;

  /*##-1- Enable peripherals and GPIO Clocks #################################*/
  /* Enable GPIO TX/RX clock */
  USARTx_TX_GPIO_CLK_ENABLE();
  //USARTx_RX_GPIO_CLK_ENABLE();

  /* Select SysClk as source of USART1 clocks */
  RCC_PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1;
  RCC_PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_SYSCLK;
  HAL_RCCEx_PeriphCLKConfig(&RCC_PeriphClkInit);

  /* Enable USARTx clock */
  USARTx_CLK_ENABLE();

  /*##-2- Configure peripheral GPIO ##########################################*/
  /* UART TX GPIO pin configuration  */
  GPIO_InitStruct.Pin       = USARTx_TX_PIN;
  GPIO_InitStruct.Mode      = GPIO_MODE_AF_PP;
  GPIO_InitStruct.Pull      = GPIO_PULLUP;
  GPIO_InitStruct.Speed     = GPIO_SPEED_FREQ_VERY_HIGH;
  GPIO_InitStruct.Alternate = USARTx_TX_AF;

  HAL_GPIO_Init(USARTx_TX_GPIO_PORT, &GPIO_InitStruct);

  /* UART RX GPIO pin configuration  */
  GPIO_InitStruct.Pin = USARTx_RX_PIN;
  GPIO_InitStruct.Alternate = USARTx_RX_AF;

  HAL_GPIO_Init(USARTx_RX_GPIO_PORT, &GPIO_InitStruct);

  HAL_NVIC_SetPriority(USARTx_IRQn,0,1);  
  HAL_NVIC_EnableIRQ(USARTx_IRQn);  


}


在main文件中加了回调函数:
/**
  * @brief Rx Transfer completed callbacks
  * @param huart: uart handle
  * @retval None
  */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
                UartReady = SET;
}


main() 函数里增加了 接收判断函数;
UartHandle.Instance        = USARTx;

  UartHandle.Init.BaudRate   = 9600;
  UartHandle.Init.WordLength = UART_WORDLENGTH_8B;
  UartHandle.Init.StopBits   = UART_STOPBITS_1;
  UartHandle.Init.Parity     = UART_PARITY_ODD;
  UartHandle.Init.HwFlowCtl  = UART_HWCONTROL_NONE;
  UartHandle.Init.Mode       = UART_MODE_TX_RX;
  UartHandle.Init.OverSampling = UART_OVERSAMPLING_16;
  if (HAL_UART_Init(&UartHandle) != HAL_OK)
  {
    /* Initialization Error */
    Error_Handler();
  }
        printf("\n\r UART Printf Example: retarget the C library printf function to the UART\n\r");
  printf("** Test finished successfully. ** \n\r");
        UartReady = RESET;
        
        if( HAL_UART_Receive_IT(&UartHandle , aRxBuffer, 30) != HAL_OK)
        {
                 Error_Handler();
        }
        UartReady = RESET;
        while (UartReady != SET)
        {
                BSP_LED_On(LED2);
                HAL_Delay(100);
                BSP_LED_Off(LED2);
                HAL_Delay(100);
                BSP_LED_On(LED2);
                HAL_Delay(100);
                BSP_LED_Off(LED2);
                HAL_Delay(500);
        }
        
        UartReady = RESET;
        BSP_LED_Off(LED2);


启动程序后, 断点放在最后两行, 无论用超级终端怎么发数据, 都无法跳出上面的while 循环。


如果谁有 746Nucleo板子的中断方式发送和接收的工程, 共享出来学习一下。 谢谢!

收藏 评论3 发布时间:2017-10-18 11:03

举报

3个回答
wenyangzeng 回答时间:2017-10-18 11:39:53
本帖最后由 wenyangzeng 于 2017-10-18 11:41 编辑

main()函数中需要加入:
__HAL_UART_ENABLE_IT(&UartHandle,UART_IT_RXNE);

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

david_wzn 回答时间:2017-10-18 16:49:01
我把这个语句加到

if( HAL_UART_Receive_IT(&UartHandle , aRxBuffer, 30) != HAL_OK)
前面, 刚编译下载后 ,超级终端中发送数据, 还是不能中断。一直在循环里。

有没有观察中断寄存器的工具啊?
david_wzn 回答时间:2017-10-18 17:31:17
刚在IAR上捕获到寄存器,如图。 请大神帮看一下还有什么没启动?
捕获.JPG

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版