А вообще, причин может быть немало.
Фоторезист Ordyl Alpha 350
Жидкое олово для лужения плат (видео) - самое лучшее и только у меня.
Паяльные маски XV501T-4 и KSM-S6189 (5 цветов).
Заказ печатных плат - pcbsmac@gmail.com
Спасибо, так и есть. Не все прочитал, еще меньше понял. Еще и счетчик включить нужно, сначала думал что он и обновляется и запускается сам.HardWareMan писал(а):Не вижу работу с TIM3->DIER.
А в чём сложность? Не понял.Silicoid писал(а):Подскажите плиз, есть ли какой-нибудь способ заставить создавать (вернее вносить правки) файл с нужным расширением?
Код: Выделить всё
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_ADC1_Init();
/* USER CODE BEGIN 2 */
my_cpp_main();
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */То, что вы хотите получить, полная чушь. Если используете МХ для настройки периферии, то тогда пишите на С, ну а коли решили использовать С++, то пишите работу с периферией сами, иначе ваша программа будет вызывать рвотный рефлекс как у адептов С, так и плюсовиков. Не знаю, как сейчас, но раньше С++ тошнило от кода МХ вплоть до ошибок компиляции. Так что следуйте совету из старого анекдота: "Абрам Моисеевич, вы или крестик снимите, или трусы наденьте!"Silicoid писал(а):Но если я пользуюсь визуальным конфигуратором (.ioc который), он вновь создает пустой файл main.c, который потом приходится мержить с проектом руками.
Сложности нет. неудобство присутствует.tonyk писал(а):А в чём сложность? Не понял.
Для этого калокуб не нужен, достаточно лишь конфигуратор использовать. Из него же удобно выбрать наиболее подходящий МК по требованиям к периферии. А потом составляем табличку - что на какой ноге - и начинаем рисовать. По мере трассировки платы, естественно, будет возникать желание что-то куда-то передвинуть. Тут тоже вполне конфигуратор поможет. Подправляем свою табличку с ногами в Readme.md, и рисуем дальше. Ну, а по готовой печатной плате уже сформируется окончательная табличка, глядя на нее и напишем инициализацию периферии. И это будет красиво и удобно, а не блевотное дерьмище, которое генерирует калокуб.Когда у вас 64 ноги и на 58 из них что-то висит и самое плохое, что это что-то иногда еще и переползает с ноги на ногу, то держать в голове (или notepad++) где что подключено, ну очень неудобно.
Код: Выделить всё
GPIOB->ODR = 0;
GPIOB->AFR[0] = AFRf(2, 0) | AFRf(7, 3) | AFRf(10, 5);
GPIOB->AFR[1] = AFRf(1, 8) | AFRf(7, 10) | AFRf(5, 13) | AFRf(5, 14) | AFRf(5, 15);
GPIOB->MODER = MODER_AF(0) | MODER_O(1) | MODER_O(2) | MODER_AF(3) | MODER_O(4) | MODER_AF(5) | MODER_O(6)
| MODER_I(7) | MODER_AF(8) | MODER_I(9) | MODER_AF(10) | MODER_I(11) | MODER_O(12) | MODER_AF(13)
| MODER_AF(14) | MODER_AF(15);
GPIOB->OSPEEDR = OSPEED_HI(0) | OSPEED_HI(5) | OSPEED_HI(8) | OSPEED_MED(13) | OSPEED_MED(14) | OSPEED_MED(15);
Ну так и подпишите, вариантов масса.Silicoid писал(а):А тут хоть можно подписать какой вывод за что отвечает.
Код: Выделить всё
////////////////////////////////////////////////////////////////////////////////
//
// Глобальные параметры. Устанавливаются при запуске программы
//
////////////////////////////////////////////////////////////////////////////////
// Обрати внимание на имена пинов у I2C здесь и в файле реализации!
// Они должны совпадать, инече не заработает сброс шины!
const PinDescriptor pin[] =
{
#ifdef __STM32F446__
//========================
// DO
//========================
// PLC stations.
// You do not change postions of this descrptors, because they are used for
// sturtup diagosnostics!
#if ( ( defined (__MEDSINTEZ__) || defined (__NUCLEO_F446RE__) ) )
{ "FAULT_LED", GPIOC, BIT_2, GPIO, OUTPUT, NO_PULL, PUSH_PULL, LOW_SPEED },
{ "STOP_LED", GPIOC, BIT_1, GPIO, OUTPUT, NO_PULL, PUSH_PULL, LOW_SPEED },
{ "RUN_LED", GPIOC, BIT_0, GPIO, OUTPUT, NO_PULL, PUSH_PULL, LOW_SPEED },
{ "RUN-STOP", GPIOC, BIT_3, GPIO, INPUT, PULL_DOWN, INPUT_PIN, LOW_SPEED },
#elif defined (__SK2N_002__)
{ "FAULT_LED", GPIOC, BIT_3, GPIO, OUTPUT, NO_PULL, PUSH_PULL, LOW_SPEED },
{ "STOP_LED", GPIOC, BIT_2, GPIO, OUTPUT, NO_PULL, PUSH_PULL, LOW_SPEED },
{ "RUN_LED", GPIOC, BIT_1, GPIO, OUTPUT, NO_PULL, PUSH_PULL, LOW_SPEED },
{ "RUN-STOP", GPIOC, BIT_0, GPIO, INPUT, PULL_DOWN, INPUT_PIN, LOW_SPEED },
#endif
//========================
{ "INIT", GPIOC, BIT_13, GPIO, INPUT, PULL_UP, INPUT_PIN, LOW_SPEED }, //
//
//========================
// Peripherias
//========================
// Console UART (connected to ST-Link on Discovery)
{ "TX2", GPIOA, BIT_2, AF07, ALTFUNC, PULL_UP, PUSH_PULL, HIGH_SPEED },
{ "RX2", GPIOA, BIT_3, AF07, ALTFUNC, PULL_UP, PUSH_PULL, HIGH_SPEED },
#if ( defined (__MEDSINTEZ__) || defined(__NUCLEO_F446RE__) )
//--------------------------------------------------------------------------
// UART1, EIA-485
{ "TX1", GPIOA, BIT_9, AF07, ALTFUNC, PULL_UP, PUSH_PULL, HIGH_SPEED },
{ "RX1", GPIOA, BIT_10, AF07, ALTFUNC, PULL_UP, PUSH_PULL, HIGH_SPEED },
#elif defined (__SK2N_002__)
//--------------------------------------------------------------------------
// UART3, EIA-485
{ "TX3", GPIOB, BIT_10, AF07, ALTFUNC, PULL_UP, PUSH_PULL, HIGH_SPEED },
{ "RX3", GPIOC, BIT_5, AF07, ALTFUNC, PULL_UP, PUSH_PULL, HIGH_SPEED },
//--------------------------------------------------------------------------
// UART1, EIA-422
{ "TX1", GPIOA, BIT_9, AF07, ALTFUNC, PULL_UP, PUSH_PULL, HIGH_SPEED },
{ "RX1", GPIOA, BIT_10, AF07, ALTFUNC, PULL_UP, PUSH_PULL, HIGH_SPEED },
{ "DIR1", GPIOA, BIT_11, AF07, ALTFUNC, PULL_UP, PUSH_PULL, HIGH_SPEED },
#endif
//------------------------------------------------------------------------------
// SPI2 (W5500)
{ "WIZ_MOSI", GPIOB, BIT_15, AF05, ALTFUNC, NO_PULL, PUSH_PULL, HIGH_SPEED },
{ "WIZ_MISO", GPIOB, BIT_14, AF05, ALTFUNC, NO_PULL, PUSH_PULL, HIGH_SPEED },
{ "WIZ_SCLK", GPIOB, BIT_13, AF05, ALTFUNC, NO_PULL, PUSH_PULL, HIGH_SPEED },
{ "WIZ_CS", GPIOB, BIT_12, GPIO, OUTPUT, NO_PULL, PUSH_PULL, HIGH_SPEED },
#if ( defined (__MEDSINTEZ__) || defined (__NUCLEO_F446RE__) )
{ "WIZ_RSTn", GPIOB, BIT_11, GPIO, OUTPUT, NO_PULL, PUSH_PULL, LOW_SPEED },
#elif defined (__SK2N_002__)
{ "WIZ_RSTn", GPIOC, BIT_6, GPIO, OUTPUT, NO_PULL, PUSH_PULL, LOW_SPEED },
#endif
//------------------------------------------------------------------------------
// SPI3 (W25Q)
{ "W25Q_MOSI", GPIOC, BIT_12, AF06, ALTFUNC, NO_PULL, PUSH_PULL, HIGH_SPEED }, // DI
{ "W25Q_MISO", GPIOC, BIT_11, AF06, ALTFUNC, NO_PULL, PUSH_PULL, HIGH_SPEED }, // DO
{ "W25Q_SCLK", GPIOC, BIT_10, AF06, ALTFUNC, NO_PULL, PUSH_PULL, HIGH_SPEED },
{ "W25Q_CS", GPIOA, BIT_15, GPIO, OUTPUT, PULL_UP, PUSH_PULL, HIGH_SPEED },
// bxCAN1
{ "bxCAN1-TX", GPIOB, BIT_9, AF09, ALTFUNC, NO_PULL, PUSH_PULL, HIGH_SPEED },
{ "bxCAN1-RX", GPIOB, BIT_8, AF09, ALTFUNC, PULL_UP, PUSH_PULL, HIGH_SPEED },
{ 0 } // the end of the map marker
#endif // __NUCLEO_F446RE__
};
Код: Выделить всё
class HW_Cnt32 : public HW_Timer_base, protected IRQ
{
....
protected:
virtual void IRQ_Handler( void );
......
};
Какая связь между вызовом обработчика прерывания как виртуального метода и стандартными библиотеками?VladislavS писал(а):Вот это совсем не нужно и даже вредно в случае линковки с какими-либо библиотеками написанными на Си. А это хоть те же стандартные библиотеки
Как раз наоборот, проще через виртуальный метод. Обработкой прерывания занимается тот объект, которому это нужно. В случае с extern "C" разрывается логическая связь между объектом и обработчиком. Ну и раз уж мы используем ООП, то не будем уподобляться Абраму Моисеевичу из известного анекдота и чётко определимся, что нам следует надеть, трусы или крестик.VladislavS писал(а):Куда проще обработчику прерывания добавить extern "C" и дёрнуть из него нужные методы класса.
Код: Выделить всё
void __attribute__((fast_interrupt)) UartRS485PC_InterruptHandler()
{
while(UART_RS485_PC::isDR()) control_if_rs485.ProcessByte(UART_RS485_PC::ReadByte());
}
void __attribute__((fast_interrupt)) UartUSB_InterruptHandler()
{
while(UART_USB::isDR()) control_if_usb.ProcessByte(UART_USB::ReadByte());
}
void __attribute__((fast_interrupt)) AXIS_FIFO_RX_InterruptHandler()
{
static int32_t occupancy = 0;
if(occupancy==0) occupancy = ETH_PORT::ReadRXFIFIOccupancy();
int32_t words2read = ETH_PORT::ReadReceiveLength() >> 2;
for(auto i=0u; i<words2read ; i++)
{
control_if_eth.ProcessWord(ETH_PORT::ReadWord());
}
occupancy -= words2read;
if (control_if_eth.isCommandReceived()) INTC::DisableInterrupt(AXIS_FIFO_RX_InterruptHandler_NUM);
if(occupancy==0) ETH_PORT::ClearRXCInterrupt();
}Код: Выделить всё
#ifndef BOARD_..._H
#define BOARD_..._H
#define CLKIN_XTAL 24000000 //[Hz] frequency of external main crystal or oscillator
#define CLKIN_OSCHP 1 //==1 - generator on XTAL1 (Direct Input Mode); ==0 - quartz on XTAL1/2 (Crystal Mode)
#define CLKIN_RTCX 32768 //[Hz] external frequency for RTC
//Allocation USIC-s
#define nUSIC_df 2, 1 //USIC/channel's number for SPI-FLASH
#define nUSIC_rf 0, 1 //USIC/channel's number for RF-unit
#define nUSIC_service 0, 0 //USIC/channel's number for log-UART
#define nUSIC_term 2, 0 //USIC/channel's number for UART of terminal
//Allocation CCU-timers/slices
#define nCCU_intmon 40, 0 //timer/slice numbers for monitoring of duration of interrupts bans (for debug)
#define nCCU_dac_trig 40, 1 //timer/slice numbers for trigger-signals for DAC
#define nCCU_dac_exe 40, 2 //timer/slice numbers for interrupt generation in middle/end of DMA-block of DAC
#define nCCU_adc_trig 41, 0 //timer/slice numbers for trigger-signals for ADC
#define nCCU_adc_res 41, 1 //timer/slice numbers
#define nCCU_buzzer 40, 3 //timer/slice numbers for buzzer
#define PIN_SERV_RX 1, 4 //RX nUSIC_service
#define PIN_SERV_TX 1, 5 //TX nUSIC_service
#define PIN_TERM_RX 5, 1 //RX nUSIC_term
#define PIN_TERM_TX 5, 0 //TX nUSIC_term
#define PIN_LED1 5, 9 //LED1; bool."1" - is lighting
#define PIN_LED2 3, 14 //LED2; bool."1" - is lighting
#define PIN_LED3 6, 0 //LED3; bool."1" - is lighting
#define PIN_BUZZER 0, 12 //==1 - buzzer enable
#define PIN_DAC_GEN 14, 8 //generator's output
#define PIN_DF_SCLK 4, 2 //SCLK for nUSIC_df
#define PIN_DF_MOSI 4, 7 //MOSI for nUSIC_df
#define PIN_DF_MISO 4, 6 //MISO for nUSIC_df
#define PIN_DF_CS 4, 3 //CS for N25Q032A on nUSIC_df
#define PIN_DF_WP 4, 5 //WP for N25Q032A
#define PIN_DF_HOLD 4, 4 //HOLD for N25Q032A
#define PIN_A_IN1 14, 0 //analog input 1
#define PIN_A_IN2 14, 1 //analog input 2
#define PIN_RF_SCLK 3, 0 //SCLK for nUSIC_rf
#define PIN_RF_MOSI 3, 13 //MOSI for nUSIC_rf
#define PIN_RF_MISO 4, 0 //MISO for nUSIC_rf
#define PIN_RF_CS 3, 1 //CS for RF-unit
#define PIN_RF_RST 3, 12 //NRESET for RF-unit; active - bool.0, >=100mcs, >=5ms - startup time
#define PIN_RF_BOOST 0, 13 //BOOST switch control
#define PIN_RF_LF 0, 14 //antenna switch control LF
#define PIN_RF_HF 0, 15 //antenna switch control HF
#define PIN_DIAG 2, 2 //thermal protection input from generator
//Allocation ADC-inputs (group, channel)
#define nADC_in1 0, 0 //analog input 1
#define nADC_in2 0, 1 //analog input 2
//Allocation GPDMA lines (DMALINEx_...) for DLR. Channels are allocated similarly.
#define nDMALINE_dac 1
#define nDMALINE_df_RX 8
#define nDMALINE_df_TX 9
//Allocation of Service Requests for all CCUs. Each element also needs to be added to the list CHK_SRCCU!
#define nCCU_SR_intmon 0, nCCU_intmon //SR for nCCU_intmon
#define nCCU_SR_dac_trig 1, nCCU_dac_trig //SR for DAC-triggering
#define nCCU_SR_dac_exe 2, nCCU_dac_exe //SR generating an interrupt in middle/end of a block of samples transmitted to the DAC
#define nCCU_SR_adc_trig 2, nCCU_adc_trig //SR for ADC-triggering
#define nCCU_SR_adc_res 1, nCCU_adc_res //SR reading result from ADC
#define nCCU_SR_buzzer 3, nCCU_buzzer //SR interrupt for buzzer control
//Allocation of Service Requests for all USICs. Each element also needs to be added to the list CHK_SRUSIC!
#define nUSIC_SR_serv_RX 3, nUSIC_service
#define nUSIC_SR_serv_TX 4, nUSIC_service
#define nUSIC_SR_serv_ERR 5, nUSIC_service
#define nUSIC_SR_term_RX 3, nUSIC_term
#define nUSIC_SR_term_TX 4, nUSIC_term
#define nUSIC_SR_term_ERR 5, nUSIC_term
#define nUSIC_SR_df_RX 0, nUSIC_df
#define nUSIC_SR_df_TX 1, nUSIC_df
#define nUSIC_SR_df_ERR 2, nUSIC_df
#define nUSIC_SR_rf_RX 0, nUSIC_rf
#define nUSIC_SR_rf_ERR 1, nUSIC_rf
#endifУродство же! Не хватало еще стартап на асме, бэкенд на С, а фронтенд на С++…Чем ассемблерный стартап не подходит?