标题:
stm32 SPI+DMA阻塞方式,测试通过,有需要的可以下,谁有中断方式麻烦教教我,感激不尽
[打印本页]
作者:
JayLau
时间:
2018-8-9 10:13
标题:
stm32 SPI+DMA阻塞方式,测试通过,有需要的可以下,谁有中断方式麻烦教教我,感激不尽
这个是SPI+DM1用的查询方式,我要改成中断方式一直没成功,感觉好无助啊。。。。谁调过中断的可以帮帮我吗?
stm32单片机源程序如下:
#include "stm32f10x_lib.h"
#include "SPI_DMA.h"
#include "LED.h"
#include "delay.h"
extern vu8 SPI1_TX_Buff ;
extern vu8 SPI2_TX_Buff ;
extern vu8 SPI1_RX_Buff ;
extern vu8 SPI2_RX_Buff ;
void main( void )
{
u8 i ;
Stm32_Clock_Init(9);
delay_init(72);
SPI1_Configuration();
SPI2_Configuration();
SPI1_DMA_Configuration();
SPI2_DMA_Configuration();
LED_Init();
SPI1_SetSpeed( SPI_SPEED_256 );
DMA1_Channel2->CCR |= 1 << 0 ; //开启DMA通道2
DMA1_Channel4->CCR |= 1 << 0 ; //开启DMA通道4
DMA1_Channel5->CCR |= 1 << 0 ; //开启DMA通道5
DMA1_Channel3->CCR |= 1 << 0 ; //开启DMA通道3
while( ( DMA1->ISR & (1<<17) ) == 0 ) ; //等待通道5传输完成
while( ( DMA1->ISR & (1<<9) ) == 0 ) ; //等待通道3传输完成
while( ( DMA1->ISR & (1<<13) ) == 0 ) ; //等待通道4传输完成
while( ( DMA1->ISR & (1<<5) ) == 0 ) ; //等待通道2传输完成
if(SPI1_RX_Buff == SPI2_TX_Buff) LED_ON; //如果SPI1接收的SPI2发送数据相同
else LED_OFF ; //点亮LED
delay_ms(1000);
LED_OFF;
delay_ms(1000);
if(SPI2_RX_Buff == SPI1_TX_Buff) LED_ON; //如果SPI2接收的SPI1发送数据相同
else LED_OFF ; //点亮LED
delay_ms(1000);
LED_OFF;
delay_ms(1000);
//第二次传输
DMA1_Channel2->CCR &= ~(1 << 0) ; //关闭DMA通道2
DMA1_Channel4->CCR &= ~(1 << 0) ; //关闭DMA通道4
DMA1_Channel5->CCR &= ~(1 << 0) ; //关闭DMA通道5
DMA1_Channel3->CCR &= ~(1 << 0) ; //开启DMA通道3
SPI2_TX_Buff = 0x87; //对SPI2的发送缓冲重新赋值
SPI1_TX_Buff = 0x67; //对SPI1的发送缓冲重新赋值
DMA1->IFCR = 0xff ; //清除DMA传输完成标志
SPI1_SetSpeed( SPI_SPEED_2 ); //改变SPI的速度
DMA1_Channel2->CNDTR = buffersize ; //传输数量设置为buffersize个
DMA1_Channel3->CNDTR = buffersize ; //传输数量设置为buffersize个
DMA1_Channel4->CNDTR = buffersize ; //传输数量设置为buffersize个
DMA1_Channel5->CNDTR = buffersize ; //传输数量设置为buffersize个
DMA1_Channel2->CCR |= 1 << 0 ; //开启DMA通道2
DMA1_Channel4->CCR |= 1 << 0 ; //开启DMA通道4
DMA1_Channel5->CCR |= 1 << 0 ; //开启DMA通道5
DMA1_Channel3->CCR |= 1 << 0 ; //开启DMA通道3
while( ( DMA1->ISR & (1<<17) ) == 0 ) ;
while( ( DMA1->ISR & (1<<9) ) == 0 ) ;
while( ( DMA1->ISR & (1<<13) ) == 0 ) ;
while( ( DMA1->ISR & (1<<5) ) == 0 ) ;
if(SPI1_RX_Buff == SPI2_TX_Buff) LED_ON;
else LED_OFF ;
delay_ms(1000);
LED_OFF;
delay_ms(1000);
if(SPI2_RX_Buff == SPI1_TX_Buff) LED_ON;
else LED_OFF ;
while(1)
{}
}
复制代码
所有资料51hei提供下载:
SPI_DMA.rar
(242.77 KB, 下载次数: 50)
2018-8-9 16:03 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
askloser
时间:
2019-2-26 08:58
學習參考看看
作者:
laigs218
时间:
2019-2-26 18:56
首先 SPI 的NVIC 宣告
void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
/* 1 bit for pre-emption priority, 3 bits for subpriority */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
/* Configure and enable SPI1 interrupt -------------------------------------*/
NVIC_InitStructure.NVIC_IRQChannel = SPI1_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
/* Configure and enable SPI2 interrupt -------------------------------------*/
NVIC_InitStructure.NVIC_IRQChannel = SPI2_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_Init(&NVIC_InitStructure);
}
stm32中断应使用在 stm32f10x_it.c
Main Interrupt Service Routines
Example
void SPI1_IRQHandler(void)
{
if (SPI_I2S_GetITStatus(SPI1, SPI_I2S_IT_TXE) != RESET)
{
/* Send SPI1 data */
SPI_I2S_SendData(SPI1, SPI1_Buffer_Tx[TxIdx++]);
/* Disable SPI1 TXE interrupt */
if (TxIdx == BufferSize)
{
SPI_I2S_ITConfig(SPI1, SPI_I2S_IT_TXE, DISABLE);
}
}
}
作者:
13825283634
时间:
2019-8-28 17:14
51黑有你更精彩!!!
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1