заготовка для играния мелодий

This commit is contained in:
2026-04-15 16:24:41 +03:00
parent f0f5f625e9
commit e5285479f9
10 changed files with 666 additions and 136 deletions

107
Core/Clock/melody.c Normal file
View File

@@ -0,0 +1,107 @@
#include "melody.h"
#define FIXED_ARR 10 // фиксированный период таймера
// Конвертирует длительность ноты в миллисекунды
static uint32_t _duration_to_ms(MelodyHandle* mh, float duration) {
float quarter_sec = 60.0f / mh->bpm; // четверть в секундах
float whole_sec = quarter_sec * 4.0f; // целая нота в секундах
float note_sec = whole_sec * duration; // нота в секундах
return (uint32_t)(note_sec * 1000.0f); // в миллисекунды
}
// Устанавливает частоту на выходе PWM
static void _set_freq(MelodyHandle* mh, uint32_t freq) {
if (freq == 0) {
// Выключаем звук - просто CCR = 0
__HAL_TIM_SET_COMPARE(mh->htim, mh->channel, 0);
return;
}
// Считаем предделитель: PSC = F_timer / freq / (ARR+1)
// ARR+1 = 11, так как ARR = 10
uint32_t psc = mh->timer_clock_hz / freq / (FIXED_ARR + 1);
// Ограничиваем диапазоном 1..65535
if (psc < 1) psc = 1;
if (psc > 65535) psc = 65535;
// Устанавливаем prescaler (вычитаем 1, т.к. счётчик от 0 до psc-1)
__HAL_TIM_SET_PRESCALER(mh->htim, psc - 1);
// Фиксированный период
__HAL_TIM_SET_AUTORELOAD(mh->htim, FIXED_ARR);
// Скважность 50% для чистого тона
__HAL_TIM_SET_COMPARE(mh->htim, mh->channel, FIXED_ARR / 2);
}
void Melody_Init(MelodyHandle* mh, TIM_HandleTypeDef* htim, uint32_t channel, uint32_t timer_clock_hz) {
mh->htim = htim;
mh->channel = channel;
mh->timer_clock_hz = timer_clock_hz;
mh->sequence = NULL;
mh->length = 0;
mh->current_index = 0;
mh->note_start_time = 0;
mh->is_playing = 0;
// Настраиваем таймер на фиксированный период
__HAL_TIM_SET_AUTORELOAD(mh->htim, FIXED_ARR);
__HAL_TIM_SET_COMPARE(mh->htim, mh->channel, 0);
// Запускаем PWM один раз
HAL_TIM_PWM_Start(mh->htim, mh->channel);
}
void Melody_SetBPM(MelodyHandle* mh, uint16_t bpm) {
mh->bpm = bpm;
}
void Melody_Play(MelodyHandle* mh, const Note* sequence, uint16_t length, uint16_t bpm) {
if (mh->is_playing) {
_set_freq(mh, 0);
}
mh->sequence = sequence;
mh->length = length;
mh->current_index = 0;
mh->is_playing = 1;
mh->note_start_time = HAL_GetTick();
mh->bpm = bpm;
if (length > 0 && sequence[0].freq != 0) {
_set_freq(mh, sequence[0].freq);
}
}
void Melody_Stop(MelodyHandle* mh) {
mh->is_playing = 0;
_set_freq(mh, 0);
}
void Melody_Update(MelodyHandle* mh) {
if (!mh->is_playing) return;
uint32_t now = HAL_GetTick();
uint32_t dur_ms = _duration_to_ms(mh, mh->sequence[mh->current_index].duration);
if (now - mh->note_start_time >= dur_ms) {
mh->current_index++;
if (mh->current_index >= mh->length) {
Melody_Stop(mh);
return;
}
mh->note_start_time = now;
if (mh->sequence[mh->current_index].freq == NOTE_REST) {
__HAL_TIM_SET_COMPARE(mh->htim, mh->channel, 0);
} else {
_set_freq(mh, mh->sequence[mh->current_index].freq);
}
}
}
uint8_t Melody_IsPlaying(MelodyHandle* mh) {
return mh->is_playing;
}

175
Core/Clock/melody.h Normal file
View File

