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

STM32F407 UART发不出数据

[复制链接]
laoshuchixiang 提问时间:2014-10-28 20:27 /
我用的是PC10和PC11的UART3,配置代码如下:
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
GPIO_PinAFConfig(GPIOC, GPIO_PinSource10, GPIO_AF_USART3);
GPIO_PinAFConfig(GPIOC, GPIO_PinSource11, GPIO_AF_USART3);
  /* Configure USART Tx as alternate function  */
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOC, &GPIO_InitStructure);
  /* Configure USART Rx as alternate function  */
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
  GPIO_Init(GPIOC, &GPIO_InitStructure);

USART_InitStructure.USART_BaudRate =9600; //波特率
USART_InitStructure.USART_WordLength = USART_WordLength_8b; //8 位数据
USART_InitStructure.USART_StopBits = USART_StopBits_1; //停止位
USART_InitStructure.USART_Parity = USART_Parity_No; // 校验方式:无
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;  //硬件流控制失能
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; // 发送/接收使能
  /* Configure and enable the USART */
  USART_Init(USART3, &USART_InitStructure);
  /* Enable the USART Receive interrupt */
  USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);
USART_Cmd(USART3, ENABLE);
  /* Enable USART Interrupt */
  NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);

结果
    USART_SendData(USART3, *(Buf + i) );
    while(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET);
就一直停在这里了,TXE不置位,USART3的DR寄存器一直位0。不知道是什么原因

收藏 评论12 发布时间:2014-10-28 20:27

举报

12个回答
Eagleson 回答时间:2014-10-28 21:27:58
给你一个参考 也是用的USART3

usart.rar

下载

895.98 KB, 下载次数: 603, 下载积分: ST金币 -1

废鱼 回答时间:2014-10-29 09:36:20
没有开启发送中断,查询的应该是发送缓冲区的标志位是否为1,如果为1说明数据没有发送出去,为0说明数据发送成功,缓冲区被清空。另外,楼主可以用电脑接收一下是否有数据发送出去。
laoshuchixiang 回答时间:2014-10-29 11:16:11
谢谢,用这个程序是可以的,但我把配置设置成完全一样了,我自己这边还是不行。并且用我自己的配置放到这个程序里UART也是工作正常的。不清楚怎么回事了。不知和我用了FSMC和USB接口是不是有关,但我已经把相关调用的函数都屏蔽了。就只剩UART功能了,还是不行,郁闷啊
Eagleson 回答时间:2014-10-30 11:53:41
RexZheng-202302 发表于 2014-10-29 11:16
谢谢,用这个程序是可以的,但我把配置设置成完全一样了,我自己这边还是不行。并且用我自己的配置放到这 ...

还是不行??
laoshuchixiang 回答时间:2014-11-2 19:33:55
安 发表于 2014-10-29 09:36
没有开启发送中断,查询的应该是发送缓冲区的标志位是否为1,如果为1说明数据没有发送出去,为0说明数据发 ...

但是我不用中断发送的,查询发送。while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);这个也是例程里的,当把数据送缓冲区时TXE应该置1,然后发送完了变0. 但是我数据送缓冲区后TXE不会置位。用示波器测试实际也没有数据发出
laoshuchixiang 回答时间:2014-11-2 19:34:57

时的,单独用你的例程是可以的。放到我的程序里去就不行了
laoshuchixiang 回答时间:2014-11-2 19:35:52
并且我另一个项目里用的STM32F405的USART也不行。同样的问题。
laoshuchixiang 回答时间:2014-11-2 19:37:18

USART配置和其他配置是不是要有先后顺序啊?
Eagleson 回答时间:2014-11-3 08:35:04
RexZheng-202302 发表于 2014-11-2 19:37
USART配置和其他配置是不是要有先后顺序啊?

不应该有先后顺序的,你检查一下看是不是后面的配置把什么关了,引起串口通信失败的
废鱼 回答时间:2014-11-5 08:51:39
把你的代码发出来让大家看一下。
laoshuchixiang 回答时间:2014-11-8 15:14:09
结贴,已经查到原因了。问题在于我在外部定义了HSI_VALUE,导致程序中的HSI_VALUE定义失效,从而导致波特率计算错误为0。去掉外部自己定义的HSI_VALUE就OK了。感谢版主给我的例程,通过比较寄存器的值发现的问题。谢谢各位。
zsyzww 回答时间:2016-11-14 14:45:27
亲~看一下 APB1时钟是不是超过42MHZ
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版