OpenEdv-开源电子网

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

stm32f103vet6同时开了串口1和串口2但是串口2进不去中断

[复制链接]

3

主题

14

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2018-5-22
在线时间
5 小时
发表于 2018-5-22 16:52:42 | 显示全部楼层 |阅读模式
10金钱
串口2接了红外解码模块,想用遥控器给红外解码模块发信息然后由串口1发到电脑上,但电脑上不显示接受,应该是串口2中断没进,不知道那错了



oid USART1_Initialise(void)
{
        //GPIO端口设置
        GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE);
        //USART1_TX   PA.9
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_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_IPU;
        GPIO_Init(GPIOA, &GPIO_InitStructure);  

        //Usart1 NVIC 配置

        NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;        //

        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;            //IRQ通道使能
        NVIC_Init(&NVIC_InitStructure);    //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器USART1

        //USART 初始化设置

        USART_InitStructure.USART_BaudRate = 115200;//一般设置为9600;
        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(USART1, &USART_InitStructure);


        USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启中断

        USART_Cmd(USART1, ENABLE);                    //使能串口

}
void USART2_Initialise( void )
{
    GPIO_InitTypeDef GPIO_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
    USART_InitTypeDef USART_InitStructure;

    /* Enable the USART2 Pins Software Remapping */
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2|RCC_APB2Periph_AFIO, ENABLE);

    /* Configure USART2 Rx (PA.03) as input floating */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;   
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    /* Configure USART2 Tx (PA.02) as alternate function push-pull */
    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);

    /* Enable the USART2 Interrupt */
    NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);   

    USART_InitStructure.USART_BaudRate = 9600;               
    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);
    /* Enable USART2 */
    USART_Cmd(USART2, ENABLE);
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-5-24 02:09:36 | 显示全部楼层
回复

使用道具 举报

3

主题

43

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
429
金钱
429
注册时间
2017-1-6
在线时间
66 小时
发表于 2018-5-24 08:26:35 | 显示全部楼层
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;   
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    /* Configure USART2 Tx (PA.02) as alternate function push-pull */
    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);


这两个初始化反了
你仔细看下
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
这个速度 你应该放上面
回复

使用道具 举报

3

主题

14

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2018-5-22
在线时间
5 小时
 楼主| 发表于 2018-5-24 22:00:17 | 显示全部楼层
mexico007 发表于 2018-5-24 08:26
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;   
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
...

为啥说反了啊,TX必须定义在RX前面吗,新手不太明白,能说清楚点吗谢谢了
回复

使用道具 举报

3

主题

14

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2018-5-22
在线时间
5 小时
 楼主| 发表于 2018-5-24 22:15:46 | 显示全部楼层

那个485例程啊,没看懂能告诉下吗,谢谢了。。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-5-25 00:48:39 | 显示全部楼层
604723254 发表于 2018-5-24 22:15
那个485例程啊,没看懂能告诉下吗,谢谢了。。

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

使用道具 举报

3

主题

43

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
429
金钱
429
注册时间
2017-1-6
在线时间
66 小时
发表于 2018-5-25 08:07:57 | 显示全部楼层
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
我的意思是这条语句你应该放在
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
这条上面

这样两个引脚才都有速度
回复

使用道具 举报

15

主题

406

帖子

0

精华

高级会员

Rank: 4

积分
795
金钱
795
注册时间
2015-3-26
在线时间
151 小时
发表于 2018-5-25 08:56:39 | 显示全部楼层
别应该是什么什么,去打断点,去调试啊 ,中断服务程序不发上来怎么定位问题
回复

使用道具 举报

0

主题

207

帖子

0

精华

高级会员

Rank: 4

积分
959
金钱
959
注册时间
2017-5-27
在线时间
108 小时
发表于 2018-5-25 09:13:27 | 显示全部楼层
请描述详细信息,不要下结论,中断代码贴一下
回复

使用道具 举报

3

主题

14

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2018-5-22
在线时间
5 小时
 楼主| 发表于 2018-5-25 14:03:28 | 显示全部楼层
lanlzp 发表于 2018-5-25 09:13
请描述详细信息,不要下结论,中断代码贴一下

这是我中断代码额
void USART1_IRQHandler(void)
{
   
                 uint8_t ucTemp;
         USART_ClearITPendingBit(USART1,USART_IT_RXNE);
        if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)
        {               
                ucTemp = USART_ReceiveData(USART2);
    USART_SendData(USART1,ucTemp);
        }               
}


void USART2_IRQHandler(void)
{
   uint8_t ucTemp;
         USART_ClearITPendingBit(USART1,USART_IT_RXNE);
        if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)
        {               
                ucTemp = USART_ReceiveData(USART2);
    USART_SendData(USART1,ucTemp);   
                 
}
回复

使用道具 举报

3

主题

14

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2018-5-22
在线时间
5 小时
 楼主| 发表于 2018-5-25 14:03:54 | 显示全部楼层
xyl210xyl 发表于 2018-5-25 08:56
别应该是什么什么,去打断点,去调试啊 ,中断服务程序不发上来怎么定位问题

中断发下面了。。
回复

使用道具 举报

0

主题

207

帖子

0

精华

高级会员

Rank: 4

