OpenEdv-开源电子网

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

USART2_DMA通道6、7的完成中断均不能进入!

[复制链接]

4

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
67
金钱
67
注册时间
2013-12-14
在线时间
3 小时
发表于 2014-5-12 08:02:56 | 显示全部楼层 |阅读模式
5金钱
[mw_shl_code=c,true] [mw_shl_code=c,true]//RS485总线串口、DMA初始化[/mw_shl_code] [/mw_shl_code] [mw_shl_code=c,true]void Init_RS485(u32 bound) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);             //使能GPIOA时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2|RCC_APB2Periph_AFIO,ENABLE);   //使能USART2时钟 USART_DeInit(USART2); //复位串口2 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;     //PA1端口配置 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;     //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOG, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;          //PA2 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽 GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; //PA3 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入 GPIO_Init(GPIOA, &GPIO_InitStructure); RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2,ENABLE); //复位串口2 RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2,DISABLE); //停止复位 USART_InitStructure.USART_BaudRate = bound; //一般设置为9600; 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(USART2, &USART_InitStructure); //初始化串口 USART_Cmd(USART2, ENABLE); //使能串口 // USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); //开启串口接收中断 //配置USART2_RX的DMA_CH6接收中断 NVIC_Configuration();//中断优先级配置 NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel6_IRQn; //使能DMA1_CH6(USART2_RX)中断 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //先占优先级1级 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //从优先级1级 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能中断通道 NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器 //配置USART2_TX的DMA_CH7发送中断 NVIC_Configuration();//中断优先级配置 NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel7_IRQn; //使能DMA1_CH7(USART2_RX)中断 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //先占优先级1级 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; //从优先级2级 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能中断通道 NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器 //配置USART2的接收DMA通道 DMA_ClearITPendingBit(DMA1_IT_TC6); //清通道6完成中断 DMA_Config(DMA1_Channel6,(u32)&USART2->DR,(u32)U2_ReceBuff,8,DMA_DIR_PeripheralSRC);//USART2_RX DMA_ITConfig(DMA1_Channel6, DMA_IT_TC,ENABLE); //开启USART1_DMA_CH6完成中断 DMA_Cmd(DMA1_Channel6, ENABLE); //开启DMA_CH6通道 USART_DMACmd(USART2, USART_DMAReq_Rx, ENABLE); //开启USART2接收DMA //配置USART2的发送DMA通道 DMA_ClearITPendingBit(DMA1_IT_TC7); //清通道7完成中断 DMA_Config(DMA1_Channel7,(u32)&USART2->DR,(u32)U2_SendBuff,7,DMA_DIR_PeripheralDST);//USART2_TX DMA_ITConfig(DMA1_Channel7, DMA_IT_TC,ENABLE); //开启USART1_DMA_CH7完成中断 // DMA_Cmd(DMA1_Channel7, ENABLE); //开启DMA_CH7通道 USART_DMACmd(USART2, USART_DMAReq_Tx, ENABLE); //开启USART2发送DMA // RS485_EN = 1; //485发送模式 RS485_EN = 0; //默认485接收模式 } //USART2_RX_DMA完成中断服务函数 void DMA1_Channel6_IRQHandler(void) { // u8 i = 0; DMA_ITConfig(DMA1_Channel6, DMA_IT_TC,DISABLE); //关闭USART2_DMA_CH2接收完成中断 printf("ok\r\n"); if(DMA_GetITStatus(DMA1_IT_TC6) != RESET) {//以下为从机状态数据帧解码函数 // Frame_Decoding(); //帧解码函数 printf("%x\r\n",U2_ReceBuff[0]); printf("%x\r\n",U2_ReceBuff[1]); printf("%x\r\n",U2_ReceBuff[2]); printf("%x\r\n",U2_ReceBuff[3]); printf("%x\r\n",U2_ReceBuff[4]); printf("%x\r\n",U2_ReceBuff[5]); printf("%x\r\n",U2_ReceBuff[6]); printf("%x\r\n",U2_ReceBuff[7]); } DMA_ClearITPendingBit(DMA1_IT_TC6); DMA_Config(DMA1_Channel6,(u32)&USART2->DR,(u32)U2_ReceBuff,8,DMA_DIR_PeripheralSRC);//USART2_RX DMA_Cmd(DMA1_Channel6, ENABLE); //开启DMA_CH6通道 DMA_ITConfig(DMA1_Channel6, DMA_IT_TC,ENABLE); //开启USART2_DMA_CH6接收完成中断 } //USART2_TX_DMA完成中断服务函数 void DMA1_Channel7_IRQHandler(void) { // u8 i = 0; printf("send ok"); DMA_ITConfig(DMA1_Channel7, DMA_IT_TC,DISABLE); //关闭USART2_DMA_CH7接收完成中断 if(DMA_GetITStatus(DMA1_IT_TC7) != RESET) {//以下为RS485基于MODBUS协议发送完成后定时器延时函数 printf("send ok"); } // printf("\r\n"); DMA_ClearITPendingBit(DMA1_IT_TC7); DMA_Config(DMA1_Channel7,(u32)&USART2->DR,(u32)U2_ReceBuff,7,DMA_DIR_PeripheralDST);//USART2_TX DMA_Cmd(DMA1_Channel7, ENABLE); //开启DMA_CH7通道 DMA_ITConfig(DMA1_Channel7, DMA_IT_TC,ENABLE); //开启USART2_DMA_CH7接收完成中断 } int main(void) { u8 s = 1; NVIC_Configuration();//中断优先级配置 SystemInit(); //系统72M初始化 uart_init(9600); //串口 delay_init(72); //软件延时 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //先开启AFIO复用时钟 GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);//才能调用本句关闭JTAG开启SWD,JTAG引脚释放为GPIO Init_RS485(9600); //RS485总线初始化 while(1) { printf("while1 ok\r\n"); delay_ms(500); Frame_Send(Cabinet1,Demand_Slave,0x00); delay_ms(500); } }[/mw_shl_code]

