Jump to content
karomag

Динамическая индикация STM32

Recommended Posts

Помогите! Не пойму, почему не работает код. Хотя он был рабочий, пока я что-то не "оптимизировал"...

// Общие выводы индикатора
#define D0 GPIO_Pin_14
#define D1 GPIO_Pin_13
#define D2 GPIO_Pin_12
#define ALL_CATOD ( D0 | D1 | D2 )

// К какой ноге какой сегмент подключен
#define SEG_A GPIO_Pin_0
#define SEG_B GPIO_Pin_1
#define SEG_C GPIO_Pin_2
#define SEG_D GPIO_Pin_3
#define SEG_E GPIO_Pin_4
#define SEG_F GPIO_Pin_5
#define SEG_G GPIO_Pin_6

//Собираем цифры из сегментов
#define DIG0 ( SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F )
#define DIG1 ( SEG_B | SEG_C )
#define DIG2 ( SEG_A | SEG_B | SEG_G | SEG_E | SEG_D )
#define DIG3 ( SEG_A | SEG_B | SEG_G | SEG_C | SEG_D )
#define DIG4 ( SEG_F | SEG_G | SEG_B | SEG_C)
#define DIG5 ( SEG_A | SEG_F | SEG_G | SEG_C | SEG_D )
#define DIG6 ( SEG_A | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G )
#define DIG7 ( SEG_A | SEG_B | SEG_C )
#define DIG8 ( SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G)
#define DIG9 ( SEG_A | SEG_B | SEG_C | SEG_D | SEG_F | SEG_G)
#define ALL_SEG (DIG8 )

void GPIO_Configuration(void)
{
   GPIO_InitTypeDef GPIO_InitStructure;
   /* GPIOA Configuration:TIM3 Channel1, 2, 3 and 4 as alternate function push-pull */
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
   GPIO_Init(GPIOB, &GPIO_InitStructure);

   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
   GPIO_InitStructure.GPIO_Pin = ALL_SEG | ALL_CATOD;
   GPIO_Init(GPIOA, &GPIO_InitStructure);

}

void show_temp(void) {

   u16 tmp; // Содержит копию counter (из него по очереди исключаются последние цифры)
   u8 digit; // В эту переменную поочередно записываются цифры из которых состоит число counter
   u16 catods[] = { D0, D1, D2 };
   u8 digitsp[] = { DIG0, DIG1, DIG2, DIG3, DIG4, DIG5, DIG6, DIG7, DIG8,   DIG9 };
   u8 i;

   tmp = measureT;

   for (i = 0; i < 3; i++) {
      if (tmp > 0) {
         //Вытаскиваем первую справа цифру из числа counter
         digit = tmp % 10;
         tmp = tmp / 10;
         //Выключаем все разряды. 1 на катоды
         GPIOA->ODR |= ALL_CATOD;
         //Включаем i разряд индикатора
         GPIOA->ODR &= ~catods[i];
         //Выводим цифру в i разряд
         GPIOA->ODR &= ~DIG8; //Выключаем все сегменты
         GPIOA->ODR |= digitsp[digit]; //Зажигаем нужные
         //Небольшая задержка. Пусть цифра погорит некоторое время
         delay_ms(1000);
      }
   }
}

Большую задержку поставил, чтобы глазом было видно результат. Число 123 отображается: сначало 33, потом 22, потом 111. Почему загорается несколько разрядов, хотя GPIOA->ODR &= ~catods;?

Share this post


Link to post
Share on other sites
2 минуты назад, karomag сказал:

пока я что-то не "оптимизировал"...

А что это "что-то" ? Или мы должны догадаться ?

Share this post


Link to post
Share on other sites
Только что, Alex сказал:

А что это "что-то" ? Или мы должны догадаться ?

Да, я не пойму сам. Был проект, в котором я учился выводить на индикатор произвольные числа - работал. Перенес код в другой проект не работает, загружаю предыдущий тоже нет...

Share this post


Link to post
Share on other sites

Приглашаем на вебинар «Новинки и уникальные решения Molex. На что обратить внимание и почему»

15 апреля приглашаем на вебинар, который будет интересен разработчикам и инженерам-схемотехникам, интересующимся тенденциями рынка, новыми перспективными решениями для соединений «провод-провод», «провод-плата», «плата-плата». Для инженеров КИПиА и IT будут освещены уникальные решения Molex для «удлинения» интерфейсов HDMI, DisplayPort и USB даже в условиях сильного зашумления, а также семейство бесконтактных датчиков Contrinex. Помимо этого, будет уделено внимание дальнейшему развитию направления антенн, где Molex имеет ряд интересных и уникальных решений.

