Пытался запустить Акселерометр LIS302DL c микроконтроллером STM32F103 на отладочной плате Discovery. Пример использования брал отсюда http://easystm32.ru/sensors/49-lis302dl . Код прикрепил. Проблема в том, что когда я подаю питание на акселлерометер сразу же на ножке прерывания выставляется высокий уровень. В прерывании читаю нужный регистр и ножка прерывания выставляется в 0 и снова ставится в высокий уровень. Таким образом Прерываня происходят бесконечно, до тех пор пока не нажмеш кнопку Reset на плате Discovery. После этого ножка прерывания выставляется только после того как акселерометр тряхнеш, потом сбрасывается и снова готова измерять. В чем причина? Почему ножка находится в вечном прерывании пока не сбросиш МК?
Функции отправки и приёма по SPI а так же все функции инициализации настроены правильно, и тестировались много раз
Код: Выделить всё
#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)
{
}
}
