Skip to content

Commit b4d387f

Browse files
committed
feat exmaples: update beep
Signed-off-by: John Sanpe <[email protected]>
1 parent 0c0d4a4 commit b4d387f

File tree

5 files changed

+677
-657
lines changed

5 files changed

+677
-657
lines changed

examples/beep/CMakeLists.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55

66
add_executable(beep main.c beep.c)
77
target_link_libraries(beep ${CMAKE_PROJECT_NAME})
8-
target_link_libraries(beep bfdev)
98

109
add_custom_command(
1110
TARGET beep

examples/beep/beep.c

Lines changed: 46 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -5,52 +5,69 @@
55
#define BEEP_TIMER TIM1
66
#define BEEP_CHANNEL TIM_CHANNEL_2
77

8+
static TIM_HandleTypeDef htim1;
9+
810
static int
911
buzzer_play(unsigned int freq, unsigned int length)
1012
{
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;
13+
uint32_t prescaler, overflow;
14+
uint32_t cycles;
2715

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;
16+
cycles = 48000000 / freq;
17+
overflow = cycles;
18+
prescaler = 0;
3519

36-
if (HAL_TIM_PWM_Init(&TimHandle) != HAL_OK)
37-
return -1;
20+
while (overflow > UINT16_MAX) {
21+
prescaler++;
22+
overflow = cycles / (prescaler + 1);
23+
}
3824

39-
if (HAL_TIM_PWM_ConfigChannel(&TimHandle, &sConfig, BEEP_CHANNEL) != HAL_OK)
25+
if (prescaler > UINT16_MAX)
4026
return -1;
4127

42-
if (HAL_TIM_PWM_Start(&TimHandle, BEEP_CHANNEL) != HAL_OK)
28+
__HAL_TIM_SET_PRESCALER(&htim1, prescaler);
29+
__HAL_TIM_SET_AUTORELOAD(&htim1, overflow - 1);
30+
__HAL_TIM_SET_COMPARE(&htim1, BEEP_CHANNEL, overflow >> 1);
31+
32+
if (HAL_TIM_PWM_Start(&htim1, BEEP_CHANNEL) != HAL_OK)
4333
return -1;
4434

4535
HAL_Delay(length);
46-
if (HAL_TIM_PWM_Stop(&TimHandle, BEEP_CHANNEL) != HAL_OK)
36+
if (HAL_TIM_PWM_Stop(&htim1, BEEP_CHANNEL) != HAL_OK)
37+
return -1;
38+
39+
return 0;
40+
}
41+
42+
int
43+
buzzer_init(void)
44+
{
45+
TIM_OC_InitTypeDef sConfig = {};
46+
47+
htim1.Instance = BEEP_TIMER;
48+
htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
49+
htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
50+
htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
51+
htim1.Init.RepetitionCounter = 0;
52+
53+
sConfig.OCMode = TIM_OCMODE_PWM1;
54+
sConfig.OCFastMode = TIM_OCFAST_DISABLE;
55+
sConfig.OCPolarity = TIM_OCPOLARITY_HIGH;
56+
sConfig.OCIdleState = TIM_OCIDLESTATE_RESET;
57+
sConfig.OCNPolarity = TIM_OCNPOLARITY_HIGH;
58+
sConfig.OCNIdleState = TIM_OCNIDLESTATE_RESET;
59+
60+
if (HAL_TIM_PWM_Init(&htim1) != HAL_OK)
61+
return -1;
62+
63+
if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfig, BEEP_CHANNEL) != HAL_OK)
4764
return -1;
4865

4966
return 0;
5067
}
5168

5269
int
53-
beep(const struct beep_table *table)
70+
buzzer_beep(const struct beep_table *table)
5471
{
5572
unsigned int freq, length;
5673
int retval;

examples/beep/beep.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@ struct beep_table {
1414
};
1515

1616
extern int
17-
beep(const struct beep_table *table);
17+
buzzer_init(void);
18+
19+
extern int
20+
buzzer_beep(const struct beep_table *table);
1821

1922
#endif /* _BEEP_H_ */

examples/beep/main.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,8 @@ int main(void)
3434
GPIOInitType.Alternate = GPIO_AF1_TIM1;
3535
HAL_GPIO_Init(GPIOB, &GPIOInitType);
3636

37-
beep(mario);
37+
buzzer_init();
38+
buzzer_beep(mario);
3839
for (;;);
3940

4041
return 0;

0 commit comments

Comments
 (0)