OpenEdv-开源电子网

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

求助:STM32F413ZHT6的串口9不能正常使用

[复制链接]

1

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2016-4-30
在线时间
8 小时
发表于 2021-8-14 16:34:16 | 显示全部楼层 |阅读模式
2金钱
用下边代码配置了串口1-8都可以使用,但是9和10不能使用是怎么回事啊?万分感谢
void uart9_init(u32 bound){
        GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
       
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB2Periph_UART9,ENABLE);

        GPIO_PinAFConfig(GPIOD,GPIO_PinSource14,GPIO_AF11_UART9);
        GPIO_PinAFConfig(GPIOD,GPIO_PinSource15,GPIO_AF11_UART9);
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14 | GPIO_Pin_15;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;       
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
        GPIO_Init(GPIOD,&GPIO_InitStructure);

        USART_InitStructure.USART_BaudRate = bound;
        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(UART9, &USART_InitStructure);
       
  USART_Cmd(UART9, ENABLE);
       
#if EN_USART9_RX       
        USART_ITConfig(UART9, USART_IT_RXNE, ENABLE);

  NVIC_InitStructure.NVIC_IRQChannel = UART9_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority =0;               
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                       
        NVIC_Init(&NVIC_InitStructure);       

#endif
       
}
void UART9_IRQHandler(void)                       
{
        u8 temp;
       
        if(USART_GetITStatus(UART9, USART_IT_RXNE) != RESET)          
  {       
      temp = USART_ReceiveData(UART9);   
      USART_ClearITPendingBit(UART9, USART_IT_RXNE);
                  USART_SendData(USART1, temp);
  }
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2016-4-30
在线时间
8 小时
 楼主| 发表于 2021-8-16 08:32:13 | 显示全部楼层
回复

使用道具 举报

7

主题

480

帖子

0

精华

高级会员

Rank: 4

积分
773
金钱
773
注册时间
2021-4-15
在线时间
304 小时
发表于 2021-8-16 10:21:46 | 显示全部楼层
这么多串口这个芯片!自己配置不行的话 尝试用Cube吧!
日常敲键--头秃一片
回复

使用道具 举报

1

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2016-4-30
在线时间
8 小时
 楼主| 发表于 2021-8-16 15:15:00 | 显示全部楼层
终于折腾出来了能发数据了,但是波特率不对,设置的115200 ,   但是串口调试助手需要230400才能收到,这又怎么原因
回复

使用道具 举报

0

主题

50

帖子

0

精华

高级会员

Rank: 4

积分
985
金钱
985
注册时间
2019-7-3
在线时间
185 小时
发表于 2021-8-16 15:30:01 | 显示全部楼层
huhujiajia 发表于 2021-8-16 15:15
终于折腾出来了能发数据了,但是波特率不对,设置的115200 ,   但是串口调试助手需要230400才能收到,这又 ...

你的工程哪里来的?
看看工程的晶振与系统时钟和你的板子是否一致。
回复

使用道具 举报

1

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2016-4-30
在线时间
8 小时
 楼主| 发表于 2021-8-16 18:16:50 | 显示全部楼层
fengshuzhitan 发表于 2021-8-16 15:30
你的工程哪里来的?
看看工程的晶振与系统时钟和你的板子是否一致。

相同的配置我换串口1-8都行,就是9和10不行
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2021-8-17 02:02:12 | 显示全部楼层
huhujiajia 发表于 2021-8-16 15:15
终于折腾出来了能发数据了,但是波特率不对,设置的115200 ,   但是串口调试助手需要230400才能收到,这又 ...

说明你的时钟不对
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

1

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2016-4-30
在线时间
8 小时
 楼主| 发表于 2021-8-17 16:46:45 | 显示全部楼层

应该改哪个时钟呢?原子哥
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2021-8-18 02:00:07 | 显示全部楼层
huhujiajia 发表于 2021-8-17 16:46
应该改哪个时钟呢?原子哥

应该是HAL库设置的系统时钟不对
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

1

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2016-4-30
在线时间
8 小时
 楼主| 发表于 2021-8-18 11:48:50 | 显示全部楼层
正点原子 发表于 2021-8-18 02:00
应该是HAL库设置的系统时钟不对

我用的不是HAL库,标准库。别的uart很正常,就9,10不行
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2021-8-19 02:25:02 | 显示全部楼层
huhujiajia 发表于 2021-8-18 11:48
我用的不是HAL库,标准库。别的uart很正常,就9,10不行

看看寄存器的状态吧,这个最能说明问题
BRR寄存器,看是不是你设置的
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

33

主题

218

帖子

0

精华

高级会员

Rank: 4

积分
568
金钱
568
注册时间
2015-1-12
在线时间
75 小时
发表于 2021-9-2 15:43:30 | 显示全部楼层
学习了,继续努力
回复

使用道具 举报

33

主题

218

帖子

0

精华

高级会员

Rank: 4

积分
568
金钱
568
注册时间
2015-1-12
在线时间
75 小时
发表于 2021-9-9 15:40:55 | 显示全部楼层
huhujiajia 发表于 2021-8-18 11:48
我用的不是HAL库,标准库。别的uart很正常,就9,10不行

使用HAL库函数,我遇到问题是其他串口正常,只有UART9串口,发送波特率是接收的一半,才能通信。比如单片机波特率设为9600,串口助手19200才能正常通信,否则乱码。同一个原子例程模板改的,串口1,2,6,7,8都是正常相同的波特率
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2021-9-12 00:01:46 | 显示全部楼层
yuanzinpl 发表于 2021-9-9 15:40
使用HAL库函数,我遇到问题是其他串口正常,只有UART9串口,发送波特率是接收的一半,才能通信。比如单片 ...

说明你波特率设置错了
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

33

主题

218

帖子

0

精华

高级会员

Rank: 4

积分
568
金钱
568
注册时间
2015-1-12
在线时间
75 小时
发表于 2021-9-13 13:34:38 | 显示全部楼层
正点原子 发表于 2021-9-12 00:01
说明你波特率设置错了

找到原因了,HAL库函数中没有考虑UART9和UART10这两种串口的情形,只把USART1和USART6按照所在的APB2时钟设置波特率了,UART9和UART10也在APB2时钟下面。但是没考虑UART9和UART10,程序中除了USART1和USART6,其他串口都按照最后的else情况 ,按照APB1时钟设置了,时钟差别2倍关系,BRR按照APB1设置,实际UART9,UART10时钟确是APB2,所以波特率也是2倍关系。详情查看UART_SetConfig(UART_HandleTypeDef *huart)
iif(huart->Init.OverSampling == UART_OVERSAMPLING_8)  {
    /*-------------------------- USART BRR Configuration ---------------------*/
#if defined(USART6)
    if((huart->Instance == USART1) || (huart->Instance == USART6))
    {
      huart->Instance->BRR = UART_BRR_SAMPLING8(HAL_RCC_GetPCLK2Freq(), huart->Init.BaudRate);
    }
#else
    if(huart->Instance == USART1)
    {
      huart->Instance->BRR = UART_BRR_SAMPLING8(HAL_RCC_GetPCLK2Freq(), huart->Init.BaudRate);
    }        
#endif /* USART6 */
    else
    {
      huart->Instance->BRR = UART_BRR_SAMPLING8(HAL_RCC_GetPCLK1Freq(), huart->Init.BaudRate);
    }
  }
  else
  {
    /*-------------------------- USART BRR Configuration ---------------------*/
#if defined(USART6)
    if((huart->Instance == USART1) || (huart->Instance == USART6))
    {
      huart->Instance->BRR = UART_BRR_SAMPLING16(HAL_RCC_GetPCLK2Freq(), huart->Init.BaudRate);
    }
#else
    if(huart->Instance == USART1)
    {
      huart->Instance->BRR = UART_BRR_SAMPLING16(HAL_RCC_GetPCLK2Freq(), huart->Init.BaudRate);
    }        
#endif /* USART6 */
    else
    {
      huart->Instance->BRR = UART_BRR_SAMPLING16(HAL_RCC_GetPCLK1Freq(), huart->Init.BaudRate);
    }
  }

USART1    APB2

USART2    APB1

USART3    APB1

UART4      APB1

UART5      APB1

USART6   APB2

UART7      APB1

UART8      APB1

UART9      APB2

UART10     APB2


根据串口初始化函数推测,HAL库函数确是没有专门针对UAR9,UART10进行设置
大部分参数This parameter can be UARTx where x: 1, 2, 3, 4, 5, 6, 7 or 8 to select the USART or   *         UART peripheral.
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-26 23:23

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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