Перейти к содержанию

Mars36

Members
  • Постов

    27
  • Зарегистрирован

  • Посещение

Информация

  • Город
    Воронеж

Электроника

  • Стаж в электронике
    Менее года
  • Сфера радиоэлектроники
    микроконтроллеры, питание

Посетители профиля

795 просмотров профиля

Достижения Mars36

Новобранец

Новобранец (2/14)

  • 10 постов на форуме
  • Неделя на форуме
  • Месяц на форуме
  • Год на форуме

Последние значки

0

Репутация

  1. Боюсь ошибиться со схемой. Мне не удалось найти статьи по этому поводу, поэтому использовать специализированную микросхему мне кажется более правильным , по крайней мере в первый раз .т.к. в ДШ есть описание и примеры стандартных применений А так, конечно, было бы интересно такое реализовать.
  2. Поскольку я буду использовать такую поделку исключительно для себя, поэтому хочу, что бы она выглядела красиво, без навешанных модулей на соплях. Разве у них есть встроенная защита? К примеру у кого нибудь NCR18650B. Насколько я знаю, аккумуляторы со встроенной защитой чуть-чуть длиннее и с трудом влезают в стандартные холдеры.
  3. Спасибо, а есть ли более продвинутые микросхемы с защитой от КЗ и переразряда? Удалось найти только ту же микросхему, только дополнительно с BMS. И Будет ли достаточно делителя напряжения для точности замера заряда аккумулятора?
  4. На поделке предполагаю USB и работу от аккума 18650. Хотелось бы иметь дополнительно возможность заряжать аккум не вынимая из устройства. Сильно экономить батарейку смысла нет, т.к. устройство должно работать за раз не более 12-16 часов. Для контроля заряда выбрал TP4056. Собственно вопрос, как совместить одновременно заряд аккумулятора и работу устройства? Как я понимаю если сделать как нацарапано на скриншоте работа во время заряда должна убить МК, т.к. во время заряда напряжение будет больше 4 вольт.
  5. Есть вопросик по OLED ssd1306. Не могу понять как очистить дисплей. В чужих библиотеках есть функция заполнения, но отыскать ее содержимое не удалось. Как я понял надо просто заполнить все семь страниц черным цветом, например. А это делается отправкой данных, уже заготовленными "пустыми" квадратами? В даташите описание очистки также не удалось найти.
  6. Доброго времени. Хочу найти ресурс где можно подробно почитать про компиляцию и линковку проекта для stm32f103 в линуксе. В гугле много инфы на счет самого мейка и с ним более менее понятно, а вот процесс компиляция под конкретный контроллер мне найти не удалось. Хотелось бы узнать на зависимости файлов CMSIS и весь алгоритм. Хочу научится компилировать проект из консоли, а в идеале прикрутить все необходимое к нужному мне текстовому редактору. Рассматривал готовые мейкфайлы, но написаны они достаточно сложно для моего познания в синтаксисе мейка. Пока планирую написать хотя бы элементарный мейк.
  7. Спасибо за ответ. В параметрах линкера было "-Wl,-gc-sections". Изменил на "-Wl,-gc-sections, -u,vfprintf -lprintf_flt", проект заметно потяжелел, но результат остался неизменным. Так же пробовал менять на "-Wl,-u,vfprintf -lprintf_flt" но результата это так же не принесло. Спасибо, заработало.
  8. Доброго времени. Есть проблемка по конвертации float в string в stm32f103. Для конвертации целых чисел использую функцию sprintf со спецификатором "%u" и все прекрасно шлется на дисплей и по uart, но при попытке отправить float возникает какая то магия. Пример: sprintf(testStr, "%.3f", 1.281); То в uart не прилетает ничего, и на дисплее так же пустота. Как удалось узнать из гугла ни sprintf ни printf не работают с float, хотя на ютубе в роликах люди использовали эту функцию и у них все прекрасно работало. Хочу узнать, есть ли какая нибудь аналогичная функция?
  9. @BARS_ Поправил настройку и использовал функцию задержки на таймере, тоже самое. Подключил РТОС и использовал его задержку и так же по нулям.Понизив частоту до 24 Mhz сообщение об ошибке не стало но мусор остался. Нашел тему на easyelectronics с частично похожей проблемой. Там ее решили. Решенный вариант я залил в свой камень, но вместо сообщения "Hello" приходит один и тот же код 0xF8, хотя на отправку идет пять символов. Код с той темы: #include "stm32f4xx.h" // Device header #include "FreeRTOS.h" #include "task.h" #include "queue.h" void RCC_Init(void); void GPIO_Init(void); void UART_Init(void); void USART2_send (char chr); void vTaskLed1 (void *argument); int main(void){ RCC_Init(); GPIO_Init(); UART_Init(); xTaskCreate(vTaskLed1,"LED1",32,NULL,1,NULL); vTaskStartScheduler(); //planner while(1); } //********************************************************************************** void vTaskLed1 (void *argument){ while(1){ GPIOD->ODR |= GPIO_ODR_ODR_12; //turn on led green GPIOD->ODR &= ~GPIO_ODR_ODR_13; //turn off led orange vTaskDelay(10000); GPIOD->ODR |= GPIO_ODR_ODR_13; //turn on led orange GPIOD->ODR &= ~GPIO_ODR_ODR_12; //turn off led green USART2_send('H'); USART2_send('e'); USART2_send('l'); USART2_send('l'); USART2_send('0'); USART2_send('!'); USART2_send('\n'); vTaskDelay(10000); } } //********************************************************************************** void RCC_Init(void){ RCC->CR |= ((uint32_t)RCC_CR_HSEON); // Enable HSE while (!(RCC->CR & RCC_CR_HSERDY)); // Ready start HSE FLASH->ACR = (FLASH_ACR_PRFTEN | FLASH_ACR_LATENCY| FLASH_ACR_ICEN | FLASH_ACR_DCEN); // Cloclk Flash memory RCC->CFGR |= RCC_CFGR_HPRE_DIV1; // AHB = SYSCLK/1 - 168/1 RCC->CFGR |= RCC_CFGR_PPRE1_DIV4; // APB1 = HCLK/4 - 168/4 = 42 RCC->CFGR |= RCC_CFGR_PPRE2_DIV2; // APB2 = HCLK/2 - 168/2 = 84 RCC->CFGR &= ~RCC_PLLCFGR_PLLSRC; // clearn PLLSRC bits RCC->CFGR &= ~RCC_PLLCFGR_PLLM; // clearn PLLM bits RCC->CFGR &= ~RCC_PLLCFGR_PLLN; // clearn PLLN bits RCC->CFGR &= ~RCC_PLLCFGR_PLLP; // clearn PLLP bits RCC->CFGR |= RCC_PLLCFGR_PLLSRC_HSE; // source HSE = 8MHz RCC->CFGR |= RCC_PLLCFGR_PLLM_4; // source HSE/4 = 2 MHz RCC->CFGR |= (RCC_PLLCFGR_PLLN_7 | RCC_PLLCFGR_PLLN_5 | RCC_PLLCFGR_PLLN_3); // is set N mul: PLLM x168: clock = 2 MHz * 168 = 336 MHz // already RCC_PLLCFGR_PLLP = 0; // PLLN/2 = 336 MHz * 2 = 168 MHz RCC->CR |= RCC_CR_PLLON; // enable PLL while((RCC->CR & RCC_CR_PLLRDY) == 0) {} // wait till PLL is ready RCC->CFGR &= ~RCC_CFGR_SW; // clear SW bits RCC->CFGR |= RCC_CFGR_SW_PLL; // select source SYSCLK = PLL while((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_1) {} // wait till PLL is used } void GPIO_Init (void){ RCC->AHB1ENR |= RCC_AHB1ENR_GPIODEN; //Turn on clock on AHB1 to GPIOD GPIOD->MODER &= ~GPIO_MODER_MODER13; //PD15 - clear - led orange GPIOD->MODER |= GPIO_MODER_MODER13_0; //PD13 - PP - led orange GPIOD->MODER &= ~GPIO_MODER_MODER12; //PD15 - clear - led green GPIOD->MODER |= GPIO_MODER_MODER12_0; //PD12 - PP - led green GPIOD->OSPEEDR = 0; //low speed for all gpiod GPIOD->OTYPER = 0; } void UART_Init(void){ RCC->APB1ENR |= RCC_APB1ENR_USART2EN; //Turn on clock on APB1 to UASRT1 ----------------------------тут RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN; //Turn on clock on AHB1 to GPIOA //PA2 - TX GPIOA->MODER &= ~GPIO_MODER_MODER2_0; //MODER 10 GPIOA->MODER |= GPIO_MODER_MODER2_1; //MODER 10 GPIOA->PUPDR &= ~GPIO_PUPDR_PUPDR2; //PUPDR 00 GPIOA->OTYPER &= ~GPIO_OTYPER_OT_2; //OTYPER 0 => PA2 - AF PP GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR2; //OSPEED 11 - very high speed GPIOA->AFR[0] |= 0x00000700; //AF7 //PA3 - RX GPIOA->MODER &= ~GPIO_MODER_MODER3; //MODER 00 GPIOA->PUPDR &= ~GPIO_PUPDR_PUPDR3; //PUPDR 0 => PA3 - floating input GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR3; //OSPEED 11 - very high speed USART2->BRR = 0x00001117; // BRR = (f(APB1)+ 4800)/9600, f(APB1) == 42 MHz USART2->CR1 |= USART_CR1_UE; //Enable USART2 USART2->CR1 |= USART_CR1_TE; //Transmitter USART2 USART2->CR1 |= USART_CR1_RE; //Resiver USART2 USART2->CR1 |= USART_CR1_RXNEIE; //RX Interrupt Enable NVIC_EnableIRQ(USART2_IRQn); } void USART2_send (char chr){ while(!USART2->SR & USART_SR_TC); USART2->DR = chr; } У человека с той темы так же дискавери. Как по мне сажать UART на P2-P3 не очень хорошо, т.к. по схеме там висят железки, но у него как я понял все заработало. Подумал, что это из за юсб хаба к которому подключена отладка и USB->UART, но попробовав воткнуть сразу в порту на материнке, ноутбуке и другом компе, но ситуация не изменилась. Странно, что каждый раз приходит почти один и тот же код.
  10. @BARS_Спасибо. Установил настройки UART как у вас и изменил значение AFR на " GPIOB->AFR[0] |= 0x77000000;". Ситуация улучшилась. Теперь байты передаются когда нужно, но так же какой то мусор. Как мне кажется дело либо в кодировке терминала либо с частотой МК. Функцию инициализации RCC перепроверил несколько раз, все должно быть в норме. Но терминал пишет ошибку связанную с битрейтом. Для удобства решил сразу отправлять код "0x31". Функцию для задержки написал, что бы случае чего не заспамило терминал, но за пример на таймере спасибо). До этого использовал FreeRTOS и задержку из перехода между задачами.
  11. @snn_krs Пока данные не принимаю. Сначала бы с отправкой разобраться. Изменил "GPIOB->AFR[0] |= 0x00000700;" на "GPIOB->AFR[0] |= GPIO_AFRL_AFRL7_0 | GPIO_AFRL_AFRL7_1 | GPIO_AFRL_AFRL7_2; " и сделал галушку для прерывания по приему на всякий случай, но все осталось точно так же. По идее делаю как написано в RM и даташите, хотя скорее всего я слепой.
  12. @MasterElectric в кубе пожмакал делители, после прописал нужные руками. Получилось. Что на апб2 - 84mhz, что в притык по даташиту. (8400000+4800)/9600=0х222Е. А что не так с регистром afr? Должен быть выбран младший, т.к. пины 6 и 7 и af7 из таблицы по референс мануалу, если нужно перенастроить с pa9 и pa10.
  13. Mars36

    stm32f407vg отправка по UART

    Доброго времени суток, второй день пытаюсь настроить отправку данных по UART для камня 407vg на плате discovery. Использую USART1 с ножками PB6(TX) и PB7(RX). Тактирование от внешнего кварца. Частота APB2 - 84MHz, соответственно BRR->0x222E. При заливке прошивки в камень на ПК прилетает один мусорный байт и большей ничего не происходит, при ресете МК соответственно опять прилетает один мусорный байт. Пробовал подключать через USART2, там дела обстоят чуть лучше. Байты отправляются, но в виде мусора. Притом, отправлял разные символы(почти все цифры и буква алфавита) но код на терминали был либо 0xDF либо 0xFF. /******************************************************************************/ /* LYBRARY */ /******************************************************************************/ #include "stm32f4xx.h" /******************************************************************************/ /* USE FUNCTION */ /******************************************************************************/ void InitGPIO (void); void InitRCC(void); void InitUSART2(void); void delay (uint32_t time); /******************************************************************************/ /* MAIN */ /******************************************************************************/ int main (void){ InitGPIO (); InitRCC(); InitUSART2(); while (1){ GPIOD->BSRR |= GPIO_BSRR_BS15; while(!(USART1->SR & USART_SR_TC)); USART1->DR = 'h'; delay(200000000); GPIOD->BSRR |= GPIO_BSRR_BR15; delay(200000000); } } /******************************************************************************/ /* InitGPIO */ /******************************************************************************/ void InitUSART2(void){ RCC->APB2ENR |= RCC_APB2ENR_USART1EN; RCC->AHB1ENR |= RCC_AHB1ENR_GPIOBEN; GPIOB->MODER &= ~GPIO_MODER_MODER6_0; GPIOB->MODER |= GPIO_MODER_MODER6_1; GPIOB->PUPDR &= ~GPIO_PUPDR_PUPDR6; GPIOB->OTYPER &= ~GPIO_OTYPER_OT_6; GPIOB->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR6; GPIOB->AFR[0] |= 0x00000700; GPIOB->MODER &= ~GPIO_MODER_MODER7; GPIOB->PUPDR &= ~GPIO_PUPDR_PUPDR7; GPIOB->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR7; USART1->BRR = 0x0000222E; USART1->CR1 |= USART_CR1_UE; USART1->CR1 |= USART_CR1_TE; USART1->CR1 |= USART_CR1_RE; USART1->CR1 |= USART_CR1_RXNEIE; NVIC_EnableIRQ(USART1_IRQn); } void InitRCC(void){ RCC->CR |= ((uint32_t)RCC_CR_HSEON); while (!(RCC->CR & RCC_CR_HSERDY)); FLASH->ACR = (FLASH_ACR_PRFTEN | FLASH_ACR_LATENCY| FLASH_ACR_ICEN | FLASH_ACR_DCEN); RCC->CFGR |= RCC_CFGR_HPRE_DIV1; RCC->CFGR |= RCC_CFGR_PPRE1_DIV4; RCC->CFGR |= RCC_CFGR_PPRE2_DIV2; RCC->CFGR &= ~RCC_PLLCFGR_PLLSRC; RCC->CFGR &= ~RCC_PLLCFGR_PLLM; RCC->CFGR &= ~RCC_PLLCFGR_PLLN; RCC->CFGR &= ~RCC_PLLCFGR_PLLP; RCC->CFGR |= RCC_PLLCFGR_PLLSRC_HSE; RCC->CFGR |= RCC_PLLCFGR_PLLM_4; RCC->CFGR |= (RCC_PLLCFGR_PLLN_7 | RCC_PLLCFGR_PLLN_5 | RCC_PLLCFGR_PLLN_3); RCC->CR |= RCC_CR_PLLON; while((RCC->CR & RCC_CR_PLLRDY) == 0) {} RCC->CFGR &= ~RCC_CFGR_SW; RCC->CFGR |= RCC_CFGR_SW_PLL; while((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_1) {} } void InitGPIO (void) { RCC->AHB1ENR |= RCC_AHB1ENR_GPIODEN; GPIOD->MODER |= GPIO_MODER_MODE15_0; GPIOD->OTYPER &=~ GPIO_OTYPER_OT15; GPIOD->OSPEEDR |= GPIO_OSPEEDR_OSPEED15_0; GPIOD->MODER |= GPIO_MODER_MODE14_0; GPIOD->OTYPER &=~ GPIO_OTYPER_OT14; GPIOD->OSPEEDR |= GPIO_OSPEEDR_OSPEED14_0; GPIOD->MODER |= GPIO_MODER_MODE13_0; GPIOD->OTYPER &=~ GPIO_OTYPER_OT13; GPIOD->OSPEEDR |= GPIO_OSPEEDR_OSPEED13_0; GPIOD->MODER |= GPIO_MODER_MODE12_0; GPIOD->OTYPER &=~ GPIO_OTYPER_OT12; GPIOD->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR15_0; } void delay(uint32_t time){ uint32_t i; for (i=0; i<time;i++); }
  14. Под событиями подразумеваются флаги?
×
×
  • Создать...