@@ -0,0 +1,175 @@
#ifndef MELODY_H
#define MELODY_H
#include "stm32f1xx_hal.h"
typedef struct {
uint16_t freq; // частота в Гц или NOTE_REST
float duration; // длительность в долях (0.25 = четверть)
} Note;
typedef struct {
TIM_HandleTypeDef* htim;
uint32_t channel;
uint32_t timer_clock_hz; // частота тактирования таймера в Гц
const Note* sequence;
uint16_t length;
uint16_t current_index;
uint32_t note_start_time;
uint8_t is_playing;
uint16_t bpm;
} MelodyHandle;
void Melody_Init(MelodyHandle* mh, TIM_HandleTypeDef* htim, uint32_t channel, uint32_t timer_clock_hz);
void Melody_SetBPM(MelodyHandle* mh, uint16_t bpm);
void Melody_Play(MelodyHandle* mh, const Note* sequence, uint16_t length, uint16_t bpm);
void Melody_Stop(MelodyHandle* mh);
void Melody_Update(MelodyHandle* mh);
uint8_t Melody_IsPlaying(MelodyHandle* mh);
// Длительности (в долях от целой ноты)
#define NOTE_WHOLE 1.0
#define NOTE_HALF 0.5
#define NOTE_QUARTER 0.25
#define NOTE_EIGHTH 0.125
#define NOTE_SIXTEENTH 0.0625
#define NOTE_THIRTYSECOND 0.03125
#define NOTE_WHOLE_DOT 1.5
#define NOTE_HALF_DOT 0.75
#define NOTE_QUARTER_DOT 0.375
#define NOTE_EIGHTH_DOT 0.1875
#define NOTE_SIXTEENTH_DOT 0.09375
// Ноты (частота, Гц) - диапазон 700-8000 Гц для SCS-17-S
// Октавы смещены: старая 4-я = новая 0-я, старая 5-я = новая 1-я и т.д.
// 0-я октава (бывшая 4-я)
#define NOTE_B0 494
#define NOTE_C1 523
#define NOTE_CS1 554
#define NOTE_D1 587
#define NOTE_DS1 622
#define NOTE_E1 659
#define NOTE_F1 698
#define NOTE_FS1 740
#define NOTE_G1 784
#define NOTE_GS1 831
#define NOTE_A1 880
#define NOTE_AS1 932
#define NOTE_B1 988
// 2-я октава (бывшая 6-я)
#define NOTE_C2 1047
#define NOTE_CS2 1109
#define NOTE_D2 1175
#define NOTE_DS2 1245
#define NOTE_E2 1319
#define NOTE_F2 1397
#define NOTE_FS2 1480
#define NOTE_G2 1568
#define NOTE_GS2 1661
#define NOTE_A2 1760
#define NOTE_AS2 1865
#define NOTE_B2 1976
// 3-я октава (бывшая 7-я)
#define NOTE_C3 2093
#define NOTE_CS3 2217
#define NOTE_D3 2349
#define NOTE_DS3 2489
#define NOTE_E3 2637
#define NOTE_F3 2794
#define NOTE_FS3 2960
#define NOTE_G3 3136
#define NOTE_GS3 3322
#define NOTE_A3 3520
#define NOTE_AS3 3729
#define NOTE_B3 3951
// 4-я октава (бывшая 8-я)
#define NOTE_C4 4186
#define NOTE_CS4 4435
#define NOTE_D4 4699
#define NOTE_DS4 4978
#define NOTE_E4 5274
#define NOTE_F4 5588
#define NOTE_FS4 5920
#define NOTE_G4 6272
#define NOTE_GS4 6645
#define NOTE_A4 7040
#define NOTE_AS4 7459
#define NOTE_B4 7902
// Сольфеджио с новыми октавами
// 0-я октава
#define SI0 NOTE_B0 // 494 Hz
// 1-я октава
#define DO1 NOTE_C1 // 523 Hz
#define RE1 NOTE_D1 // 587 Hz
#define MI1 NOTE_E1 // 659 Hz
#define FA1 NOTE_F1 // 698 Hz
#define SOL1 NOTE_G1 // 784 Hz
#define LA1 NOTE_A1 // 880 Hz
#define SI1 NOTE_B1 // 988 Hz
// 2-я октава
#define DO2 NOTE_C2 // 1047 Hz
#define RE2 NOTE_D2 // 1175 Hz
#define MI2 NOTE_E2 // 1319 Hz
#define FA2 NOTE_F2 // 1397 Hz
#define SOL2 NOTE_G2 // 1568 Hz
#define LA2 NOTE_A2 // 1760 Hz
#define SI2 NOTE_B2 // 1976 Hz
// 3-я октава
#define DO3 NOTE_C3 // 2093 Hz
#define RE3 NOTE_D3 // 2349 Hz
#define MI3 NOTE_E3 // 2637 Hz
#define FA3 NOTE_F3 // 2794 Hz
#define SOL3 NOTE_G3 // 3136 Hz
#define LA3 NOTE_A3 // 3520 Hz
#define SI3 NOTE_B3 // 3951 Hz
// 4-я октава
#define DO4 NOTE_C4 // 4186 Hz
#define RE4 NOTE_D4 // 4699 Hz
#define MI4 NOTE_E4 // 5274 Hz
#define FA4 NOTE_F4 // 5588 Hz
#define SOL4 NOTE_G4 // 6272 Hz
#define LA4 NOTE_A4 // 7040 Hz
#define SI4 NOTE_B4 // 7902 Hz
// Диезы для 1-й октавы
#define DO1s NOTE_CS1 // 554 Hz
#define RE1s NOTE_DS1 // 622 Hz
#define FA1s NOTE_FS1 // 740 Hz
#define SOL1s NOTE_GS1 // 831 Hz
#define LA1s NOTE_AS1 // 932 Hz
// Диезы для 2-й октавы
#define DO2s NOTE_CS2 // 1109 Hz
#define RE2s NOTE_DS2 // 1245 Hz
#define FA2s NOTE_FS2 // 1480 Hz
#define SOL2s NOTE_GS2 // 1661 Hz
#define LA2s NOTE_AS2 // 1865 Hz
// Диезы для 3-й октавы
#define DO3s NOTE_CS3 // 2217 Hz
#define RE3s NOTE_DS3 // 2489 Hz
#define FA3s NOTE_FS3 // 2960 Hz
#define SOL3s NOTE_GS3 // 3322 Hz
#define LA3s NOTE_AS3 // 3729 Hz
// Диезы для 4-й октавы
#define DO4s NOTE_CS4 // 4435 Hz
#define RE4s NOTE_DS4 // 4978 Hz
#define FA4s NOTE_FS4 // 5920 Hz
#define SOL4s NOTE_GS4 // 6645 Hz
#define LA4s NOTE_AS4 // 7459 Hz
#define NOTE_REST 0
#endif

