STM32F103+LIS302DL

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Foxek
Первый раз сказал Мяу!
Сообщения: 35
Зарегистрирован: Сб дек 28, 2013 20:31:22

STM32F103+LIS302DL

Сообщение 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 а так же все функции инициализации настроены правильно, и тестировались много раз
Реклама
Аватара пользователя
GRAF
Мудрый кот
Сообщения: 1867
Зарегистрирован: Ср янв 23, 2008 22:11:54
Откуда: Калининград

Re: STM32F103+LIS302DL

Сообщение GRAF »

Foxek, вы порог выставляете в регистре FF_WU_THS_1 (32h), а прерывание идет от FF_WU_2 (бит I2CFG1 = 1). В регистре FF_WU_THS_2(36h) по умолчанию нули, вот прерывание и срабатывает.
Реклама
Ответить

Вернуться в «ARM»