积分
959
金钱
959
注册时间
2017-5-27
在线时间
108 小时
发表于 2018-5-25 17:29:36 | 显示全部楼层
604723254 发表于 2018-5-25 14:03
这是我中断代码额
void USART1_IRQHandler(void)
{

void USART1_IRQHandler(void)
{
   
                 uint8_t ucTemp;
      //   USART_ClearITPendingBit(USART1,USART_IT_RXNE);
        if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)
        {               
                ucTemp = USART_ReceiveData(USART1);
    USART_SendData(USART1,ucTemp);
        }               
}


void USART2_IRQHandler(void)
{
   uint8_t ucTemp;
       //  USART_ClearITPendingBit(USART1,USART_IT_RXNE);
        if(USART_GetITStatus(USART2,USART_IT_RXNE)!=RESET)
        {               
                ucTemp = USART_ReceiveData(USART2);
    USART_SendData(USART2,ucTemp);   
                 
}
回复

使用道具 举报

0

主题

207

帖子

0

精华

高级会员

Rank: 4

积分
959
金钱
959
注册时间
2017-5-27
在线时间
108 小时
发表于 2018-5-25 17:30:27 | 显示全部楼层
lanlzp 发表于 2018-5-25 17:29
void USART1_IRQHandler(void)
{
   

仔细对对代码
回复

使用道具 举报

3

主题

14

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2018-5-22
在线时间
5 小时
 楼主| 发表于 2018-5-25 23:14:48 | 显示全部楼层
mexico007 发表于 2018-5-25 08:07
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
我的意思是这条语句你应该放在
GPIO_InitStructure ...

不用啊,TX是推挽输出才有速度,RX是浮空输入不用速度啊
回复

使用道具 举报

3

主题

14

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2018-5-22
在线时间
5 小时
 楼主| 发表于 2018-5-25 23:34:59 | 显示全部楼层
lanlzp 发表于 2018-5-25 17:29
void USART1_IRQHandler(void)
{
   

我是串口2接收然后在串口2中断里把接受的东西发给串口1啊,应该没问题啊。。。
回复

使用道具 举报

15

主题

406

帖子

0

精华

高级会员

Rank: 4

积分
795
金钱
795
注册时间
2015-3-26
在线时间
151 小时
发表于 2018-5-26 08:48:36 | 显示全部楼层
我擦,你中断里面发个毛数据啊 。。。
回复

使用道具 举报

3

主题

14

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2018-5-22
在线时间
5 小时
 楼主| 发表于 2018-5-26 15:59:47 | 显示全部楼层
xyl210xyl 发表于 2018-5-26 08:48
我擦,你中断里面发个毛数据啊 。。。

不在中断里发在哪发啊
回复

使用道具 举报

0

主题

207

帖子

0

精华

高级会员

Rank: 4

积分
959
金钱
959
注册时间
2017-5-27
在线时间
108 小时
发表于 2018-5-28 09:09:11 | 显示全部楼层
604723254 发表于 2018-5-25 23:34
我是串口2接收然后在串口2中断里把接受的东西发给串口1啊,应该没问题啊。。。

仔细对对代码,多看少问
回复

使用道具 举报

11

主题

2154

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4943
金钱
4943
注册时间
2015-1-10
在线时间
620 小时
发表于 2018-5-28 09:51:38 | 显示全部楼层
本帖最后由 阿侑kevin 于 2018-5-28 09:59 编辑

看你的代码,应该是进了串口2中断,但是第一次处理完了没清中断标志,这个你在KEIL或是IAR 的寄存器里可以看到,串口2中断一直挂起导致无法再次进入串口2 中断,12楼已经给你更正了这个问题其次,说一下串口发送的问题,我发现很多人在用串口库做发送,个人在几年的工作中发现其实是有一点小小的问题的,比如我们发一个长数组,大家都会用for循环发送,然后主程序一直在死等,这样是不合理的,在工业应用中一般都是采用发送中断或是发送完成中断去实现,这个可以百度到很多
再者,个人觉得中断中只去置标志或是处理非常紧急的任务,大多数操作还是在main中通过状态机进行更合理一点
回复

使用道具 举报

2

主题

91

帖子

0

精华

高级会员

Rank: 4

积分
509
金钱
509
注册时间
2016-11-16
在线时间
111 小时
发表于 2018-5-28 11:25:49 | 显示全部楼层
中断中还是只处理标志位比较好。  在外部检测标志位再来发送数据
回复

使用道具 举报

3

主题

14

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2018-5-22
在线时间
5 小时
 楼主| 发表于 2018-5-29 23:06:36 | 显示全部楼层
阿侑kevin 发表于 2018-5-28 09:51
看你的代码,应该是进了串口2中断,但是第一次处理完了没清中断标志,这个你在KEIL或是IAR 的寄存器里可以 ...

好的,谢谢啊
回复

使用道具 举报

3

主题

14

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2018-5-22
在线时间
5 小时
 楼主| 发表于 2018-5-29 23:06:49 | 显示全部楼层
lanlzp 发表于 2018-5-28 09:09
仔细对对代码,多看少问

O(∩_∩)O好的
回复

使用道具 举报

3

主题

56

帖子

0

精华

初级会员

Rank: 2

积分
88
金钱
88
注册时间
2019-5-8
在线时间
27 小时
发表于 2019-5-12 20:30:20 | 显示全部楼层
兄弟 最后怎么解决的啊?给分享一下
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-20 01:35

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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