OpenEdv-开源电子网

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

如何同时开启串口USART1(115200)和串口USART2(9600),请各大侠指教,两个只有串口1打开,串口2打不开,屏蔽串口1,串口2也打不开

[复制链接]

1

主题

7

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2015-11-24
在线时间
0 小时
发表于 2015-11-24 17:11:25 | 显示全部楼层 |阅读模式
5金钱
/*******************************************************************************
* 函数名 : USART1_Init_Config
* 描述   : USART1初始化配置
* 输入   : bound:波特率(常用:2400、4800、9600、19200、38400、115200等)
* 输出   : 无
* 返回   : 无 
* 说明   : 无
*******************************************************************************/
void USART1_Init_Config(u32 bound)
{
    GPIO_InitTypeDef  GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef  NVIC_InitStructure;

/*使能USART1和GPIOA外设时钟*/  
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);

/*复位串口1*/
  USART_DeInit(USART1);  

/*USART1_GPIO初始化设置*/ 
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //USART1_TXD(PA.9)     
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置引脚输出最大速率为50MHz
    GPIO_Init(GPIOA, &GPIO_InitStructure); //调用库函数中的GPIO初始化函数,初始化USART1_TXD(PA.9)  
   
    
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //USART1_RXD(PA.10)
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
    GPIO_Init(GPIOA, &GPIO_InitStructure); //调用库函数中的GPIO初始化函数,初始化USART1_RXD(PA.10)


   /*USART1 初始化设置*/
USART_InitStructure.USART_BaudRate = bound; //设置波特率
USART_InitStructure.USART_WordLength = USART_WordLength_8b; //8位数据格式
USART_InitStructure.USART_StopBits = USART_StopBits_1; //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); //初始化串口1

   /*Usart1 NVIC配置*/
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1; //抢占优先级3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //从优先级3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器 
 
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //使能串口1接收中断

    USART_Cmd(USART1, ENABLE);                     //使能串口 
USART_ClearFlag(USART1, USART_FLAG_TC); //清除发送完成标志
}

/*******************************************************************************
* 函数名 : USART2_Init_Config
* 描述   : USART2初始化配置
* 输入   : bound:波特率(常用:2400、4800、9600、19200、38400、115200等)
* 输出   : 无
* 返回   : 无 
* 说明   : 无
*******************************************************************************/
void USART2_Init_Config(u32 bound)
{
    GPIO_InitTypeDef  GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef  NVIC_InitStructure;

/*使能USART2和GPIOA外设时钟*/  
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2 , ENABLE);
/*复位串口1*/
  USART_DeInit(USART2);  

/*USART1_GPIO初始化设置*/ 
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //USART2_TXD(PA.2)     
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置引脚输出最大速率为50MHz
    GPIO_Init(GPIOA, &GPIO_InitStructure); //调用库函数中的GPIO初始化函数,初始化USART2_TXD(PA.2)  
   
    
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; //USART2_RXD(PA.3)
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
    GPIO_Init(GPIOA, &GPIO_InitStructure); //调用库函数中的GPIO初始化函数,初始化USART2_RXD(PA.3)


   /*USART1 初始化设置*/
USART_InitStructure.USART_BaudRate = bound; //设置波特率
USART_InitStructure.USART_WordLength = USART_WordLength_8b; //8位数据格式
USART_InitStructure.USART_StopBits = USART_StopBits_1; //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); //初始化串口1

USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
USART_Cmd(USART2, ENABLE); 
USART_ClearFlag(USART2, USART_FLAG_TC);
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

239

帖子

0

精华

高级会员

Rank: 4

积分
545
金钱
545
注册时间
2015-6-5
在线时间
110 小时
发表于 2015-11-24 17:33:54 | 显示全部楼层
回复

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2015-11-24
在线时间
0 小时
 楼主| 发表于 2015-11-25 08:52:27 | 显示全部楼层
我用的是STM32F103C8T6的芯片,int main(void)
{
// USART1_Init_Config(115200);//USART1初始化配置
USART2_Init_Config(9600);//USART2初始化配置
while (1)
{
// if(Usart1_R_State == 1)//一帧数据接收完成
// {
// USART1_SendData((u8 *)Usart1_R_Buff, Usart1_R_Count);//USART1发送数据缓冲区数据(发送刚接收完成的一帧数据)
// Usart1_R_State =0;
// Usart1_R_Count =0;
// }

if(Usart2_R_State == 1)//一帧数据接收完成
{
USART2_SendData((u8 *)Usart2_R_Buff, Usart2_R_Count);//USART2发送数据缓冲区数据(发送刚接收完成的一帧数据)
Usart2_R_State =0;
Usart2_R_Count =0;
}
}
}



/*******************************************************************************
* 函数名: USART2_IRQHandler
* 描述 : 串口2中断服务程序
* 输入 : 无
* 返回 : 无 
* 说明 : 1)、只启动了USART2中断接收,未启动USART2中断发送。
*           2)、接收到0x0d 0x0a(回车、"\r\n")代表帧数据接收完成
*******************************************************************************/
void USART2_IRQHandler(void)                
{
u8 Res2=0;

if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) //接收中断(接收到的数据必须是0x0d 0x0a结尾)
{
Res2 =USART_ReceiveData(USART2); //读取接收到的数据(USART1->DR)

Usart2_R_Buff[Usart2_R_Count++] = Res2;
if(Usart2_R_State == 0)//数据接收未完成
{
if(Res2 == 0x0d)//接收到0x0d,下一个字节接收到0x0a则接收完成
{
Usart2_R_State =2;
}
}
else if(Usart2_R_State == 2)
{
if(Res2 == 0x0a)//上一个字节接收到0x0d,这个字节接收到oxoa则接收完成
{
Usart2_R_State =1;//数据接收完成
}
else//接收错误
{
Usart2_R_State =0;
Usart2_R_Count =0;
}
}
if(Usart2_R_Count >= USART2_REC_MAXLEN)//接收数据长度走出接收数据缓冲区
{
if((Usart2_R_Buff[USART2_REC_MAXLEN-2] != 0x0d) || (Usart2_R_Buff[USART2_REC_MAXLEN-1] != 0x0a))
{
Usart2_R_Count =0;
Usart2_R_State =0;
}
}   

}
回复

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2015-11-24
在线时间
0 小时
 楼主| 发表于 2015-11-25 08:53:24 | 显示全部楼层
