OpenEdv-开源电子网

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

F407 PA0和PA1复用串口4问题

[复制链接]

1

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
103
金钱
103
注册时间
2019-7-26
在线时间
18 小时
发表于 2020-6-11 18:35:22 | 显示全部楼层 |阅读模式
5金钱
//3õê¼»ˉIO ′®¿ú4
//bound:2¨ìØÂê
void uart4_init(u32 bound)
        {
        //GPIO¶Ë¿úéèÖÃ
        GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;

        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOC|RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOD,ENABLE); //ê1ÄüGPIOA¡¢GPIOC¡¢GPIODê±Öó
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_USART6,ENABLE);//ê1ÄüUSART1¡¢USART6ê±Öó
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4,ENABLE);//ê1ÄüUSART1¡¢USART2¡¢USART3¡¢UART4¡¢UART5¡¢USART6ê±Öó
               
        //′®¿ú4¶Ôó|òy½Å¸′óÃó3éä
        GPIO_PinAFConfig(GPIOC,GPIO_PinSource10,GPIO_AF_UART4); //GPIOD8¸′óÃÎaUART4
        GPIO_PinAFConfig(GPIOC,GPIO_PinSource11,GPIO_AF_UART4); //GPIOD9¸′óÃÎaUART4
       
        //USART4¶Ë¿úÅäÖÃ
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11; //GPIOA0óëGPIOA1
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//¸′óÃ1|Äü
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz ;        //Ëù¶è50MHz
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //íÆíì¸′óÃêä3ö
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //éÏà-
        GPIO_Init(GPIOC,&GPIO_InitStructure); //3õê¼»ˉPD8£&#172D9

        //USART3 3õê¼»ˉéèÖÃ
        USART_InitStructure.USART_BaudRate = bound;//2¨ìØÂêéèÖÃ
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;//×Ö3¤Îa8λêy¾Y¸ñê½
        USART_InitStructure.USART_StopBits = USART_StopBits_1;//ò»¸öí£Ö1λ
        USART_InitStructure.USART_Parity = USART_Parity_No;//ÎTÆæżD£Ñéλ
        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//ÎTó2¼têy¾Yá÷¿ØÖÆ
        USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;        //êÕ·¢Ä£ê½
        USART_Init(UART4, &USART_InitStructure); //3õê¼»ˉ′®¿ú4

        USART_Cmd(UART4, ENABLE);  //ê1Äü′®¿ú4

        //USART_ClearFlag(USART1, USART_FLAG_TC);
        USART_ITConfig(UART4, USART_IT_RXNE, ENABLE);//¿aÆôÏà1ØÖD¶Ï

        //Usart1 NVIC ÅäÖÃ
        NVIC_InitStructure.NVIC_IRQChannel = UART4_IRQn;//′®¿ú4ÖD¶Ïí¨μà
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//ÇàÕ¼óÅÏ輶3
        NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;                //×óóÅÏ輶3
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //IRQí¨μàê1Äü
        NVIC_Init(&NVIC_InitStructure);        //¸ù¾YÖ¸¶¨μÄ2Îêy3õê¼»ˉVIC¼Ä′æÆ÷
  }
       
       
void UART4_IRQHandler(void)                        //′®¿ú4ÖD¶Ï·tÎñoˉêy
{
//        printf("111");
        u8 Res;
        if(USART_GetITStatus(UART4, USART_IT_RXNE))  //½óêÕÖD¶Ï
        {
            Res=USART_ReceiveData(UART4);                  //¶áè¡′®¿ú½óêÕμ½êy¾Y
                if(Res==0x5A)
                {
                  Flag_u4_rev=1;
                  UART4_RX_BUF[UART4_RX_CNT++]=Res;
                }
                else if(Res==0xA5)
                {
                  UART4_RX_BUF[UART4_RX_CNT++]=Res;
                  if(Flag_u4_rev==1)
                  {
                    UART4_RX_CNT=0;
                          Flag_u4_ok=0;  
                  }
                  else
                  {
                    UART4_RX_BUF[UART4_RX_CNT++]=Res;
                          Flag_u4_rev=0;
                  }          
                }
                else
                {
                  UART4_RX_BUF[UART4_RX_CNT++]=Res;
                  Flag_u4_rev=0;
                  if(UART4_RX_BUF[UART4_RX_CNT-1]==0x55 && UART4_RX_BUF[UART4_RX_CNT-2]==0xAA)
                  {
                    Flag_u4_ok=1;
                  }
                }
                if(UART4_RX_CNT==USART_REC_LEN)
                {
                  UART4_RX_CNT--;
                }
                UART4_Send_Data();
                USART_ClearITPendingBit(UART4, USART_IT_RXNE);
        }
}       