Подробнее

Я наверное, никогда в своей жизни не узнаю почему я потратил пол дня на эту проблему... Сейчас, в порыве отчаяние "перекинул" общие катода с того же порта А на порт С:

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Pin = ALL_SEG;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = ALL_CATOD;
    GPIO_Init(GPIOC, &GPIO_InitStructure);

И о чудо ЗАРАБОТАЛО! Но как такое может происходить... Может быть это связано с какими-то альтернативными функциями ног? Хотя ШИМ и АЦП у меня запущен на порте В.

Share this post


Link to post
Share on other sites

Схема? Катоды управляются полевиками? Может, порт работает только в одну сторону, отключаясь оставляет заряд на полевике и тот держит ток...

И вообще, не нравятся мне такое краткие записи логических преобразований, неужели их нельзя развернуть по-нормальному, чтобы было видно что происходит?


Учение - изучение правил. Опыт - изучение исключений.

Share this post


Link to post
Share on other sites
                     

Как снизить потери при включении силового ключа: простая схема управления скоростью нарастания

Снижение потерь на переключения в силовых электронных системах, например, в приводах, зачастую противоречит требованиям ЭМС и ограничивается таким параметром как скорость нарастания напряжения. Простой способ решения, предлагаемый Infineon – параллельное использование двух традиционных драйверов.

Читать статью

Только что, Alexeyslav сказал:

Схема? Катоды управляются полевиками? Может, порт работает только в одну сторону, отключаясь оставляет заряд на полевике и тот держит ток...

И вообще, не нравятся мне такое краткие записи логических преобразований, неужели их нельзя развернуть по-нормальному, чтобы было видно что происходит?

Плата STM32VLDiscovery, общие катоды подключены напрямую к выводам платы, а аноды через резистор.

Не понял, что вы называете "кратким описание логических преобразований", я в программировании МК еще совсем в начале пути и не очень понимаю, как должно быть по "нормальному"? Пишу где-то методом тыка, где то подглядываю у других)

Share this post


Link to post
Share on other sites
Только что, snn_krs сказал:

А тактирование порта А включено ?

RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE );

Да, конечно. Аноды на порте А.

Методом "перетыкивания ножек" удалось сузить круг подозреваемых до 13 и 14 ног порта А, на остальных ногах нормально все.

Ох, ты еж! Кажется, я понял где "собака зарыта".

image.png.3f6e5be8c3774196e6860790a14d648b.png

на 13 и 14 ногах сидит ST-Link!

Я правильно понял?

Share this post


Link to post
Share on other sites

Напрямую? Мне всегда казалось что у STM32 слишком слабые выходы чтобы подключать к ним светодиодные индикаторы. Ну, какой-то ток они выдержат... но он значительно меньше чем у других контроллеров.

Под краткой записью я имею ввиду выражения вроде "ODR &= ~catods" - настоящая головоломка когда начинаешь читать и пытаться вникнуть в суть выполняемой функции. Символов вроде меньше, но очевидность стремится к нулю. Такое ощущение что эти выражения придумали программисты-машинисты которым побыстрей бы выдать код на скорости 200 симв/мин. Не понимаю, чем неугодна оказалась классическая математическая запись выражений?


Учение - изучение правил. Опыт - изучение исключений.

Share this post


Link to post
Share on other sites
11 час назад, Alexeyslav сказал:

Напрямую? Мне всегда казалось что у STM32 слишком слабые выходы чтобы подключать к ним светодиодные индикаторы. Ну, какой-то ток они выдержат... но он значительно меньше чем у других контроллеров.

Под краткой записью я имею ввиду выражения вроде "ODR &= ~catods" - настоящая головоломка когда начинаешь читать и пытаться вникнуть в суть выполняемой функции. Символов вроде меньше, но очевидность стремится к нулю. Такое ощущение что эти выражения придумали программисты-машинисты которым побыстрей бы выдать код на скорости 200 симв/мин. Не понимаю, чем неугодна оказалась классическая математическая запись выражений?

Да, тема подключения индикатора уже обсуждалась в другой ветке. Я по незнанию сначала подключил - все работало. Потом начал читать теорию и был удивлен: должно все сгореть)))) Но я упустил момент динамической индикации: разряды вкл поочередно на короткое время - в итоге ток получается не большой. Плюс современные индикаторы(светодиоды) требуют все меньший ток. Хотя, теперь бы сделал на "ключах".

