Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

rebase and re-pr Fix at32 targets #9618

Merged
merged 8 commits into from
Jan 5, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions src/main/drivers/adc_at32f43x.c
Original file line number Diff line number Diff line change
Expand Up @@ -179,11 +179,11 @@ void adcHardwareInit(drv_adc_config_t *init)
adcDevice_t * adc = &adcHardware[adcConfig[i].adcDevice];
// init adc gpio port
IOInit(IOGetByTag(adcConfig[i].tag), OWNER_ADC, RESOURCE_ADC_CH1 + (i - ADC_CHN_1), 0);
IOConfigGPIO(IOGetByTag(adcConfig[i].tag), IO_CONFIG(GPIO_MODE_ANALOG, 0, GPIO_OUTPUT_OPEN_DRAIN, GPIO_PULL_NONE));
IOConfigGPIO(IOGetByTag(adcConfig[i].tag), IO_CONFIG(GPIO_MODE_ANALOG, 0, 0, 0));

adcConfig[i].adcChannel = adcChannelByTag(adcConfig[i].tag);
adcConfig[i].dmaIndex = adc->usedChannelCount++;
adcConfig[i].sampleTime = ADC_SAMPLETIME_6_5;
adcConfig[i].sampleTime = ADC_SAMPLETIME_640_5;
adcConfig[i].enabled = true;

adc->enabled = true;
Expand Down
2 changes: 1 addition & 1 deletion src/main/drivers/bus_spi.h
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ typedef struct SPIDevice_s {
ioTag_t mosi;
ioTag_t miso;
rccPeriphTag_t rcc;
#if defined(STM32F7) || defined(STM32H7)
#if defined(STM32F7) || defined(STM32H7) || defined(AT32F43x)
uint8_t sckAF;
uint8_t misoAF;
uint8_t mosiAF;
Expand Down
81 changes: 59 additions & 22 deletions src/main/drivers/bus_spi_at32f43x.c
Original file line number Diff line number Diff line change
Expand Up @@ -80,25 +80,61 @@
};
#endif