能进入中断,但是STlink仿真时下发的数和接收到的数不一样
同样程序在PC10和PC11复用时没有问题,下发的数据和接收的数据一样  是PA0 配置时需要注意什么吗?

最佳答案

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

抱歉,这几天再忙别的事情,今天测试了一下别的串口引脚的波形,没有异常,就查看了一下IO引脚分配表,找到了PA1引脚为正弦波的原因,确实因为是后续电路的问题。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
103
金钱
103
注册时间
2019-7-26
在线时间
18 小时
 楼主| 发表于 2020-6-11 18:35:23 | 显示全部楼层
本帖最后由 阳20150618 于 2020-6-16 16:38 编辑
正点原子 发表于 2020-6-14 01:32
哪个串口都能用的,不行先看看是否有波形输出,看看寄存器配置

分配图

分配图

抱歉,这几天再忙别的事情,今天测试了一下别的串口引脚的波形,没有异常,就查看了一下IO引脚分配表,找到了PA1引脚为正弦波的原因,确实因为是后续电路的问题。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2020-6-12 01:21:11 | 显示全部楼层
具体是什么差异?
回复

使用道具 举报

1

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
103
金钱
103
注册时间
2019-7-26
在线时间
18 小时
 楼主| 发表于 2020-6-12 08:55:55 | 显示全部楼层

原子哥,问题是使用PC10接收数据无误,PA0时下发一个字节,直接发送到串口调试助手时,发现接收错误,不过有时会正确,可以使用printf打印
回复

使用道具 举报

1

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
103
金钱
103
注册时间
2019-7-26
在线时间
18 小时
 楼主| 发表于 2020-6-12 09:00:02 | 显示全部楼层
本帖最后由 阳20150618 于 2020-6-12 09:06 编辑

发送与接收调试图

发送与接收调试图
正点原子 发表于 2020-6-12 01:21
具体是什么差异?

原子哥,问题是使用PC10时接收数据无误,PA0时,下发一个字节直接上传到调试助手时数据是错的,有时是对的,可以使用printf打印
回复

使用道具 举报

1

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
103
金钱
103
注册时间
2019-7-26
在线时间
18 小时
 楼主| 发表于 2020-6-12 09:01:23 | 显示全部楼层
本帖最后由 阳20150618 于 2020-6-12 09:03 编辑
这是目前的配置及中断函数。
void uart4_init(u32 bound)
        {
        //GPIO¶Ë¿úéèÖÃ
        GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;

        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOC|RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOD,ENABLE); //ê1ÄüGPIOA¡¢GPIOC¡¢GPIODê±Öó
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_USART6,ENABLE);//ê1ÄüUSART1¡¢USART6ê±Öó
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4,ENABLE);//ê1ÄüUSART1¡¢USART2¡¢USART3¡¢UART4¡¢UART5¡¢USART6ê±Öó
               
        //′®¿ú4¶Ôó|òy½Å¸′óÃó3éä
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource0,GPIO_AF_UART4); //GPIOA0¸′óÃÎaUART4
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource1,GPIO_AF_UART4); //GPIOA1¸′óÃÎaUART4
       
        //USART4¶Ë¿úÅäÖÃ
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1; //GPIOA0óëGPIOA1
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//¸′óÃ1|Äü
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz ;        //Ëù¶è50MHz
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //íÆíì¸′óÃêä3ö
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //éÏà-
        GPIO_Init(GPIOA,&GPIO_InitStructure); //3õê¼»ˉPD8£&#172D9

        //USART3 3õê¼»ˉéèÖÃ
        USART_InitStructure.USART_BaudRate = bound;//2¨ìØÂêéèÖÃ
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;//×Ö3¤Îa8λêy¾Y¸ñê½
        USART_InitStructure.USART_StopBits = USART_StopBits_1;//ò»¸öí£Ö1λ
        USART_InitStructure.USART_Parity = USART_Parity_No;//ÎTÆæżD£Ñéλ
        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//ÎTó2¼têy¾Yá÷¿ØÖÆ
        USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;        //êÕ·¢Ä£ê½
        USART_Init(UART4, &USART_InitStructure); //3õê¼»ˉ′®¿ú4

        USART_Cmd(UART4, ENABLE);  //ê1Äü′®¿ú4

        //USART_ClearFlag(USART1, USART_FLAG_TC);
        USART_ITConfig(UART4, USART_IT_RXNE, ENABLE);//¿aÆôÏà1ØÖD¶Ï

        //Usart1 NVIC ÅäÖÃ
        NVIC_InitStructure.NVIC_IRQChannel = UART4_IRQn;//′®¿ú4ÖD¶Ïí¨μà
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//ÇàÕ¼óÅÏ輶3
        NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;                //×óóÅÏ輶3
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //IRQí¨μàê1Äü
        NVIC_Init(&NVIC_InitStructure);        //¸ù¾YÖ¸¶¨μÄ2Îêy3õê¼»ˉVIC¼Ä′æÆ÷
  }