Я в институте учил Delphi. Работаю "программистом" 1С - для меня битовые операции вообще сложная тема))) Но везде применяется именно сокращенный вид присваивания. Вот и пытаюсь привыкнуть.

Edited by karomag

Share this post


Link to post
Share on other sites

Импульсный ток так и остаётся высоким. То что средний ток будет меньше практически ничего не значит - это отодвинет лишь тепловой пробой, а превышение максимальных параметров выхода всё ещё остаётся. Сейчас оно работает, а через 500 часов наработки сгорит к чертям порт и делов-то. А, кстати, а что будет с током если выведешь все 8-ки на индикатор?

Ну, сами по себе битовые операции то остаются только такая краткая их форма записи не очевидна и сбивает с толку. Где-то она уместна, но зачем пихать её во все щели, даже на линейный участок алгоритма где должна быть очевидность а не краткость записи(хотя вот не уверен что в нынешнем С вообще ещё можно использовать математическую запись). Это что-то вроде моды, очень заразно но не значит что так надо делать всегда и везде... Но это дело такое.

Edited by Alexeyslav

Учение - изучение правил. Опыт - изучение исключений.

Share this post


Link to post
Share on other sites
В 14.11.2017 в 01:23, Alexeyslav сказал:

Сейчас оно работает, а через 500 часов наработки сгорит к чертям порт и делов-то. А, кстати, а что будет с током если выведешь все 8-ки на индикатор?

Гипотетически все 8 не будут выводится. Но вы имеете, ввиду что ток будет слишком большим для всего МК?

Это первый проект на STM32. Были сомнения, что я вообще смогу его реализовать, поэтому сильно в дебри не лез... Вообще в планах, сделать индикацию на двух 74HC495. Слышал, что есть какие-то спец драйверы для семисегментников. Но мне кажется это гораздо сложнее.

Share this post


Link to post
Share on other sites
В 14.11.2017 в 01:23, Alexeyslav сказал:

Импульсный ток так и остаётся высоким. То что средний ток будет меньше практически ничего не значит - это отодвинет лишь тепловой пробой, а превышение максимальных параметров выхода всё ещё остаётся. Сейчас оно работает, а через 500 часов наработки сгорит к чертям порт и делов-то. А, кстати, а что будет с током если выведешь все 8-ки на индикатор?

Я на АТмеле-АВРах пробовал - если ток превышает предельный, падает напряжение которое нога выдает для единицы, для 5-вольтной логики у меня падало до 3,5 вольт. То есть начинает сказываться сопротивление транзистора (грубо говоря) ноги (пина)! Но все работало ни чего не сгорело!!!

Edited by ruhi

Можно сделать все! Но чем больше можно, тем больше нельзя!

Share this post


Link to post
Share on other sites

Ну да... и 60мВт тепла выделяется на выходном транзисторе порта, один может и ничего но если несколько нагрузить до предела уже может выйти из строя что-то. А вообще работа в предельном режиме сильно сокращает ресурс элемента, вплоть до нескольких минут работы. Забавно было смотреть как советский светодиод АЛ307 работает при 100мА... но он работал же! Недолго...

Цитата

Но вы имеете, ввиду что ток будет слишком большим для всего МК?

В даташите указан ток максимальный для одного пина, ограничен для группы(весь порт или по 8 бит) и для выводов питания всего контроллера отдельно. Причем надо смотреть какой именно ток ограничен - импульсный или в целом. Ну и обращать внимание на абсолютные ограничения - их нельзя превышать НИ В КОЕМ СЛУЧАЕ. Полупроводники конечно имеют запас, но работа в околопредельном режиме всегда сокращает ресурс полупроводника.

Ну вот у вас получилось 25мА, это ток который при "8" будет течь через один общий пин, вроде же это больше чем разрешённый? А если он на том же порту что и сегменты... как-то не очень выходит.


Учение - изучение правил. Опыт - изучение исключений.

Share this post


Link to post
Share on other sites
14 часа назад, Alexeyslav сказал:

Ну вот у вас получилось 25мА, это ток который при "8" будет течь через один общий пин, вроде же это больше чем разрешённый? А если он на том же порту что и сегменты... как-то не очень выходит.

Это максимальный, насколько я понял из datasheet на МК на пин. Да общий пин на том же порте...

Share this post


Link to post
Share on other sites

