Created
July 28, 2024 15:41
-
-
Save kraftwerk28/38280930bec21625d2f7c97421edf19d to your computer and use it in GitHub Desktop.
stm32g030f6t6 timer IC IRQ
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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