OpenEdv-开源电子网

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

串口二和串口三如何使用,为啥不能像串口一一样配置嘛?

[复制链接]

1

主题

6

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2020-8-23
在线时间
2 小时
发表于 2020-8-23 13:41:54 | 显示全部楼层 |阅读模式
为什么usart1的中断和printf函数能用,usart2和usart3中断却进不去,改了fputc函数,也不能用printf函数,配置都没问题啊。就是用的那个stm32原子哥的例程。串口调试助手发什么然后单片机接收到就返回什么打印在串口调试助手屏幕上,用串口一都可以没问题。为啥串口二和三就是没反应。发什么都接收不到。压根没显示。还有就是这个串口一跳线帽不能拔掉有啥用?我比如想用一个esp8266Nodemcu和stm32接线都接不了。意思是只能和串口二和串口三的tx和Rx互接。我想的就是直接printf函数打印那个AT指令就可以配置esp8266,我用那个arduino就很简单。就一个串口。板子上的tx和rx和esp8266的rx和tx互接就可以构建局域网。这stm32感觉好麻烦。有大佬提示一下嘛
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

33

主题

1628

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6679
金钱
6679
注册时间
2015-8-25
在线时间
1036 小时
发表于 2020-8-24 17:13:31 | 显示全部楼层
USART1挂在APB2总线上
UART2,UART3挂在APB1总线上
He who fights with monsters should look to it that he himself does not become a monster, when you gaze long into the abyss, the abyss also gazes into you.
过于执着就会陷入其中,迷失自己,困住自己。
回复 支持 反对

使用道具 举报

17

主题

175

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1016
金钱
1016
注册时间
2014-4-7
在线时间
99 小时
发表于 2020-8-24 17:20:41 | 显示全部楼层
为什么usart1的中断和printf函数能用,usart2和usart3中断却进不去
    1. 串口2 和串口3有没有正确初始化,他们的时钟和gpio有没有正确配置,中断服务程序有没有写对,NVIC有没有设置正确



在你没有做出成绩之前,这个世界不会在乎你的自尊。
回复 支持 反对

使用道具 举报

3

主题

808

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3888
金钱
3888
注册时间
2017-3-7
在线时间
1694 小时
发表于 2020-8-24 19:06:16 | 显示全部楼层
建议新手使用cubemx直接生成代码,省去了解寄存器这一步,等深入,在研究
回复 支持 反对

使用道具 举报

0

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2020-8-23
在线时间
11 小时
发表于 2020-8-25 14:10:53 | 显示全部楼层
一看就是没有理解寄存器
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2020-8-23
在线时间
2 小时
 楼主| 发表于 2020-8-25 14:12:41 | 显示全部楼层
亲亻尔嘴 发表于 2020-8-24 17:20
为什么usart1的中断和printf函数能用,usart2和usart3中断却进不去
    1. 串口2 和串口3有没有正确初始化 ...

void Pb_Init(void)
{
        GPIO_InitTypeDef GPIO_InitStrue;
        USART_InitTypeDef USART_InitStrue;
        NVIC_InitTypeDef NVIC_InitStrue;
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);
       
        USART_DeInit(USART3);  //复位串口3
       
       
        GPIO_InitStrue.GPIO_Mode=GPIO_Mode_AF_PP;
        GPIO_InitStrue.GPIO_Pin=GPIO_Pin_10;
        GPIO_InitStrue.GPIO_Speed=GPIO_Speed_50MHz;
  GPIO_Init(GPIOB,&GPIO_InitStrue);
       
        GPIO_InitStrue.GPIO_Mode=GPIO_Mode_IN_FLOATING;
        GPIO_InitStrue.GPIO_Pin=GPIO_Pin_11;
  GPIO_Init(GPIOB,&GPIO_InitStrue);
       
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);
       
       
        USART_InitStrue.USART_BaudRate=115200;
        USART_InitStrue.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
        USART_InitStrue.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;
        USART_InitStrue.USART_Parity=USART_Parity_No;
        USART_InitStrue.USART_StopBits=USART_StopBits_1;
        USART_InitStrue.USART_WordLength=USART_WordLength_8b;
       
        USART_Init(USART3,&USART_InitStrue);
        USART_Cmd(USART3,ENABLE);//使能串口
        USART_ITConfig(USART3,USART_IT_RXNE,ENABLE);//开启接收中断
       
       
        NVIC_InitStrue.NVIC_IRQChannel=USART3_IRQn;
        NVIC_InitStrue.NVIC_IRQChannelCmd=ENABLE;
        NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority=1;
        NVIC_InitStrue.NVIC_IRQChannelSubPriority=1;
        NVIC_Init(&NVIC_InitStrue);
       
}

