OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 9646|回复: 12

【紧急求助】STM32F407ZGT6的6个串口中串口1通了,但是3、6不通,相同代码,请高人指教

[复制链接]

26

主题

186

帖子

0

精华

高级会员

Rank: 4

积分
810
金钱
810
注册时间
2014-5-30
在线时间
93 小时
发表于 2016-1-28 09:05:25 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 天山狐狸 于 2016-1-28 22:07 编辑

如题,我使用了407的6个串口,用外设库初始化的,但是现在1通,3、6不通,2、4、5还没有测试。

代码如下,串口1、3、6的代码基本相同,只是USARTx不通而已。6个串口的管脚分配是软件STM32CubeMX生成的。

[mw_shl_code=applescript,true]void USART1_Init(uint32_t BaudRate)
{
  USART_InitTypeDef USART_InitStructure;

  USART_InitStructure.USART_BaudRate = BaudRate;
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  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;
  USART_Init(USART1, &USART_InitStructure);//初始化串口

  USART_Cmd(USART1, ENABLE);//使能串口
  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开相关中断
}


void USART3_Init(uint32_t BaudRate)
{
  USART_InitTypeDef USART_InitStructure;

  USART_InitStructure.USART_BaudRate = BaudRate;
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  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;
  USART_Init(USART3, &USART_InitStructure);//初始化串口

  USART_Cmd(USART3, ENABLE);//使能串口
  USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//开相关中断
}[/mw_shl_code]

最佳答案

