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

STM32F103RCT6的UART5能收不能发

[复制链接]
shipeng1989 提问时间:2020-7-24 11:50 /
最近有项目需要用到STM32F103RCT6的USART1,UART4,UART5。其中USART1和UART4采用DMA方式收发且都能正常工作,唯独这个UART5死活就是能收不能发。而更诡异的是总共焊了5块样板,相同的烧录文件其中有2块UART5可以正常收发另外3块UART5能收不能发。进一步查找原因发现将2块正常的样板和3块不正常的样板交换单片机IC后,发现问题出在单片机IC上,2台正常的样板现在不正常了,而换了IC的2块原来异常的板也正常了。
以下是我的初始化源代码:

  1. void UART45_Init(void)
  2. {
  3.         //GPIO端口设置
  4.         GPIO_InitTypeDef GPIO_InitStructure;
  5.         USART_InitTypeDef USART_InitStructure;
  6.         DMA_InitTypeDef DMA_InitStructure;
  7.         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);

  8.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4|RCC_APB1Periph_UART5, ENABLE);

  9.         USART_DeInit(UART4);
  10.          //UART45_TX
  11.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_12;
  12.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  13.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  14.     GPIO_Init(GPIOC, &GPIO_InitStructure);

  15.     //UART4_RX
  16.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
  17.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  18.     GPIO_Init(GPIOC, &GPIO_InitStructure);
  19.     //UART5_RX
  20.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
  21.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  22.         GPIO_Init(GPIOD, &GPIO_InitStructure);
  23.    //USART 初始化设置

  24.         USART_InitStructure.USART_BaudRate = 9600;
  25.         USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  26.         USART_InitStructure.USART_StopBits = USART_StopBits_1;
  27.         USART_InitStructure.USART_Parity = USART_Parity_No;
  28.         USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  29.         USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

  30.     USART_Init(UART4, &USART_InitStructure);
  31.     USART_Init(UART5, &USART_InitStructure);
  32.     USART_ITConfig(UART4, USART_IT_IDLE, ENABLE);
  33.     USART_ITConfig(UART5, USART_IT_IDLE, ENABLE);
  34.     USART_ITConfig(UART5, USART_IT_RXNE, ENABLE);
  35.     USART_Cmd(UART4, ENABLE);
  36.     USART_Cmd(UART5, ENABLE);

  37.         DMA_DeInit(DMA2_Channel3);
  38.         DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&UART4->DR;
  39.         DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)(u4rxd_array);
  40.         DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
  41.         DMA_InitStructure.DMA_BufferSize = sizeof(u4rxd_array);
  42.         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  43.         DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  44.         DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
  45.         DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
  46.         DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
  47.         DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;
  48.         DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
  49.         DMA_Init(DMA2_Channel3, &DMA_InitStructure);

  50.         DMA_ITConfig(DMA2_Channel3, DMA_IT_TC, ENABLE);

  51.         USART_DMACmd(UART4, USART_DMAReq_Rx, ENABLE);
  52.         DMA_Cmd (DMA2_Channel3,ENABLE);

  53.     DMA_DeInit(DMA2_Channel5);
  54.         DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&UART4->DR;
  55.         DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)(u4txd_array);
  56.         DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
  57.         DMA_InitStructure.DMA_BufferSize = 0;
  58.         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  59.         DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  60.         DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
  61.         DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
  62.         DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
  63.         DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;
  64.         DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
  65.         DMA_Init(DMA2_Channel5, &DMA_InitStructure);

  66.         DMA_ITConfig(DMA2_Channel5, DMA_IT_TC, DISABLE);

  67.         USART_DMACmd(UART4, USART_DMAReq_Tx, ENABLE);
  68.         DMA_Cmd (DMA2_Channel5,DISABLE);
  69. }
复制代码
debug发现不正常的样板向UART5->DR写数据其值不会发生变化,请高人指点一下@香水城
收藏 评论4 发布时间:2020-7-24 11:50

举报

4个回答
butterflyspring 回答时间:2020-8-6 17:44:07
这就奇怪了,既然部分产品可以,说明软件大体上没问题。最好单独测试串口5,先测试IO引脚是否输出,确定硬件连接通过,再用单独测试串口5 的软件,保证配置寄存器内容正确
回答时间:2020-8-7 08:55:07
uar5是直接连接到串口吗?还是过了232这类芯片。建议检测IO波形,如果波形正常,说明是后面的电路的问题,再一步一步的排查,可能是电平转换芯片那边有虚焊或者漏焊的。
Tcreat 回答时间:2020-8-7 13:23:03
话说会不是买到炸弹货了  有的芯片好 有的芯片坏的
shipeng1989 回答时间:2020-8-18 08:30:51
没办法最后还是放弃了UART5改用USART3就没有问题了

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版