static spiDevice_t spiHardwareMap[] = {
#ifdef USE_SPI_DEVICE_1
{ .dev = SPI1, .nss = IO_TAG(SPI1_NSS_PIN), .sck = IO_TAG(SPI1_SCK_PIN), .miso = IO_TAG(SPI1_MISO_PIN), .mosi = IO_TAG(SPI1_MOSI_PIN), .rcc = RCC_APB2(SPI1), .af = GPIO_MUX_5, .divisorMap = spiDivisorMapFast },
#else
{ .dev = NULL }, // No SPI1
#endif
#ifdef USE_SPI_DEVICE_2
{ .dev = SPI2, .nss = IO_TAG(SPI2_NSS_PIN), .sck = IO_TAG(SPI2_SCK_PIN), .miso = IO_TAG(SPI2_MISO_PIN), .mosi = IO_TAG(SPI2_MOSI_PIN), .rcc = RCC_APB1(SPI2), .af = GPIO_MUX_5, .divisorMap = spiDivisorMapSlow },
#else
{ .dev = NULL }, // No SPI2
#endif
#ifdef USE_SPI_DEVICE_3
{ .dev = SPI3, .nss = IO_TAG(SPI3_NSS_PIN), .sck = IO_TAG(SPI3_SCK_PIN), .miso = IO_TAG(SPI3_MISO_PIN), .mosi = IO_TAG(SPI3_MOSI_PIN), .rcc = RCC_APB1(SPI3), .af = GPIO_MUX_6, .divisorMap = spiDivisorMapSlow },
#else
{ .dev = NULL }, // No SPI3
#endif
{ .dev = NULL }, // No SPI4
};
//MAP spi pin config and af
static spiDevice_t spiHardwareMap[] = {
#ifdef USE_SPI_DEVICE_1
#if defined(SPI1_SCK_AF) || defined(SPI1_MISO_AF) || defined(SPI1_MOSI_AF)
#if !defined(SPI1_SCK_AF) || !defined(SPI1_MISO_AF) || !defined(SPI1_MOSI_AF)
#error SPI1: SCK, MISO and MOSI AFs should be defined together in target.h!
#endif
{ .dev = SPI1, .nss = IO_TAG(SPI1_NSS_PIN), .sck = IO_TAG(SPI1_SCK_PIN), .miso = IO_TAG(SPI1_MISO_PIN), .mosi = IO_TAG(SPI1_MOSI_PIN), .rcc = RCC_APB2(SPI1), .sckAF = SPI1_SCK_AF, .misoAF = SPI1_MISO_AF, .mosiAF = SPI1_MOSI_AF, .divisorMap = spiDivisorMapFast },
#else
{ .dev = SPI1, .nss = IO_TAG(SPI1_NSS_PIN), .sck = IO_TAG(SPI1_SCK_PIN), .miso = IO_TAG(SPI1_MISO_PIN), .mosi = IO_TAG(SPI1_MOSI_PIN), .rcc = RCC_APB2(SPI1), .sckAF = GPIO_MUX_5, .misoAF = GPIO_MUX_5, .mosiAF = GPIO_MUX_5, .divisorMap = spiDivisorMapFast },
#endif
#else
{ .dev = NULL }, // No SPI1
#endif

#ifdef USE_SPI_DEVICE_2
#if defined(SPI2_SCK_AF) || defined(SPI2_MISO_AF) || defined(SPI2_MOSI_AF)
#if !defined(SPI2_SCK_AF) || !defined(SPI2_MISO_AF) || !defined(SPI2_MOSI_AF)
#error SPI2: SCK, MISO and MOSI AFs should be defined together in target.h!
#endif
{ .dev = SPI2, .nss = IO_TAG(SPI2_NSS_PIN), .sck = IO_TAG(SPI2_SCK_PIN), .miso = IO_TAG(SPI2_MISO_PIN), .mosi = IO_TAG(SPI2_MOSI_PIN), .rcc = RCC_APB1(SPI2), .sckAF = SPI2_SCK_AF, .misoAF = SPI2_MISO_AF, .mosiAF = SPI2_MOSI_AF, .divisorMap = spiDivisorMapSlow },
#else
{ .dev = SPI2, .nss = IO_TAG(SPI2_NSS_PIN), .sck = IO_TAG(SPI2_SCK_PIN), .miso = IO_TAG(SPI2_MISO_PIN), .mosi = IO_TAG(SPI2_MOSI_PIN), .rcc = RCC_APB1(SPI2), .sckAF = GPIO_MUX_5, .misoAF = GPIO_MUX_5, .mosiAF = GPIO_MUX_5, .divisorMap = spiDivisorMapSlow },
#endif
#else
{ .dev = NULL }, // No SPI2
#endif

#ifdef USE_SPI_DEVICE_3
#if defined(SPI3_SCK_AF) || defined(SPI3_MISO_AF) || defined(SPI3_MOSI_AF)
#if !defined(SPI3_SCK_AF) || !defined(SPI3_MISO_AF) || !defined(SPI3_MOSI_AF)
#error SPI3: SCK, MISO and MOSI AFs should be defined together in target.h!
#endif
{ .dev = SPI3, .nss = IO_TAG(SPI3_NSS_PIN), .sck = IO_TAG(SPI3_SCK_PIN), .miso = IO_TAG(SPI3_MISO_PIN), .mosi = IO_TAG(SPI3_MOSI_PIN), .rcc = RCC_APB1(SPI3), .sckAF = SPI3_SCK_AF, .misoAF = SPI3_MISO_AF, .mosiAF = SPI3_MOSI_AF, .divisorMap = spiDivisorMapSlow },
#else
{ .dev = SPI3, .nss = IO_TAG(SPI3_NSS_PIN), .sck = IO_TAG(SPI3_SCK_PIN), .miso = IO_TAG(SPI3_MISO_PIN), .mosi = IO_TAG(SPI3_MOSI_PIN), .rcc = RCC_APB1(SPI3), .sckAF = GPIO_MUX_6, .misoAF = GPIO_MUX_6, .mosiAF = GPIO_MUX_6, .divisorMap = spiDivisorMapSlow },
#endif
#else
{ .dev = NULL }, // No SPI3
#endif

#ifdef USE_SPI_DEVICE_4
#if defined(SPI4_SCK_AF) || defined(SPI4_MISO_AF) || defined(SPI4_MOSI_AF)
#if !defined(SPI4_SCK_AF) || !defined(SPI4_MISO_AF) || !defined(SPI4_MOSI_AF)
#error SPI4: SCK, MISO and MOSI AFs should be defined together in target.h!
#endif
{ .dev = SPI4, .nss = IO_TAG(SPI4_NSS_PIN), .sck = IO_TAG(SPI4_SCK_PIN), .miso = IO_TAG(SPI4_MISO_PIN), .mosi = IO_TAG(SPI4_MOSI_PIN), .rcc = RCC_APB2(SPI4), .sckAF = SPI4_SCK_AF, .misoAF = SPI4_MISO_AF, .mosiAF = SPI4_MOSI_AF, .divisorMap = spiDivisorMapSlow }
#else
{ .dev = SPI4, .nss = IO_TAG(SPI4_NSS_PIN), .sck = IO_TAG(SPI4_SCK_PIN), .miso = IO_TAG(SPI4_MISO_PIN), .mosi = IO_TAG(SPI4_MOSI_PIN), .rcc = RCC_APB2(SPI4), .sckAF = GPIO_MUX_6, .misoAF = GPIO_MUX_6, .mosiAF = GPIO_MUX_6, .divisorMap = spiDivisorMapSlow }
#endif
#else
{ .dev = NULL } // No SPI4
#endif
};
#else
#error "Invalid CPU"
#endif

