Skip to content

Commit d89ed41

Browse files
committed
feat beep: added initial mario music
Signed-off-by: John Sanpe <[email protected]>
1 parent 3e606d7 commit d89ed41

File tree

6 files changed

+1282
-0
lines changed

6 files changed

+1282
-0
lines changed

examples/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
# Copyright(c) 2023 John Sanpe <[email protected]>
44
#
55

6+
add_subdirectory(beep)
67
add_subdirectory(benchmark)
78
add_subdirectory(blink)
89
add_subdirectory(uart)

examples/beep/CMakeLists.txt

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
# SPDX-License-Identifier: GPL-2.0-or-later
2+
#
3+
# Copyright(c) 2023 ffashion <[email protected]>
4+
#
5+
6+
add_executable(beep main.c beep.c)
7+
target_link_libraries(beep ${CMAKE_PROJECT_NAME})
8+
target_link_libraries(beep bfdev)
9+
10+
add_custom_command(
11+
TARGET beep
12+
POST_BUILD COMMAND
13+
${CMAKE_OBJCOPY} -O binary
14+
${CMAKE_CURRENT_BINARY_DIR}/beep
15+
${CMAKE_CURRENT_BINARY_DIR}/beep.bin
16+
POST_BUILD COMMAND
17+
${CMAKE_OBJCOPY} -O ihex
18+
${CMAKE_CURRENT_BINARY_DIR}/beep
19+
${CMAKE_CURRENT_BINARY_DIR}/beep.hex
20+
)

examples/beep/beep.c

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
#include <bfdev.h>
2+
#include "beep.h"
3+
#include "py32f0xx_hal.h"
4+
5+
#define BEEP_TIMER TIM1
6+
#define BEEP_CHANNEL TIM_CHANNEL_2
7+
8+
static int
9+
buzzer_play(unsigned int freq, unsigned int length)
10+
{
11+
TIM_HandleTypeDef TimHandle;
12+
TIM_OC_InitTypeDef sConfig;
13+
uint32_t period_cycles;
14+
uint16_t prescaler, overflow;
15+
16+
period_cycles = 24000000 / freq;
17+
prescaler = period_cycles / 0xffff + 1;
18+
overflow = BFDEV_DIV_ROUND_CLOSEST(period_cycles, prescaler);
19+
20+
TimHandle.Instance = BEEP_TIMER;
21+
TimHandle.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
22+
TimHandle.Init.CounterMode = TIM_COUNTERMODE_UP;
23+
TimHandle.Init.RepetitionCounter = 0;
24+
TimHandle.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
25+
TimHandle.Init.Prescaler = prescaler;
26+
TimHandle.Init.Period = overflow;
27+
28+
sConfig.OCMode = TIM_OCMODE_PWM1;
29+
sConfig.OCPolarity = TIM_OCPOLARITY_HIGH;
30+
sConfig.OCFastMode = TIM_OCFAST_DISABLE;
31+
sConfig.OCNPolarity = TIM_OCNPOLARITY_HIGH;
32+
sConfig.OCNIdleState = TIM_OCNIDLESTATE_RESET;
33+
sConfig.OCIdleState = TIM_OCIDLESTATE_RESET;
34+
sConfig.Pulse = overflow >> 1;
35+
36+
if (HAL_TIM_PWM_Init(&TimHandle) != HAL_OK)
37+
return -1;
38+
39+
if (HAL_TIM_PWM_ConfigChannel(&TimHandle, &sConfig, BEEP_CHANNEL) != HAL_OK)
40+
return -1;
41+
42+
if (HAL_TIM_PWM_Start(&TimHandle, BEEP_CHANNEL) != HAL_OK)
43+
return -1;
44+
45+
HAL_Delay(length);
46+
if (HAL_TIM_PWM_Stop(&TimHandle, BEEP_CHANNEL) != HAL_OK)
47+
return -1;
48+
49+
return 0;
50+
}
51+
52+
int
53+
beep(const struct beep_table *table)
54+
{
55+
unsigned int freq, length;
56+
int retval;
57+
58+
freq = 440;
59+
length = 200;
60+
61+
for (retval = 0; !retval && table->type; ++table) {
62+
switch (table->type) {
63+
case BEEP_PLAY: default:
64+
retval = buzzer_play(freq, length);
65+
break;
66+
67+
case BEEP_DELAY:
68+
HAL_Delay(table->value);
69+
break;
70+
71+
case BEEP_FREQ:
72+
freq = table->value;
73+
break;
74+
75+
case BEEP_LENGTH:
76+
length = table->value;
77+
break;
78+
}
79+
}
80+
81+
return retval;
82+
}

examples/beep/beep.h

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
#ifndef _BEEP_H_
2+
#define _BEEP_H_
3+
4+
enum beep_type {
5+
BEEP_PLAY = 1,
6+
BEEP_DELAY,
7+
BEEP_FREQ,
8+
BEEP_LENGTH,
9+
};
10+
11+
struct beep_table {
12+
enum beep_type type;
13+
unsigned short value;
14+
};
15+
16+
extern int
17+
beep(const struct beep_table *table);
18+
19+
#endif /* _BEEP_H_ */

examples/beep/main.c

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
#include "beep.h"
2+
#include "mario.h"
3+
#include "py32f0xx_hal.h"
4+
5+
int main(void)
6+
{
7+
RCC_OscInitTypeDef OscInitType = {};
8+
RCC_ClkInitTypeDef ClkInitType = {};
9+
GPIO_InitTypeDef GPIOInitType = {};
10+
11+
HAL_Init();
12+
13+
OscInitType.OscillatorType = RCC_OSCILLATORTYPE_HSI;
14+
OscInitType.HSICalibrationValue = RCC_HSICALIBRATION_24MHz;
15+
OscInitType.HSIState = RCC_HSI_ON;
16+
OscInitType.HSIDiv = RCC_HSI_DIV1;
17+
OscInitType.PLL.PLLState = RCC_PLL_ON;
18+
OscInitType.PLL.PLLSource = RCC_PLLSOURCE_HSI;
19+
HAL_RCC_OscConfig(&OscInitType);
20+
21+
ClkInitType.ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1;
22+
ClkInitType.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
23+
ClkInitType.AHBCLKDivider = RCC_SYSCLK_DIV1;
24+
ClkInitType.APB1CLKDivider = RCC_HCLK_DIV1;
25+
HAL_RCC_ClockConfig(&ClkInitType, FLASH_LATENCY_1);
26+
27+
__HAL_RCC_GPIOB_CLK_ENABLE();
28+
__HAL_RCC_TIM1_CLK_ENABLE();
29+
30+
GPIOInitType.Pin = GPIO_PIN_3;
31+
GPIOInitType.Mode = GPIO_MODE_AF_PP;
32+
GPIOInitType.Pull = GPIO_NOPULL;
33+
GPIOInitType.Speed = GPIO_SPEED_FREQ_HIGH;
34+
GPIOInitType.Alternate = GPIO_AF1_TIM1;
35+
HAL_GPIO_Init(GPIOB, &GPIOInitType);
36+
37+
beep(mario);
38+
for (;;);
39+
40+
return 0;
41+
}

0 commit comments

Comments
 (0)