OpenEdv-开源电子网

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

想做一个USART2与USART3通信的程序,不知为何不通

[复制链接]

7

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
106
金钱
106
注册时间
2020-10-19
在线时间
17 小时
发表于 2020-11-10 22:56:54 | 显示全部楼层 |阅读模式
1金钱
板子:STM32精英板F103ZEUSART2_TXA2
USART2_RXA3
USART3_TXB10
USART3_RXB11

硬件连接:用杜邦线连接A2与B11,A3与B10

设想:2号口发送一个字节到3号口,3号口接收以后点亮LED1,并且发送一个字节到2号口,2号口同样接收到之后点亮LED0,再发送字节到3号口,依次循环
问题:好像进不了中断,在第一次发送数据到3号口时,没有进入3号口的中断,于是我下载到板子上,连好了线路,也不行
重写了usart.c:
u8 USART_RX_STA2=0;       //接收状态标记
u8 USART_RX_STA3=0;       //接收状态标记
void usart_init_2(u32 bound){
        //GPIO端口设置
        GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
       
        RCC_APB2PeriphClockCmd(RCC_APB1Periph_USART2|RCC_APB2Periph_GPIOA, ENABLE);       

        //USART2_TX   GPIOA.2
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PA2
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;       
        GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.2

        //USART2_RX          GPIOA.3初始化
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//PA3
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.3

        //Usart2 NVIC 配置
        NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1 ;         //中断设置也是在网上找了资料,不知道2号口和3号口设置同一个优先级对不对
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;               
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                       
        NVIC_Init(&NVIC_InitStructure);        //根据指定的参数初始化VIC寄存器

        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_ClearFlag(USART2, USART_FLAG_TC);                  //这一行与下一行是论坛里找到的,说是发送第一个字节会不成功,因此加上这一句,或者下面一句
        //USART_ClearFlag(USART2, USART_FLAG_TC | USART_IT_RXNE);
        USART_Cmd(USART2, ENABLE);                  
}


void usart_init_3(u32 bound){
        GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
       
        RCC_APB2PeriphClockCmd(RCC_APB1Periph_USART3|RCC_APB2Periph_GPIOB, ENABLE);       

        //UART3_TX   GPIOB.10
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;       
        GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOC.12

        //UART3_RX          GPIOB.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=1 ;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;               
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                       
        NVIC_Init(&NVIC_InitStructure);        //根据指定的参数初始化VIC寄存器

        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(USART3, &USART_InitStructure);
        USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);
        USART_ClearFlag(USART3, USART_FLAG_TC);
        //USART_ClearFlag(USART3, USART_FLAG_TC | USART_IT_RXNE);
        USART_Cmd(USART3, ENABLE);                  
}

void USART2_IRQHandler(void)
{
        //中断处理程序
        if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
        {
                USART_RX_STA2 = 1;
                delay_ms(200);
                USART_SendData(USART3,0x1);                                             //这里发送一个字节0x1
                while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);
                //while(!(USART3->SR & USART_FLAG_TXE));
        }
}

void USART3_IRQHandler(void)
{
        if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)
        {
                USART_RX_STA3 = 1;
                delay_ms(200);
                USART_SendData(USART2,0x1);
                while(USART_GetFlagStatus(USART2,USART_FLAG_TC)!=SET);
                //while(!(USART2->SR & USART_FLAG_TXE));
        }
}


main.c程序很简单
#include "sys.h"
#include "uart.h"
#include "delay.h"
//#include "beep.h"
#include "led.h"
//#include "key.h"

int main(void)
{
        delay_init();
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
        usart_init_2(9600);                                    //波特率不敢设置太高
        usart_init_3(9600);
        LED_Init();
       
        USART_SendData(USART3,0x0d);             //首先发送一个数据到3号口,免得两个口都没数据,进入循环等待
        while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);
        //while(!(USART3->SR & USART_FLAG_TXE));//等待数据寄存器为空,发送完毕
       
        while(1)
        {
                if(USART_RX_STA2)        //有数据到达uart2
                {
                        LED0=0;                //点亮LED0
                        USART_RX_STA2 = 0;        //清除数据标记
                        delay_ms(200);
                        LED0=1;
                }
                if(USART_RX_STA3)        //有数据到达uart3
                {
                        LED1=0;                //点亮LED1
                        USART_RX_STA3 = 0;        //清除数据标记
                        delay_ms(200);
                        LED1=1;
                }
        }
}

最佳答案

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

http://www.openedv.com/forum.php?mod=viewthread&tid=284685&extra= 看下这个帖子 就两串口通信的
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

31

主题

2183

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
14433
金钱
14433
注册时间
2018-8-3
在线时间
1157 小时
发表于 2020-11-10 22:56:55 | 显示全部楼层
回复

使用道具 举报

7

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
106
金钱
106
注册时间
2020-10-19
在线时间
17 小时
 楼主| 发表于 2020-11-10 23:01:49 | 显示全部楼层
中断处理函数里面的delay_ms(1000),不是200毫秒
回复

使用道具 举报

7

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
106
金钱
106
注册时间
2020-10-19
在线时间
17 小时
 楼主| 发表于 2020-11-12 15:46:57 | 显示全部楼层
翼行园子 发表于 2020-11-10 22:56
http://www.openedv.com/forum.php?mod=viewthread&tid=284685&extra= 看下这个帖子 就两串口通信的

感谢您的回复,我看了一下,好像有些不一样,我的不是探索者,有的函数不一样,另外你的程序发送还是要发送0x0d和0x0a,我的想法是只发送一个字节就响应。
回复

使用道具 举报

31

主题

2183

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
14433
金钱
14433
注册时间
2018-8-3
在线时间
1157 小时
发表于 2020-11-12 17:35:57 | 显示全部楼层
routedhust 发表于 2020-11-12 15:46
感谢您的回复,我看了一下,好像有些不一样,我的不是探索者,有的函数不一样,另外你的程序发送还是要发 ...

那你中断部分的可以参考F1的485历程那个串口中断去写
啊哈~加油!!
回复

使用道具 举报

7

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
106
金钱
106
注册时间
2020-10-19
在线时间
17 小时
 楼主| 发表于 2020-11-26 11:35:42 | 显示全部楼层
翼行园子 发表于 2020-11-12 17:35
那你中断部分的可以参考F1的485历程那个串口中断去写

谢谢,等我学到485再看看吧
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-22 21:05

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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