Expand Down Expand Up @@ -135,12 +171,13 @@ bool spiInitDevice(SPIDevice device, bool leadingEdge)
IOInit(IOGetByTag(spi->miso), OWNER_SPI, RESOURCE_SPI_MISO, device + 1);
IOInit(IOGetByTag(spi->mosi), OWNER_SPI, RESOURCE_SPI_MOSI, device + 1);

IOConfigGPIOAF(IOGetByTag(spi->sck), SPI_IO_AF_SCK_CFG, spi->af);
IOConfigGPIOAF(IOGetByTag(spi->miso), SPI_IO_AF_MISO_CFG, spi->af);
IOConfigGPIOAF(IOGetByTag(spi->mosi), SPI_IO_AF_CFG, spi->af);
IOConfigGPIOAF(IOGetByTag(spi->sck), SPI_IO_AF_SCK_CFG, spi->sckAF);
IOConfigGPIOAF(IOGetByTag(spi->miso), SPI_IO_AF_MISO_CFG, spi->misoAF);
IOConfigGPIOAF(IOGetByTag(spi->mosi), SPI_IO_AF_CFG, spi->mosiAF);

if (spi->nss) {
IOConfigGPIOAF(IOGetByTag(spi->nss), SPI_IO_CS_CFG, spi->af);
IOInit(IOGetByTag(spi->nss), OWNER_SPI, RESOURCE_SPI_CS, device + 1);
IOConfigGPIO(IOGetByTag(spi->nss), SPI_IO_CS_CFG);
}

spi_i2s_reset(spi->dev);
Expand Down
126 changes: 27 additions & 99 deletions src/main/drivers/serial_usb_vcp_at32f43x.c
Original file line number Diff line number Diff line change
Expand Up @@ -226,19 +226,12 @@ void OTG_WKUP_HANDLER(void)

uint32_t CDC_Send_FreeBytes(void)
{
/*
return the bytes free in the circular buffer

functionally equivalent to:
(APP_Rx_ptr_out > APP_Rx_ptr_in ? APP_Rx_ptr_out - APP_Rx_ptr_in : APP_RX_DATA_SIZE - APP_Rx_ptr_in + APP_Rx_ptr_in)
but without the impact of the condition check.
*/
uint32_t freeBytes;
ATOMIC_BLOCK(NVIC_PRIO_VCP) {
freeBytes = ((UserTxBufPtrOut - UserTxBufPtrIn) + (-((int)(UserTxBufPtrOut <= UserTxBufPtrIn)) & APP_TX_DATA_SIZE)) - 1;
}

return freeBytes;
cdc_struct_type *pcdc = (cdc_struct_type *)otg_core_struct.dev.class_handler->pdata;
if(pcdc->g_tx_completed){
return APP_TX_BLOCK_SIZE;
}else{
return 0;
}
}