现象是无论DMA接收完成还是发送完成,均不会进入中断,不过USART2经485可以正常发送数据,只是进入不了中断,中断服务函数名与.s启动文件中一样,DMA1时钟开启。还请各位帮忙解答一下,卡半天了。


最佳答案

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

已解决,DMA发送是要求先关闭,再赋值CNDTR数据长度,再开启DMA,设计到一些软件逻辑没考虑仔细
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
67
金钱
67
注册时间
2013-12-14
在线时间
3 小时
 楼主| 发表于 2014-5-12 08:02:57 | 显示全部楼层
已解决,DMA发送是要求先关闭,再赋值CNDTR数据长度,再开启DMA,设计到一些软件逻辑没考虑仔细
回复

使用道具 举报

4

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
67
金钱
67
注册时间
2013-12-14
在线时间
3 小时
 楼主| 发表于 2014-5-12 08:06:58 | 显示全部楼层

使用JTAG调试时,发现中断标志位在DMA发送一帧数据后被置位,依然进入不了DMA1_CH7完成中断中进行下一步程序。

回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-5-12 08:15:36 | 显示全部楼层
在中断服务函数里面打断点,仿真看下能不能进去
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

0

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2014-5-11
在线时间
5 小时
发表于 2014-5-12 08:17:31 | 显示全部楼层
我的中断也进不了,刚学STM32,想让其进串口中断,能发,中断进不了。
回复

使用道具 举报

4

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
67
金钱
67
注册时间
2013-12-14
在线时间
3 小时
 楼主| 发表于 2014-5-12 08:33:29 | 显示全部楼层
回复【3楼】Badu_Space:
---------------------------------
硬件调试中断中设置断点进不去,其它地方设置断点正常。
回复

使用道具 举报

4

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
67
金钱
67
注册时间
2013-12-14
在线时间
3 小时
 楼主| 发表于 2014-5-12 08:36:49 | 显示全部楼层
回复【3楼】Badu_Space:
---------------------------------
前辈,程序没什么问题吧,我这些配置检查了半天也没发现什么问题
回复

使用道具 举报

80

主题

931

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3348
金钱
3348
注册时间
2013-5-28
在线时间
468 小时
发表于 2014-5-12 11:13:17 | 显示全部楼层
你不会NVIC没开吧?要进中断就4个事
1.中断使能
2.NVIC中断开启
3.中断条件符合(中断置位)
4.中断函数名正确
回复

使用道具 举报

80

主题

931

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3348
金钱
3348
注册时间
2013-5-28
在线时间
468 小时
发表于 2014-5-12 11:16:17 | 显示全部楼层
感觉很对啊,你include那个IT文件没?
回复

使用道具 举报

4

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
67
金钱
67
注册时间
2013-12-14
在线时间
3 小时
 楼主| 发表于 2014-5-12 11:29:08 | 显示全部楼层
回复【7楼】聚东风:
---------------------------------
这些我都注意到了,没错误
回复

使用道具 举报

4

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
67
金钱
67
注册时间
2013-12-14
在线时间
3 小时
 楼主| 发表于 2014-5-12 11:30:14 | 显示全部楼层
回复【8楼】聚东风:
---------------------------------
include stm32f10x_it.c ?
包含了, 但是DMA中断服务函数我都直接写在主函数中了,it文件里面没有
回复

使用道具 举报

4

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
67
金钱
67
注册时间
2013-12-14
在线时间
3 小时
 楼主| 发表于 2014-5-12 11:32:36 | 显示全部楼层
回复【8楼】聚东风:
---------------------------------
而且现在出现这个情况,就是我DMA1_CH7  (USART2的TX), 发送之前再开启一下DMA_IT_TC完成中断,此时可以进去中断服务函数执行, 但是要发送7个字节,莫名其妙多了一个字节的0X00;
以上只是DMA发送勉强可以发之前开一次中断, 要是接收这个法子不可行,谁知道从机什么时候发过来
回复

使用道具 举报

26

主题

201

帖子

0

精华

高级会员

Rank: 4

积分
606
金钱
606
注册时间
2013-12-14
在线时间
125 小时
发表于 2015-11-25 14:14:56 | 显示全部楼层
回复【12楼】cszgulu:
---------------------------------
DMA_Cmd(DMA1_Channel4, DISABLE);
DMA_SetCurrDataCounter(DMA1_Channel4, s_UART_SendInfo[0].sendLen);       
DMA_Cmd(DMA1_Channel4, ENABLE);

我的还是用不了
回复

使用道具 举报

2

主题

14

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
298
金钱
298
注册时间
2014-8-22
在线时间
91 小时
发表于 2016-6-13 15:41:40 | 显示全部楼层
本帖最后由 zhanghankui 于 2016-6-13 18:11 编辑

我的也是, DMA1_Channel4可以进入中断,但通道7进不去。数据传输没有问题,不知道哪里的问题啊
解决了,还是没配置好
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-11 05:34

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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