STM32F103+LIS302DL

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

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

Сообщение GRAF »

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

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