void USART3_IRQHandler(void)                        //串口中断服务程序
{
        u8 res;
    if(USART_GetITStatus(USART3,USART_IT_RXNE))
                {
                        res=USART_ReceiveData(USART3);
                        USART_SendData(USART3,res);
                }
}

这样配置的串口三,然后中断函数是电脑发给单片机什么然后单片机就返回给什么打印在串口调试助手上。为啥这样我发啥都不会有打印
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2020-8-23
在线时间
2 小时
 楼主| 发表于 2020-8-25 14:14:00 | 显示全部楼层
a5820736 发表于 2020-8-24 19:06
建议新手使用cubemx直接生成代码,省去了解寄存器这一步,等深入,在研究

void Pb_Init(void)
{
        GPIO_InitTypeDef GPIO_InitStrue;
        USART_InitTypeDef USART_InitStrue;
        NVIC_InitTypeDef NVIC_InitStrue;
        
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);
        
        USART_DeInit(USART3);  //复位串口3
        
        
        GPIO_InitStrue.GPIO_Mode=GPIO_Mode_AF_PP;
        GPIO_InitStrue.GPIO_Pin=GPIO_Pin_10;
        GPIO_InitStrue.GPIO_Speed=GPIO_Speed_50MHz;
  GPIO_Init(GPIOB,&GPIO_InitStrue);
        
        GPIO_InitStrue.GPIO_Mode=GPIO_Mode_IN_FLOATING;
        GPIO_InitStrue.GPIO_Pin=GPIO_Pin_11;
  GPIO_Init(GPIOB,&GPIO_InitStrue);
        
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);
        
        
        USART_InitStrue.USART_BaudRate=115200;
        USART_InitStrue.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
        USART_InitStrue.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;
        USART_InitStrue.USART_Parity=USART_Parity_No;
        USART_InitStrue.USART_StopBits=USART_StopBits_1;
        USART_InitStrue.USART_WordLength=USART_WordLength_8b;
        
        USART_Init(USART3,&USART_InitStrue);
        USART_Cmd(USART3,ENABLE);//使能串口
        USART_ITConfig(USART3,USART_IT_RXNE,ENABLE);//开启接收中断
        
        
        NVIC_InitStrue.NVIC_IRQChannel=USART3_IRQn;
        NVIC_InitStrue.NVIC_IRQChannelCmd=ENABLE;
        NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority=1;
        NVIC_InitStrue.NVIC_IRQChannelSubPriority=1;
        NVIC_Init(&NVIC_InitStrue);
        
}

void USART3_IRQHandler(void)                        //串口中断服务程序
{
        u8 res;
    if(USART_GetITStatus(USART3,USART_IT_RXNE))
                {
                        res=USART_ReceiveData(USART3);
                        USART_SendData(USART3,res);
                }
}

这样配置的串口三,然后中断函数是电脑发给单片机什么然后单片机就返回给什么打印在串口调试助手上。为啥这样我发啥都不会有打印
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2020-8-23
在线时间
2 小时
 楼主| 发表于 2020-8-25 14:14:27 | 显示全部楼层