/**
Expand All @@ -251,92 +244,29 @@ uint32_t CDC_Send_FreeBytes(void)
*/
uint32_t CDC_Send_DATA(const uint8_t *ptrBuffer, uint32_t sendLength)
{
for (uint32_t i = 0; i < sendLength; i++) {
while (CDC_Send_FreeBytes() == 0) {
// block until there is free space in the ring buffer
delay(1);
}

ATOMIC_BLOCK(NVIC_PRIO_VCP) {
UserTxBuffer[UserTxBufPtrIn] = ptrBuffer[i];
UserTxBufPtrIn = (UserTxBufPtrIn + 1) % APP_TX_DATA_SIZE;
}
cdc_struct_type *pcdc = (cdc_struct_type *)otg_core_struct.dev.class_handler->pdata;
uint32_t start = millis();

uint32_t pos=0;
while(pos < sendLength || (pos==sendLength && sendLength%64 == 0) ){//`==` is intended for sending 0 length packet
int tosend=sendLength-pos;
if(tosend>APP_TX_BLOCK_SIZE){
tosend=APP_TX_BLOCK_SIZE;
}
return sendLength;
}

void TxTimerConfig(void){
/* Initialize TIMx peripheral as follow:
+ Period = CDC_POLLING_INTERVAL*1000 - 1 every 5ms
+ Prescaler = ((SystemCoreClock/2)/10000) - 1
+ ClockDivision = 0
+ Counter direction = Up
*/
crm_periph_clock_enable(CRM_TMR20_PERIPH_CLOCK, TRUE);
//timer, period, perscaler
tmr_base_init(usbTxTmr,(CDC_POLLING_INTERVAL - 1),((system_core_clock)/10000 - 1));
//TMR_CLOCK_DIV1 = 0X00 NO DIV
tmr_clock_source_div_set(usbTxTmr,TMR_CLOCK_DIV1);
//COUNT UP
tmr_cnt_dir_set(usbTxTmr,TMR_COUNT_UP);

tmr_period_buffer_enable(usbTxTmr,TRUE);

tmr_interrupt_enable(usbTxTmr, TMR_OVF_INT, TRUE);

nvic_irq_enable(TMR20_OVF_IRQn,NVIC_PRIO_USB,0);

tmr_counter_enable(usbTxTmr,TRUE);

}

/**
* @brief TIM period elapsed callback
* @param htim: TIM handle
* @retval None
*/
void TMR20_OVF_IRQHandler(void)
{

uint32_t buffsize;
static uint32_t lastBuffsize = 0;

cdc_struct_type *pcdc = (cdc_struct_type *)otg_core_struct.dev.class_handler->pdata;

if (pcdc->g_tx_completed == 1) {
// endpoint has finished transmitting previous block
if (lastBuffsize) {
bool needZeroLengthPacket = lastBuffsize % 64 == 0;

// move the ring buffer tail based on the previous succesful transmission
UserTxBufPtrOut += lastBuffsize;
if (UserTxBufPtrOut == APP_TX_DATA_SIZE) {
UserTxBufPtrOut = 0;
}
lastBuffsize = 0;

if (needZeroLengthPacket) {
usb_vcp_send_data(&otg_core_struct.dev, (uint8_t*)&UserTxBuffer[UserTxBufPtrOut], 0);
return;
}
}
if (UserTxBufPtrOut != UserTxBufPtrIn) {
if (UserTxBufPtrOut > UserTxBufPtrIn) { /* Roll-back */
buffsize = APP_TX_DATA_SIZE - UserTxBufPtrOut;
} else {
buffsize = UserTxBufPtrIn - UserTxBufPtrOut;
}
if (buffsize > APP_TX_BLOCK_SIZE) {
buffsize = APP_TX_BLOCK_SIZE;
}

uint32_t txed=usb_vcp_send_data(&otg_core_struct.dev,(uint8_t*)&UserTxBuffer[UserTxBufPtrOut], buffsize);
if (txed==SUCCESS) {
lastBuffsize = buffsize;
}
}
while(pcdc->g_tx_completed != 1) {
if (millis() - start > USB_TIMEOUT) {
return pos;
}
}
tmr_flag_clear(usbTxTmr,TMR_OVF_FLAG);
uint32_t txed=usb_vcp_send_data(&otg_core_struct.dev,(uint8_t *)(ptrBuffer+pos), tosend);
if(pos==sendLength){
break;
}
if (txed==SUCCESS) {
pos+=tosend;
}
}
return pos;
}

/************************************************************/
Expand Down Expand Up @@ -542,8 +472,6 @@ void usbVcpInitHardware(void)
&cdc_class_handler,
&cdc_desc_handler);

//config TX timer
TxTimerConfig();
}

