Главная › Форумы › Программирование микроконтроллеров › Программирование МК STM32
Помечено: STM32
- В этой теме 168 ответов, 99 участников, последнее обновление 4 месяца, 1 неделя назад сделано
Sanekfps2024.
-
АвторСообщения
-
Июнь 15, 2020 в 6:14 дп #21728
dionos
УчастникДоброго время суток. Помогите найти ошибку. Пытаюсь настроить ultrasonic us100 на stm32f103c8t6 на TIM4 CH1 на OnePulse Mode с последующем переключением на Input Capture Mode.
RCC APB1 APB2 настроины на 48 Mhz
Сброс настроек таймера и установка его на One pulse Mode:
5 us пульс для запуска ultrasonic
void TIM4_OnePulsModeInit()
{
RCC->APB2ENR |= RCC_APB2ENR_IOPBEN;
RCC->APB1ENR |= RCC_APB1ENR_TIM4EN;TIM4->CR1 &= ~TIM_CR1_CEN;
//Setup GPIO B6 as Alt func
GPIOB->CRL &= ~(GPIO_CRL_CNF6 | GPIO_CRL_MODE6); // Reset GPIO StateGPIOB->CRL |= GPIO_CRL_MODE6_0 | GPIO_CRL_MODE6_1 | GPIO_CRL_CNF6_1;
GPIOB->CRL &= ~(GPIO_CRL_CNF6_0);//Init Timer 40 Hz
TIM4->PSC = (uint32_t)((SystemCoreClock/1000000)-1); //48-1
TIM4->ARR = 25000; // 0,025sec(period)
CLEAR_REG(TIM4->CR1);
CLEAR_REG(TIM4->CCER);
CLEAR_REG(TIM4->EGR);
CLEAR_REG(TIM4->CCMR1);TIM4->CR1 |= /*TIM_CR1_URS | */ TIM_CR1_OPM | TIM_CR1_ARPE; // Enable Update request source, One-pulse mode, Auto-reload preload enable
TIM4->CCER |= TIM_CCER_CC1E; // Channel 1, CC1 channel configured as output
TIM4->EGR |= TIM_EGR_UG; // Enable Update generationTIM4->CCMR1 |= (TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_2); //Enable Output compare 1 mode
TIM4->CCMR1 |= (TIM_CCMR1_OC1PE); //Output compare 1 preload enable
TIM4->CCR1 = 5000;
TIM4->CR1 |= TIM_CR1_CEN;
}Сбос настроек таймена и установка его на Input Capture Mode
void Tim4_InputCaptureModeInit()
{
RCC->APB2ENR |= RCC_APB2ENR_IOPBEN;
RCC->APB1ENR |= RCC_APB1ENR_TIM4EN;TIM4->CR1 &= ~TIM_CR1_CEN;
//Setup GPIO B6 Input floating
GPIOB->CRL &= ~(GPIO_CRL_CNF6 | GPIO_CRL_MODE6); // Reset GPIO StateGPIOB->CRL |= GPIO_CRL_CNF6_0;
//GPIOB->CRL &= ~(GPIO_CRL_CNF6_0);CLEAR_REG(TIM4->CR1);
CLEAR_REG(TIM4->CCER);
CLEAR_REG(TIM4->EGR);
CLEAR_REG(TIM4->CCMR1);//Init Timer 40 Hz
TIM4->PSC = (uint32_t)((SystemCoreClock/1000000)-1); //48-1
TIM4->ARR = 25000; // 0,025sec(period)TIM4->CR1 |= TIM_CR1_URS;
TIM4->CCMR1 |= TIM_CCMR1_CC1S_0; //CC1 channel is configured as input, IC1 is mapped on TI1
TIM4->CCER |= TIM_CCER_CC1P; //1: inverted: capture is done on a falling edge of IC1
TIM4->CCMR1 &= ~ TIM_CCMR1_IC1PSC;
TIM4->CCER |= TIM_CCER_CC1E; //Enable capture from the counter into the capture register by setting the CC1ETIM4->CR1 |= TIM_CR1_CEN;
}void main()
{
…
while(1)
{
TIM4_OnePulsModeInit();
while((TIM4->SR & TIM_SR_UIF) != TIM_SR_UIF);
TIM4->SR &= ~TIM_SR_UIF;Tim4_InputCaptureModeInit();
while((TIM4->SR & TIM_SR_UIF) != TIM_SR_UIF);
TIM4->SR &= ~TIM_SR_UIF;TIM4->SR &= ~TIM_SR_CC1IF;
TIM4->SR &= ~TIM_SR_CC1OF;
pulse = TIM4->CCR1;len = (uint32_t)((pulse * 331 / 2) / 1000);
…
}
}но pulse(TIM4->CCR1) переменная постоянно имеет значение 5000, которое было установлено в TIM4_OnePulsModeInit.
Июнь 23, 2020 в 7:35 пп #21807A-Soft
УчастникУважаемый Админ, у меня 2 вопроса:
1. Как удалить дубликат Вашей статьи, в котором я указан автором?
2. Будут ли еще уроки по STM32 Assembler или больше не ждать?Июнь 24, 2020 в 5:34 дп #21808Narod Stream
ХранительA-Soft, Здравствуйте!
1. Удалил.
2. Думаю, что будут, по крайней мере, у меня нереализованных проектов по данной теме много, в том числе и работа на аппаратном уровне с плавающей точкой, понятное дело, что уже в линейке M4.-
Ответ изменён 4 года, 2 месяца назад пользователем
Narod Stream.
Июнь 27, 2020 в 6:17 пп #21812A-Soft
УчастникЗдравствуйте, Narod Stream!
Ну что ж, ждём продолжения.
Хочу ВСЁ писать на ассемблере, а не только вставки в С/С++ код. Но пока много чего не понимаю.
Недавно я стал работать с M4 — вообще «в ёлочку» будет.
С Уважением, A-Soft.Июнь 29, 2020 в 4:08 дп #21818OttoDietrich
УчастникЗдравствуйте. У вас есть презентация вашей STM32H745I https://www.youtube.com/watch?v=pNPlW9wyo98
Будут ли уроки связанные с ней ?
Июнь 30, 2020 в 1:16 пп #21887admira1
УчастникЗдравствуйте, уже второй месяц пошел а я так и не продвинулся в написании программы, ethernet to uart. По порядку
Приобрел для проекта отладочную плату nucleo h743zi2 на плате присутствует физика lan 8742.
И начал писать программу, до этого с ethernet на stm32 не сталкивался.
Проблема заключается в следующем. В H7 микроконтроллерах, нужно включить кэш данных и кэш инструкций, настроить MPU. Далее включил ethernet с протоколом общения физики и камня RMII, далее включаю lwip. Отключаю динамическую адресацию, вписываю настройки сетки. Ну и настраиваю все rcc и увиличиваю стэк и кучу и тд. Далее генерирую код, и настраиваю кейл, в кейле во вкладке опции для цели — цели снимаю галку на Iram1 оставляю галку Iram2(ЭТО КАК Я ПОНЯЛ НУЖНО ЧТОБЫ ETHERNET И DMA МОГЛИ ДРУЖИТЬ). Далее в main прописываю структуру gnetif и в бесконечном цикле делаю MX_process(), компилирую все это дело, пингую и ничего(заданый узел недоступен)(пробовал как в ваших видео тоже не работает). Далее проверяю есть ли подключение, (netif_is_up), вывел светодиодики(на плате user led) когда вытаскиваю кабель ehernet (все меняться светодиодик тухнет другой загорается), т.е. физику микроконтроллер видит. Не понимаю в чем может быть проблема, все делаю по инструкции написанной самим STM а оно не работает.2) закупил такой же комплект как у вас в уроках stm disko f407 и waveshare lan8720 все сделал по вашему уроку (помоему 89), и опять проверяем работу физики и мк, пробуем пингануть плату получаем (заданый узел недоступен).
Кароче очень сильно устал перерыл весь интернет, помогите пожалуйста разобраться…Июль 25, 2020 в 12:07 пп #22003A-Soft
УчастникЗдравствуйте, NarodStream!
Очень интересен такой момент — как программировать STM32 на с++?
А именно связка CubeMX -> Keil -> c++
Как-то так чтобы потом можно было и в кубе редактировать.
Надо не столько синтаксис c++, сколько сам рабочий проект (мигание светика) и как им пользоваться.Сентябрь 27, 2020 в 2:00 пп #22173pvg_79
УчастникЛюди как создать новую тему?
Интересует I2C Slave на библиотеке HAL, у меня ничего не получается.Сентябрь 30, 2020 в 2:53 пп #22174Oleg Nicolaiciuc
УчастникВсем привет!
Извените если не в тему вопрос! Не решал ли кто нибудь задачу вывода изображения на TFT дисплей? Какой из стандартных графических форматов (*.pic, *.pcx, *.jpg, *.bmp …) наиболее просто преобразуется в линейную последовательность пикселей в условиях дефицита оперативной памяти. Может быть существуют какие либо библиотеки или кто нибудь может поделиться исходниками? Приветствуются любые идеи!Ноябрь 13, 2020 в 9:16 дп #22247Ilfat
УчастникЗдравствуйте не могу пропинговать контроллер(Stm32f7Discovery) когда запущена инициализация GUI, не подскажете в чем может быть проблема(без GUI_Init() пингуется)?
Ноябрь 17, 2020 в 5:30 дп #22252RedOrm
УчастникПробую написать программу на STM32 используя HAL библиотеки. В программе инициализируются три таймера номер 3 (TIM3), номер 5 (TIM5), номер 2 (TIM2).
TIM3 тактируется от внутреннего источника (от шины), работает в режиме ШИМ и формирует на выходе меандр с частотой 1,2 МГц.
TIM5 тактируется от TIM3, работает в режиме ШИМ.
TIM2 тактируется от TIM3, работает в режиме сравнения.Как хотелось бы чтобы работало:
Таймеры запускаются одновременно. Разрешается прерывание по TIM2 по значению Pulse в STM32CubeMX. TIM2 отсчитывает интервал времени в течение которого TIM5 сформирует на выходе два импульса ШИМ с заданной частотой и заполнением. Когда TIM2 досчитывает до конца временного интервала (значение Pulse в STM32CubeMX), формируется прерывание.
В обработчике прерывания меняется заполнение импульсов, которые формирует TIM5. Запрещается прерывание TIM2 по значению Pulse и разрешается прерывание TIM2 по переполнению.
Далее таймеры продолжают считать. TIM5 формирует один импульс с измененным заполнением и возникает переполнение по переполнению TIM2.
В обработчике прерывания меняется заполнение импульсов, которые формирует TIM5, на изначальное значение. Запрещается прерывание TIM2 по переполнению, разрешается прерывание TIM2 по значению Pulse.
И так по кругу… TIM5 на выходе должен формировать последовательность импульсов: два с одинаковым заполнением, один с меньшим, опять два с одинаковым, опять один с меньшим и т.д.
Написал такой код main.c:
1234567891011121314151617MX_GPIO_Init();MX_TIM3_Init();MX_TIM2_Init();MX_TIM5_Init();HAL_TIM_PWM_Start (&htim2, TIM_CHANNEL_1);HAL_TIM_PWM_Start (&htim2, TIM_CHANNEL_2);HAL_TIM_OC_Start_IT(&htim2, TIM_CHANNEL_3);HAL_TIM_PWM_Start (&htim5, TIM_CHANNEL_1);HAL_TIM_PWM_Start (&htim3, TIM_CHANNEL_1);while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}Обработка прерываний такая:
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849void HAL_TIM_OC_DelayElapsedCallback (TIM_HandleTypeDef *htim){if (htim->Instance == TIM2){if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_3){HAL_TIM_PWM_Stop (&htim3, TIM_CHANNEL_1);HAL_TIM_PWM_Stop (&htim2, TIM_CHANNEL_1);HAL_TIM_PWM_Stop (&htim2, TIM_CHANNEL_2);HAL_TIM_OC_Stop_IT (&htim2, TIM_CHANNEL_3);HAL_TIM_PWM_Stop (&htim5, TIM_CHANNEL_1);TIM5->CCR1 = 4;__HAL_TIM_ENABLE_IT(&htim2, TIM_IT_UPDATE);HAL_TIM_PWM_Start (&htim2, TIM_CHANNEL_1);HAL_TIM_PWM_Start (&htim2, TIM_CHANNEL_2);HAL_TIM_OC_Start (&htim2, TIM_CHANNEL_3);HAL_TIM_PWM_Start (&htim5, TIM_CHANNEL_1);HAL_TIM_PWM_Start (&htim3, TIM_CHANNEL_1);}elsereturn;}}//---Прерывание по переполнению счетчика-------------------------------void HAL_TIM_PeriodElapsedCallback (TIM_HandleTypeDef *htim){if(htim->Instance == TIM2){HAL_TIM_PWM_Stop (&htim3, TIM_CHANNEL_1);HAL_TIM_PWM_Stop (&htim2, TIM_CHANNEL_1);HAL_TIM_PWM_Stop (&htim2, TIM_CHANNEL_2);HAL_TIM_OC_Stop (&htim2, TIM_CHANNEL_3);HAL_TIM_PWM_Stop (&htim5, TIM_CHANNEL_1);__HAL_TIM_DISABLE_IT (&htim2, TIM_IT_UPDATE );TIM5->CCR1 = 3;HAL_TIM_PWM_Start (&htim2, TIM_CHANNEL_1);HAL_TIM_PWM_Start (&htim2, TIM_CHANNEL_2);HAL_TIM_OC_Start_IT(&htim2, TIM_CHANNEL_3);HAL_TIM_PWM_Start (&htim5, TIM_CHANNEL_1);HAL_TIM_PWM_Start (&htim3, TIM_CHANNEL_1);}else return;}Начинаю отлаживать. Пробую сначала работу без второго обработчика прерывания. Вижу следующую картину
Ноябрь 30, 2020 в 10:11 дп #22278Alojs82
УчастникДобрый день,
Я программирую STM32 какое-то время. Пожалуйста, сделал ли кто-нибудь связь по протоколу MODBUS TCP / IP.
Я хотел бы сделать преобразователь данных из STM32 (например, температуры и входов / выходов) в ПЛК Siemens.
Это о том, как происходило общение в STM32.Я купил комплект DISCOVERY_F767ZI с портом Ethernet (LAN8742A-CZ-)
Спасибо.
Декабрь 13, 2020 в 10:48 дп #22279Chirila Constantin
УчастникДобрый день.
Сайт Keil не работает, подскажите, пожалуйста, где найти инсталяцию MDK ARM STM 32 version 5, хщчу начать заниматься STM32, так занимаюсь AVR — ами.
Февраль 22, 2021 в 3:09 пп #22319diegoarmanda
УчастникЗдравствуйте! Хотелось бы увидеть от вас уроки по настройке GPS с STM32
Март 7, 2021 в 7:27 пп #22325Vladimir4444
УчастникЕсть силовая часть для BLDC в сборе на транзисторах gp10nc60kd и ir2106s
Мотор на 100 вольт 2000 ватт BLDC на постоянных магнитах от стиральной машинки LG а так же, есть STM32F103. Помогите найти прошивку чтобы сделать контроллер.
С моей стороны, посильная помощь. Очень прошу! Хочу запустить этот мотор для собственныз нужд. А знаний по программированию абсолютно ноль. -
Ответ изменён 4 года, 2 месяца назад пользователем
-
АвторСообщения
-
АвторСообщения
-
Доброго время суток. Помогите найти ошибку. Пытаюсь настроить ultrasonic us100 на stm32f103c8t6 на TIM4 CH1 на OnePulse Mode с последующем переключением на Input Capture Mode.
RCC APB1 APB2 настроины на 48 Mhz
Сброс настроек таймера и установка его на One pulse Mode:
5 us пульс для запуска ultrasonic
void TIM4_OnePulsModeInit()
{
RCC->APB2ENR |= RCC_APB2ENR_IOPBEN;
RCC->APB1ENR |= RCC_APB1ENR_TIM4EN;TIM4->CR1 &= ~TIM_CR1_CEN;
//Setup GPIO B6 as Alt func
GPIOB->CRL &= ~(GPIO_CRL_CNF6 | GPIO_CRL_MODE6); // Reset GPIO StateGPIOB->CRL |= GPIO_CRL_MODE6_0 | GPIO_CRL_MODE6_1 | GPIO_CRL_CNF6_1;
GPIOB->CRL &= ~(GPIO_CRL_CNF6_0);//Init Timer 40 Hz
TIM4->PSC = (uint32_t)((SystemCoreClock/1000000)-1); //48-1
TIM4->ARR = 25000; // 0,025sec(period)
CLEAR_REG(TIM4->CR1);
CLEAR_REG(TIM4->CCER);
CLEAR_REG(TIM4->EGR);
CLEAR_REG(TIM4->CCMR1);TIM4->CR1 |= /*TIM_CR1_URS | */ TIM_CR1_OPM | TIM_CR1_ARPE; // Enable Update request source, One-pulse mode, Auto-reload preload enable
TIM4->CCER |= TIM_CCER_CC1E; // Channel 1, CC1 channel configured as output
TIM4->EGR |= TIM_EGR_UG; // Enable Update generationTIM4->CCMR1 |= (TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_2); //Enable Output compare 1 mode
TIM4->CCMR1 |= (TIM_CCMR1_OC1PE); //Output compare 1 preload enable
TIM4->CCR1 = 5000;
TIM4->CR1 |= TIM_CR1_CEN;
}Сбос настроек таймена и установка его на Input Capture Mode
void Tim4_InputCaptureModeInit()
{
RCC->APB2ENR |= RCC_APB2ENR_IOPBEN;
RCC->APB1ENR |= RCC_APB1ENR_TIM4EN;TIM4->CR1 &= ~TIM_CR1_CEN;
//Setup GPIO B6 Input floating
GPIOB->CRL &= ~(GPIO_CRL_CNF6 | GPIO_CRL_MODE6); // Reset GPIO StateGPIOB->CRL |= GPIO_CRL_CNF6_0;
//GPIOB->CRL &= ~(GPIO_CRL_CNF6_0);CLEAR_REG(TIM4->CR1);
CLEAR_REG(TIM4->CCER);
CLEAR_REG(TIM4->EGR);
CLEAR_REG(TIM4->CCMR1);//Init Timer 40 Hz
TIM4->PSC = (uint32_t)((SystemCoreClock/1000000)-1); //48-1
TIM4->ARR = 25000; // 0,025sec(period)TIM4->CR1 |= TIM_CR1_URS;
TIM4->CCMR1 |= TIM_CCMR1_CC1S_0; //CC1 channel is configured as input, IC1 is mapped on TI1
TIM4->CCER |= TIM_CCER_CC1P; //1: inverted: capture is done on a falling edge of IC1
TIM4->CCMR1 &= ~ TIM_CCMR1_IC1PSC;
TIM4->CCER |= TIM_CCER_CC1E; //Enable capture from the counter into the capture register by setting the CC1ETIM4->CR1 |= TIM_CR1_CEN;
}void main()
{
…
while(1)
{
TIM4_OnePulsModeInit();
while((TIM4->SR & TIM_SR_UIF) != TIM_SR_UIF);
TIM4->SR &= ~TIM_SR_UIF;Tim4_InputCaptureModeInit();
while((TIM4->SR & TIM_SR_UIF) != TIM_SR_UIF);
TIM4->SR &= ~TIM_SR_UIF;TIM4->SR &= ~TIM_SR_CC1IF;
TIM4->SR &= ~TIM_SR_CC1OF;
pulse = TIM4->CCR1;len = (uint32_t)((pulse * 331 / 2) / 1000);
…
}
}но pulse(TIM4->CCR1) переменная постоянно имеет значение 5000, которое было установлено в TIM4_OnePulsModeInit.
Уважаемый Админ, у меня 2 вопроса:
1. Как удалить дубликат Вашей статьи, в котором я указан автором?
2. Будут ли еще уроки по STM32 Assembler или больше не ждать?A-Soft, Здравствуйте!
1. Удалил.
2. Думаю, что будут, по крайней мере, у меня нереализованных проектов по данной теме много, в том числе и работа на аппаратном уровне с плавающей точкой, понятное дело, что уже в линейке M4.-
Ответ изменён 4 года, 2 месяца назад пользователем
Narod Stream.
Здравствуйте, Narod Stream!
Ну что ж, ждём продолжения.
Хочу ВСЁ писать на ассемблере, а не только вставки в С/С++ код. Но пока много чего не понимаю.
Недавно я стал работать с M4 — вообще «в ёлочку» будет.
С Уважением, A-Soft.Здравствуйте. У вас есть презентация вашей STM32H745I https://www.youtube.com/watch?v=pNPlW9wyo98
Будут ли уроки связанные с ней ?
Здравствуйте, уже второй месяц пошел а я так и не продвинулся в написании программы, ethernet to uart. По порядку
Приобрел для проекта отладочную плату nucleo h743zi2 на плате присутствует физика lan 8742.
И начал писать программу, до этого с ethernet на stm32 не сталкивался.
Проблема заключается в следующем. В H7 микроконтроллерах, нужно включить кэш данных и кэш инструкций, настроить MPU. Далее включил ethernet с протоколом общения физики и камня RMII, далее включаю lwip. Отключаю динамическую адресацию, вписываю настройки сетки. Ну и настраиваю все rcc и увиличиваю стэк и кучу и тд. Далее генерирую код, и настраиваю кейл, в кейле во вкладке опции для цели — цели снимаю галку на Iram1 оставляю галку Iram2(ЭТО КАК Я ПОНЯЛ НУЖНО ЧТОБЫ ETHERNET И DMA МОГЛИ ДРУЖИТЬ). Далее в main прописываю структуру gnetif и в бесконечном цикле делаю MX_process(), компилирую все это дело, пингую и ничего(заданый узел недоступен)(пробовал как в ваших видео тоже не работает). Далее проверяю есть ли подключение, (netif_is_up), вывел светодиодики(на плате user led) когда вытаскиваю кабель ehernet (все меняться светодиодик тухнет другой загорается), т.е. физику микроконтроллер видит. Не понимаю в чем может быть проблема, все делаю по инструкции написанной самим STM а оно не работает.2) закупил такой же комплект как у вас в уроках stm disko f407 и waveshare lan8720 все сделал по вашему уроку (помоему 89), и опять проверяем работу физики и мк, пробуем пингануть плату получаем (заданый узел недоступен).
Кароче очень сильно устал перерыл весь интернет, помогите пожалуйста разобраться…Здравствуйте, NarodStream!
Очень интересен такой момент — как программировать STM32 на с++?
А именно связка CubeMX -> Keil -> c++
Как-то так чтобы потом можно было и в кубе редактировать.
Надо не столько синтаксис c++, сколько сам рабочий проект (мигание светика) и как им пользоваться.Люди как создать новую тему?
Интересует I2C Slave на библиотеке HAL, у меня ничего не получается.Всем привет!
Извените если не в тему вопрос! Не решал ли кто нибудь задачу вывода изображения на TFT дисплей? Какой из стандартных графических форматов (*.pic, *.pcx, *.jpg, *.bmp …) наиболее просто преобразуется в линейную последовательность пикселей в условиях дефицита оперативной памяти. Может быть существуют какие либо библиотеки или кто нибудь может поделиться исходниками? Приветствуются любые идеи!Здравствуйте не могу пропинговать контроллер(Stm32f7Discovery) когда запущена инициализация GUI, не подскажете в чем может быть проблема(без GUI_Init() пингуется)?
Пробую написать программу на STM32 используя HAL библиотеки. В программе инициализируются три таймера номер 3 (TIM3), номер 5 (TIM5), номер 2 (TIM2).
TIM3 тактируется от внутреннего источника (от шины), работает в режиме ШИМ и формирует на выходе меандр с частотой 1,2 МГц.
TIM5 тактируется от TIM3, работает в режиме ШИМ.
TIM2 тактируется от TIM3, работает в режиме сравнения.Как хотелось бы чтобы работало:
Таймеры запускаются одновременно. Разрешается прерывание по TIM2 по значению Pulse в STM32CubeMX. TIM2 отсчитывает интервал времени в течение которого TIM5 сформирует на выходе два импульса ШИМ с заданной частотой и заполнением. Когда TIM2 досчитывает до конца временного интервала (значение Pulse в STM32CubeMX), формируется прерывание.
В обработчике прерывания меняется заполнение импульсов, которые формирует TIM5. Запрещается прерывание TIM2 по значению Pulse и разрешается прерывание TIM2 по переполнению.
Далее таймеры продолжают считать. TIM5 формирует один импульс с измененным заполнением и возникает переполнение по переполнению TIM2.
В обработчике прерывания меняется заполнение импульсов, которые формирует TIM5, на изначальное значение. Запрещается прерывание TIM2 по переполнению, разрешается прерывание TIM2 по значению Pulse.
И так по кругу… TIM5 на выходе должен формировать последовательность импульсов: два с одинаковым заполнением, один с меньшим, опять два с одинаковым, опять один с меньшим и т.д.
Написал такой код main.c:
1234567891011121314151617MX_GPIO_Init();MX_TIM3_Init();MX_TIM2_Init();MX_TIM5_Init();HAL_TIM_PWM_Start (&htim2, TIM_CHANNEL_1);HAL_TIM_PWM_Start (&htim2, TIM_CHANNEL_2);HAL_TIM_OC_Start_IT(&htim2, TIM_CHANNEL_3);HAL_TIM_PWM_Start (&htim5, TIM_CHANNEL_1);HAL_TIM_PWM_Start (&htim3, TIM_CHANNEL_1);while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}Обработка прерываний такая:
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849void HAL_TIM_OC_DelayElapsedCallback (TIM_HandleTypeDef *htim){if (htim->Instance == TIM2){if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_3){HAL_TIM_PWM_Stop (&htim3, TIM_CHANNEL_1);HAL_TIM_PWM_Stop (&htim2, TIM_CHANNEL_1);HAL_TIM_PWM_Stop (&htim2, TIM_CHANNEL_2);HAL_TIM_OC_Stop_IT (&htim2, TIM_CHANNEL_3);HAL_TIM_PWM_Stop (&htim5, TIM_CHANNEL_1);TIM5->CCR1 = 4;__HAL_TIM_ENABLE_IT(&htim2, TIM_IT_UPDATE);HAL_TIM_PWM_Start (&htim2, TIM_CHANNEL_1);HAL_TIM_PWM_Start (&htim2, TIM_CHANNEL_2);HAL_TIM_OC_Start (&htim2, TIM_CHANNEL_3);HAL_TIM_PWM_Start (&htim5, TIM_CHANNEL_1);HAL_TIM_PWM_Start (&htim3, TIM_CHANNEL_1);}elsereturn;}}//---Прерывание по переполнению счетчика-------------------------------void HAL_TIM_PeriodElapsedCallback (TIM_HandleTypeDef *htim){if(htim->Instance == TIM2){HAL_TIM_PWM_Stop (&htim3, TIM_CHANNEL_1);HAL_TIM_PWM_Stop (&htim2, TIM_CHANNEL_1);HAL_TIM_PWM_Stop (&htim2, TIM_CHANNEL_2);HAL_TIM_OC_Stop (&htim2, TIM_CHANNEL_3);HAL_TIM_PWM_Stop (&htim5, TIM_CHANNEL_1);__HAL_TIM_DISABLE_IT (&htim2, TIM_IT_UPDATE );TIM5->CCR1 = 3;HAL_TIM_PWM_Start (&htim2, TIM_CHANNEL_1);HAL_TIM_PWM_Start (&htim2, TIM_CHANNEL_2);HAL_TIM_OC_Start_IT(&htim2, TIM_CHANNEL_3);HAL_TIM_PWM_Start (&htim5, TIM_CHANNEL_1);HAL_TIM_PWM_Start (&htim3, TIM_CHANNEL_1);}else return;}Начинаю отлаживать. Пробую сначала работу без второго обработчика прерывания. Вижу следующую картину
Добрый день,
Я программирую STM32 какое-то время. Пожалуйста, сделал ли кто-нибудь связь по протоколу MODBUS TCP / IP.
Я хотел бы сделать преобразователь данных из STM32 (например, температуры и входов / выходов) в ПЛК Siemens.
Это о том, как происходило общение в STM32.Я купил комплект DISCOVERY_F767ZI с портом Ethernet (LAN8742A-CZ-)
Спасибо.
Добрый день.
Сайт Keil не работает, подскажите, пожалуйста, где найти инсталяцию MDK ARM STM 32 version 5, хщчу начать заниматься STM32, так занимаюсь AVR — ами.
Здравствуйте! Хотелось бы увидеть от вас уроки по настройке GPS с STM32
Есть силовая часть для BLDC в сборе на транзисторах gp10nc60kd и ir2106s
Мотор на 100 вольт 2000 ватт BLDC на постоянных магнитах от стиральной машинки LG а так же, есть STM32F103. Помогите найти прошивку чтобы сделать контроллер.
С моей стороны, посильная помощь. Очень прошу! Хочу запустить этот мотор для собственныз нужд. А знаний по программированию абсолютно ноль. -
Ответ изменён 4 года, 2 месяца назад пользователем
-
АвторСообщения
- Для ответа в этой теме необходимо авторизоваться.