@@ -39,7 +39,8 @@ static void MX_GPIO_Init(void);
3939static void MX_I2C1_Init (uint8_t address );
4040static void MX_IWDG_Init (void );
4141static 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 );
4344static uint8_t readPinstraps ();
4445static 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
0 commit comments