Вс май 04, 2025 14:00:05
Вс май 04, 2025 14:07:03
Спойлер
Вс май 04, 2025 14:10:23
Вс май 04, 2025 14:52:22
a5021 писал(а):а помогаек всяких без счета сейчас:Спойлер
[spoiler]
Вс май 04, 2025 15:05:28
ARV писал(а):Итак, по сути. Модбас не укладывается в модель OSI, т.к. был придуман еще до его изобретения, если я не ошибаюсь.
ARV писал(а):Итак, по сути. Модбас... Длина пакета него переменная в принципе, хотя наиболее частая длина 8 байт, но при ошибках может быть 6, а при записи большого количества регистров-катушек, как было отмечено, может быть до 257 байт.
ARV писал(а):tonyk писал(а):
В некоторых STM32 встроены полноценные UART с аппаратной поддержкой Модбас.
это вы сейчас утверждаете, или предполагаете? я пока что обнаружил встроенную поддержку аппаратного переключения RX-TX, что и применяю. но никакой дргой поддержки модбас я пока не видел (но я и видел мало, как вы уже ранее верно подметили).
ARV писал(а):Не представляю, как еще можно все настроить...
ARV писал(а):я ранее интересовался: а как же девайсы на 8-битниках двадцатилетней давности модбас тянут?!
Вс май 04, 2025 15:43:21
Здорово, а букву наверно можно наугад вводить?
а вы все оптимизациями имен по размеру занимаетесь )
Вс май 04, 2025 16:42:38
а это делается программно, или "завести на вход" следует понимать буквально - изменить схему?jcxz писал(а):завести сигнал RXD на вход сброса/перезагрузки таймера
уверен, что рассказывать необязательно, т.к. вне зависимости от того, что именно я делаю, ваш вердикт все равно будет "не правильно". Однако, таймер есть, и он на самом деле ловит таймауты и паузы между пакетами.jcxz писал(а):ак именно вы делите поток байтов на кадры Modbus при помощи одного только UART? Без таймера и без использования аппаратной функции таймаута UART?
на минуточку: вы в теме для начинающих, так что речь не о конях и корме, а о жеребятах и бутылочке с соской. умерьте ваш гонор, а то вам поляки завидуют.jcxz писал(а):Как обычно - "не в коня корм"
к драйверу RS485 зато имеетtonyk писал(а):А автоуправление DE никакого отношения к Модбас не имеет.
ну, вот и спасибо, теперь буду знать.tonyk писал(а):Если бы читали, то знали, что полноценный UART, которого лишён попсовый STM32F103, умеет аппаратно выделять Модбас-кадр используя свой специальный таймер, отсчитывающий задержку в количестве битов. Кроме того, такой UART умеет сравнивать байт внутри кадра с заданным. Ну и до кучи можно считать CRC принятого пакета, используя аппаратный блок вычисления CRC вкупе с DMA.
Вс май 04, 2025 17:20:38
ARV писал(а):к драйверу RS485 зато имеет
ARV писал(а):но ведь DMA не может в два "приемника" данные отправлять? или может? это я к тому, что CRC считать одновременно с "перемещением байта в буфер" все равно не получится?
Поймал мужик золотую рыбку - та и говорит: "Исполню твое желание, отпусти меня!"
Мужик думал, думал да и говорит: "Хочу ссать водкой!"
Рыбка отвечает - "Запросто!"
Пришел мужик домой, поссал в стакан, к жене : "Выпей!!"
Та :"Да ты че о@ел!". Мужик сам попробовал - нормально, она следом. Ну в общем посидели до утра.
Утром жена приходит со стаканом и с огурчиком - "Опохмелиться бы"
Мужик: "Вчера была презентация - а сегодня за деньги и из горла!"
Вс май 04, 2025 17:53:39
Вс май 04, 2025 19:02:21
Вс май 04, 2025 19:31:38
Пт май 09, 2025 22:51:49
PERIPHERAL_REGISTER(...)
(PERIPHERAL_REGISTER_BITFIELD1 | PERIPHERAL_REGISTER_BITFIELD2 | ... | PERIPHERAL_REGISTER_BITFIELDn)
(TIM_CR1_OPM | TIM_CR1_DIR | TIM_CR1_CEN)
TIM_CR1(OPM, DIR, CEN)
int main(void) {
// 1. Enable clocks for TIM2 and USART2 peripherals
RCC->APB1ENR |= RCC_APB1ENR(TIM2EN, USART2EN);
// 2. Enable clock for GPIOA (for USART2 TX/RX and PWM on PA0)
RCC->APB2ENR |= RCC_APB2ENR(IOPAEN);
// 3. Configure PA0 (TIM2_CH1) as alternate function push-pull, 50 MHz
GPIOA->CRL &= ~GPIO_CRL(MODE0, CNF0);
GPIOA->CRL |= GPIO_CRL(MODE0_1, MODE0_0, CNF0_1);
// 4. Configure PA2 (USART2_TX) as alternate function push-pull, 50 MHz
GPIOA->CRL &= ~GPIO_CRL(MODE2, CNF2);
GPIOA->CRL |= GPIO_CRL(MODE2_1, MODE2_0, CNF2_1);
// 5. Configure PA3 (USART2_RX) as input floating
GPIOA->CRL &= ~GPIO_CRL(MODE3, CNF3);
GPIOA->CRL |= GPIO_CRL(CNF3_0);
// --- TIM2 PWM setup on CH1 (PA0) ---
TIM2->PSC = 8 - 1; // 1 MHz timer clock
TIM2->ARR = 1000 - 1; // 1 kHz PWM frequency
TIM2->CCR1 = 500; // Initial duty: 50%
// Set PWM mode 1 on CH1, enable preload
TIM2->CCMR1 = TIM_CCMR1(OC1M_2, OC1M_1, OC1PE);
TIM2->CCER = TIM_CCER(CC1E);
TIM2->CR1 = TIM_CR1(ARPE, CEN);
// --- USART2 setup ---
USART2->BRR = 8000000 / 9600;
USART2->CR1 = USART_CR1(UE, TE, RE);
// --- Main loop ---
while (1) {
// Poll RXNE (Receive Data Register Not Empty)
if (USART2->SR & USART_SR(RXNE)) {
// Read received byte (clears RXNE)
signed char delta = (signed char)USART2->DR;
// Adjust duty cycle
int duty = TIM2->CCR1 + delta;
if (duty < 0) duty = 0;
if (duty > TIM2->ARR) duty = TIM2->ARR;
TIM2->CCR1 = duty;
}
// Main loop continues immediately (non-blocking)
}
}
// --- Universal BITS Macro ---
// Helper macro: paste together PREFIX_, REG, and FIELD to form a bitfield macro name
#define _BITS_ONE(PREFIX_, REG, FIELD) PREFIX_##REG##_##FIELD
// Recursive macros to combine 1-16 bitfields with the '|' operator
#define _BITS_1(PREFIX_, REG, A1) _BITS_ONE(PREFIX_, REG, A1)
#define _BITS_2(PREFIX_, REG, A1, ...) _BITS_ONE(PREFIX_, REG, A1) | _BITS_1(PREFIX_, REG, __VA_ARGS__)
#define _BITS_3(PREFIX_, REG, A1, ...) _BITS_ONE(PREFIX_, REG, A1) | _BITS_2(PREFIX_, REG, __VA_ARGS__)
#define _BITS_4(PREFIX_, REG, A1, ...) _BITS_ONE(PREFIX_, REG, A1) | _BITS_3(PREFIX_, REG, __VA_ARGS__)
#define _BITS_5(PREFIX_, REG, A1, ...) _BITS_ONE(PREFIX_, REG, A1) | _BITS_4(PREFIX_, REG, __VA_ARGS__)
#define _BITS_6(PREFIX_, REG, A1, ...) _BITS_ONE(PREFIX_, REG, A1) | _BITS_5(PREFIX_, REG, __VA_ARGS__)
#define _BITS_7(PREFIX_, REG, A1, ...) _BITS_ONE(PREFIX_, REG, A1) | _BITS_6(PREFIX_, REG, __VA_ARGS__)
#define _BITS_8(PREFIX_, REG, A1, ...) _BITS_ONE(PREFIX_, REG, A1) | _BITS_7(PREFIX_, REG, __VA_ARGS__)
#define _BITS_9(PREFIX_, REG, A1, ...) _BITS_ONE(PREFIX_, REG, A1) | _BITS_8(PREFIX_, REG, __VA_ARGS__)
#define _BITS_10(PREFIX_, REG, A1, ...) _BITS_ONE(PREFIX_, REG, A1) | _BITS_9(PREFIX_, REG, __VA_ARGS__)
#define _BITS_11(PREFIX_, REG, A1, ...) _BITS_ONE(PREFIX_, REG, A1) | _BITS_10(PREFIX_, REG, __VA_ARGS__)
#define _BITS_12(PREFIX_, REG, A1, ...) _BITS_ONE(PREFIX_, REG, A1) | _BITS_11(PREFIX_, REG, __VA_ARGS__)
#define _BITS_13(PREFIX_, REG, A1, ...) _BITS_ONE(PREFIX_, REG, A1) | _BITS_12(PREFIX_, REG, __VA_ARGS__)
#define _BITS_14(PREFIX_, REG, A1, ...) _BITS_ONE(PREFIX_, REG, A1) | _BITS_13(PREFIX_, REG, __VA_ARGS__)
#define _BITS_15(PREFIX_, REG, A1, ...) _BITS_ONE(PREFIX_, REG, A1) | _BITS_14(PREFIX_, REG, __VA_ARGS__)
#define _BITS_16(PREFIX_, REG, A1, ...) _BITS_ONE(PREFIX_, REG, A1) | _BITS_15(PREFIX_, REG, __VA_ARGS__)
// Macro to count the number of variadic arguments (up to 16)
#define _BITS_NARG(...) _BITS_NARG_(__VA_ARGS__,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1)
#define _BITS_NARG_(_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,N,...) N
// Macro chooser: selects the correct _BITS_N macro based on argument count
#define _BITS_CHOOSER2(count) _BITS_##count
#define _BITS_CHOOSER1(count) _BITS_CHOOSER2(count)
#define _BITS_CHOOSER(count) _BITS_CHOOSER1(count)
// Main macro: expands to a mask of all requested bitfields for a given peripheral register
#define BITS(PREFIX_, REG, ...) \
(_BITS_CHOOSER(_BITS_NARG(__VA_ARGS__))(PREFIX_, REG, __VA_ARGS__))
// --- Peripheral Type Wrappers ---
// These wrappers make it easy to use the BITS macro for each peripheral type.
// Example: RCC_BITS(APB2ENR, IOPAEN, AFIOEN) expands to (RCC_APB2ENR_IOPAEN | RCC_APB2ENR_AFIOEN)
#define RCC_BITS(reg, ...) BITS(RCC_, reg, __VA_ARGS__) // For RCC registers
#define GPIO_BITS(reg, ...) BITS(GPIO_, reg, __VA_ARGS__) // For GPIO registers
#define AFIO_BITS(reg, ...) BITS(AFIO_, reg, __VA_ARGS__) // For AFIO registers
#define TIM_BITS(reg, ...) BITS(TIM_, reg, __VA_ARGS__) // For TIM registers
#define USART_BITS(reg, ...) BITS(USART_, reg, __VA_ARGS__) // For USART registers
#define UART_BITS(reg, ...) BITS(UART_, reg, __VA_ARGS__) // For UART registers
#define SPI_BITS(reg, ...) BITS(SPI_, reg, __VA_ARGS__) // For SPI registers
#define I2C_BITS(reg, ...) BITS(I2C_, reg, __VA_ARGS__) // For I2C registers
#define CAN_BITS(reg, ...) BITS(CAN_, reg, __VA_ARGS__) // For CAN registers
#define ADC_BITS(reg, ...) BITS(ADC_, reg, __VA_ARGS__) // For ADC registers
#define DAC_BITS(reg, ...) BITS(DAC_, reg, __VA_ARGS__) // For DAC registers
#define CRC_BITS(reg, ...) BITS(CRC_, reg, __VA_ARGS__) // For CRC registers
#define USB_BITS(reg, ...) BITS(USB_, reg, __VA_ARGS__) // For USB registers
#define BKP_BITS(reg, ...) BITS(BKP_, reg, __VA_ARGS__) // For BKP registers
#define PWR_BITS(reg, ...) BITS(PWR_, reg, __VA_ARGS__) // For PWR registers
#define FLASH_BITS(reg, ...) BITS(FLASH_, reg, __VA_ARGS__) // For FLASH registers
#define DBGMCU_BITS(reg, ...) BITS(DBGMCU_, reg, __VA_ARGS__) // For DBGMCU registers
#define WWDG_BITS(reg, ...) BITS(WWDG_, reg, __VA_ARGS__) // For WWDG registers
#define IWDG_BITS(reg, ...) BITS(IWDG_, reg, __VA_ARGS__) // For IWDG registers
#define RTC_BITS(reg, ...) BITS(RTC_, reg, __VA_ARGS__) // For RTC registers
#define EXTI_BITS(reg, ...) BITS(EXTI_, reg, __VA_ARGS__) // For EXTI registers
// --- RCC ---
#define RCC_CR(...) BITS(RCC_, CR, __VA_ARGS__)
#define RCC_CFGR(...) BITS(RCC_, CFGR, __VA_ARGS__)
#define RCC_CIR(...) BITS(RCC_, CIR, __VA_ARGS__)
#define RCC_APB2RSTR(...) BITS(RCC_, APB2RSTR, __VA_ARGS__)
#define RCC_APB1RSTR(...) BITS(RCC_, APB1RSTR, __VA_ARGS__)
#define RCC_AHBENR(...) BITS(RCC_, AHBENR, __VA_ARGS__)
#define RCC_APB2ENR(...) BITS(RCC_, APB2ENR, __VA_ARGS__)
#define RCC_APB1ENR(...) BITS(RCC_, APB1ENR, __VA_ARGS__)
#define RCC_BDCR(...) BITS(RCC_, BDCR, __VA_ARGS__)
#define RCC_CSR(...) BITS(RCC_, CSR, __VA_ARGS__)
// --- GPIO ---
#define GPIO_CRL(...) BITS(GPIO_, CRL, __VA_ARGS__)
#define GPIO_CRH(...) BITS(GPIO_, CRH, __VA_ARGS__)
#define GPIO_IDR(...) BITS(GPIO_, IDR, __VA_ARGS__)
#define GPIO_ODR(...) BITS(GPIO_, ODR, __VA_ARGS__)
#define GPIO_BSRR(...) BITS(GPIO_, BSRR, __VA_ARGS__)
#define GPIO_BRR(...) BITS(GPIO_, BRR, __VA_ARGS__)
#define GPIO_LCKR(...) BITS(GPIO_, LCKR, __VA_ARGS__)
// --- AFIO ---
#define AFIO_EVCR(...) BITS(AFIO_, EVCR, __VA_ARGS__)
#define AFIO_MAPR(...) BITS(AFIO_, MAPR, __VA_ARGS__)
#define AFIO_EXTICR1(...) BITS(AFIO_, EXTICR1, __VA_ARGS__)
#define AFIO_EXTICR2(...) BITS(AFIO_, EXTICR2, __VA_ARGS__)
#define AFIO_EXTICR3(...) BITS(AFIO_, EXTICR3, __VA_ARGS__)
#define AFIO_EXTICR4(...) BITS(AFIO_, EXTICR4, __VA_ARGS__)
#define AFIO_MAPR2(...) BITS(AFIO_, MAPR2, __VA_ARGS__)
// --- TIM (general purpose and advanced) ---
#define TIM_CR1(...) BITS(TIM_, CR1, __VA_ARGS__)
#define TIM_CR2(...) BITS(TIM_, CR2, __VA_ARGS__)
#define TIM_SMCR(...) BITS(TIM_, SMCR, __VA_ARGS__)
#define TIM_DIER(...) BITS(TIM_, DIER, __VA_ARGS__)
#define TIM_SR(...) BITS(TIM_, SR, __VA_ARGS__)
#define TIM_EGR(...) BITS(TIM_, EGR, __VA_ARGS__)
#define TIM_CCMR1(...) BITS(TIM_, CCMR1, __VA_ARGS__)
#define TIM_CCMR2(...) BITS(TIM_, CCMR2, __VA_ARGS__)
#define TIM_CCER(...) BITS(TIM_, CCER, __VA_ARGS__)
#define TIM_CNT(...) BITS(TIM_, CNT, __VA_ARGS__)
#define TIM_PSC(...) BITS(TIM_, PSC, __VA_ARGS__)
#define TIM_ARR(...) BITS(TIM_, ARR, __VA_ARGS__)
#define TIM_CCR1(...) BITS(TIM_, CCR1, __VA_ARGS__)
#define TIM_CCR2(...) BITS(TIM_, CCR2, __VA_ARGS__)
#define TIM_CCR3(...) BITS(TIM_, CCR3, __VA_ARGS__)
#define TIM_CCR4(...) BITS(TIM_, CCR4, __VA_ARGS__)
#define TIM_DCR(...) BITS(TIM_, DCR, __VA_ARGS__)
#define TIM_DMAR(...) BITS(TIM_, DMAR, __VA_ARGS__)
// --- USART ---
#define USART_SR(...) BITS(USART_, SR, __VA_ARGS__)
#define USART_DR(...) BITS(USART_, DR, __VA_ARGS__)
#define USART_BRR(...) BITS(USART_, BRR, __VA_ARGS__)
#define USART_CR1(...) BITS(USART_, CR1, __VA_ARGS__)
#define USART_CR2(...) BITS(USART_, CR2, __VA_ARGS__)
#define USART_CR3(...) BITS(USART_, CR3, __VA_ARGS__)
#define USART_GTPR(...) BITS(USART_, GTPR, __VA_ARGS__)
// --- SPI ---
#define SPI_CR1(...) BITS(SPI_, CR1, __VA_ARGS__)
#define SPI_CR2(...) BITS(SPI_, CR2, __VA_ARGS__)
#define SPI_SR(...) BITS(SPI_, SR, __VA_ARGS__)
#define SPI_DR(...) BITS(SPI_, DR, __VA_ARGS__)
#define SPI_CRCPR(...) BITS(SPI_, CRCPR, __VA_ARGS__)
#define SPI_RXCRCR(...) BITS(SPI_, RXCRCR, __VA_ARGS__)
#define SPI_TXCRCR(...) BITS(SPI_, TXCRCR, __VA_ARGS__)
#define SPI_I2SCFGR(...) BITS(SPI_, I2SCFGR, __VA_ARGS__)
#define SPI_I2SPR(...) BITS(SPI_, I2SPR, __VA_ARGS__)
// --- I2C ---
#define I2C_CR1(...) BITS(I2C_, CR1, __VA_ARGS__)
#define I2C_CR2(...) BITS(I2C_, CR2, __VA_ARGS__)
#define I2C_OAR1(...) BITS(I2C_, OAR1, __VA_ARGS__)
#define I2C_OAR2(...) BITS(I2C_, OAR2, __VA_ARGS__)
#define I2C_DR(...) BITS(I2C_, DR, __VA_ARGS__)
#define I2C_SR1(...) BITS(I2C_, SR1, __VA_ARGS__)
#define I2C_SR2(...) BITS(I2C_, SR2, __VA_ARGS__)
#define I2C_CCR(...) BITS(I2C_, CCR, __VA_ARGS__)
#define I2C_TRISE(...) BITS(I2C_, TRISE, __VA_ARGS__)
// --- ADC ---
#define ADC_SR(...) BITS(ADC_, SR, __VA_ARGS__)
#define ADC_CR1(...) BITS(ADC_, CR1, __VA_ARGS__)
#define ADC_CR2(...) BITS(ADC_, CR2, __VA_ARGS__)
#define ADC_SMPR1(...) BITS(ADC_, SMPR1, __VA_ARGS__)
#define ADC_SMPR2(...) BITS(ADC_, SMPR2, __VA_ARGS__)
#define ADC_JOFR1(...) BITS(ADC_, JOFR1, __VA_ARGS__)
#define ADC_JOFR2(...) BITS(ADC_, JOFR2, __VA_ARGS__)
#define ADC_JOFR3(...) BITS(ADC_, JOFR3, __VA_ARGS__)
#define ADC_JOFR4(...) BITS(ADC_, JOFR4, __VA_ARGS__)
#define ADC_HTR(...) BITS(ADC_, HTR, __VA_ARGS__)
#define ADC_LTR(...) BITS(ADC_, LTR, __VA_ARGS__)
#define ADC_SQR1(...) BITS(ADC_, SQR1, __VA_ARGS__)
#define ADC_SQR2(...) BITS(ADC_, SQR2, __VA_ARGS__)
#define ADC_SQR3(...) BITS(ADC_, SQR3, __VA_ARGS__)
#define ADC_JSQR(...) BITS(ADC_, JSQR, __VA_ARGS__)
#define ADC_JDR1(...) BITS(ADC_, JDR1, __VA_ARGS__)
#define ADC_JDR2(...) BITS(ADC_, JDR2, __VA_ARGS__)
#define ADC_JDR3(...) BITS(ADC_, JDR3, __VA_ARGS__)
#define ADC_JDR4(...) BITS(ADC_, JDR4, __VA_ARGS__)
#define ADC_DR(...) BITS(ADC_, DR, __VA_ARGS__)
// --- EXTI ---
#define EXTI_IMR(...) BITS(EXTI_, IMR, __VA_ARGS__)
#define EXTI_EMR(...) BITS(EXTI_, EMR, __VA_ARGS__)
#define EXTI_RTSR(...) BITS(EXTI_, RTSR, __VA_ARGS__)
#define EXTI_FTSR(...) BITS(EXTI_, FTSR, __VA_ARGS__)
#define EXTI_SWIER(...) BITS(EXTI_, SWIER, __VA_ARGS__)
#define EXTI_PR(...) BITS(EXTI_, PR, __VA_ARGS__)
// --- PWR ---
#define PWR_CR(...) BITS(PWR_, CR, __VA_ARGS__)
#define PWR_CSR(...) BITS(PWR_, CSR, __VA_ARGS__)
// --- FLASH ---
#define FLASH_ACR(...) BITS(FLASH_, ACR, __VA_ARGS__)
#define FLASH_KEYR(...) BITS(FLASH_, KEYR, __VA_ARGS__)
#define FLASH_OPTKEYR(...) BITS(FLASH_, OPTKEYR, __VA_ARGS__)
#define FLASH_SR(...) BITS(FLASH_, SR, __VA_ARGS__)
#define FLASH_CR(...) BITS(FLASH_, CR, __VA_ARGS__)
#define FLASH_AR(...) BITS(FLASH_, AR, __VA_ARGS__)
#define FLASH_OBR(...) BITS(FLASH_, OBR, __VA_ARGS__)
#define FLASH_WRPR(...) BITS(FLASH_, WRPR, __VA_ARGS__)
// --- BKP ---
#define BKP_DR1(...) BITS(BKP_, DR1, __VA_ARGS__)
#define BKP_DR2(...) BITS(BKP_, DR2, __VA_ARGS__)
// ...repeat for all BKP_DRx as needed
#define BKP_RTCCR(...) BITS(BKP_, RTCCR, __VA_ARGS__)
#define BKP_CR(...) BITS(BKP_, CR, __VA_ARGS__)
#define BKP_CSR(...) BITS(BKP_, CSR, __VA_ARGS__)
// --- CRC ---
#define CRC_DR(...) BITS(CRC_, DR, __VA_ARGS__)
#define CRC_IDR(...) BITS(CRC_, IDR, __VA_ARGS__)
#define CRC_CR(...) BITS(CRC_, CR, __VA_ARGS__)
// --- WWDG ---
#define WWDG_CR(...) BITS(WWDG_, CR, __VA_ARGS__)
#define WWDG_CFR(...) BITS(WWDG_, CFR, __VA_ARGS__)
#define WWDG_SR(...) BITS(WWDG_, SR, __VA_ARGS__)
// --- IWDG ---
#define IWDG_KR(...) BITS(IWDG_, KR, __VA_ARGS__)
#define IWDG_PR(...) BITS(IWDG_, PR, __VA_ARGS__)
#define IWDG_RLR(...) BITS(IWDG_, RLR, __VA_ARGS__)
#define IWDG_SR(...) BITS(IWDG_, SR, __VA_ARGS__)
// --- RTC ---
#define RTC_CRH(...) BITS(RTC_, CRH, __VA_ARGS__)
#define RTC_CRL(...) BITS(RTC_, CRL, __VA_ARGS__)
#define RTC_PRLH(...) BITS(RTC_, PRLH, __VA_ARGS__)
#define RTC_PRLL(...) BITS(RTC_, PRLL, __VA_ARGS__)
#define RTC_DIVH(...) BITS(RTC_, DIVH, __VA_ARGS__)
#define RTC_DIVL(...) BITS(RTC_, DIVL, __VA_ARGS__)
#define RTC_CNTH(...) BITS(RTC_, CNTH, __VA_ARGS__)
#define RTC_CNTL(...) BITS(RTC_, CNTL, __VA_ARGS__)
#define RTC_ALRH(...) BITS(RTC_, ALRH, __VA_ARGS__)
#define RTC_ALRL(...) BITS(RTC_, ALRL, __VA_ARGS__)
Пт май 09, 2025 23:26:27
TIM_CR1(OPM, DIR, CEN)
Пт май 09, 2025 23:27:22
GPIOA->CRL &=
GPIOA->CRL |=
GPIOA->CRL =
Пт май 09, 2025 23:48:49
Пт май 09, 2025 23:52:18
Сб май 10, 2025 01:04:34
GPIOA->CRL &=
GPIOA->CRL |=
#define PORT_A_CONFIG ...чего-то-там
*(__IO uint64_t*) GPIOA_BASE = PORT_A_CONFIG;
Плюс куча макросов нужна или вы для всех серий уже готовые и проверенные поставляете?
Сб май 10, 2025 01:36:15
a5021 писал(а):я написал их сегодня в ходе обдумывания концепта. не сказать, чтобы надорвался.
Сб май 10, 2025 07:28:38
Сб май 10, 2025 07:45:27