szczyb1314 发表于 2020-8-24 17:13
USART1挂在APB2总线上
UART2,UART3挂在APB1总线上

void Pb_Init(void)
{
        GPIO_InitTypeDef GPIO_InitStrue;
        USART_InitTypeDef USART_InitStrue;
        NVIC_InitTypeDef NVIC_InitStrue;
        
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);
        
        USART_DeInit(USART3);  //复位串口3
        
        
        GPIO_InitStrue.GPIO_Mode=GPIO_Mode_AF_PP;
        GPIO_InitStrue.GPIO_Pin=GPIO_Pin_10;
        GPIO_InitStrue.GPIO_Speed=GPIO_Speed_50MHz;
  GPIO_Init(GPIOB,&GPIO_InitStrue);
        
        GPIO_InitStrue.GPIO_Mode=GPIO_Mode_IN_FLOATING;
        GPIO_InitStrue.GPIO_Pin=GPIO_Pin_11;
  GPIO_Init(GPIOB,&GPIO_InitStrue);
        
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);
        
        
        USART_InitStrue.USART_BaudRate=115200;
        USART_InitStrue.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
        USART_InitStrue.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;
        USART_InitStrue.USART_Parity=USART_Parity_No;
        USART_InitStrue.USART_StopBits=USART_StopBits_1;
        USART_InitStrue.USART_WordLength=USART_WordLength_8b;
        
        USART_Init(USART3,&USART_InitStrue);
        USART_Cmd(USART3,ENABLE);//使能串口
        USART_ITConfig(USART3,USART_IT_RXNE,ENABLE);//开启接收中断
        
        
        NVIC_InitStrue.NVIC_IRQChannel=USART3_IRQn;
        NVIC_InitStrue.NVIC_IRQChannelCmd=ENABLE;
        NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority=1;
        NVIC_InitStrue.NVIC_IRQChannelSubPriority=1;
        NVIC_Init(&NVIC_InitStrue);
        
}

void USART3_IRQHandler(void)                        //串口中断服务程序
{
        u8 res;
    if(USART_GetITStatus(USART3,USART_IT_RXNE))
                {
                        res=USART_ReceiveData(USART3);
                        USART_SendData(USART3,res);
                }
}

这样配置的串口三,然后中断函数是电脑发给单片机什么然后单片机就返回给什么打印在串口调试助手上。为啥这样我发啥都不会有打印
回复 支持 反对

使用道具 举报

0

主题

26

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2020-8-25
在线时间
4 小时
发表于 2020-8-26 13:23:33 | 显示全部楼层
回复 支持 反对

使用道具 举报

17

主题

175

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1016
金钱
1016
注册时间
2014-4-7
在线时间
99 小时
发表于 2020-8-28 09:07:34 | 显示全部楼层
逆光xyz 发表于 2020-8-25 14:12
void Pb_Init(void)
{
        GPIO_InitTypeDef GPIO_InitStrue;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
应该还有个AFIO的时钟没有使能,你试试
在你没有做出成绩之前,这个世界不会在乎你的自尊。
回复 支持 反对

使用道具 举报

15

主题

84

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
352
金钱
352
注册时间
2019-5-30
在线时间
78 小时
发表于 2020-10-21 13:22:24 | 显示全部楼层
同问,一样的问题,楼主解决了吗
回复 支持 反对

使用道具 举报

1

主题

10

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2020-6-18
在线时间
10 小时
发表于 2020-11-26 20:53:00 | 显示全部楼层
同问,问题解决了吗?
回复 支持 反对

使用道具 举报

0

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2020-5-7
在线时间
12 小时
发表于 2021-3-13 17:07:18 | 显示全部楼层
如果想通过串口使单片机与电脑通信,必须经过一个电平转换芯片(CH340),跳线帽将PA9,PA10与CH340芯片连接,所以如果想使用其他串口与电脑通信,必须将其他串口的引脚与CH340的引脚连接,可以看一看原理图
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-9 15:00

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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