diff --git a/Core/Inc/floppy.h b/Core/Inc/floppy.h index 45a0a5d..860ff3e 100644 --- a/Core/Inc/floppy.h +++ b/Core/Inc/floppy.h @@ -1,10 +1,22 @@ -// -// Created by Vlad on 11.10.2023. -// - #ifndef FLOPPOTRON_FLOPPY_H #define FLOPPOTRON_FLOPPY_H +#ifdef __cplusplus +extern "C" { +#endif + + /** + * Функция, вызываемая в прерывании таймера несущей частоты + */ + void FloppySoundTickHandler(); + + /** + * Функция, вызываемая в прерывании таймера времени (по умолчанию должно быть время 100bpm) + */ + void FloppyTrackTick(); +#ifdef __cplusplus +}; +#endif #endif //FLOPPOTRON_FLOPPY_H diff --git a/Core/Inc/main.h b/Core/Inc/main.h index 054f4bf..ddcb5d8 100644 --- a/Core/Inc/main.h +++ b/Core/Inc/main.h @@ -57,12 +57,20 @@ void Error_Handler(void); /* USER CODE END EFP */ /* Private defines -----------------------------------------------------------*/ -#define STEP1_Pin GPIO_PIN_0 -#define STEP1_GPIO_Port GPIOA -#define DIR1_Pin GPIO_PIN_1 +#define DIR1_Pin GPIO_PIN_0 #define DIR1_GPIO_Port GPIOA -#define TEST_Pin GPIO_PIN_2 -#define TEST_GPIO_Port GPIOA +#define STEP1_Pin GPIO_PIN_1 +#define STEP1_GPIO_Port GPIOA +#define SEL1_Pin GPIO_PIN_2 +#define SEL1_GPIO_Port GPIOA +#define DIR2_Pin GPIO_PIN_3 +#define DIR2_GPIO_Port GPIOA +#define STEP2_Pin GPIO_PIN_4 +#define STEP2_GPIO_Port GPIOA +#define SEL2_Pin GPIO_PIN_5 +#define SEL2_GPIO_Port GPIOA +#define SOUND_TICK_Pin GPIO_PIN_11 +#define SOUND_TICK_GPIO_Port GPIOB /* USER CODE BEGIN Private defines */ diff --git a/Core/Inc/stm32f1xx_it.h b/Core/Inc/stm32f1xx_it.h index a85ae55..d120170 100644 --- a/Core/Inc/stm32f1xx_it.h +++ b/Core/Inc/stm32f1xx_it.h @@ -56,6 +56,7 @@ void DebugMon_Handler(void); void PendSV_Handler(void); void SysTick_Handler(void); void USB_LP_CAN1_RX0_IRQHandler(void); +void TIM3_IRQHandler(void); void TIM4_IRQHandler(void); /* USER CODE BEGIN EFP */ diff --git a/Core/Src/floppy.cpp b/Core/Src/floppy.cpp index 33d58b4..90efe9f 100644 --- a/Core/Src/floppy.cpp +++ b/Core/Src/floppy.cpp @@ -1,3 +1,230 @@ -// -// Created by Vlad on 11.10.2023. -// +#include "floppy.h" +#include "main.h" + +#define FLOPPOTRON_TICK_SPEED (uint16_t)(72000000 / 3600) +#define FLOPPOTRON_SOUND_FREQ (FLOPPOTRON_TICK_SPEED / 2) + +#define FLOPPOTRON_MAX_STEPS (100 * 2 * 2) + +// класс, описывающий программный таймер для флоппи привода, но мы сделаем вместо него структуру +struct FloppyDrive { +public: + uint16_t cnt = 0; // текущий счетчик таймера + uint16_t top = 0; // верхнее значение таймера + uint16_t curr_step = 0; // текущий шаг флоппи привода + bool isStarted = false; // запущен ли таймер + + GPIO_TypeDef* gpio{}; + const uint16_t gpioDirBit{}; // бит ноги GPIO для подключения к Floppy::DIR + const uint16_t gpioStepBit{}; // бит ноги GPIO для подключения к Floppy::STEP + const uint16_t gpioSelBit{}; // бит ноги GPIO для подключения к Floppy::DRVSB (Drive select B) + + void setFreq(uint16_t freq) { + // freq = FLOPPOTRON_SOUND_FREQ / top + top = FLOPPOTRON_SOUND_FREQ / freq; + } + + void setEnable(bool en) { + isStarted = en; + } + + void tick() { + if (isStarted) { + cnt++; + if (cnt >= top) { + cnt = 0; + curr_step++; + if (curr_step >= FLOPPOTRON_MAX_STEPS) { + curr_step = 0; + } + if (curr_step & 1) { + // нечетные шаги, это тик направления + if (curr_step < FLOPPOTRON_MAX_STEPS / 2) { + gpio->ODR |= gpioDirBit; + } else { + gpio->ODR &= ~gpioDirBit; + } + } else { + // четные шаги, это шаги мотора + gpio->ODR ^= gpioStepBit; + } + } + } else { + cnt = 0; + } + } +}; + +FloppyDrive drives[] = { + {.gpio = DIR1_GPIO_Port, .gpioDirBit = DIR1_Pin, .gpioStepBit = STEP1_Pin}, + {.gpio = DIR2_GPIO_Port, .gpioDirBit = DIR2_Pin, .gpioStepBit = STEP2_Pin}, +}; + + +void FloppySoundTickHandler() { + for (auto& drive:drives) { + drive.tick(); + } +} + +#define FT_CMD_NOTES_ON 0x1000 +#define FT_CMD_NOTES_OFF 0x2000 +#define FT_CMD_WAIT 0x3000 + +// составная команда - частота на +#define FT_CMD_SET_FRQ1 0x8000 +#define FT_CMD_SET_FRQ2 0x9000 + +#define FT_CMD_STOP 0x0000 +#define FT_CMD_MASK 0xF000 + + +// хандлер для проигрывания нот +void FloppyTrackTick() { + // байткод для 100bpm, тестовая мелодия + const static uint16_t bytecode[] = { +// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 165, FT_CMD_WAIT | 50, // '3' +// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 247, FT_CMD_WAIT | 50, // '7' +// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 196, FT_CMD_WAIT | 50, // '5' +// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 247, FT_CMD_WAIT | 50, // '7' +// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 165, FT_CMD_WAIT | 50, // '3' +// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 247, FT_CMD_WAIT | 50, // '7' +// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 196, FT_CMD_WAIT | 50, // '5' +// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 247, FT_CMD_WAIT | 50, // '7' +// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 147, FT_CMD_WAIT | 50, // '2' +// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 247, FT_CMD_WAIT | 50, // '7' +// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 196, FT_CMD_WAIT | 50, // '5' +// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 247, FT_CMD_WAIT | 50, // '7' +// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 147, FT_CMD_WAIT | 50, // '2' +// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 247, FT_CMD_WAIT | 50, // '7' +// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 196, FT_CMD_WAIT | 50, // '5' +// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 247, FT_CMD_WAIT | 50, // '7' +// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 147, FT_CMD_WAIT | 50, // '2' +// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 247, FT_CMD_WAIT | 50, // '7' +// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 174, FT_CMD_WAIT | 50, // '4' +// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 247, FT_CMD_WAIT | 50, // '7' +// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 147, FT_CMD_WAIT | 50, // '2' +// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 247, FT_CMD_WAIT | 50, // '7' +// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 174, FT_CMD_WAIT | 50, // '4' +// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 247, FT_CMD_WAIT | 50, // '7' +// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 147, FT_CMD_WAIT | 50, // '2' +// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 220, FT_CMD_WAIT | 50, // '6' +// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 174, FT_CMD_WAIT | 50, // '4' +// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 220, FT_CMD_WAIT | 50, // '6' +// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 147, FT_CMD_WAIT | 50, // '2' +// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 220, FT_CMD_WAIT | 50, // '6' +// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 174, FT_CMD_WAIT | 50, // '4' +// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 220, FT_CMD_WAIT | 50, // '6' +// FT_CMD_NOTES_OFF | 3, FT_CMD_WAIT | 50, // ' ' +// FT_CMD_NOTES_OFF | 3, FT_CMD_WAIT | 50, // ' ' +// FT_CMD_NOTES_OFF | 3, FT_CMD_WAIT | 50, // ' ' +// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 165, FT_CMD_WAIT | 50, // '3' +// FT_CMD_NOTES_OFF | 3, FT_CMD_WAIT | 50, // ' ' +// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 196, FT_CMD_WAIT | 50, // '5' +// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 174, FT_CMD_WAIT | 50, // '4' +// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 196, FT_CMD_WAIT | 50, // '5' +// FT_CMD_NOTES_OFF | 3, FT_CMD_WAIT | 50, // ' ' +// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 247, FT_CMD_WAIT | 50, // '7' +// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 262, FT_CMD_WAIT | 50, // '1'' +// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 247, FT_CMD_WAIT | 50, // '7' +// FT_CMD_NOTES_OFF | 3, FT_CMD_WAIT | 50, // ' ' +// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 147, FT_CMD_WAIT | 50, // '2' +// FT_CMD_NOTES_OFF | 3, FT_CMD_WAIT | 50, // ' ' +// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 174, FT_CMD_WAIT | 50, // '4' +// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 196, FT_CMD_WAIT | 50, // '5' +// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 174, FT_CMD_WAIT | 50, // '4' +// FT_CMD_NOTES_OFF | 3, FT_CMD_WAIT | 50, // ' ' +// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 196, FT_CMD_WAIT | 50, // '5' +// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 220, FT_CMD_WAIT | 50, // '6' +// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 196, FT_CMD_WAIT | 50, // '5' +// FT_CMD_NOTES_OFF | 3, FT_CMD_WAIT | 50, // ' ' +// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 147, FT_CMD_WAIT | 50, // '2' +// FT_CMD_NOTES_OFF | 3, FT_CMD_WAIT | 50, // ' ' +// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 174, FT_CMD_WAIT | 50, // '4' +// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 165, FT_CMD_WAIT | 50, // '3' +// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 174, FT_CMD_WAIT | 50, // '4' +// FT_CMD_NOTES_OFF | 3, FT_CMD_WAIT | 50, // ' ' +// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 247, FT_CMD_WAIT | 50, // '7' +// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 262, FT_CMD_WAIT | 50, // '1'' +// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 247, FT_CMD_WAIT | 50, // '7' +// FT_CMD_NOTES_OFF | 3, FT_CMD_WAIT | 50, // ' ' +// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 147, FT_CMD_WAIT | 50, // '2' +// FT_CMD_NOTES_OFF | 3, FT_CMD_WAIT | 50, // ' ' +// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 174, FT_CMD_WAIT | 50, // '4' +// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 165, FT_CMD_WAIT | 50, // '3' +// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 174, FT_CMD_WAIT | 50, // '4' +// FT_CMD_NOTES_OFF | 3, FT_CMD_WAIT | 50, // ' ' +// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 196, FT_CMD_WAIT | 50, // '5' +// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 220, FT_CMD_WAIT | 50, // '6' +// FT_CMD_NOTES_ON | 1, FT_CMD_SET_FRQ1 | 196, FT_CMD_WAIT | 50, // '5' + + // недо-имперский марш + FT_CMD_NOTES_ON | 3, FT_CMD_SET_FRQ1 | 165, FT_CMD_SET_FRQ2 | 165, FT_CMD_WAIT | 25, // '3' + FT_CMD_NOTES_OFF | 3, FT_CMD_WAIT | 25, // ' ' + FT_CMD_NOTES_ON | 3, FT_CMD_SET_FRQ1 | 165, FT_CMD_SET_FRQ2 | 165, FT_CMD_WAIT | 25, // '3' + FT_CMD_NOTES_OFF | 3, FT_CMD_WAIT | 25, // ' ' + FT_CMD_NOTES_ON | 3, FT_CMD_SET_FRQ1 | 165, FT_CMD_SET_FRQ2 | 165, FT_CMD_WAIT | 25, // '3' + FT_CMD_NOTES_OFF | 3, FT_CMD_WAIT | 25, // ' ' + FT_CMD_NOTES_ON | 3, FT_CMD_SET_FRQ1 | 131, FT_CMD_SET_FRQ2 | 131, FT_CMD_WAIT | 25, // '1' + FT_CMD_NOTES_OFF | 3, FT_CMD_WAIT | 25, // ' ' + FT_CMD_NOTES_ON | 3, FT_CMD_SET_FRQ1 | 196, FT_CMD_SET_FRQ2 | 196, FT_CMD_WAIT | 25, // '5' + FT_CMD_NOTES_ON | 3, FT_CMD_SET_FRQ1 | 165, FT_CMD_SET_FRQ2 | 165, FT_CMD_WAIT | 25, // '3' + FT_CMD_NOTES_OFF | 3, FT_CMD_WAIT | 25, // ' ' + FT_CMD_NOTES_ON | 3, FT_CMD_SET_FRQ1 | 131, FT_CMD_SET_FRQ2 | 131, FT_CMD_WAIT | 25, // '1' + FT_CMD_NOTES_OFF | 3, FT_CMD_WAIT | 25, // ' ' + FT_CMD_NOTES_ON | 3, FT_CMD_SET_FRQ1 | 196, FT_CMD_SET_FRQ2 | 196, FT_CMD_WAIT | 25, // '5' + FT_CMD_NOTES_ON | 3, FT_CMD_SET_FRQ1 | 165, FT_CMD_SET_FRQ2 | 165, FT_CMD_WAIT | 25, // '3' + + FT_CMD_NOTES_OFF | 3, FT_CMD_WAIT | 500, + FT_CMD_STOP + }; + + static const uint16_t* pc = bytecode; + static uint16_t wait = 0; + + if (wait == 0) { + while (wait == 0) { + uint16_t cmd = *(pc++); + uint16_t value = cmd & (~FT_CMD_MASK); + switch (cmd & FT_CMD_MASK) { + case FT_CMD_STOP: + pc = bytecode; // просто все начнем сначала + drives[0].setEnable(false); + drives[1].setEnable(false); + break; + + case FT_CMD_NOTES_ON: + if (value & 1) { + drives[0].setEnable(true); + } + if (value & 2) { + drives[1].setEnable(true); + } + break; + + case FT_CMD_NOTES_OFF: + if (value & 1) { + drives[0].setEnable(false); + } + if (value & 2) { + drives[1].setEnable(false); + } + break; + + case FT_CMD_WAIT: + wait = value; + break; + + case FT_CMD_SET_FRQ1: + drives[0].setFreq(value); + break; + + case FT_CMD_SET_FRQ2: + drives[1].setFreq(value); + break; + } + } + } else { + wait--; + } +} \ No newline at end of file diff --git a/Core/Src/main.c b/Core/Src/main.c index 94483a4..f5a6b4d 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -22,7 +22,7 @@ /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ - +#include "floppy.h" /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ @@ -41,6 +41,7 @@ /* USER CODE END PM */ /* Private variables ---------------------------------------------------------*/ +TIM_HandleTypeDef htim3; TIM_HandleTypeDef htim4; /* USER CODE BEGIN PV */ @@ -51,6 +52,7 @@ TIM_HandleTypeDef htim4; void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_TIM4_Init(void); +static void MX_TIM3_Init(void); /* USER CODE BEGIN PFP */ /* USER CODE END PFP */ @@ -90,9 +92,11 @@ int main(void) MX_GPIO_Init(); MX_TIM4_Init(); MX_USB_DEVICE_Init(); + MX_TIM3_Init(); /* USER CODE BEGIN 2 */ HAL_TIM_Base_Start_IT(&htim4); + HAL_TIM_Base_Start_IT(&htim3); /* USER CODE END 2 */ @@ -153,6 +157,51 @@ void SystemClock_Config(void) } } +/** + * @brief TIM3 Initialization Function + * @param None + * @retval None + */ +static void MX_TIM3_Init(void) +{ + + /* USER CODE BEGIN TIM3_Init 0 */ + + /* USER CODE END TIM3_Init 0 */ + + TIM_ClockConfigTypeDef sClockSourceConfig = {0}; + TIM_MasterConfigTypeDef sMasterConfig = {0}; + + /* USER CODE BEGIN TIM3_Init 1 */ + + /* USER CODE END TIM3_Init 1 */ + htim3.Instance = TIM3; + htim3.Init.Prescaler = 71; + htim3.Init.CounterMode = TIM_COUNTERMODE_UP; + htim3.Init.Period = 9999; + htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; + if (HAL_TIM_Base_Init(&htim3) != HAL_OK) + { + Error_Handler(); + } + sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; + if (HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig) != HAL_OK) + { + Error_Handler(); + } + sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; + sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; + if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN TIM3_Init 2 */ + + /* USER CODE END TIM3_Init 2 */ + +} + /** * @brief TIM4 Initialization Function * @param None @@ -212,17 +261,31 @@ static void MX_GPIO_Init(void) /* GPIO Ports Clock Enable */ __HAL_RCC_GPIOD_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); + __HAL_RCC_GPIOB_CLK_ENABLE(); /*Configure GPIO pin Output Level */ - HAL_GPIO_WritePin(GPIOA, STEP1_Pin|DIR1_Pin|TEST_Pin, GPIO_PIN_RESET); + HAL_GPIO_WritePin(GPIOA, DIR1_Pin|STEP1_Pin|SEL1_Pin|DIR2_Pin + |STEP2_Pin|SEL2_Pin, GPIO_PIN_RESET); - /*Configure GPIO pins : STEP1_Pin DIR1_Pin TEST_Pin */ - GPIO_InitStruct.Pin = STEP1_Pin|DIR1_Pin|TEST_Pin; + /*Configure GPIO pin Output Level */ + HAL_GPIO_WritePin(SOUND_TICK_GPIO_Port, SOUND_TICK_Pin, GPIO_PIN_RESET); + + /*Configure GPIO pins : DIR1_Pin STEP1_Pin SEL1_Pin DIR2_Pin + STEP2_Pin SEL2_Pin */ + GPIO_InitStruct.Pin = DIR1_Pin|STEP1_Pin|SEL1_Pin|DIR2_Pin + |STEP2_Pin|SEL2_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + /*Configure GPIO pin : SOUND_TICK_Pin */ + GPIO_InitStruct.Pin = SOUND_TICK_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; + HAL_GPIO_Init(SOUND_TICK_GPIO_Port, &GPIO_InitStruct); + /* USER CODE BEGIN MX_GPIO_Init_2 */ /* USER CODE END MX_GPIO_Init_2 */ } diff --git a/Core/Src/stm32f1xx_hal_msp.c b/Core/Src/stm32f1xx_hal_msp.c index 997e60c..4beb783 100644 --- a/Core/Src/stm32f1xx_hal_msp.c +++ b/Core/Src/stm32f1xx_hal_msp.c @@ -88,7 +88,21 @@ void HAL_MspInit(void) */ void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base) { - if(htim_base->Instance==TIM4) + if(htim_base->Instance==TIM3) + { + /* USER CODE BEGIN TIM3_MspInit 0 */ + + /* USER CODE END TIM3_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_TIM3_CLK_ENABLE(); + /* TIM3 interrupt Init */ + HAL_NVIC_SetPriority(TIM3_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(TIM3_IRQn); + /* USER CODE BEGIN TIM3_MspInit 1 */ + + /* USER CODE END TIM3_MspInit 1 */ + } + else if(htim_base->Instance==TIM4) { /* USER CODE BEGIN TIM4_MspInit 0 */ @@ -113,7 +127,21 @@ void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base) */ void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* htim_base) { - if(htim_base->Instance==TIM4) + if(htim_base->Instance==TIM3) + { + /* USER CODE BEGIN TIM3_MspDeInit 0 */ + + /* USER CODE END TIM3_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_TIM3_CLK_DISABLE(); + + /* TIM3 interrupt DeInit */ + HAL_NVIC_DisableIRQ(TIM3_IRQn); + /* USER CODE BEGIN TIM3_MspDeInit 1 */ + + /* USER CODE END TIM3_MspDeInit 1 */ + } + else if(htim_base->Instance==TIM4) { /* USER CODE BEGIN TIM4_MspDeInit 0 */ diff --git a/Core/Src/stm32f1xx_it.c b/Core/Src/stm32f1xx_it.c index 061a9a4..6f0226f 100644 --- a/Core/Src/stm32f1xx_it.c +++ b/Core/Src/stm32f1xx_it.c @@ -22,6 +22,7 @@ #include "stm32f1xx_it.h" /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ +#include "floppy.h" /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ @@ -56,6 +57,7 @@ /* External variables --------------------------------------------------------*/ extern PCD_HandleTypeDef hpcd_USB_FS; +extern TIM_HandleTypeDef htim3; extern TIM_HandleTypeDef htim4; /* USER CODE BEGIN EV */ @@ -213,38 +215,39 @@ void USB_LP_CAN1_RX0_IRQHandler(void) /* USER CODE END USB_LP_CAN1_RX0_IRQn 1 */ } +/** + * @brief This function handles TIM3 global interrupt. + */ +void TIM3_IRQHandler(void) +{ + /* USER CODE BEGIN TIM3_IRQn 0 */ + // вызываем функцию обработки мелодии + FloppyTrackTick(); + + // сброс всех флагов прерывания + TIM3->SR = 0; + /* USER CODE END TIM3_IRQn 0 */ + /* USER CODE BEGIN TIM3_IRQn 1 */ + + /* USER CODE END TIM3_IRQn 1 */ +} + /** * @brief This function handles TIM4 global interrupt. */ void TIM4_IRQHandler(void) { /* USER CODE BEGIN TIM4_IRQn 0 */ - TEST_GPIO_Port->ODR ^= TEST_Pin; + // дергаем ногу такта таймера (для отладки) + SOUND_TICK_GPIO_Port->ODR ^= SOUND_TICK_Pin; - static uint16_t cnt = 0; - cnt += 1; - if (cnt >= 50) { // тут менять частоту (делитель от 40к) - cnt = 0; + // вызываем тик у флоппи приводов + FloppySoundTickHandler(); - // тик таймера, который для флоппи - - static char t = 0; - static int curr_step = 0; - if (t) { - STEP1_GPIO_Port->ODR ^= STEP1_Pin; - curr_step++; - } else { - if (curr_step >= 80) { - curr_step = 0; - DIR1_GPIO_Port->ODR ^= DIR1_Pin; - } - } - - t = !t; - } + // сброс всех флагов прерывания + TIM4->SR = 0; /* USER CODE END TIM4_IRQn 0 */ - HAL_TIM_IRQHandler(&htim4); /* USER CODE BEGIN TIM4_IRQn 1 */ /* USER CODE END TIM4_IRQn 1 */ diff --git a/Floppotron.ioc b/Floppotron.ioc index 1d714d8..cac1957 100644 --- a/Floppotron.ioc +++ b/Floppotron.ioc @@ -10,25 +10,31 @@ Mcu.Family=STM32F1 Mcu.IP0=NVIC Mcu.IP1=RCC Mcu.IP2=SYS -Mcu.IP3=TIM4 -Mcu.IP4=USB -Mcu.IP5=USB_DEVICE -Mcu.IPNb=6 +Mcu.IP3=TIM3 +Mcu.IP4=TIM4 +Mcu.IP5=USB +Mcu.IP6=USB_DEVICE +Mcu.IPNb=7 Mcu.Name=STM32F103C(8-B)Tx Mcu.Package=LQFP48 Mcu.Pin0=PD0-OSC_IN Mcu.Pin1=PD1-OSC_OUT -Mcu.Pin10=VP_TIM4_VS_ClockSourceINT -Mcu.Pin11=VP_USB_DEVICE_VS_USB_DEVICE_CDC_FS +Mcu.Pin10=PA12 +Mcu.Pin11=PA13 +Mcu.Pin12=PA14 +Mcu.Pin13=VP_SYS_VS_Systick +Mcu.Pin14=VP_TIM3_VS_ClockSourceINT +Mcu.Pin15=VP_TIM4_VS_ClockSourceINT +Mcu.Pin16=VP_USB_DEVICE_VS_USB_DEVICE_CDC_FS Mcu.Pin2=PA0-WKUP Mcu.Pin3=PA1 Mcu.Pin4=PA2 -Mcu.Pin5=PA11 -Mcu.Pin6=PA12 -Mcu.Pin7=PA13 -Mcu.Pin8=PA14 -Mcu.Pin9=VP_SYS_VS_Systick -Mcu.PinsNb=12 +Mcu.Pin5=PA3 +Mcu.Pin6=PA4 +Mcu.Pin7=PA5 +Mcu.Pin8=PB11 +Mcu.Pin9=PA11 +Mcu.PinsNb=17 Mcu.ThirdPartyNb=0 Mcu.UserConstants= Mcu.UserName=STM32F103C8Tx @@ -44,18 +50,23 @@ NVIC.PendSV_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false NVIC.PriorityGroup=NVIC_PRIORITYGROUP_4 NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false NVIC.SysTick_IRQn=true\:15\:0\:false\:false\:true\:false\:true\:false -NVIC.TIM4_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true +NVIC.TIM3_IRQn=true\:0\:0\:false\:false\:true\:true\:false\:true +NVIC.TIM4_IRQn=true\:0\:0\:false\:false\:true\:true\:false\:true NVIC.USB_LP_CAN1_RX0_IRQn=true\:0\:0\:false\:false\:true\:false\:true\:true NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false -PA0-WKUP.GPIOParameters=GPIO_Speed,GPIO_Label -PA0-WKUP.GPIO_Label=STEP1 +PA0-WKUP.GPIOParameters=GPIO_Speed,PinState,GPIO_Label,GPIO_ModeDefaultOutputPP +PA0-WKUP.GPIO_Label=DIR1 +PA0-WKUP.GPIO_ModeDefaultOutputPP=GPIO_MODE_OUTPUT_PP PA0-WKUP.GPIO_Speed=GPIO_SPEED_FREQ_HIGH PA0-WKUP.Locked=true +PA0-WKUP.PinState=GPIO_PIN_RESET PA0-WKUP.Signal=GPIO_Output -PA1.GPIOParameters=GPIO_Speed,GPIO_Label -PA1.GPIO_Label=DIR1 +PA1.GPIOParameters=GPIO_Speed,PinState,GPIO_Label,GPIO_ModeDefaultOutputPP +PA1.GPIO_Label=STEP1 +PA1.GPIO_ModeDefaultOutputPP=GPIO_MODE_OUTPUT_PP PA1.GPIO_Speed=GPIO_SPEED_FREQ_HIGH PA1.Locked=true +PA1.PinState=GPIO_PIN_RESET PA1.Signal=GPIO_Output PA11.Mode=Device PA11.Signal=USB_DM @@ -65,11 +76,41 @@ PA13.Mode=Serial_Wire PA13.Signal=SYS_JTMS-SWDIO PA14.Mode=Serial_Wire PA14.Signal=SYS_JTCK-SWCLK -PA2.GPIOParameters=GPIO_Speed,GPIO_Label -PA2.GPIO_Label=TEST +PA2.GPIOParameters=GPIO_Speed,PinState,GPIO_Label,GPIO_ModeDefaultOutputPP +PA2.GPIO_Label=SEL1 +PA2.GPIO_ModeDefaultOutputPP=GPIO_MODE_OUTPUT_PP PA2.GPIO_Speed=GPIO_SPEED_FREQ_HIGH PA2.Locked=true +PA2.PinState=GPIO_PIN_RESET PA2.Signal=GPIO_Output +PA3.GPIOParameters=GPIO_Speed,PinState,GPIO_Label,GPIO_ModeDefaultOutputPP +PA3.GPIO_Label=DIR2 +PA3.GPIO_ModeDefaultOutputPP=GPIO_MODE_OUTPUT_PP +PA3.GPIO_Speed=GPIO_SPEED_FREQ_HIGH +PA3.Locked=true +PA3.PinState=GPIO_PIN_RESET +PA3.Signal=GPIO_Output +PA4.GPIOParameters=GPIO_Speed,PinState,GPIO_Label,GPIO_ModeDefaultOutputPP +PA4.GPIO_Label=STEP2 +PA4.GPIO_ModeDefaultOutputPP=GPIO_MODE_OUTPUT_PP +PA4.GPIO_Speed=GPIO_SPEED_FREQ_HIGH +PA4.Locked=true +PA4.PinState=GPIO_PIN_RESET +PA4.Signal=GPIO_Output +PA5.GPIOParameters=GPIO_Speed,PinState,GPIO_Label,GPIO_ModeDefaultOutputPP +PA5.GPIO_Label=SEL2 +PA5.GPIO_ModeDefaultOutputPP=GPIO_MODE_OUTPUT_PP +PA5.GPIO_Speed=GPIO_SPEED_FREQ_HIGH +PA5.Locked=true +PA5.PinState=GPIO_PIN_RESET +PA5.Signal=GPIO_Output +PB11.GPIOParameters=GPIO_Speed,PinState,GPIO_Label,GPIO_ModeDefaultOutputPP +PB11.GPIO_Label=SOUND_TICK +PB11.GPIO_ModeDefaultOutputPP=GPIO_MODE_OUTPUT_PP +PB11.GPIO_Speed=GPIO_SPEED_FREQ_HIGH +PB11.Locked=true +PB11.PinState=GPIO_PIN_RESET +PB11.Signal=GPIO_Output PD0-OSC_IN.Mode=HSE-External-Oscillator PD0-OSC_IN.Signal=RCC_OSC_IN PD1-OSC_OUT.Mode=HSE-External-Oscillator @@ -103,7 +144,7 @@ ProjectManager.StackSize=0x400 ProjectManager.TargetToolchain=STM32CubeIDE ProjectManager.ToolChainLocation= ProjectManager.UnderRoot=true -ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true,3-MX_TIM4_Init-TIM4-false-HAL-true,4-MX_USB_DEVICE_Init-USB_DEVICE-false-HAL-false +ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true,3-MX_TIM4_Init-TIM4-false-HAL-true,4-MX_USB_DEVICE_Init-USB_DEVICE-false-HAL-false,5-MX_TIM3_Init-TIM3-false-HAL-true RCC.ADCFreqValue=36000000 RCC.AHBFreq_Value=72000000 RCC.APB1CLKDivider=RCC_HCLK_DIV2 @@ -125,6 +166,9 @@ RCC.TimSysFreq_Value=72000000 RCC.USBFreq_Value=48000000 RCC.USBPrescaler=RCC_USBCLKSOURCE_PLL_DIV1_5 RCC.VCOOutput2Freq_Value=8000000 +TIM3.IPParameters=Prescaler,Period +TIM3.Period=9999 +TIM3.Prescaler=71 TIM4.IPParameters=Period TIM4.Period=3600 USB_DEVICE.CLASS_NAME_FS=CDC @@ -135,6 +179,8 @@ USB_DEVICE.VirtualMode=Cdc USB_DEVICE.VirtualModeFS=Cdc_FS VP_SYS_VS_Systick.Mode=SysTick VP_SYS_VS_Systick.Signal=SYS_VS_Systick +VP_TIM3_VS_ClockSourceINT.Mode=Internal +VP_TIM3_VS_ClockSourceINT.Signal=TIM3_VS_ClockSourceINT VP_TIM4_VS_ClockSourceINT.Mode=Internal VP_TIM4_VS_ClockSourceINT.Signal=TIM4_VS_ClockSourceINT VP_USB_DEVICE_VS_USB_DEVICE_CDC_FS.Mode=CDC_FS