查看完整内容[请看2#楼]

最好有个发送完成中断和发送缓存为空中断,在那里将485收发控制脚切换为接收模式即可,在发送函数里切换显然是不正确的,你只是把数据给了发送缓存,但实际不一定发送完成的,就正如你的波形一下!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

391

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1957
金钱
1957
注册时间
2014-8-8
在线时间
307 小时
发表于 2016-1-28 09:05:26 | 显示全部楼层
天山狐狸 发表于 2016-1-28 11:58
程序和波形如下,数据滞后于485收发,,这个是怎么回事呢

[mw_shl_code=applescript,true]void USART3 ...

最好有个发送完成中断和发送缓存为空中断,在那里将485收发控制脚切换为接收模式即可,在发送函数里切换显然是不正确的,你只是把数据给了发送缓存,但实际不一定发送完成的,就正如你的波形一下!
回复

使用道具 举报

2

主题

391

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1957
金钱
1957
注册时间
2014-8-8
在线时间
307 小时
发表于 2016-1-28 09:31:29 | 显示全部楼层
首先考虑引脚配置是否OK,实测是否有波形,然后考虑是否可能是中断嵌套问题!
回复

使用道具 举报

26

主题

186

帖子

0

精华

高级会员

Rank: 4

积分
810
金钱
810
注册时间
2014-5-30
在线时间
93 小时
 楼主| 发表于 2016-1-28 09:52:52 | 显示全部楼层
365mcu 发表于 2016-1-28 09:31
首先考虑引脚配置是否OK,实测是否有波形,然后考虑是否可能是中断嵌套问题!

中断暂时没开。。

管脚配置都查了,没有问题啊。。


Tx脚有波形,但是到了A B线,就发不出去了,485模块没有问题,换到串口1上可以使用。485收发控制脚也正常。。

现在看波形,应该是软件哪里没有配置对,但是找不到
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2016-1-25
在线时间
1 小时
发表于 2016-1-28 10:10:04 | 显示全部楼层
首先 你检查一下你的 每种时钟的定义是不是和源文件的一致。而且你在下面的那个中单的抢占优先级和响应优先级不能设置成一摸一样的。着两个地方先改一下 不行再说。
回复

使用道具 举报

2

主题

391

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1957
金钱
1957
注册时间
2014-8-8
在线时间
307 小时
发表于 2016-1-28 10:13:09 | 显示全部楼层
天山狐狸 发表于 2016-1-28 09:52
中断暂时没开。。

管脚配置都查了,没有问题啊。。

如果是485的话你的收发控制引脚是否正确!?
回复

使用道具 举报

26

主题

186

帖子

0

精华

高级会员

Rank: 4

积分
810
金钱
810
注册时间
2014-5-30
在线时间
93 小时
 楼主| 发表于 2016-1-28 10:48:52 | 显示全部楼层
365mcu 发表于 2016-1-28 10:13
如果是485的话你的收发控制引脚是否正确!?

这个是正确的

我上面的管脚、时钟等配置正确吗
回复

使用道具 举报

26

主题

186

帖子

0

精华

高级会员

Rank: 4

积分
810
金钱
810
注册时间
2014-5-30
在线时间
93 小时
 楼主| 发表于 2016-1-28 10:49:17 | 显示全部楼层
CEEEWA 发表于 2016-1-28 10:10
首先 你检查一下你的 每种时钟的定义是不是和源文件的一致。而且你在下面的那个中单的抢占优先级和响应优先 ...

没有开中断呢,即NVIC还没设置
回复

使用道具 举报

26

主题

186

帖子

0

精华

高级会员

Rank: 4

积分
810
金钱
810
注册时间
2014-5-30
在线时间
93 小时
 楼主| 发表于 2016-1-28 10:58:09 | 显示全部楼层
365mcu 发表于 2016-1-28 10:13
如果是485的话你的收发控制引脚是否正确!?

好像是407的IO驱动能力不够,我的一个485收发控制脚,IO已经输出了高,但是两485那里,确是低。。但是直接把3.3V接到485收发控制脚,那里就高了
回复

使用道具 举报

26

主题

186

帖子

0

精华

高级会员

Rank: 4

积分
810
金钱
810
注册时间
2014-5-30
在线时间
93 小时
 楼主| 发表于 2016-1-28 11:25:26 | 显示全部楼层
CEEEWA 发表于 2016-1-28 10:10
首先 你检查一下你的 每种时钟的定义是不是和源文件的一致。而且你在下面的那个中单的抢占优先级和响应优先 ...

问题已经找到,但不知怎么解决:

用示波器看波形发现:485使能发送已经打开了,但是串口数据却发不出去,,等到485使能发送都关闭了串口数据才发出去。
回复

使用道具 举报

26

主题

186

帖子

0

精华

高级会员

Rank: 4

积分
810
金钱
810
注册时间
2014-5-30
在线时间
93 小时
 楼主| 发表于 2016-1-28 11:58:31 | 显示全部楼层

程序和波形如下,数据滞后于485收发,,这个是怎么回事呢

[mw_shl_code=applescript,true]void USART3_SendString_A(uint8_t *Data)
{
  uint8_t *pBuf = Data;

  Enable_485Tx2;//使能485发送

  while (*pBuf)
  {
    USART3->DR = ((*pBuf) & (uint16_t)0x01FF);
    pBuf++;

    while (!(USART3->SR & 0x0040));
  }
  Enable_485Rx2;//默认到485接收
}[/mw_shl_code]

2016-01-28_115605.png
回复

使用道具 举报

4

主题

35

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
351
金钱
351
注册时间
2013-4-23
在线时间
98 小时
发表于 2016-1-28 12:02:16 | 显示全部楼层
既然是ZGT的芯片,一定用显示屏了,一定开启FSMC了,你看你的端口设置,串口3映射到FSMC的数据线上了,那几个还有映射到SD卡的线上了,能正常工作吗?我没试过,不敢妄下结论,但我要用,一定要避开这样的用法。
回复

使用道具 举报

26

主题

186

帖子

0

精华

高级会员

Rank: 4

积分
810
金钱
810
注册时间
2014-5-30
在线时间
93 小时
 楼主| 发表于 2016-1-28 12:41:34 | 显示全部楼层
dalianlwd 发表于 2016-1-28 12:02
既然是ZGT的芯片,一定用显示屏了,一定开启FSMC了,你看你的端口设置,串口3映射到FSMC的数据线上了,那几 ...

没有用FSMC,没有用SDIO呢

现在发现串口3的状态寄存器的TXE TC一直是1,这样就没等数据发完,485切到输入了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-26 03:39

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表