回复【3楼】baotang:
---------------------------------
我是用串口软件跟他通讯,但没数据发上去
回复

使用道具 举报

22

主题

751

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1605
金钱
1605
注册时间
2015-6-10
在线时间
222 小时
发表于 2015-11-25 09:01:43 | 显示全部楼层
在串口中断加断点,看有没有进去
回复

使用道具 举报

22

主题

2251

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4480
金钱
4480
注册时间
2013-4-22
在线时间
337 小时
发表于 2015-11-25 09:07:54 | 显示全部楼层
void NVIC_Configuration(void)
{
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

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

你先看看中断优先级配置没有?例子给你了
回复

使用道具 举报

2

主题

239

帖子

0

精华

高级会员

Rank: 4

积分
545
金钱
545
注册时间
2015-6-5
在线时间
110 小时
发表于 2015-11-25 09:19:01 | 显示全部楼层
USART2 沒看到你有設定中斷

所以進不了中斷

好死不死
USART2_SendData((u8 *)Usart2_R_Buff, Usart2_R_Count);//USART2发送数据缓冲区数据(发送刚接收完成的一帧数据) 

你的觸發條件是接收剛發送的

低階錯誤
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2015-11-25
在线时间
0 小时
发表于 2015-11-25 10:05:22 | 显示全部楼层
路过。。。。
各位大侠,有没有想换工作的?广东五洲龙电源科技高薪聘软件工程师,新能源车动力锂电管理系统BMS开发方向。有意者发简历至3024577197@qq.com或加Q私聊。.
广东五洲龙电源诚聘软件工程师。有意者发简历3024577197@qq.com或Q私聊
回复

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2015-11-24
在线时间
0 小时
 楼主| 发表于 2015-11-25 10:19:04 | 显示全部楼层
回复【7楼】Rocks:
---------------------------------
 哪里的问题啊,不明白
回复

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2015-11-24
在线时间
0 小时
 楼主| 发表于 2015-11-25 10:29:32 | 显示全部楼层
回复【9楼】baotang:
---------------------------------
回复【7楼】Rocks:
---------------------------------
但我单独设置 串口1 是可行,没有改过程序,只是改改串口,但对换过来串口2 就不行了
回复

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2015-11-24
在线时间
0 小时
 楼主| 发表于 2015-11-25 11:10:04 | 显示全部楼层
回复【7楼】Rocks:
---------------------------------
中段有加上去,没贴出来,但还是不行/*******************************************************************************
* 函数名: USART2_Init_Config
* 描述 : USART2初始化配置
* 输入 : bound:波特率(常用:2400、4800、9600、19200、38400、115200等)
* 输出 : 无
* 返回 : 无 
* 说明 : 无
*******************************************************************************/
void USART2_Init_Config(u32 bound)
{
    GPIO_InitTypeDef  GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef  NVIC_InitStructure;

/*使能USART2和GPIOA外设时钟*/  
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2 , ENABLE);
/*复位串口1*/
  USART_DeInit(USART2);  

/*USART1_GPIO初始化设置*/ 
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //USART2_TXD(PA.2)     
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置引脚输出最大速率为50MHz
    GPIO_Init(GPIOA, &GPIO_InitStructure); //调用库函数中的GPIO初始化函数,初始化USART2_TXD(PA.2)  
   
    
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; //USART2_RXD(PA.3)
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
    GPIO_Init(GPIOA, &GPIO_InitStructure); //调用库函数中的GPIO初始化函数,初始化USART2_RXD(PA.3)


   /*USART1 初始化设置*/
USART_InitStructure.USART_BaudRate = bound; //设置波特率
USART_InitStructure.USART_WordLength = USART_WordLength_8b; //8位数据格式
USART_InitStructure.USART_StopBits = USART_StopBits_1; //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); //初始化串口1


NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0 ;//抢占优先级3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //子优先级3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器

USART_Cmd(USART2, ENABLE); 
USART_ClearFlag(USART2, USART_FLAG_TC);
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
}
回复

使用道具 举报

7

主题

171

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2337
金钱
2337
注册时间
2015-9-6
在线时间
536 小时
发表于 2015-11-25 12:37:53 | 显示全部楼层
按照4楼说的,你把调试一下,把断点设在中断函数里,先看能不能进中断,再把Res2放到监视窗里面去,看有没有读到数
回复

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2015-11-24
在线时间
0 小时
 楼主| 发表于 2015-11-25 17:33:49 | 显示全部楼层
解决了,是我的数据插反了
回复

使用道具 举报

0

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
139
金钱
139
注册时间
2014-1-11
在线时间
23 小时
发表于 2016-6-19 20:40:42 | 显示全部楼层
参考一下
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-13 15:07

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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