OpenEdv-开源电子网

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

新手求问串口2初始化代码问题

[复制链接]

14

主题

204

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2443
金钱
2443
注册时间
2017-9-13
在线时间
559 小时
发表于 2018-1-25 09:33:47 | 显示全部楼层 |阅读模式
10金钱
F407+FreeRTOS,使用串口2和PC机进行通信,我从网上和原子的例程中找到以下两种串口2的初始化函数,使用第一个初始化函数,串口2收发均不可用,使用第二个初始化函数,串口2正常工作,收发均可行,请问这两个初始化函数的根本区别在哪?是什么导致了一个成功一个失败?

void uart2_init(u32 bound)
{
        NVIC_InitTypeDef NVIC_InitStructure;
        GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;

        USART_DeInit(USART2);
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;
        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(GPIOB,&GPIO_InitStructure);
               
        GPIO_PinAFConfig(GPIOB,GPIO_PinSource2,GPIO_AF_USART2);
        GPIO_PinAFConfig(GPIOB,GPIO_PinSource3,GPIO_AF_USART2);  
       
        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(USART2, &USART_InitStructure);
       
        USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
               
        USART_Cmd(USART2, ENABLE);

        NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;               
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                       
        NVIC_Init(&NVIC_InitStructure);
}

void uart2_init(u32 bound)
{                  
        float temp;
        u16 mantissa;
        u16 fraction;
        u32 pclk1 = 42;
        NVIC_InitTypeDef NVIC_InitStructure;

        temp=(float)(pclk1*1000000)/(bound*16);
        mantissa=temp;                                                        
        fraction=(temp-mantissa)*16;                        
        mantissa<<=4;
        mantissa+=fraction;
        RCC->AHB1ENR|=1<<0;                                          
        RCC->APB1ENR|=1<<17;                                         
        GPIO_Set(GPIOA,PIN2|PIN3,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_50M,GPIO_PUPD_PU);
        GPIO_AF_Set(GPIOA,2,7);                                       
        GPIO_AF_Set(GPIOA,3,7);                                          

        USART2->BRR=mantissa;
        USART2->CR1|=1<<2;        
        USART2->CR1|=1<<3;         
               
        USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
       
        USART2->CR1|=1<<13;
                
        NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;               
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                       
        NVIC_Init(&NVIC_InitStructure);
}

最佳答案

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

你这两种方式定义复用的端口不同啊,是不是你复用的端口错误啊
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

10

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2018-1-18
在线时间
4 小时
发表于 2018-1-25 09:33:48 | 显示全部楼层
你这两种方式定义复用的端口不同啊,是不是你复用的端口错误啊
回复

使用道具 举报

35

主题

309

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2641
金钱
2641
注册时间
2016-8-10
在线时间
470 小时
发表于 2018-1-25 09:47:13 | 显示全部楼层
一个是A2   A3,一个是B2    B3
回复

使用道具 举报

14

主题

204

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2443
金钱
2443
注册时间
2017-9-13
在线时间
559 小时
 楼主| 发表于 2018-1-25 09:57:56 | 显示全部楼层
eieieiei 发表于 2018-1-25 09:44
你这两种方式定义复用的端口不同啊,是不是你复用的端口错误啊

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);

这行改成 RCC_AHB1Periph_GPIOA 吗?
回复

使用道具 举报

14

主题

204

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2443
金钱
2443
注册时间
2017-9-13
在线时间
559 小时
 楼主| 发表于 2018-1-25 09:58:56 | 显示全部楼层
huyang201306 发表于 2018-1-25 09:47
一个是A2   A3,一个是B2    B3

如果第一种的 GPIOB 改成 GPIOA 的话,两种方法还有区别吗?
回复

使用道具 举报

1

主题

10

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2018-1-18
在线时间
4 小时
发表于 2018-1-25 14:27:36 | 显示全部楼层
HCHDaLeiGe 发表于 2018-1-25 09:57
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);

这行改成 RCC_AHB1Periph_GPIOA 吗?

应该是可以的,有区别啊,你第一种是库函数的方式实现的,第二种是直接操作寄存器
回复

使用道具 举报

14

主题

204

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2443
金钱
2443
注册时间
2017-9-13
在线时间
559 小时
 楼主| 发表于 2018-1-25 15:27:05 | 显示全部楼层
eieieiei 发表于 2018-1-25 14:27
应该是可以的,有区别啊,你第一种是库函数的方式实现的,第二种是直接操作寄存器

我把第一种改成GPIOA了,还是不好用
回复

使用道具 举报

1

主题

10

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2018-1-18
在线时间
4 小时
发表于 2018-1-26 09:38:24 | 显示全部楼层
HCHDaLeiGe 发表于 2018-1-25 15:27
我把第一种改成GPIOA了,还是不好用

是还是不能用还是出现乱码的问题呀?
回复

使用道具 举报

14

主题

204

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2443
金钱
2443
注册时间
2017-9-13
在线时间
559 小时
 楼主| 发表于 2018-1-26 13:09:48 | 显示全部楼层
eieieiei 发表于 2018-1-26 09:38
是还是不能用还是出现乱码的问题呀?

不能用,串口2不能收不能发
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2017-11-22
在线时间
2 小时
发表于 2018-1-26 17:28:41 | 显示全部楼层
void uart_init(USART_TypeDef* USARTx,u32 bound,u8 PreemptionPriority,u8 SubPriority)
{
        //GPIO端口设置
        GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
          if(USARTx==USART1)
        {
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);        //使能USART1,GPIOA时钟
        //USART1_TX   PA.9
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;        //复用推挽输出
        GPIO_Init(GPIOA, &GPIO_InitStructure);
        //USART1_RX          PA.10
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
        GPIO_Init(GPIOA, &GPIO_InitStructure);  

        //Usart1 NVIC 配置
        NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
        }
        else if(USARTx==USART2)
        {
  RCC_APB1PeriphClockCmd( RCC_APB1Periph_USART2 , ENABLE);
        //USART2_TX   PA.2
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;        //复用推挽输出
        GPIO_Init(GPIOA, &GPIO_InitStructure);

        //USART2_RX          PA.3
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
        GPIO_Init(GPIOA, &GPIO_InitStructure);  

        //Usart2 NVIC 配置

        NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
        }
        else if(USARTx==USART3)
        {
                RCC_APB1PeriphClockCmd( RCC_APB1Periph_USART3 , ENABLE);
                //USART3_TX   PB.10
                GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PB.10
                GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
                GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;        //复用推挽输出
                GPIO_Init(GPIOB, &GPIO_InitStructure);
                //USART3_RX          PB.11
                GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
                GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
                GPIO_Init(GPIOB, &GPIO_InitStructure);  
                //USART3 NVIC 配置
                NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
        }
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=PreemptionPriority ;//抢占优先级
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = SubPriority;                //子优先级
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //IRQ通道使能
        NVIC_Init(&NVIC_InitStructure);        //根据指定的参数初始化VIC寄存器
        //USART 初始化设置

        USART_InitStructure.USART_BaudRate = bound;//波特率
        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;        //收发模式

        USART_Init(USARTx, &USART_InitStructure); //初始化串口
       
        USART_ITConfig(USARTx,USART_IT_IDLE,ENABLE);//数据帧中断

        USART_ITConfig(USARTx, USART_IT_RXNE, ENABLE);//开启中断
        USART_ITConfig(USARTx, USART_IT_TXE, DISABLE);
       
        USART_ClearFlag(USARTx,USART_FLAG_TC);
        USART_Cmd(USARTx, ENABLE);                    //使能串口
}
试试这个
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-8 18:07

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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