Вот это как раз плохо. Может и поработает так какое-то время, а потом внезапно порт перестанет работать... При нагреве чипа(летом?) всё станет ещё хуже - нагрузочная способность порта уменьшится.


Учение - изучение правил. Опыт - изучение исключений.

Share this post


Link to post
Share on other sites
В 12.11.2017 в 22:01, karomag сказал:

#define SEG_G GPIO_Pin_6

//Собираем цифры из сегментов

#define DIG0 ( SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F )

Вы сегменты с разрядами не перепутали часом? Сегмент это часть одной цифры, а разряд - номер цифры.


Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Share this post


Link to post
Share on other sites
В 21.11.2017 в 18:36, COKPOWEHEU сказал:

Вы сегменты с разрядами не перепутали часом? Сегмент это часть одной цифры, а разряд - номер цифры.

А с чего такой вопрос? Все так и есть.

Share this post


Link to post
Share on other sites

Join the conversation

You are posting as a guest. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Similar Content

    • By Sanchous
      Я делаю проект с использованием stm32, до этого я работал с arduino, и подобных проблем не было, при прошивке МК эти кодом (сгенерированым при помощи cubeMX):
      /* USER CODE BEGIN Header */ /** ****************************************************************************** * @file : main.c * @brief : Main program body ****************************************************************************** * @attention * * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics. * All rights reserved.</center></h2> * * This software component is licensed by ST under BSD 3-Clause license, * the "License"; You may not use this file except in compliance with the * License. You may obtain a copy of the License at: * opensource.org/licenses/BSD-3-Clause * ****************************************************************************** */ /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ #include "main.h" /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ /* USER CODE BEGIN PTD */ /* USER CODE END PTD */ /* Private define ------------------------------------------------------------*/ /* USER CODE BEGIN PD */ /* USER CODE END PD */ /* Private macro -------------------------------------------------------------*/ /* USER CODE BEGIN PM */ /* USER CODE END PM */ /* Private variables ---------------------------------------------------------*/ /* USER CODE BEGIN PV */ /* USER CODE END PV */ /* Private function prototypes -----------------------------------------------*/ void SystemClock_Config(void); /* USER CODE BEGIN PFP */ /* USER CODE END PFP */ /* Private user code ---------------------------------------------------------*/ /* USER CODE BEGIN 0 */ /* USER CODE END 0 */ /** * @brief The application entry point. * @retval int */ int main(void) { /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /* MCU Configuration--------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* Configure the system clock */ SystemClock_Config(); /* USER CODE BEGIN SysInit */ /* USER CODE END SysInit */ /* Initialize all configured peripherals */ /* USER CODE BEGIN 2 */ /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ } /** * @brief System Clock Configuration * @retval None */ void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; /** Initializes the CPU, AHB and APB busses clocks */ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; RCC_OscInitStruct.HSIState = RCC_HSI_ON; RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } /** Initializes the CPU, AHB and APB busses clocks */ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK) { Error_Handler(); } } /* USER CODE BEGIN 4 */ /* USER CODE END 4 */ /** * @brief This function is executed in case of error occurrence. * @retval None */ void Error_Handler(void) { /* USER CODE BEGIN Error_Handler_Debug */ /* User can add his own implementation to report the HAL error return state */ /* USER CODE END Error_Handler_Debug */ } #ifdef USE_FULL_ASSERT /** * @brief Reports the name of the source file and the source line number * where the assert_param error has occurred. * @param file: pointer to the source file name * @param line: assert_param error line source number * @retval None */ void assert_failed(uint8_t *file, uint32_t line) { /* USER CODE BEGIN 6 */ /* User can add his own implementation to report the file name and line number, tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ /* USER CODE END 6 */ } #endif /* USE_FULL_ASSERT */ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ С использованием такого make скрипта:
      ########################################################################################################################## # File automatically-generated by tool: [projectgenerator] version: [3.5.2] date: [Mon Feb 03 16:34:48 MSK 2020] ########################################################################################################################## # ------------------------------------------------ # Generic Makefile (based on gcc) # # ChangeLog : # 2017-02-10 - Several enhancements + project update mode # 2015-07-22 - first version # ------------------------------------------------ ###################################### # target ###################################### TARGET = test ###################################### # building variables ###################################### # debug build? DEBUG = 1 # optimization OPT = -Og ####################################### # paths ####################################### # Build path BUILD_DIR = build ###################################### # source ###################################### # C sources C_SOURCES = \ Src/main.c \ Src/stm32f1xx_it.c \ Src/stm32f1xx_hal_msp.c \ Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio_ex.c \ Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim.c \ Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim_ex.c \ Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal.c \ Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc.c \ Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc_ex.c \ Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio.c \ Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_dma.c \ Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_cortex.c \ Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_pwr.c \ Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash.c \ Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash_ex.c \ Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_exti.c \ Src/system_stm32f1xx.c # ASM sources ASM_SOURCES = \ startup_stm32f103xb.s ####################################### # binaries ####################################### PREFIX = arm-none-eabi- # The gcc compiler bin path can be either defined in make command via GCC_PATH variable (> make GCC_PATH=xxx) # either it can be added to the PATH environment variable. ifdef GCC_PATH CC = $(GCC_PATH)/$(PREFIX)gcc AS = $(GCC_PATH)/$(PREFIX)gcc -x assembler-with-cpp CP = $(GCC_PATH)/$(PREFIX)objcopy SZ = $(GCC_PATH)/$(PREFIX)size else CC = $(PREFIX)gcc AS = $(PREFIX)gcc -x assembler-with-cpp CP = $(PREFIX)objcopy SZ = $(PREFIX)size endif HEX = $(CP) -O ihex BIN = $(CP) -O binary -S ####################################### # CFLAGS ####################################### # cpu CPU = -mcpu=cortex-m3 # fpu # NONE for Cortex-M0/M0+/M3 # float-abi # mcu MCU = $(CPU) -mthumb $(FPU) $(FLOAT-ABI) # macros for gcc # AS defines AS_DEFS = # C defines C_DEFS = \ -DUSE_HAL_DRIVER \ -DSTM32F103xB # AS includes AS_INCLUDES = # C includes C_INCLUDES = \ -IInc \ -IDrivers/STM32F1xx_HAL_Driver/Inc \ -IDrivers/STM32F1xx_HAL_Driver/Inc/Legacy \ -IDrivers/CMSIS/Device/ST/STM32F1xx/Include \ -IDrivers/CMSIS/Include \ -IDrivers/CMSIS/Include # compile gcc flags ASFLAGS = $(MCU) $(AS_DEFS) $(AS_INCLUDES) $(OPT) -Wall -fdata-sections -ffunction-sections CFLAGS = $(MCU) $(C_DEFS) $(C_INCLUDES) $(OPT) -Wall -fdata-sections -ffunction-sections ifeq ($(DEBUG), 1) CFLAGS += -g -gdwarf-2 endif # Generate dependency information CFLAGS += -MMD -MP -MF"$(@:%.o=%.d)" ####################################### # LDFLAGS ####################################### # link script LDSCRIPT = STM32F103C8Tx_FLASH.ld # libraries LIBS = -lc -lm -lnosys LIBDIR = LDFLAGS = $(MCU) -specs=nano.specs -T$(LDSCRIPT) $(LIBDIR) $(LIBS) -Wl,-Map=$(BUILD_DIR)/$(TARGET).map,--cref -Wl,--gc-sections # default action: build all all: $(BUILD_DIR)/$(TARGET).elf $(BUILD_DIR)/$(TARGET).hex $(BUILD_DIR)/$(TARGET).bin ####################################### # build the application ####################################### # list of objects OBJECTS = $(addprefix $(BUILD_DIR)/,$(notdir $(C_SOURCES:.c=.o))) vpath %.c $(sort $(dir $(C_SOURCES))) # list of ASM program objects OBJECTS += $(addprefix $(BUILD_DIR)/,$(notdir $(ASM_SOURCES:.s=.o))) vpath %.s $(sort $(dir $(ASM_SOURCES))) $(BUILD_DIR)/%.o: %.c Makefile | $(BUILD_DIR) $(CC) -c $(CFLAGS) -Wa,-a,-ad,-alms=$(BUILD_DIR)/$(notdir $(<:.c=.lst)) $< -o $@ $(BUILD_DIR)/%.o: %.s Makefile | $(BUILD_DIR) $(AS) -c $(CFLAGS) $< -o $@ $(BUILD_DIR)/$(TARGET).elf: $(OBJECTS) Makefile $(CC) $(OBJECTS) $(LDFLAGS) -o $@ $(SZ) $@ $(BUILD_DIR)/%.hex: $(BUILD_DIR)/%.elf | $(BUILD_DIR) $(HEX) $< $@ $(BUILD_DIR)/%.bin: $(BUILD_DIR)/%.elf | $(BUILD_DIR) $(BIN) $< $@ $(BUILD_DIR): md $@ ####################################### # clean up ####################################### clean: -rm -fR $(BUILD_DIR) ####################################### # dependencies ####################################### -include $(wildcard $(BUILD_DIR)/*.d) # *** EOF *** При прошивке через st-link программой stm32 st-link utulity, я получаю ошибку: "File empty or corrupted!"
    • By Alexander Beznosikov
      Уважаемые гуру, подкинули мне задачку, для меня не решаемую.
      1. Есть потенциометр, на выходе которого напряжения в диапазоне от 0в до +1,92в.
      2. Есть индикатор (цифровой милливольтметр LxD5130) 1-999мв с шагом 1мв (1мв-1 на табло, 10мв-10 на табло и т.д.).
      Необходимо из диапазона напряжений 0-1,92в преобразовать в диапазон от 20мв до 160мв.
      Пробовал делитель напряжения, подогнать напряжения под необходимый диапазон не получается.
    • Guest Владимир
      By Guest Владимир
      Доброго времени суток.
      Есть условный  конвейер, и по нему двигаются N-ыме товары с qr штрихкодами. Нужно разработать сканер, который чем быстрее будет работать, тем лучше.
      Посоветуйте какие то камеры и статьи/книги о подобном.
    • By One _ moment
      Здравствуйте. Нужно разобраться с принципом работы интерфейса I2C на Stm32. понимаю, что материала в интернете много, но почему-то даже просто структура, где определяются параметры, у меня другая.
      Моя вот такая:
      typedef struct
      {
        uint32_t I2C_Timing;  
        uint32_t I2C_AnalogFilter;      
        uint32_t I2C_DigitalFilter; 
        uint32_t I2C_Mode;  
        uint32_t I2C_OwnAddress1;
        uint32_t I2C_Ack;
        uint32_t I2C_AcknowledgedAddress;
      }I2C_InitTypeDef;
      Те, что даются в примерах, в статьях, такая:
      typedef struct
      {
        uint32_t I2C_ClockSpeed;          
       
        uint16_t I2C_Mode;                
       
        uint16_t I2C_DutyCycle;           
       
        uint16_t I2C_OwnAddress1;         
       
        uint16_t I2C_Ack;                 
       
        uint16_t I2C_AcknowledgedAddress; 
      }I2C_InitTypeDef;
       
      Найдя пример на этом форуме (https://forum.cxem.net/index.php?/topic/202586-i2c-%D0%B2-stm32f030/) увидел, что используются параметры такие же, что и у меня, но теперь не понятно, откуда такие значения берут и по какой логике. 
      Прошу не пинать ногами и кидать в меня гнилые помидоры, а помочь разобраться в этом всём или подсказать, где можно найти исчерпывающую информацию, где хорошо и по полочкам всё разложено.
      Программирую в keil uVision v5
      Отладочная плата stm32f0 disco
      МК stm32f0030r8
      Благодарю заранее.
    • Guest User1324
      By Guest User1324
      Здравствуйте, помогите подключить USB-флешку к STM32F103RCT6, нужна дополнить принципиальную схему. Если есть возможность нарисовать.
  • Сообщения

    • Ааа… Это ты у Алиенса селфовский пред попутал с моим Кенвудом? Яяаасно…  
    • А,понял,спутал-извиняюсь
    • Да нет,конечно нет. Разве это напряженка?   Была такая и поддержу на сто процентов. Дал посверлить и... Кстати какая то нездоровая судьба у вещей которые дали кому то в пользование. Помните рижский железный кофейник продавался в СССР? У нас такой много лет был. И забывали включенным,и без воды включали. Хоть бы что. А тут мамка как то дала в школе коллеге-и капут мгновенно И пусть. Почему нет? Абсолютно спокойно к этому отношусь
    • Типичное интеллигентское заблуждение. Вправлять исполнительные органы гораздо эффективнее. Однозначно понятной становится причина "вправления" и сами собой выводы делаются правильные. А если вправлять кумпол, то не факт, что ход мыслей при "вправлении" будет правильный и в конечном счёте приведёт к нужным "вправляющему" результатам.
    • Гм.. Вы вгоняете в краску... Кумполом он думал, надеюсь. Кумпол и вправлять. 
    • Кумпол-то при чём? Он же не кумполом пи́сал...  
    • Вот озадачили. Всё же наукоград... Может "многоуважаемый господин, не соизволите ли вы.." и ведром по кумполу.
×
×
  • Create New...