Добавлена инициализация I2C для лидара

This commit is contained in:
2026-02-26 17:01:03 +03:00
parent 8a3336c994
commit 385aa66ffc
3 changed files with 37 additions and 4 deletions

View File

@@ -31,6 +31,10 @@ typedef struct
} lidar_data;
void lidar_init();
void USART3_IRQHandler();
void lidar_update(lidar_data* lidar);
void lidar_i2c2_init();
void lidar_i2c2_update();
#endif

View File

@@ -37,7 +37,7 @@ void lidar_init()
USART3->BRR = 16000000UL / 115200UL;
// parity control disable
USART3->CR1 &= ~(USART_CR1_PCE);
USART3->CR1 &= ~USART_CR1_PCE;
// word length 8 bit
USART3->CR1 &= ~USART_CR1_M1 & ~USART_CR1_M0;
@@ -50,7 +50,7 @@ void lidar_init()
USART3->CR1 |= USART_CR1_RE | USART_CR1_RXNEIE;
// overrun disable
USART3->CR3 |= USART_CR3_OVRDIS;
// USART3->CR3 |= USART_CR3_OVRDIS;
// USART3 enable
USART3->CR1 |= USART_CR1_UE;
@@ -59,8 +59,10 @@ void lidar_init()
NVIC_EnableIRQ(USART3_IRQn);
}
uint32_t test;
void USART3_IRQHandler()
{
++test;
if (USART3->ISR & USART_ISR_RXNE)
{
uint8_t b = USART3->RDR;
@@ -96,4 +98,30 @@ void lidar_update(lidar_data* lidar)
lidar->distance = buffer.distance_l | (buffer.distance_h << 8);
lidar->strength = buffer.strength_l | (buffer.strength_h << 8);
lidar->temperature = buffer.temp_l | (buffer.temp_h << 8);
}
}
void lidar_i2c2_init()
{
RCC->AHB2ENR |= RCC_AHB2ENR_GPIOAEN;
GPIOA->MODER &= ~(3 << (8 * 2)) & ~(3 << (9 * 2));
GPIOA->MODER |= 2 << (8 * 2) | 2 << (9 * 2); // alt func mode
GPIOA->AFR[1] &= ~(0xF << 0) & ~(0xF << 4);
GPIOA->AFR[1] |= 4 << 0 | 4 << 4; // AF4
GPIOA->OTYPER |= 1 << 8 | 1 << 9; // open-drain
GPIOA->PUPDR &= ~(3 << (8 * 2)) & ~(3 << (9 * 2));
GPIOA->PUPDR |= 1 << (8 * 2) | 1 << (9 * 2); // pull-up
RCC->APB1ENR1 |= RCC_APB1ENR1_I2C2EN; // enable I2C2
I2C2->TIMINGR = 0x00303D5B; // 400 kHz @ 16 MHz
I2C2->CR1 |= I2C_CR1_PE;
}