добавлены функции на отправку сигнала. что-то рисуют и ногами, и через ШИМ, вроде похоже на результаты с уно, но через шим на паузе иногда в верхнем состоянии остаемся, а не в нижнем

This commit is contained in:
KLASSENTS 2025-01-21 16:59:34 +07:00
parent fe791d754d
commit 9e317ce9f3

View File

@ -2072,6 +2072,65 @@ extern "C" void __attribute__((noinline, section(".ram_text"), optimize("O3")))
TIM16_CLEAR_INT_MASK(htimer16_0, 0xFFFFFFFF); // reset timer interrupt flags TIM16_CLEAR_INT_MASK(htimer16_0, 0xFFFFFFFF); // reset timer interrupt flags
} }
# if defined(SEND_PWM_BY_TIMER)
#include "pins_arduino.h"
#define IR_SEND_PIN 3
static TIMER32_HandleTypeDef ir_sender_htimer;
static TIMER32_CHANNEL_HandleTypeDef ir_sender_htimer_channel;
/*
* timerConfigForSend() is used exclusively by IRsend::enableIROut()
* Set output pin mode and disable receive interrupt if it uses the same resource
*/
void timerConfigForSend(uint16_t aFrequencyKHz)
{
uint32_t pwmTopVal = 0;
if ((aFrequencyKHz*1000) <= PWM_FREQUENCY_MAX)
pwmTopVal = F_CPU/(aFrequencyKHz*1000)-3;
else
ErrorMsgHandler("timerConfigForSend(): invalid frequency for IR sending");
// initialization of the required timer
ir_sender_htimer.Instance = pwmPinToTimer(IR_SEND_PIN);
ir_sender_htimer.Top = pwmTopVal;
ir_sender_htimer.State = TIMER32_STATE_DISABLE;
ir_sender_htimer.Clock.Source = TIMER32_SOURCE_PRESCALER;
ir_sender_htimer.Clock.Prescaler = 0; // Prescaler = 1
ir_sender_htimer.InterruptMask = 0;
ir_sender_htimer.CountMode = TIMER32_COUNTMODE_FORWARD;
HAL_Timer32_Init(&ir_sender_htimer);
// gpio init as timer channel pin
HAL_GPIO_PinConfig(digitalPinToPort(IR_SEND_PIN), digitalPinToBitMask(IR_SEND_PIN),
HAL_GPIO_MODE_TIMER_SERIAL, HAL_GPIO_PULL_NONE, HAL_GPIO_DS_2MA);
ir_sender_htimer_channel.TimerInstance = ir_sender_htimer.Instance;
ir_sender_htimer_channel.ChannelIndex = pwmPinToTimerChannel(IR_SEND_PIN);
ir_sender_htimer_channel.PWM_Invert = TIMER32_CHANNEL_NON_INVERTED_PWM;
ir_sender_htimer_channel.Mode = TIMER32_CHANNEL_MODE_PWM;
ir_sender_htimer_channel.CaptureEdge = TIMER32_CHANNEL_CAPTUREEDGE_RISING;
ir_sender_htimer_channel.OCR = ((pwmTopVal * IR_SEND_DUTY_CYCLE_PERCENT)/100);
ir_sender_htimer_channel.Noise = TIMER32_CHANNEL_FILTER_OFF;
HAL_Timer32_Channel_Init(&ir_sender_htimer_channel);
HAL_Timer32_Start(&ir_sender_htimer);
}
void enableSendPWMByTimer()
{
// start timer with initialized channel
HAL_Timer32_Value_Clear(&ir_sender_htimer);
HAL_Timer32_Channel_Enable(&ir_sender_htimer_channel);
}
void disableSendPWMByTimer()
{
HAL_Timer32_Channel_Disable(&ir_sender_htimer_channel);
digitalWriteFast(IR_SEND_PIN, 1);
}
# endif // defined(SEND_PWM_BY_TIMER)
/*************************************** /***************************************
* Unknown CPU board * Unknown CPU board
***************************************/ ***************************************/