cancel
Showing results for 
Search instead for 
Did you mean: 

GPIO interrupt change other pin state

megahercas6
Senior
Posted on August 20, 2014 at 11:54

Hello, i am facing strange problem with STM32F4 I have +-10V power supply that is enabled with GPIOB Pin 2. When i start program, it will enable power supply, just like i declare in startup;

GPIO_SetBits(GPIOB,GPIO_Pin_2); And at startput, i get +-10V output, Also, i have FT2232D what will create communication link between memory and computer ( i am using FTDI-> SPI converter,and DMA to transfer data, so processor could do other jobs, and it is working very well) Since i am using circular DMA tranfer, FTDI will generate interrupt, so i can configure DMA and SPI hardware, again, this part works. but ptoblem is, after this interrupt, GPIOB PIN2 goes low, even if where is no code to make that pin go low. also, where is no power DIP, so processor is working as it should

#define SPIx SPI2
 #define SPIx_CLK RCC_APB1Periph_SPI2
 #define SPIx_CLK_INIT RCC_APB1PeriphClockCmd
 #define SPIx_IRQn SPI2_IRQn
 #define SPIx_IRQHANDLER SPI2_IRQHandler
 #define SPIx_SCK_PIN GPIO_Pin_13
 #define SPIx_SCK_GPIO_PORT GPIOB
 #define SPIx_SCK_GPIO_CLK RCC_AHB1Periph_GPIOB
 #define SPIx_SCK_SOURCE GPIO_PinSource13
 #define SPIx_SCK_AF GPIO_AF_SPI2
 #define SPIx_MISO_PIN GPIO_Pin_14
 #define SPIx_MISO_GPIO_PORT GPIOB
 #define SPIx_MISO_GPIO_CLK RCC_AHB1Periph_GPIOB
 #define SPIx_MISO_SOURCE GPIO_PinSource14
 #define SPIx_MISO_AF GPIO_AF_SPI2
 #define SPIx_MOSI_PIN GPIO_Pin_15
 #define SPIx_MOSI_GPIO_PORT GPIOB
 #define SPIx_MOSI_GPIO_CLK RCC_AHB1Periph_GPIOB
 #define SPIx_MOSI_SOURCE GPIO_PinSource15
 #define SPIx_MOSI_AF GPIO_AF_SPI2
 #define SPIx_DMA DMA1
 #define SPIx_DMA_CLK RCC_AHB1Periph_DMA1
 #define SPIx_TX_DMA_CHANNEL DMA_Channel_0
 #define SPIx_TX_DMA_STREAM DMA1_Stream4
 #define SPIx_TX_DMA_FLAG_TCIF DMA_FLAG_TCIF4
 #define SPIx_RX_DMA_CHANNEL DMA_Channel_0
 #define SPIx_RX_DMA_STREAM DMA1_Stream3
 #define SPIx_RX_DMA_FLAG_TCIF DMA_FLAG_TCIF3
 void SPI_Config(void);
 void SPI_Int(void);
 void EXTI_Int(void);
 #define BUFFERSIZE 14

 void SPI_Config(void)
{
/* Peripheral Clock Enable -------------------------------------------------*/
/* Enable the SPI clock */
SPIx_CLK_INIT(SPIx_CLK, ENABLE);
/* Enable GPIO clocks */
RCC_AHB1PeriphClockCmd(SPIx_SCK_GPIO_CLK | SPIx_MISO_GPIO_CLK | SPIx_MOSI_GPIO_CLK, ENABLE);
/* Enable DMA clock */
RCC_AHB1PeriphClockCmd(SPIx_DMA_CLK, ENABLE);
/* SPI GPIO Configuration --------------------------------------------------*/
/* GPIO Deinitialisation */
GPIO_DeInit(SPIx_SCK_GPIO_PORT);
GPIO_DeInit(SPIx_MISO_GPIO_PORT);
GPIO_DeInit(SPIx_MOSI_GPIO_PORT);
/* Connect SPI pins to AF5 */ 
GPIO_PinAFConfig(SPIx_SCK_GPIO_PORT, SPIx_SCK_SOURCE, SPIx_SCK_AF);
GPIO_PinAFConfig(SPIx_MISO_GPIO_PORT, SPIx_MISO_SOURCE, SPIx_MISO_AF); 
GPIO_PinAFConfig(SPIx_MOSI_GPIO_PORT, SPIx_MOSI_SOURCE, SPIx_MOSI_AF);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
/* SPI SCK pin configuration */
GPIO_InitStructure.GPIO_Pin = SPIx_SCK_PIN;
GPIO_Init(SPIx_SCK_GPIO_PORT, &GPIO_InitStructure);
/* SPI MISO pin configuration */
GPIO_InitStructure.GPIO_Pin = SPIx_MISO_PIN;
GPIO_Init(SPIx_MISO_GPIO_PORT, &GPIO_InitStructure); 
/* SPI MOSI pin configuration */
GPIO_InitStructure.GPIO_Pin = SPIx_MOSI_PIN;
GPIO_Init(SPIx_MOSI_GPIO_PORT, &GPIO_InitStructure);
/* SPI configuration -------------------------------------------------------*/
SPI_I2S_DeInit(SPIx);
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_128;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial = 7;
/* DMA configuration -------------------------------------------------------*/
/* Deinitialize DMA Streams */
DMA_DeInit(SPIx_TX_DMA_STREAM);
DMA_DeInit(SPIx_RX_DMA_STREAM);
/* Configure DMA Initialization Structure */
DMA_InitStructure.DMA_BufferSize = BUFFERSIZE ;
DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable ;
DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_1QuarterFull ;
DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single ;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
DMA_InitStructure.DMA_PeripheralBaseAddr =(uint32_t) (&(SPIx->DR)) ;
DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
/* Configure TX DMA */
DMA_InitStructure.DMA_Channel = SPIx_TX_DMA_CHANNEL ;
DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral ;
DMA_InitStructure.DMA_Memory0BaseAddr =(uint32_t)DataTx ;
DMA_Init(SPIx_TX_DMA_STREAM, &DMA_InitStructure);
/* Configure RX DMA */
DMA_InitStructure.DMA_Channel = SPIx_RX_DMA_CHANNEL ;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory ;
DMA_InitStructure.DMA_Memory0BaseAddr =(uint32_t)DataRx ; 
DMA_Init(SPIx_RX_DMA_STREAM, &DMA_InitStructure);
SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;
SPI_Init(SPIx, &SPI_InitStructure);
/* Enable DMA SPI TX Stream */
DMA_Cmd(SPIx_TX_DMA_STREAM,ENABLE);
/* Enable DMA SPI RX Stream */
DMA_Cmd(SPIx_RX_DMA_STREAM,ENABLE); 
/* Enable SPI DMA TX Requsts */
SPI_I2S_DMACmd(SPIx, SPI_I2S_DMAReq_Tx, ENABLE);
/* Enable SPI DMA RX Requsts */
SPI_I2S_DMACmd(SPIx, SPI_I2S_DMAReq_Rx, ENABLE);
/* Enable the SPI peripheral */
SPI_Cmd(SPIx, ENABLE);
}
void EXTI_Int(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_Init(GPIOB, &GPIO_InitStructure);
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOB, EXTI_PinSource12);
EXTI_InitStructure.EXTI_Line = EXTI_Line12;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; 
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void EXTI15_10_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line12) != RESET)
{
SPI_Config();
EXTI_ClearITPendingBit(EXTI_Line12);
}
}

Also, i did checked assembly, where is no code to put that pin low, and i did check my PCB, where is no shorts, or anything, GPIOB pin2 goes directly to DC/dc controller chip. For now, i will spend some time reading errata sheet, since i don't know what is wrong here
2 REPLIES 2
Posted on August 20, 2014 at 15:21

Don't do this:

/* GPIO Deinitialisation */
GPIO_DeInit(SPIx_SCK_GPIO_PORT);
GPIO_DeInit(SPIx_MISO_GPIO_PORT);
GPIO_DeInit(SPIx_MOSI_GPIO_PORT);

It reinitializes ALL the GPIO B Pins THREE TIMES! Including PB2
Tips, buy me a coffee, or three.. PayPal Venmo Up vote any posts that you find helpful, it shows what's working..
megahercas6
Senior
Posted on August 20, 2014 at 18:05

Yes, i spotted this after i did this post. What's strange is that deinit will clean everything, not just disconnect clock or something similar.

Thank you for spotting this