OpenEdv-开源电子网

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

STM32 进入空闲中断疑问

[复制链接]

2

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2017-1-11
在线时间
25 小时
发表于 2017-1-11 17:05:27 | 显示全部楼层 |阅读模式
2金钱
软件仿真 STM32,虚拟串口接 串口调试助手, 开启 IDLE空闲中断,串口助手给STM32发字符串,但只有 结尾是 空格/0/@ 才会触发空闲中断,其他字符怎么发都不会触发

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

使用道具 举报

2

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2017-1-11
在线时间
25 小时
 楼主| 发表于 2017-1-12 14:31:00 | 显示全部楼层
回复

使用道具 举报

13

主题

448

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1755
金钱
1755
注册时间
2015-2-7
在线时间
369 小时
发表于 2017-1-15 17:39:25 | 显示全部楼层
楼主贴你的代码给大家分析
回复

使用道具 举报

2

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2017-1-11
在线时间
25 小时
 楼主| 发表于 2017-1-16 09:51:12 | 显示全部楼层
本帖最后由 520sky 于 2017-1-16 09:53 编辑

代码如下,最新发现 凡是 0x?0格式的ascii码字符(上面提及字符均符合这种格式) 结尾的字符串 可以触发IDLE

[mw_shl_code=c,true]void USART1_IRQHandler(void){
        
        //char tmp[BUF_DATA_SIZE];
        
        //if(USART_GetITStatus(USART1, USART_IT_RXNE) == SET){
        //        USART_ReceiveData(USART1);
        //        DMA_reset();
        //}
        
        if(USART_GetITStatus(USART1, USART_IT_IDLE) == SET){
               
                DMA_Cmd(DMA1_Channel5,DISABLE);
               
                //Çå3yÖD¶Ï±êÖ¾
                buf_data_length = USART1->SR;  
        buf_data_length = USART1->DR;
               
                buf_data_length = BUF_DATA_SIZE - DMA_GetCurrDataCounter(DMA1_Channel5);  
               
                //ÖØÖÃDMA
                DMA_SetCurrDataCounter(DMA1_Channel5,BUF_DATA_SIZE);  
        DMA_Cmd(DMA1_Channel5,ENABLE);
        }
}

void DMA_Channel5_IRQHandler(void){
        
        if(DMA_GetITStatus(DMA1_IT_TC5) == SET){
                DMA_ClearITPendingBit(DMA1_IT_TC5);
                DMA_Config();
        }
}


//GPIO¿úÅäÖÃ
void GPIO_Config(void){
        
        GPIO_InitTypeDef GPIO_InitStructure;

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
        GPIO_Init(GPIOA, &GPIO_InitStructure);        
        
        
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
        GPIO_Init(GPIOA, &GPIO_InitStructure);        
}

//′®¿úÅäÖÃ
void USART_Config(void){
        
        USART_InitTypeDef usart_config;
        usart_config.USART_BaudRate = 115200;
        usart_config.USART_WordLength = USART_WordLength_8b;
        usart_config.USART_StopBits = USART_StopBits_1;
        usart_config.USART_Parity = USART_Parity_No;
        usart_config.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
        usart_config.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
        
        USART_Init(USART1, &usart_config);
        
        usart_config.USART_BaudRate = 57600;
        
        USART_Init(USART2, &usart_config);
        
        //USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
        //USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);
        //USART_ClearFlag(USART1, USART_FLAG_TC);
        
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
        
        USART_Cmd(USART1,ENABLE);
        USART_Cmd(USART2,ENABLE);
        
        USART_DMACmd(USART1,USART_DMAReq_Rx,ENABLE);
        
}


void NVIC_Configuration(void){
        
        NVIC_InitTypeDef NVIC_InitStructure;
        
        NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        
        NVIC_Init(&NVIC_InitStructure);
        
        NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel5_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 4;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        
        NVIC_Init(&NVIC_InitStructure);
        
}

void DMA_Config(void){
        
        DMA_InitTypeDef DMA_InitStructure;
        
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);        
        
        DMA_DeInit(DMA1_Channel5);
        
        DMA_InitStructure.DMA_PeripheralBaseAddr = (USART1_BASE + 0x4);
        DMA_InitStructure.DMA_MemoryBaseAddr = (u32)buf_data;
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
        DMA_InitStructure.DMA_BufferSize = BUF_DATA_SIZE;
        DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
        DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
        DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
        DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_Byte;
        DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
        DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;
        DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
        DMA_Init(DMA1_Channel5, &DMA_InitStructure);
        
        DMA_ITConfig(DMA1_Channel5, DMA_IT_TC, ENABLE);
        DMA_Cmd(DMA1_Channel5,ENABLE);
}[/mw_shl_code]
回复

使用道具 举报

2

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2017-1-11
在线时间
25 小时
 楼主| 发表于 2017-1-16 09:51:53 | 显示全部楼层
电子之旅 发表于 2017-1-15 17:39
楼主贴你的代码给大家分析

已附上代码
回复

使用道具 举报

13

主题

448

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1755
金钱
1755
注册时间
2015-2-7
在线时间
369 小时
发表于 2017-1-17 09:50:44 | 显示全部楼层

你为什么把串口中断配置的代码屏蔽了,这样怎么进入中断?
回复

使用道具 举报

2

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2017-1-11
在线时间
25 小时
 楼主| 发表于 2017-1-17 13:39:12 | 显示全部楼层
电子之旅 发表于 2017-1-17 09:50
你为什么把串口中断配置的代码屏蔽了,这样怎么进入中断?

额额,忘记了这是修改后的代码,
//USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);
测试时,这行没有注释的
回复

使用道具 举报

2

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2017-1-11
在线时间
25 小时
 楼主| 发表于 2017-2-6 17:12:32 | 显示全部楼层
自己顶顶~~~~~~~~~~
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2017-2-6 18:08:55 | 显示全部楼层
参考下论坛网友的代码,有用空闲中断接收的。他们用的貌似没啥问题
回复

使用道具 举报

头像被屏蔽

8

主题

95

帖子

0

精华

禁止发言

积分
349
金钱
349
注册时间
2016-12-8
在线时间
88 小时
发表于 2017-2-6 18:11:35 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

2

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2017-1-11
在线时间
25 小时
 楼主| 发表于 2017-2-7 09:16:19 | 显示全部楼层
charlefu 发表于 2017-2-6 18:11
这个,你试试看发hex的时候是否会触发。因为有的串口工具发字符串要回车才会发送,你当然收不到字符了。

发hex一模一样,仿真能看到 变量收到的值的,怎么会没发送呢
回复

使用道具 举报

2

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2017-1-11
在线时间
25 小时
 楼主| 发表于 2017-2-7 14:07:46 | 显示全部楼层
正点原子 发表于 2017-2-6 18:08
参考下论坛网友的代码,有用空闲中断接收的。他们用的貌似没啥问题

下载论坛的工程,一样出现同样的,是我的测试环境有问题吗??
用的keil 5
回复

使用道具 举报

21

主题

299

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1836
金钱
1836
注册时间
2013-7-29
在线时间
278 小时
发表于 2018-7-2 19:35:11 | 显示全部楼层
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-29 04:35

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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