void UART4_IRQHandler(void)                        //′®¿ú4ÖD¶Ï·tÎñoˉêy
{
        u8 Res;
        if(USART_GetITStatus(UART4, USART_IT_RXNE))  //½óêÕÖD¶Ï
        {
            Res=USART_ReceiveData(UART4);                  //¶áè¡′®¿ú½óêÕμ½êy¾Y
                USART_SendData(UART4,Res);
                USART_ClearITPendingBit(UART4, USART_IT_RXNE);
        }
}
回复

使用道具 举报

1

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
103
金钱
103
注册时间
2019-7-26
在线时间
18 小时
 楼主| 发表于 2020-6-12 16:07:16 | 显示全部楼层
目前怀疑与开发板U1的一个引脚相连,导致数据出现错误,但现在验证不了
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2020-6-13 01:08:38 | 显示全部楼层
阳20150618 发表于 2020-6-12 16:07
目前怀疑与开发板U1的一个引脚相连,导致数据出现错误,但现在验证不了

最好看一下波形吧。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

1

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
103
金钱
103
注册时间
2019-7-26
在线时间
18 小时
 楼主| 发表于 2020-6-13 10:09:07 | 显示全部楼层
正点原子 发表于 2020-6-13 01:08
最好看一下波形吧。

PA0和PA1设置上拉 ,PA1引脚为正弦波形,PA0为3.3V直流波形
IMG_20200613_100235.jpg
回复

使用道具 举报

1

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
103
金钱
103
注册时间
2019-7-26
在线时间
18 小时
 楼主| 发表于 2020-6-13 10:11:53 | 显示全部楼层
正点原子 发表于 2020-6-13 01:08
最好看一下波形吧。

请问原子哥,是开发板外部连接其他器件的原因吗?你们做过串口4的类似的实验吗?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2020-6-14 01:32:10 | 显示全部楼层
阳20150618 发表于 2020-6-13 10:11
请问原子哥,是开发板外部连接其他器件的原因吗?你们做过串口4的类似的实验吗?

哪个串口都能用的,不行先看看是否有波形输出,看看寄存器配置
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

1

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
103
金钱
103
注册时间
2019-7-26
在线时间
18 小时
 楼主| 发表于 2020-6-16 16:39:47 | 显示全部楼层
正点原子 发表于 2020-6-14 01:32
哪个串口都能用的,不行先看看是否有波形输出,看看寄存器配置

感谢,原子哥的解答。
回复

使用道具 举报

3

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
92
金钱
92
注册时间
2019-4-27
在线时间
12 小时
发表于 2021-8-5 13:45:41 | 显示全部楼层
阳20150618 发表于 2020-6-11 18:35
抱歉,这几天再忙别的事情,今天测试了一下别的串口引脚的波形,没有异常,就查看了一下IO引脚分配表,找 ...

哥,我这里PA1上一直有一个50M的时钟输出,这个时钟是来自外部的网卡芯片还是来自32芯片呢?卡在这里了,项目无法继续了
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-27 05:38

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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