Skip to content

Commit f1d84d3

Browse files
authored
Merge pull request #188 from fpistm/tone_review
Tone review
2 parents e144d83 + 57107fe commit f1d84d3

File tree

2 files changed

+21
-27
lines changed

2 files changed

+21
-27
lines changed

cores/arduino/Tone.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@ void noTone(uint8_t _pin)
4444
PinName p = digitalPinToPinName(_pin);
4545
if(p != NC) {
4646
TimerPinDeinit(&_timer);
47-
digitalWrite(_pin, 0);
4847
g_lastPin = NC;
4948
}
5049
}

cores/arduino/stm32/timer.c

Lines changed: 21 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -558,8 +558,10 @@ uint32_t getTimerIrq(TIM_TypeDef* tim)
558558
*/
559559
void TimerHandleDeinit(stimer_t *obj)
560560
{
561-
HAL_TIM_Base_DeInit(&(obj->handle));
562-
HAL_TIM_Base_Stop_IT(&(obj->handle));
561+
if(obj != NULL) {
562+
HAL_TIM_Base_DeInit(&(obj->handle));
563+
HAL_TIM_Base_Stop_IT(&(obj->handle));
564+
}
563565
}
564566

565567
/**
@@ -855,32 +857,16 @@ void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim)
855857
*/
856858
void HAL_TIMx_PeriodElapsedCallback(stimer_t *obj)
857859
{
860+
GPIO_TypeDef* port = get_GPIO_Port(STM_PORT(obj->pin));
858861

859-
if(get_GPIO_Port(STM_PORT(obj->pin)) != NULL) {
860-
if(obj->pinInfo.count > 0){
861-
obj->pinInfo.count--;
862-
863-
if(obj->pinInfo.state == 0) {
864-
obj->pinInfo.state = 1;
865-
digital_io_write(get_GPIO_Port(STM_PORT(obj->pin)), STM_GPIO_PIN(obj->pin), 1);
866-
}
867-
else {
868-
obj->pinInfo.state = 0;
869-
digital_io_write(get_GPIO_Port(STM_PORT(obj->pin)), STM_GPIO_PIN(obj->pin), 0);
870-
}
871-
}
872-
else if(obj->pinInfo.count == -1) {
873-
if(obj->pinInfo.state == 0) {
874-
obj->pinInfo.state = 1;
875-
digital_io_write(get_GPIO_Port(STM_PORT(obj->pin)), STM_GPIO_PIN(obj->pin), 1);
876-
}
877-
else {
878-
obj->pinInfo.state = 0;
879-
digital_io_write(get_GPIO_Port(STM_PORT(obj->pin)), STM_GPIO_PIN(obj->pin), 0);
880-
}
862+
if(port != NULL) {
863+
if(obj->pinInfo.count != 0){
864+
if (obj->pinInfo.count > 0) obj->pinInfo.count--;
865+
obj->pinInfo.state = (obj->pinInfo.state == 0)? 1 : 0;
866+
digital_io_write(port, STM_GPIO_PIN(obj->pin), obj->pinInfo.state);
881867
}
882868
else {
883-
digital_io_write(get_GPIO_Port(STM_PORT(obj->pin)), STM_GPIO_PIN(obj->pin), 0);
869+
digital_io_write(port, STM_GPIO_PIN(obj->pin), 0);
884870
}
885871
}
886872
}
@@ -916,13 +902,19 @@ void TimerPinInit(stimer_t *obj, uint32_t frequency, uint32_t duration)
916902
uint32_t timFreq = 2*frequency;
917903
uint32_t prescaler = 1;
918904
uint32_t period = 0;
905+
uint32_t scale = 0;
919906

920907
if(frequency > MAX_FREQ)
921908
return;
922909

923910
obj->timer = TIMER_TONE;
924911
obj->pinInfo.state = 0;
925912

913+
if(frequency == 0) {
914+
TimerPinDeinit(obj);
915+
return;
916+
}
917+
926918
//Calculate the toggle count
927919
if (duration > 0) {
928920
obj->pinInfo.count = ((timFreq * duration) / 1000);
@@ -934,8 +926,10 @@ void TimerPinInit(stimer_t *obj, uint32_t frequency, uint32_t duration)
934926
digital_io_init(obj->pin, GPIO_MODE_OUTPUT_PP, GPIO_NOPULL);
935927
timClkFreq = getTimerClkFreq(obj->timer);
936928

929+
// Do this once
930+
scale = timClkFreq / timFreq;
937931
while(end == 0) {
938-
period = ((uint32_t)( timClkFreq / timFreq / prescaler)) - 1;
932+
period = ((uint32_t)( scale / prescaler)) - 1;
939933

940934
if((period >= 0xFFFF) && (prescaler < 0xFFFF))
941935
prescaler++; //prescaler *= 2;
@@ -962,6 +956,7 @@ void TimerPinInit(stimer_t *obj, uint32_t frequency, uint32_t duration)
962956
void TimerPinDeinit(stimer_t *obj)
963957
{
964958
TimerHandleDeinit(obj);
959+
digital_io_init(obj->pin, GPIO_MODE_INPUT, GPIO_NOPULL);
965960
}
966961

967962
/**

0 commit comments

Comments
 (0)