Страница 1 из 1

STM32F103+LIS302DL

Добавлено: Вс ноя 30, 2014 15:49:13
Foxek
Пытался запустить Акселерометр LIS302DL c микроконтроллером STM32F103 на отладочной плате Discovery. Пример использования брал отсюда http://easystm32.ru/sensors/49-lis302dl . Код прикрепил. Проблема в том, что когда я подаю питание на акселлерометер сразу же на ножке прерывания выставляется высокий уровень. В прерывании читаю нужный регистр и ножка прерывания выставляется в 0 и снова ставится в высокий уровень. Таким образом Прерываня происходят бесконечно, до тех пор пока не нажмеш кнопку Reset на плате Discovery. После этого ножка прерывания выставляется только после того как акселерометр тряхнеш, потом сбрасывается и снова готова измерять. В чем причина? Почему ножка находится в вечном прерывании пока не сбросиш МК?

Код: Выделить всё

#include "stm32f10x.h"
#include "STM_Config.h"
#include "LIS331DLH_Config.h"
#include "Accelerometer.h"

uint8_t DataOut[3];
uint32_t j=0;

void EXTI_Configuration(void)
{
	AFIO->EXTICR [1] = AFIO_EXTICR2_EXTI4_PC;
	
	EXTI->IMR |= EXTI_IMR_MR4;
	EXTI->RTSR |= EXTI_RTSR_TR4;
}

void USART_Send_Symbol(uint8_t data)
{
	while ((USART1->SR & USART_SR_TXE) != USART_SR_TXE);
	USART1->DR=data;
}

void EXTI4_IRQHandler(void)
{
	if (EXTI->PR & (1<<4))
	{
		DataOut[0]=ReadReg(LIS302DL_OUT_X);
		DataOut[1]=ReadReg(LIS302DL_OUT_Y);
		DataOut[2]=ReadReg(LIS302DL_OUT_Z);
		for (j=0;j<3;j++)
		USART_Send_Symbol(DataOut[j]);

		ReadReg(LIS302DL_FF_WU_SRC2_REG);
		EXTI->PR |= (1<<4);
	}
}
int main(void)
{
	SYSCLK_Configuration();
	GPIO_Configuration();
	EXTI_Configuration();
	USART_Configuration();
	SPI_Configuration();
	__enable_irq();
	NVIC_EnableIRQ(EXTI4_IRQn);

	WriteReg(LIS302DL_CTRL_REG1,(1<<PD_CTRL_REG1) | (1<<ZEN_CTRL_REG1) |(1<<XEN_CTRL_REG1) | (1<<YEN_CTRL_REG1));
	WriteReg(LIS302DL_CTRL_REG2,(1<<FDS_CTRL_REG2));
	WriteReg(LIS302DL_CTRL_REG3, (1<<I2CFG1_CTRL_REG3));
	WriteReg(LIS302DL_FF_WU_THS1_REG, 55);
	WriteReg(LIS302DL_FF_WU_CFG2_REG,(1<<AOI_FF_WU_CFG_REG) | (1<<LIR_FF_WU_CFG_REG)| (1<<ZHIE_FF_WU_CFG_REG) | (1<<YHIE_FF_WU_CFG_REG) | (1<<XHIE_FF_WU_CFG_REG));
	
	ReadReg(LIS302DL_FF_WU_SRC2_REG);


	while(1)
{
}
		
}
Функции отправки и приёма по SPI а так же все функции инициализации настроены правильно, и тестировались много раз

Re: STM32F103+LIS302DL

Добавлено: Ср дек 17, 2014 00:29:41
GRAF
Foxek, вы порог выставляете в регистре FF_WU_THS_1 (32h), а прерывание идет от FF_WU_2 (бит I2CFG1 = 1). В регистре FF_WU_THS_2(36h) по умолчанию нули, вот прерывание и срабатывает.