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

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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版