Skip to content

Instantly share code, notes, and snippets.

@kraftwerk28
Created July 28, 2024 15:41
Show Gist options
  • Save kraftwerk28/38280930bec21625d2f7c97421edf19d to your computer and use it in GitHub Desktop.
Save kraftwerk28/38280930bec21625d2f7c97421edf19d to your computer and use it in GitHub Desktop.
stm32g030f6t6 timer IC IRQ
#include <stdio.h>
#include "stm32g0xx_hal.h"
static TIM_HandleTypeDef tim;
static DMA_HandleTypeDef tim_dma;
static UART_HandleTypeDef uart;
UART_HandleTypeDef *_write_uart_handle = &uart; // for syscall.c
#define NEC_LEN 64
static uint16_t nec_data[NEC_LEN];
static unsigned nec_count = 0;
#define assert(x) \
do { \
if (!(x)) { \
printf("Assertion failed: " #x); \
__disable_irq(); \
while (true) \
; \
} \
} while (0)
void TIM3_IRQHandler(void) {
HAL_TIM_IRQHandler(&tim);
}
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) {
uint16_t value = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);
nec_data[nec_count++] = value;
if (nec_count >= 50) {
HAL_TIM_IC_Stop_IT(htim, TIM_CHANNEL_1);
for (unsigned i = 0; i < nec_count; i++) {
printf("%d ", nec_data[i]);
}
printf("\r\n");
}
}
int main(int argc, char *argv[]) {
HAL_Init();
RCC_OscInitTypeDef osc = {
.OscillatorType = RCC_OSCILLATORTYPE_HSI,
.HSIState = RCC_HSI_ON,
.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT,
.PLL.PLLState = RCC_PLL_ON,
.PLL.PLLSource = RCC_PLLSOURCE_HSI,
.PLL.PLLM = RCC_PLLM_DIV1,
.PLL.PLLN = 8,
.PLL.PLLP = RCC_PLLP_DIV2,
.PLL.PLLR = RCC_PLLR_DIV2,
};
assert(HAL_RCC_OscConfig(&osc) == HAL_OK);
RCC_ClkInitTypeDef clk = {
.ClockType = RCC_CLOCKTYPE_ALL,
.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK,
.AHBCLKDivider = RCC_SYSCLK_DIV1,
.APB1CLKDivider = RCC_HCLK_DIV1,
};
assert(HAL_RCC_ClockConfig(&clk, FLASH_LATENCY_2) == HAL_OK);
__HAL_RCC_SYSCFG_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_DMA1_CLK_ENABLE();
__HAL_RCC_USART1_CLK_ENABLE();
__HAL_RCC_TIM3_CLK_ENABLE();
HAL_NVIC_EnableIRQ(TIM3_IRQn);
HAL_SYSCFG_EnableRemap(SYSCFG_REMAP_PA11);
HAL_SYSCFG_EnableRemap(SYSCFG_REMAP_PA12);
GPIO_InitTypeDef gpio = {};
// Timer IC
gpio.Mode = GPIO_MODE_AF_PP;
gpio.Pull = GPIO_NOPULL;
gpio.Speed = GPIO_SPEED_FREQ_MEDIUM;
gpio.Alternate = GPIO_AF1_TIM3;
gpio.Pin = GPIO_PIN_6;
HAL_GPIO_Init(GPIOA, &gpio);
// USART TX/RX
gpio.Mode = GPIO_MODE_AF_PP;
gpio.Pull = GPIO_NOPULL;
gpio.Speed = GPIO_SPEED_FREQ_MEDIUM;
gpio.Alternate = GPIO_AF1_USART1;
gpio.Pin = GPIO_PIN_9 | GPIO_PIN_10;
HAL_GPIO_Init(GPIOA, &gpio);
tim_dma.Instance = DMA1_Channel1;
tim_dma.Init.Mode = DMA_NORMAL;
tim_dma.Init.MemInc = DMA_MINC_ENABLE;
tim_dma.Init.PeriphInc = DMA_PINC_DISABLE;
tim_dma.Init.Direction = DMA_PERIPH_TO_MEMORY;
tim_dma.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
tim_dma.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
tim_dma.Init.Request = DMA_REQUEST_TIM3_CH1;
HAL_DMA_Init(&tim_dma);
__HAL_LINKDMA(&tim, hdma[TIM_DMA_ID_CC1], tim_dma);
uart.Instance = USART1;
uart.Init.Mode = UART_MODE_TX_RX;
uart.Init.BaudRate = 115200;
assert(HAL_UART_Init(&uart) == HAL_OK);
tim.Instance = TIM3;
tim.Init.Prescaler = 64 - 1;
tim.Init.Period = ~0;
assert(HAL_TIM_IC_Init(&tim) == HAL_OK);
TIM_SlaveConfigTypeDef slave_cfg = {
.SlaveMode = TIM_SLAVEMODE_RESET,
.TriggerPolarity = TIM_TRIGGERPOLARITY_RISING,
.InputTrigger = TIM_TS_TI1F_ED,
};
assert(HAL_TIM_SlaveConfigSynchro(&tim, &slave_cfg) == HAL_OK);
TIM_IC_InitTypeDef chan_cfg = {
.ICSelection = TIM_ICSELECTION_DIRECTTI,
.ICPolarity = TIM_ICPOLARITY_FALLING,
};
assert(HAL_TIM_IC_ConfigChannel(&tim, &chan_cfg, TIM_CHANNEL_1) == HAL_OK);
HAL_TIM_IC_Start_DMA(&tim, TIM_CHANNEL_1, (uint32_t *)nec_data, NEC_LEN);
printf("TIM3 IC started\r\n");
HAL_DMA_PollForTransfer(&tim_dma, HAL_DMA_FULL_TRANSFER, HAL_MAX_DELAY);
printf("TIM3 IC DMA completed\r\n");
while (true)
;
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment