Skip to content

Commit e6b6b03

Browse files
committed
buzzer: implement tone API
1 parent edd2256 commit e6b6b03

File tree

2 files changed

+144
-11
lines changed

2 files changed

+144
-11
lines changed

Core/Src/main.c

Lines changed: 82 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,8 @@ static void MX_GPIO_Init(void);
3939
static void MX_I2C1_Init(uint8_t address);
4040
static void MX_IWDG_Init(void);
4141
static void MX_NVIC_Init(void);
42-
static void MX_TIM1_Init(void);
42+
static void MX_TIM1_Encoder_Init(void);
43+
static void MX_TIM1_PWM_Init(void);
4344
static uint8_t readPinstraps();
4445
static void transfer(uint8_t b);
4546

@@ -70,10 +71,17 @@ int main(void)
7071

7172
HAL_I2C_EnableListen_IT(&hi2c1);
7273

74+
uint32_t endTone = 0;
75+
7376
/* Infinite loop */
7477
while (1)
7578
{
7679
//HAL_IWDG_Refresh(&hiwdg);
80+
if (endTone != 0 && HAL_GetTick() > endTone) {
81+
HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_1);
82+
endTone = 0;
83+
}
84+
7785
if (dataReceived) {
7886
switch (ADDRESS) {
7987
case NODE_BUTTONS:
@@ -82,7 +90,19 @@ int main(void)
8290
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, i2c_buffer[2] == 0 ? GPIO_PIN_RESET: GPIO_PIN_SET);
8391
break;
8492
case NODE_BUZZER:
85-
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, i2c_buffer[0] == 0 ? GPIO_PIN_RESET: GPIO_PIN_SET);
93+
uint32_t frequency;
94+
uint32_t duration;
95+
memcpy(&frequency, &i2c_buffer[0], sizeof(frequency));
96+
memcpy(&duration, &i2c_buffer[4], sizeof(duration));
97+
endTone = HAL_GetTick() + duration;
98+
99+
// TODO: make the prescaler precise and configurable
100+
uint32_t val = 0xFFFF * 180 / frequency;
101+
TIM1->ARR = val;
102+
TIM1->CCR1 = val / 2;
103+
//TIM_OC_InitTypeDef sConfig;
104+
//HAL_TIM_PWM_ConfigChannel(&htim1, &sConfig, TIM_CHANNEL_1);
105+
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
86106
break;
87107
case NODE_SMARTLEDS:
88108
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET); //DATA
@@ -126,12 +146,7 @@ void configurePins() {
126146
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
127147
break;
128148
case NODE_BUZZER:
129-
// TODO: use a PWM like
130-
GPIO_InitStruct.Pin = GPIO_PIN_0;
131-
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
132-
GPIO_InitStruct.Pull = GPIO_NOPULL;
133-
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
134-
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
149+
MX_TIM1_PWM_Init();
135150
break;
136151
case NODE_ENCODER:
137152
case NODE_ENCODER_2:
@@ -140,7 +155,7 @@ void configurePins() {
140155
GPIO_InitStruct.Pull = GPIO_NOPULL;
141156
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
142157
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
143-
MX_TIM1_Init();
158+
MX_TIM1_Encoder_Init();
144159
HAL_TIM_Encoder_Start(&htim1, TIM_CHANNEL_ALL);
145160
break;
146161
case NODE_SMARTLEDS:
@@ -178,7 +193,7 @@ uint8_t prepareRx() {
178193
case NODE_BUTTONS:
179194
return 3;
180195
case NODE_BUZZER:
181-
return 1;
196+
return 8;
182197
case NODE_ENCODER:
183198
case NODE_ENCODER_2:
184199
return 4;
@@ -305,7 +320,7 @@ static void MX_I2C1_Init(uint8_t address)
305320
}
306321

307322

308-
static void MX_TIM1_Init(void)
323+
static void MX_TIM1_Encoder_Init(void)
309324
{
310325
TIM_Encoder_InitTypeDef sConfig = {0};
311326
TIM_MasterConfigTypeDef sMasterConfig = {0};
@@ -338,6 +353,62 @@ static void MX_TIM1_Init(void)
338353
}
339354
}
340355

356+
static void MX_TIM1_PWM_Init(void)
357+
{
358+
359+
TIM_MasterConfigTypeDef sMasterConfig = {0};
360+
TIM_OC_InitTypeDef sConfigOC = {0};
361+
TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {0};
362+
363+
htim1.Instance = TIM1;
364+
htim1.Init.Prescaler = 0;
365+
htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
366+
htim1.Init.Period = 65535;
367+
htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
368+
htim1.Init.RepetitionCounter = 0;
369+
htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
370+
if (HAL_TIM_PWM_Init(&htim1) != HAL_OK)
371+
{
372+
Error_Handler();
373+
}
374+
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
375+
sMasterConfig.MasterOutputTrigger2 = TIM_TRGO2_RESET;
376+
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
377+
if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK)
378+
{
379+
Error_Handler();
380+
}
381+
sConfigOC.OCMode = TIM_OCMODE_PWM1;
382+
sConfigOC.Pulse = 0;
383+
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
384+
sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;
385+
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
386+
sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
387+
sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;
388+
if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
389+
{
390+
Error_Handler();
391+
}
392+
sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE;
393+
sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE;
394+
sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;
395+
sBreakDeadTimeConfig.DeadTime = 0;
396+
sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE;
397+
sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;
398+
sBreakDeadTimeConfig.BreakFilter = 0;
399+
sBreakDeadTimeConfig.BreakAFMode = TIM_BREAK_AFMODE_INPUT;
400+
sBreakDeadTimeConfig.Break2State = TIM_BREAK2_DISABLE;
401+
sBreakDeadTimeConfig.Break2Polarity = TIM_BREAK2POLARITY_HIGH;
402+
sBreakDeadTimeConfig.Break2Filter = 0;
403+
sBreakDeadTimeConfig.Break2AFMode = TIM_BREAK_AFMODE_INPUT;
404+
sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;
405+
if (HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig) != HAL_OK)
406+
{
407+
Error_Handler();
408+
}
409+
HAL_TIM_MspPostInit(&htim1);
410+
}
411+
341412
/**
342413
* @brief IWDG Initialization Function
343414
* @param None

Core/Src/stm32c0xx_hal_msp.c

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,68 @@ void HAL_TIM_Encoder_MspDeInit(TIM_HandleTypeDef* htim_encoder)
204204
}
205205
}
206206

207+
void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef* htim_pwm)
208+
{
209+
if(htim_pwm->Instance==TIM1)
210+
{
211+
/* USER CODE BEGIN TIM1_MspInit 0 */
212+
213+
/* USER CODE END TIM1_MspInit 0 */
214+
/* Peripheral clock enable */
215+
__HAL_RCC_TIM1_CLK_ENABLE();
216+
/* USER CODE BEGIN TIM1_MspInit 1 */
217+
218+
/* USER CODE END TIM1_MspInit 1 */
219+
}
220+
221+
}
222+
223+
void HAL_TIM_MspPostInit(TIM_HandleTypeDef* htim)
224+
{
225+
GPIO_InitTypeDef GPIO_InitStruct = {0};
226+
if(htim->Instance==TIM1)
227+
{
228+
/* USER CODE BEGIN TIM1_MspPostInit 0 */
229+
230+
/* USER CODE END TIM1_MspPostInit 0 */
231+
232+
__HAL_RCC_GPIOA_CLK_ENABLE();
233+
/**TIM1 GPIO Configuration
234+
PA0 ------> TIM1_CH1
235+
*/
236+
GPIO_InitStruct.Pin = GPIO_PIN_0;
237+
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
238+
GPIO_InitStruct.Pull = GPIO_NOPULL;
239+
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
240+
GPIO_InitStruct.Alternate = GPIO_AF5_TIM1;
241+
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
242+
243+
/* USER CODE BEGIN TIM1_MspPostInit 1 */
244+
245+
/* USER CODE END TIM1_MspPostInit 1 */
246+
}
247+
248+
}
249+
/**
250+
* @brief TIM_PWM MSP De-Initialization
251+
* This function freeze the hardware resources used in this example
252+
* @param htim_pwm: TIM_PWM handle pointer
253+
* @retval None
254+
*/
255+
void HAL_TIM_PWM_MspDeInit(TIM_HandleTypeDef* htim_pwm)
256+
{
257+
if(htim_pwm->Instance==TIM1)
258+
{
259+
/* USER CODE BEGIN TIM1_MspDeInit 0 */
260+
261+
/* USER CODE END TIM1_MspDeInit 0 */
262+
/* Peripheral clock disable */
263+
__HAL_RCC_TIM1_CLK_DISABLE();
264+
/* USER CODE BEGIN TIM1_MspDeInit 1 */
265+
266+
/* USER CODE END TIM1_MspDeInit 1 */
267+
}
268+
}
207269

208270

209271
/* USER CODE BEGIN 1 */

0 commit comments

Comments
 (0)