serialPort_t *usbVcpOpen(void)
Expand Down
2 changes: 1 addition & 1 deletion src/main/target/NEUTRONRCF435MINI/target.c
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@

timerHardware_t timerHardware[] = {

DEF_TIM(TMR1, CH1, PA8, TIM_USE_ANY |TIM_USE_LED, 0,7), // PWM1 - LED MCO1 DMA1 CH2
DEF_TIM(TMR1, CH1, PA8, TIM_USE_ANY |TIM_USE_LED, 0,6), // PWM1 - LED MCO1 DMA1 CH2

DEF_TIM(TMR4, CH1, PB6, TIM_USE_OUTPUT_AUTO, 0,0), // motor1 DMA2 CH7
DEF_TIM(TMR4, CH2, PB7, TIM_USE_OUTPUT_AUTO, 0,2), // motor2 DMA2 CH6
Expand Down
2 changes: 1 addition & 1 deletion src/main/target/NEUTRONRCF435MINI/target.h
Original file line number Diff line number Diff line change
Expand Up @@ -165,7 +165,7 @@
#define USE_ADC
#define ADC_INSTANCE ADC1

#define ADC1_DMA_STREAM DMA2_CHANNEL5
#define ADC1_DMA_STREAM DMA2_CHANNEL1
#define ADC_CHANNEL_1_PIN PA0
#define ADC_CHANNEL_2_PIN PA1
//#define ADC_CHANNEL_3_PIN PB0
Expand Down
6 changes: 3 additions & 3 deletions src/main/target/NEUTRONRCF435SE/target.c
Original file line number Diff line number Diff line change
Expand Up @@ -28,16 +28,16 @@ timerHardware_t timerHardware[] = {

DEF_TIM(TMR8, CH4, PC9, TIM_USE_OUTPUT_AUTO, 0,0), // motor1 DMA2 CH7
DEF_TIM(TMR8, CH3, PC8, TIM_USE_OUTPUT_AUTO, 0,2), // motor2 DMA2 CH6
DEF_TIM(TMR3, CH2, PC7, TIM_USE_OUTPUT_AUTO, 0,1), // motor3 DMA2 CH5
DEF_TIM(TMR3, CH1, PC6, TIM_USE_OUTPUT_AUTO, 0,3), // motor4 DMA2 CH4
DEF_TIM(TMR8, CH2, PC7, TIM_USE_OUTPUT_AUTO, 0,1), // motor3 DMA2 CH5
DEF_TIM(TMR8, CH1, PC6, TIM_USE_OUTPUT_AUTO, 0,3), // motor4 DMA2 CH4

DEF_TIM(TMR4, CH1, PB6, TIM_USE_OUTPUT_AUTO, 0,11), // PWM1 - OUT5 DMA1 CH7
DEF_TIM(TMR4, CH2, PB7, TIM_USE_OUTPUT_AUTO, 0,10), // PWM2 - OUT6 DMA2 CH1
DEF_TIM(TMR3, CH4, PB1, TIM_USE_OUTPUT_AUTO, 0,9), // PWM3 - OUT7 DMA2 CH2
DEF_TIM(TMR3, CH3, PB0, TIM_USE_OUTPUT_AUTO, 0,8), // PWM4 - OUT8 DMA2 CH3

// DEF_TIM(TMR5, CH1, PA0, TIM_USE_ANY, 0, 13), // TIM_USE_CAMERA_CONTROL
DEF_TIM(TMR5, CH2, PA1, TIM_USE_LED, 0,7), // PWM1 - LED MCO1 DMA1 CH2
DEF_TIM(TMR5, CH2, PA1, TIM_USE_LED, 0,6), // PWM1 - LED MCO1 DMA1 CH2
// DEF_TIM(TMR2, CH4, PA3, TIM_USE_ANY |TIM_USE_PPM, 0,6), // PWM2 - PPM DMA1 CH6
};

Expand Down
6 changes: 3 additions & 3 deletions src/main/target/NEUTRONRCF435SE/target.h
Original file line number Diff line number Diff line change
Expand Up @@ -168,7 +168,7 @@
#define USE_ADC
#define ADC_INSTANCE ADC1

#define ADC1_DMA_STREAM DMA2_CHANNEL5
#define ADC1_DMA_STREAM DMA2_CHANNEL1
#define ADC_CHANNEL_1_PIN PC2
#define ADC_CHANNEL_2_PIN PC1
//#define ADC_CHANNEL_3_PIN PB0
Expand All @@ -178,8 +178,8 @@

#define DEFAULT_FEATURES (FEATURE_TX_PROF_SEL | FEATURE_CURRENT_METER | FEATURE_TELEMETRY| FEATURE_VBAT | FEATURE_OSD )

// #define USE_LED_STRIP
// #define WS2811_PIN PB10 //TIM2_CH3
#define USE_LED_STRIP
#define WS2811_PIN PA1 //TIM2_CH3

// telemetry
// #define USE_SPEKTRUM_BIND
Expand Down
16 changes: 8 additions & 8 deletions src/main/target/SAGEATF4/target.c
Original file line number Diff line number Diff line change
Expand Up @@ -28,18 +28,18 @@ timerHardware_t timerHardware[] = {

// DEF_TIM(TMR5, CH4, PA3, TIM_USE_PPM, 0, 4), // PPM UART2_RX_PIN DMA1 CH5

DEF_TIM(TMR4, CH1, PB6, TIM_USE_OUTPUT_AUTO, 0,0), // motor1 DMA1 CH1
DEF_TIM(TMR4, CH2, PB7, TIM_USE_OUTPUT_AUTO, 0,1), // motor2 DMA1 CH2
DEF_TIM(TMR2, CH1, PB8, TIM_USE_OUTPUT_AUTO, 0,2), // motor3 DMA1 CH3
DEF_TIM(TMR2, CH2, PB9, TIM_USE_OUTPUT_AUTO, 0,3), // motor4 DMA1 CH4
DEF_TIM(TMR4, CH1, PB6, TIM_USE_MOTOR, 0,0), // motor1 DMA1 CH1
DEF_TIM(TMR4, CH2, PB7, TIM_USE_MOTOR, 0,1), // motor2 DMA1 CH2
DEF_TIM(TMR4, CH3, PB8, TIM_USE_MOTOR, 0,2), // motor3 DMA1 CH3
DEF_TIM(TMR4, CH4, PB9, TIM_USE_MOTOR, 0,3), // motor4 DMA1 CH4

DEF_TIM(TMR3, CH1, PC6, TIM_USE_OUTPUT_AUTO, 0,8), // PWM1 - OUT5 DMA2 CH2 DMA2_CHANNEL1->ADC
DEF_TIM(TMR3, CH2, PC7, TIM_USE_OUTPUT_AUTO, 0,9), // PWM2 - OUT6 DMA2 CH3
DEF_TIM(TMR3, CH1, PC6, TIM_USE_OUTPUT_AUTO, 0,8), // PWM1 - OUT5 DMA2 CH2 DMA2_CHANNEL1->ADC
DEF_TIM(TMR3, CH2, PC7, TIM_USE_OUTPUT_AUTO, 0,9), // PWM2 - OUT6 DMA2 CH3
DEF_TIM(TMR3, CH3, PC8, TIM_USE_OUTPUT_AUTO, 0,10), // PWM3 - OUT7 DMA2 CH4
DEF_TIM(TMR3, CH4, PC9, TIM_USE_OUTPUT_AUTO, 0,11), // PWM4 - OUT8 DMA2 CH5

DEF_TIM(TMR2, CH3, PB10, TIM_USE_ANY | TIM_USE_LED, 0,5), // PWM1 - LED MCO1 DMA1 CH6
DEF_TIM(TMR2, CH4, PB11, TIM_USE_ANY | TIM_USE_BEEPER, 0,6), // PWM2 - BB DMA1 CH7
DEF_TIM(TMR2, CH3, PB10, TIM_USE_ANY | TIM_USE_LED, 0,5), // PWM1 - LED MCO1 DMA1 CH6
DEF_TIM(TMR5, CH4, PB11, TIM_USE_ANY | TIM_USE_BEEPER, 0,6), // PWM2 - BB DMA1 CH7
};

const int timerHardwareCount = sizeof(timerHardware) / sizeof(timerHardware[0]);
Expand Down
Loading
Loading