View File

@@ -78,6 +78,8 @@ void Error_Handler(void);
#define DIGIT_SEC_L_GPIO_Port GPIOA
#define SEGMENT_A_Pin GPIO_PIN_15
#define SEGMENT_A_GPIO_Port GPIOB
#define BUZZER_Pin GPIO_PIN_8
#define BUZZER_GPIO_Port GPIOA
#define SW_ENTER_Pin GPIO_PIN_9
#define SW_ENTER_GPIO_Port GPIOA
#define SW_UP_Pin GPIO_PIN_10

View File

@@ -32,14 +32,19 @@ extern "C" {
/* USER CODE END Includes */
extern TIM_HandleTypeDef htim1;
extern TIM_HandleTypeDef htim2;
/* USER CODE BEGIN Private defines */
/* USER CODE END Private defines */
void MX_TIM1_Init(void);
void MX_TIM2_Init(void);
void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim);
/* USER CODE BEGIN Prototypes */
/* USER CODE END Prototypes */

View File

@@ -27,6 +27,7 @@
#include "clock_manager.h"
#include "menu.h"
#include "segment.h"
#include "melody.h"
/* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/
@@ -78,6 +79,50 @@ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {
Segment_Process();
}
}
MelodyHandle melody;
const Note mySong[] = {
// //1 ÒÀÊÒ
// {SOL2, NOTE_QUARTER},
// {MI3, NOTE_EIGHTH},
// {SI3, NOTE_EIGHTH},
// {MI4, NOTE_EIGHTH},
// {SI3, NOTE_EIGHTH},
// {SOL3, NOTE_EIGHTH},
// {SI3, NOTE_EIGHTH},
// {DO4, NOTE_EIGHTH_DOT},
// {LA3, NOTE_SIXTEENTH},
// {SI3, NOTE_EIGHTH},
// {SI2, NOTE_EIGHTH_DOT},
// {DO2, NOTE_SIXTEENTH},
// {SI3, NOTE_EIGHTH},
// {MI3, NOTE_QUARTER},
//2 ÒÀÊÒ
{RE3s, NOTE_QUARTER},
{SI2, NOTE_EIGHTH},
{LA2, NOTE_EIGHTH},
{LA3, NOTE_EIGHTH},
{SI3, NOTE_SIXTEENTH},
{LA3, NOTE_EIGHTH},
{RE3, NOTE_SIXTEENTH},
{FA4s, NOTE_SIXTEENTH},
{LA4, NOTE_SIXTEENTH},
{RE3s, NOTE_EIGHTH},
{LA3, NOTE_SIXTEENTH},
{RE3s, NOTE_EIGHTH},
{SI4, NOTE_SIXTEENTH},
{FA4s, NOTE_SIXTEENTH},
{RE3s, NOTE_THIRTYSECOND},
{NOTE_REST, NOTE_THIRTYSECOND},
{RE3s, NOTE_EIGHTH},
{MI3, NOTE_EIGHTH},
{DO3, NOTE_SIXTEENTH},
{SI2, NOTE_SIXTEENTH},
{MI3, NOTE_SIXTEENTH},
};
/* USER CODE END 0 */
/**
@@ -111,6 +156,7 @@ int main(void)
MX_GPIO_Init();
MX_RTC_Init();
MX_TIM2_Init();
MX_TIM1_Init();
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
@@ -120,10 +166,16 @@ int main(void)
Segment_Init();
ClockManager_Init();
Menu_Init();
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
HAL_TIM_Base_Start_IT(&htim2);
// Èíèöèàëèçàöèÿ ñ BPM = 120
Melody_Init(&melody, &htim1, TIM_CHANNEL_1, 72000000);
Melody_Play(&melody, mySong, sizeof(mySong)/sizeof(mySong[0]), 80);
while (1)
{
Menu_Process();
Melody_Update(&melody);
/* USER CODE END WHILE */

View File

@@ -24,8 +24,79 @@
/* USER CODE END 0 */
TIM_HandleTypeDef htim1;
TIM_HandleTypeDef htim2;
/* TIM1 init function */
void MX_TIM1_Init(void)
{
/* USER CODE BEGIN TIM1_Init 0 */
/* USER CODE END TIM1_Init 0 */
TIM_ClockConfigTypeDef sClockSourceConfig = {0};
TIM_MasterConfigTypeDef sMasterConfig = {0};
TIM_OC_InitTypeDef sConfigOC = {0};
TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {0};
/* USER CODE BEGIN TIM1_Init 1 */
/* USER CODE END TIM1_Init 1 */
htim1.Instance = TIM1;
htim1.Init.Prescaler = 0;
htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
htim1.Init.Period = 65535;
htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim1.Init.RepetitionCounter = 0;
htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
if (HAL_TIM_Base_Init(&htim1) != HAL_OK)
{
Error_Handler();
}
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
if (HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig) != HAL_OK)
{
Error_Handler();
}
if (HAL_TIM_PWM_Init(&htim1) != HAL_OK)
{
Error_Handler();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK)
{
Error_Handler();
}
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 0;
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;
if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
{
Error_Handler();
}
sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE;
sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE;
sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;
sBreakDeadTimeConfig.DeadTime = 0;
sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE;
sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;
sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;
if (HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN TIM1_Init 2 */
/* USER CODE END TIM1_Init 2 */
HAL_TIM_MspPostInit(&htim1);
}
/* TIM2 init function */
void MX_TIM2_Init(void)
{
@@ -70,7 +141,18 @@ void MX_TIM2_Init(void)
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
{
if(tim_baseHandle->Instance==TIM2)
if(tim_baseHandle->Instance==TIM1)
{
/* USER CODE BEGIN TIM1_MspInit 0 */
/* USER CODE END TIM1_MspInit 0 */
/* TIM1 clock enable */
__HAL_RCC_TIM1_CLK_ENABLE();
/* USER CODE BEGIN TIM1_MspInit 1 */
/* USER CODE END TIM1_MspInit 1 */
}
else if(tim_baseHandle->Instance==TIM2)
{
/* USER CODE BEGIN TIM2_MspInit 0 */
@@ -86,11 +168,47 @@ void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
/* USER CODE END TIM2_MspInit 1 */
}
}
void HAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
if(timHandle->Instance==TIM1)
{
/* USER CODE BEGIN TIM1_MspPostInit 0 */
/* USER CODE END TIM1_MspPostInit 0 */
__HAL_RCC_GPIOA_CLK_ENABLE();
/**TIM1 GPIO Configuration
PA8 ------> TIM1_CH1
*/
GPIO_InitStruct.Pin = BUZZER_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(BUZZER_GPIO_Port, &GPIO_InitStruct);
/* USER CODE BEGIN TIM1_MspPostInit 1 */
/* USER CODE END TIM1_MspPostInit 1 */
}
}
void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* tim_baseHandle)
{
if(tim_baseHandle->Instance==TIM2)
if(tim_baseHandle->Instance==TIM1)
{
/* USER CODE BEGIN TIM1_MspDeInit 0 */
/* USER CODE END TIM1_MspDeInit 0 */
/* Peripheral clock disable */
__HAL_RCC_TIM1_CLK_DISABLE();
/* USER CODE BEGIN TIM1_MspDeInit 1 */
/* USER CODE END TIM1_MspDeInit 1 */
}
else if(tim_baseHandle->Instance==TIM2)
{
/* USER CODE BEGIN TIM2_MspDeInit 0 */

File diff suppressed because one or more lines are too long

View File

@@ -148,24 +148,7 @@
<Name>(105=-1,-1,-1,-1,0)</Name>
</SetRegEntry>
</TargetDriverDllRegistry>
<Breakpoint>
<Bp>
<Number>0</Number>
<Type>0</Type>
<LineNumber>111</LineNumber>
<EnabledFlag>1</EnabledFlag>
<Address>134234580</Address>
<ByteObject>0</ByteObject>
<HtxType>0</HtxType>
<ManyObjects>0</ManyObjects>
<SizeOfObject>0</SizeOfObject>
<BreakByAccess>0</BreakByAccess>
<BreakIfRCount>1</BreakIfRCount>
<Filename>../Core/Src/main.c</Filename>
<ExecCommand></ExecCommand>
<Expression>\\lamp\../Core/Src/main.c\111</Expression>
</Bp>
</Breakpoint>
<Breakpoint/>
<WatchWindow1>
<Ww>
<count>0</count>
@@ -180,7 +163,12 @@
<Ww>
<count>2</count>
<WinNumber>1</WinNumber>
<ItemText>rtc_time</ItemText>
<ItemText>rtc_time,0x0A</ItemText>
</Ww>
<Ww>
<count>3</count>
<WinNumber>1</WinNumber>
<ItemText>htim1.Instance,0x0A</ItemText>
</Ww>
</WatchWindow1>
<Tracepoint>
@@ -238,6 +226,10 @@
<Name>System Viewer\RTC</Name>
<WinId>35904</WinId>
</Entry>
<Entry>
<Name>System Viewer\TIM1</Name>
<WinId>35903</WinId>
</Entry>
</SystemViewers>
<DebugDescription>
<Enable>1</Enable>
@@ -647,6 +639,30 @@
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>31</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\Core\Clock\melody.c</PathWithFileName>
<FilenameWithoutPath>melody.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>32</FileNumber>
<FileType>5</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\Core\Clock\melody.h</PathWithFileName>
<FilenameWithoutPath>melody.h</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
</Group>
<Group>

View File

@@ -797,6 +797,16 @@
<FileType>5</FileType>
<FilePath>..\Core\Clock\segment.h</FilePath>
</File>
<File>
<FileName>melody.c</FileName>
<FileType>1</FileType>
<FilePath>..\Core\Clock\melody.c</FilePath>
</File>
<File>
<FileName>melody.h</FileName>
<FileType>5</FileType>
<FilePath>..\Core\Clock\melody.h</FilePath>
</File>
</Files>
</Group>
<Group>

View File

@@ -11,30 +11,33 @@ Mcu.IP0=NVIC
Mcu.IP1=RCC
Mcu.IP2=RTC
Mcu.IP3=SYS
Mcu.IP4=TIM2
Mcu.IPNb=5
Mcu.IP4=TIM1
Mcu.IP5=TIM2
Mcu.IPNb=6
Mcu.Name=STM32F103C(8-B)Tx
Mcu.Package=LQFP48
Mcu.Pin0=PC13-TAMPER-RTC
Mcu.Pin1=PC14-OSC32_IN
Mcu.Pin10=PA5
Mcu.Pin11=PB15
Mcu.Pin12=PA9
Mcu.Pin13=PA10
Mcu.Pin14=PA11
Mcu.Pin15=PA12
Mcu.Pin16=PA13
Mcu.Pin17=PA14
Mcu.Pin18=PB3
Mcu.Pin19=PB4
Mcu.Pin12=PA8
Mcu.Pin13=PA9
Mcu.Pin14=PA10
Mcu.Pin15=PA11
Mcu.Pin16=PA12
Mcu.Pin17=PA13
Mcu.Pin18=PA14
Mcu.Pin19=PB3
Mcu.Pin2=PC15-OSC32_OUT
Mcu.Pin20=PB6
Mcu.Pin21=PB7
Mcu.Pin22=PB8
Mcu.Pin23=PB9
Mcu.Pin24=VP_RTC_VS_RTC_Activate
Mcu.Pin25=VP_SYS_VS_Systick
Mcu.Pin26=VP_TIM2_VS_ClockSourceINT
Mcu.Pin20=PB4
Mcu.Pin21=PB6
Mcu.Pin22=PB7
Mcu.Pin23=PB8
Mcu.Pin24=PB9
Mcu.Pin25=VP_RTC_VS_RTC_Activate
Mcu.Pin26=VP_SYS_VS_Systick
Mcu.Pin27=VP_TIM1_VS_ClockSourceINT
Mcu.Pin28=VP_TIM2_VS_ClockSourceINT
Mcu.Pin3=PD0-OSC_IN
Mcu.Pin4=PD1-OSC_OUT
Mcu.Pin5=PA0-WKUP
@@ -42,7 +45,7 @@ Mcu.Pin6=PA1
Mcu.Pin7=PA2
Mcu.Pin8=PA3
Mcu.Pin9=PA4
Mcu.PinsNb=27
Mcu.PinsNb=29
Mcu.ThirdPartyNb=0
Mcu.UserConstants=
Mcu.UserName=STM32F103C8Tx
@@ -101,6 +104,9 @@ PA5.GPIOParameters=GPIO_Label
PA5.GPIO_Label=DIGIT_SEC_L
PA5.Locked=true
PA5.Signal=GPIO_Output
PA8.GPIOParameters=GPIO_Label
PA8.GPIO_Label=BUZZER
PA8.Signal=S_TIM1_CH1
PA9.GPIOParameters=GPIO_Label
PA9.GPIO_Label=SW_ENTER
PA9.Locked=true
@@ -176,7 +182,7 @@ ProjectManager.ToolChainLocation=
ProjectManager.UAScriptAfterPath=
ProjectManager.UAScriptBeforePath=
ProjectManager.UnderRoot=false
ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true,3-MX_RTC_Init-RTC-false-HAL-true,4-MX_TIM2_Init-TIM2-false-HAL-true
ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true,3-MX_RTC_Init-RTC-false-HAL-true,4-MX_TIM2_Init-TIM2-false-HAL-true,5-MX_TIM1_Init-TIM1-false-HAL-true
RCC.ADCFreqValue=36000000
RCC.AHBFreq_Value=72000000
RCC.APB1CLKDivider=RCC_HCLK_DIV2
@@ -202,6 +208,10 @@ RCC.USBFreq_Value=72000000
RCC.VCOOutput2Freq_Value=8000000
RTC.IPParameters=OutPut
RTC.OutPut=RTC_OUTPUTSOURCE_ALARM
SH.S_TIM1_CH1.0=TIM1_CH1,PWM Generation1 CH1
SH.S_TIM1_CH1.ConfNb=1
TIM1.Channel-PWM\ Generation1\ CH1=TIM_CHANNEL_1
TIM1.IPParameters=Channel-PWM Generation1 CH1
TIM2.IPParameters=Prescaler,Period
TIM2.Period=72*10-1
TIM2.Prescaler=0
@@ -209,6 +219,8 @@ VP_RTC_VS_RTC_Activate.Mode=RTC_Enabled
VP_RTC_VS_RTC_Activate.Signal=RTC_VS_RTC_Activate
VP_SYS_VS_Systick.Mode=SysTick
VP_SYS_VS_Systick.Signal=SYS_VS_Systick
VP_TIM1_VS_ClockSourceINT.Mode=Internal
VP_TIM1_VS_ClockSourceINT.Signal=TIM1_VS_ClockSourceINT
VP_TIM2_VS_ClockSourceINT.Mode=Internal
VP_TIM2_VS_ClockSourceINT.Signal=TIM2_VS_ClockSourceINT
board=custom