Search the Community
Showing results for tags 'STM32'.
-
Мы – команда из десятка человек. Каждый из нас имеет внешнюю постоянную работу по совершенно разным специальностям. Но нас объединило одно дело, над которым мы трудимся более трех лет. Это проект по полной автоматизации сдачи и съема жилья в аренду. Именно - полной, то есть, архитектура этой идеи более сложная и более функциональная, чем у Букинга и у иных конкурентов. В целях защиты корпоративных интересов наше название и адрес сайта я называть в этом публичном пространстве не буду. Но сделаю известным, что у нас есть инвесторы и в наш проект уже вложено порядка десятка миллионов рублей, что у нас есть созданное нами же работающее оборудование на объектах и сложнейшее серверное ПО и что уже выложено в популярные магазины наше мобильное приложения для съема жилья в аренду. Т.е. мы фактически уже не стартап, а компания с клиентами и доходами. Но, чтобы масштабировать сервис, чтобы привлечь новых инвесторов и выйти на более серьёзный уровень доходов, нам нужны новые разработки в области СКУД и тщательный анализ имеющихся на предмет модернизации. Поэтому нам нужны опытные специалисты по аналоговой и цифровой радиоэлектронике. А именно, в данный момент единица нашей системы работает на Raspberry Pi c простейшей обвязкой из реле, i2c – устройств ввода и вывода и иных простейших компонентов. Но далее предполагается усложнить ее с помощью добавления новых устройств на основе МК ESP (или более энергоэффективных МК), беспроводной связи типа LoRa и создания более сложных аналоговых устройств сбора обезличенной информации. В более далекой перспективе – создание собственных модулей шифрования и, может быть, даже собственного протокола беспроводной связи, что будет очень полезно для защиты отечественных интересов в условиях войны. От Вас не требуется менять работу, переезжать. Работу можно делать удаленно, хоть даже из другого региона, при этом строго соблюдая оговоренный график выполнения работы, неформальной отчетности и регулярного участия в онлайн-конференциях с командой. Объем работы, если у Вас есть опыт в указанных выше областях, на мой взгляд, не должен превышать нескольких часов в неделю, т.к. предполагается, что Вы уже знаете, что и как принято и нужно делать. Однако, если задача окажется более творческой, а Вы – творческим человеком, то расход времени будет таким, каким сочтете нужным. В данный момент мы можем предложить в качестве вознаграждения за работу долю в компании, для чего потребуется поработать некоторое время (полгода - год) над поставленной задачей и демонстрировать положительные результаты своей работы. А в случае успешной динамики компании, Вам, как и всем нынешним участникам компании, будет предложено перейти на оплачиваемую должность в компании. Как видите, мы не обещаем Вас озолотить. Но, с другой стороны, на данном этапе Вы ничем иным не рискуете, кроме своего времени. Для связи со мной прошу писать в личку, где нужно коротко написать о себе, в т.ч. город проживания и Ваш возраст. А здесь отвечать я не буду, потому что этот форум читают конкуренты)
- 63 replies
-
-7
-
STM32F746NG keil 5.0 аудиокодек aday1361 При использовании одного буфера на приём и передачу звука через DMA всё работает нормально, если использовать разные буферы на приём и передачу, появляются лишние шумы и записанного голоса почти не слышно, буфер заполняется при срабатывании callback подскажите пожалуйста по данному вопросу
-
Доброго времени суток! Недавно была предпринята попытка разобраться с STM32L071 при поддержке STM32CubeIDE. Скрины генерации проекта прилагаю. Решено было начать с самого базового - с UART. Для теста в UART была выдана строка, которая была принята компьютером. После чего я настраиваю прием данных по UART, зная максимальный объём посылки - включаю прерывание IDLE и запускаю приём. Несмотря на очевидное наличие данных на входе контроллера (видимое с помощью осциллографа), я не получаю признак их прихода, т.е. ни прерывание IDLE, ни коллбек. В чем может быть причина? //main.c void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size) { if (huart->Instance == USART1) { } } int main (void) { /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* USER CODE BEGIN Init */ uint8_t aTxBuffer[] = " ****UART_TwoBoards_ComIT**** "; /* USER CODE END Init */ /* Configure the system clock */ SystemClock_Config(); /* USER CODE BEGIN SysInit */ /* USER CODE END SysInit */ /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_USART1_UART_Init() HAL_UART_Transmit(&huart1, (uint8_t*)aTxBuffer, sizeof(aTxBuffer), 1000); __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE); HAL_UARTEx_ReceiveToIdle_IT(&huart1, (uint8_t*)receive_buff, 20); while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } } void USART1_IRQHandler(void) { /* USER CODE BEGIN USART1_IRQn 0 */ /* USER CODE END USART1_IRQn 0 */ HAL_UART_IRQHandler(&huart1); /* USER CODE BEGIN USART1_IRQn 1 */ if (__HAL_UART_GET_FLAG(&huart1, UART_FLAG_IDLE) == SET) { __HAL_UART_CLEAR_IDLEFLAG(&huart1); HAL_UARTEx_ReceiveToIdle_IT(&huart1, (uint8_t*)receive_buff, 20); } /* USER CODE END USART1_IRQn 1 */ }
-
Всем привет! Хочу разработать платку, которая расширяет возможности БК машины, не знаю с чего начать. В программировании опыта более 10 лет, но это серверное программирование Вопросы 1) На чем лучше разработать CAN сниффер? чтобы недорого и удобно разрабатывать. У меня есть готовый образен на STM32, пока смотрю в его сторону, нашел еще варианты на Arduino 2) Как можно снять прошивку с STM32, или безопасно понять есть ли там защита? 3) Инструментарий: Что нужно для разработки кроме IDE? Какой-то переходник для прошивки? 4) Кто печатает платы по проекту чтобы можно было на себя взять только разработку, а печать заказать? 5) может ли быть такое что плата что у меня в образце какая-то типовая и её просто надо купить по каталогу и прошить? 6) есть ли какие-то распространенные библиотеки для разработки в CAN? 7) как провести отладку? что для этого нужно? Как я понимаю надо одновременно и комп к плате подключить и плату к can-шине?
-
Начал изучать UART STM32 на отладочной плате STM2F446RE. Включил UART2, по умолчанию включились порты PA2,PA3. Включил прерывания, подключил переходник UART/USB CH340, перед этим установив драйвера. Добавил простенький код в stm32f4xx_it.c: в нём объявил две переменные, когда принимается 8 бит buffrec в ответ должен отправляться "Hello world!". /* USER CODE BEGIN Includes */ uint8_t buffrec[8]; uint8_t TX_data[]="Hello world!\n\r"; /* USER CODE END Includes */ void USART2_IRQHandler(void) { /* USER CODE BEGIN USART2_IRQn 0 */ /* USER CODE END USART2_IRQn 0 */ HAL_UART_IRQHandler(&huart2); /* USER CODE BEGIN USART2_IRQn 1 */ HAL_UART_Transmit(&huart2,TX_data,14,0xFFFF); HAL_UART_Receive_IT(&huart2, buffrec,8); /* USER CODE END USART2_IRQn 1 */ } В main.c объявил приём и передачу сигнала UART: /* USER CODE BEGIN 2 */ __HAL_UART_ENABLE_IT(&huart2, UART_IT_RXNE); __HAL_UART_ENABLE_IT(&huart2, UART_IT_TC); /* USER CODE END 2 */ В компиляции нет никаких ошибок и предупреждений. Приём и передачу мониторю через Advanced Serial Port Terminal 6. В итоге при попытке отправить комбинацию "12345" записываются только первые 2 числа. При этом происходит отправка 2 сообщений "Hello world!" сразу. При этом при записи двух бит, они записываются в пустые биты, а затем перезаписывают их. Кроме того, результат приходит на COM3 (порт подключения отладочной платы), а не на COM4 (порт подключения CH340), к которым подключены пины UART2 PA2, PA3. Из-за чего могут возникать эти проблемы?
-
Есть плата, на которой находятся MCP348 и STM32F103T8U6. К MCP подключается термопара, стмка должна собирать преобразованные данные с MCP через интерфейс I2C и обрабатывать данные. Я застрял на моменте сбора данных. Написал функции для общения стм и mcp, но в ответ получаю это: При этом не важно какой канал выбран и к какому каналу подключена термопара. Функция main: int main(void) { Configure_GPIO_LED(); Configure_GPIO_I2C1(); Configure_I2C1_Master(); Configure_SysTick(); reg_conf = CONFIG_REG(1, 3, 1, 0, 0); while (1) { I2C_write_MCP(DA3_1_ADDR, reg_conf); delay(50); I2C_read_MCP(DA3_1_ADDR); delay(50); } } Функция чтения: void I2C_read_MCP(uint8_t slave_addr) { I2C1->CR1 |= I2C_CR1_START; while(!(I2C1->SR1 & I2C_SR1_SB)); I2C1->DR = (uint8_t)(DEVICE_CODE | (slave_addr << 1) | MODE_READ); while(!(I2C1->SR1 & I2C_SR1_ADDR)); for(int i = 0; i < 3; i++) { while(!(I2C1->SR1 & I2C_SR1_RXNE)); output[i] = I2C1->DR; } I2C1->CR1 |= I2C_CR1_STOP; } Функция записи: void I2C_write_MCP(uint8_t slave_addr, uint8_t data) { I2C1->CR1 |= I2C_CR1_START; while(!(I2C1->SR1 & I2C_SR1_SB)); I2C1->DR = (uint8_t)(DEVICE_CODE | (slave_addr << 1) | MODE_WRITE); while(!(I2C1->SR1 & I2C_SR1_TXE)); delay(1); I2C1->DR = data; while(!(I2C1->SR1 & I2C_SR1_TXE)); I2C1->CR1 |= I2C_CR1_STOP; } Функция настройки модуля I2C: void Configure_I2C1_Master(void) { RCC->APB1ENR |= RCC_APB1ENR_I2C1EN; I2C1->CR1 &= ~I2C_CR1_SMBUS; I2C1->CR2 |= 48; I2C1->CCR &= ~I2C_CCR_CCR; I2C1->CCR |= 120; I2C1->CCR |= I2C_CCR_FS; I2C1->TRISE = 24; I2C1->CR1 |= I2C_CR1_PE; } Подскажите, в чем может быть проблема? Или что я делаю не так.
-
Добрый день! Пытаюсь наладить передачу по SPI данных к дисплею с DMA. Передача работает, дисплей полностью закрашивается, но устанавливается флаг ошибки FIFO в регистрах DMA. МК: STM32F401CEU6 Инициализация //Где-то там alignas(32) uint16_t buff[80 * 160]; // SPI init SPI2->CR1 |= (0b000 << SPI_CR1_BR_Pos) | SPI_CR1_MSTR | SPI_CR1_SSI | SPI_CR1_SSM; SPI2->CR2 |= SPI_CR2_TXDMAEN; SPI2->CR1 |= SPI_CR1_SPE; // DMA init DMA1_Stream4->CR |= (0b01 << DMA_SxCR_DIR_Pos) | (0 << DMA_SxCR_CHSEL_Pos) | (0b11 << DMA_SxCR_MBURST_Pos) | DMA_SxCR_MINC; DMA1_Stream4->PAR = (uint32_t)&SPI2->DR; DMA1_Stream4->M0AR = (uint32_t)getBuffer(); DMA1_Stream4->FCR &= ~DMA_SxFCR_FTH; DMA1_Stream4->FCR |= DMA_SxFCR_DMDIS; __DMB(); DMA1_Stream4->FCR |= (0b11 << DMA_SxFCR_FTH_Pos); Функции отправки void ST7735s::stopScreenUpdate() { DMA1_Stream4->CR &= ~DMA_SxCR_EN; while (DMA2_Stream4->CR & DMA_SxCR_EN) ; CS_Up(); } void ST7735s::startScreenUpdate() { stopScreenUpdate(); sendCommand(ST77XX_RAMWR); CS_Down(); DC_Up(); DMA1->HIFCR = DMA_HIFCR_CFEIF4 | DMA_HIFCR_CHTIF4 | DMA_HIFCR_CTCIF4 | DMA_HIFCR_CTEIF4 | DMA_HIFCR_CDMEIF4; DMA1_Stream4->NDTR = WIDTH * HEIGHT * 2; DMA1_Stream4->CR |= DMA_SxCR_EN; } После передачи устанавливается флаг ошибки работы FIFO-буфера в DMA. Флаг приходится сбрасывать вручную + ненормально это как-то. Ошибка, как-никак. Выдержка из документации 80 пикселей * 160 пикселей * 2 байта = 25 600 байт. Итого, если я правильно понял логику, при размере пакета в 16 кусков, при размере куска = MSIZE = 1 байту, должно всё работать, т.к. конфигурации допустима + 25 600 байт ровно делиться на транзакции по 16 байт. Пробовал менять NDTR - делил на 16, но это не помогло, т.к. надо указать именно количество передаваемых байт. С делением на 16 заполняется лишь 1/16 часть дисплея. Перезаписи (ovverun) тоже нет - все пиксели занимают свои места Ошибок SPI нет Выравнивание сделал с запасом. Пробовал ранее 4 - без результата (Точнее результат - ошибка).
-
Привет всем! Помогите, пожалуйста, я только начал программировать МК STM32F407VG. Программирую в среде keil. Проект создал, все ок. НО есть единственное НО, в котором я не могу разобраться. Программа самая простая зажечь светодиоды на плате. #include "stm32f4xx.h" int main(void) { RCC->AHB1ENR |= RCC_AHB1ENR_GPIODEN; GPIOD->MODER = 0x55000000; GPIOD->OTYPER = 0; GPIOD->OSPEEDR = 0; GPIOD->ODR = 0xF000; while(1) { } } Этот код работает, все диоды загораются, все ок. Вот, если рассматривать следующий код, где я переставляю одну строчку GPIOD->ODR = 0xF000; в цикл while(1) #include "stm32f4xx.h" int main(void) { RCC->AHB1ENR |= RCC_AHB1ENR_GPIODEN; GPIOD->MODER = 0x55000000; GPIOD->OTYPER = 0; GPIOD->OSPEEDR = 0; while(1) { GPIOD->ODR = 0xF000; } } То код успешно НЕ работает, соответственно речи нет никакой, чтобы элементарно помигать диодами нет, через цикл for. Перерыл весь инет, инфы по данному вопросу никак не могу найти. Может кто-нибудь знает в чем дело??? Добавлю еще одно: САМОЕ интересное, что через отладку ПОШАГОВО, все работает, светодиоды загораются, а если просто выполнить код, ничего не горит P.S. не кидайте, пожалуйста, помидорами, я только начинающий...
-
Здравствуйте! Имеется плата на основе микрокотроллера stm32f405vg, есть задача получения значения rms(среднеквадратичное значение тока) посредством АЦП ade7953. Данные с АЦП принимаются по SPI(посредством обращения к регистру 0x31a) в массив по типу arr[0] = 0x00, arr[1] = 0x00, arr[2] = 0xB1, arr[3] = 2C. Столкнулся с проблемой перевода этого значения в амперы. В application note к АЦП я нашел формулу, прикреплённых ниже, которая должна решать этот вопрос, но как применить её так и не додумался, прошу знающих помочь. Язык Си
-
Здравствуйте, хочу впаять АУКС в магнитолу CD. Кассетные переделываются легко(замыкаются нужные концевики чтобы магнитофон думал что работает кассета, а на предусилитель кидаем линии aux, и специальную ножку мк подтягиваем к лог 1 или 0). А вот с мафоном CD все сложно, линии аукс включаются по цифровому протоколу, и с CD сигнал передается по SPI, что тоже вызывает сложность в переделке. Было решено обойти сам предусилитель магнитолы, а именно с помощью реле переключить линии основного усилителя на заказанный модуль USB-Bluetooth-MP3 из Китая. Также была разведена и изготовлена печатная плата с универсальными входами и выходами и реле. Управление платой осуществляю с помощью родной кнопки достать диск и при ее нажатии переключается управления родного энкодера. Оставалась сложность с регулировкой звука, решил попробовать цифровой потенциометр, и просто им подтягивать сигнал к земле(не знаю на сколько это правильно). Все алгоритмы реализовал, треки переключает, в память сохраняет. Но вот уже 2 день сижу и пытаюсь крутить цифровой потенциометр AD5263. Посмотрите пожалуйста, что я не так делаю? Питание логики у него разрешено 3V3, далее везде 5V. Подтянул res, shdn к +5V. Отправка по SPI 10bit, старших 2 адрес. Только не понятно нужно ли дергать ножку CS после каждых 10bit, или же можно отправить 4 по 10bit и потом дернуть CS чтобы данные потенциометре внеслись в регистр (стр.28)? Схема подключения: https://cloud.mail.ru/public/BQ7p/biynVUh2V Даташит AD5263: https://cloud.mail.ru/public/ihyh/sJzPohn2f Инициализировал SPI uint16_t spi_data; void Init_SPI(void){ //SPI1 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOA, &GPIO_InitStructure); //подключение портов //GPIO_PinAFConfig(GPIOA, GPIO_PinSource4, GPIO_AF_0);//NSS GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_0);//SCK GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_0);//MISO GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_0);//MOSI CLEAR_BIT(SPI1->CR1, SPI_CR1_BIDIMODE); //0: 2-line unidirectional data mode selected SET_BIT(SPI1->CR1, SPI_CR1_BIDIOE);//1: Output enabled (transmit-only mode) CLEAR_BIT(SPI1->CR1, SPI_CR1_CRCEN | SPI_CR1_CRCNEXT | SPI_CR1_CRCNEXT | SPI_CR1_CRCL);//0: CRC calculation disabled | 0: Next transmit value is from Tx buffer | 0: 8-bit CRC length CLEAR_BIT(SPI1->CR1, SPI_CR1_RXONLY);//0: Full-duplex (Transmit and receive) SET_BIT(SPI1->CR1, SPI_CR1_SSM);//1: Software slave management enabled SET_BIT(SPI1->CR1, SPI_CR1_SSI);////SS в высоком состоянии CLEAR_BIT(SPI1->CR1, SPI_CR1_LSBFIRST);//0: data is transmitted/received with the MSB first // Первым отправляется старший бит MODIFY_REG(SPI1->CR1, SPI_CR1_BR , SPI_CR1_BR_2 | SPI_CR1_BR_0);//011: fPCLK/16 SET_BIT(SPI1->CR1, SPI_CR1_MSTR);//1: Master configuration CLEAR_BIT(SPI1->CR1, SPI_CR1_CPOL);//0: CK to 0 when idle **** 1: CK to 1 when idle CLEAR_BIT(SPI1->CR1, SPI_CR1_CPHA);//0: The first clock transition is the first data capture edge ***** 1: The second clock transition is the first data capture ed SET_BIT(SPI1->CR2, SPI_CR2_TXDMAEN);//1: Tx buffer DMA enabled CLEAR_BIT(SPI1->CR2, SPI_CR2_RXDMAEN);//0: Rx buffer DMA disabled CLEAR_BIT(SPI1->CR2, SPI_CR2_SSOE);//0: SS output is disabled in master mode and the SPI interface can work in multimaster configuration CLEAR_BIT(SPI1->CR2, SPI_CR2_NSSP);//0: No NSS pulse CLEAR_BIT(SPI1->CR2, SPI_CR2_FRF);//0: SPI Motorola mode **** 1 SPI TI mode CLEAR_BIT(SPI1->CR2, SPI_CR2_ERRIE | SPI_CR2_RXNEIE | SPI_CR2_TXEIE); //0: Error interrupt is masked | 0: RXNE interrupt masked | 0: TXE interrupt masked MODIFY_REG(SPI1->CR2, SPI_CR2_DS, SPI_CR2_DS_3 | SPI_CR2_DS_0);//1001: 10-bit CLEAR_BIT(SPI1->CR2, SPI_CR2_FRXTH | SPI_CR2_LDMARX | SPI_CR2_LDMATX);//Last DMA transfer for reception/transmission SET_BIT(SPI1->CR1, SPI_CR1_SPE);//SPI enable// 1: Peripheral enabled } void start_SPI(uint8_t num){ //количество слов DMA_Cmd(DMA1_Channel3, DISABLE);//выкл для установки CNDTR DMA1_Channel3->CNDTR = num; SPI1_CS_ON(); DMA_Cmd(DMA1_Channel3, ENABLE); } void set_SPI_Tx(uint8_t adr, uint16_t Data) { SPI1_TX_buff[adr] = Data; } DMA uint16_t SPI1_TX_buff[4]; void SPI_DMA_Init(void){ //TX DMA1_Channel3->CPAR = (uint32_t)(&SPI1->DR); DMA1_Channel3->CMAR = (uint32_t)(SPI1_TX_buff); DMA1_Channel3->CNDTR = 0; CLEAR_BIT(DMA1_Channel3->CCR, DMA_CCR_MEM2MEM); CLEAR_BIT(DMA1_Channel3->CCR, DMA_CCR_PL); //Channel priority level 00:low MODIFY_REG(DMA1_Channel3->CCR, DMA_CCR_MSIZE, DMA_CCR_MSIZE_0);//01: 16-bits MODIFY_REG(DMA1_Channel3->CCR, DMA_CCR_PSIZE, DMA_CCR_PSIZE_0);//01: 16-bits SET_BIT(DMA1_Channel3->CCR, DMA_CCR_MINC);//1: Memory increment mode enabled CLEAR_BIT(DMA1_Channel3->CCR, DMA_CCR_PINC);//0: Peripheral increment mode disabled CLEAR_BIT(DMA1_Channel3->CCR, DMA_CCR_CIRC);//0: Circular mode disabled SET_BIT(DMA1_Channel3->CCR, DMA_CCR_DIR);//1: Read from memory CLEAR_BIT(DMA1_Channel3->CCR, DMA_CCR_TCIE | DMA_CCR_HTIE | DMA_CCR_TCIE);//Transfer error interrupt disable | Half transfer interrupt disable | Transfer complete interrupt disable SET_BIT(DMA1_Channel3->CCR, DMA_CCR_EN); } В таймере собираю и отправляю в потенциометр, также выключаю CS if(vol_level.send_flag_for_spi){//флаг отправки по SPI если выставлен, отправляем в потенциометр vol_level.send_flag_for_spi = OFF; set_SPI_Tx(0, vol_level.pot_1); set_SPI_Tx(1, (0x100 + vol_level.pot_2)); set_SPI_Tx(2, (0x200 + vol_level.pot_3)); set_SPI_Tx(3, (0x300 + vol_level.pot_4)); start_SPI(4); }else SPI1_CS_OFF();
-
Приветствую уважаемые дамы и господа! Занимаюсь разработкой носимого устройства с целью исследования технологий LoRaWAN и BLE 5.0. А также поработать с энергоэффективными режимами работы МК STM32L4-серии. Исходные данные: где - D3 микросхема зарядки Li-ion\Li-Pol аккумулятора (MCP73831), D4 - DC\DC преобразователь USB -> 3.3V (LM3671), D5 - DC\DC преобразователь VBAT -> 3.3V (LM3671). Суть моего вопроса: Если присутствует напряжение VBUS (USB), то необходимо выключать преобразователь D5 сигналом LM3671_BAT, но включать D4 сигналом LM3671_USB. Таким образом получается, что аккумулятор будет заряжаться, а питаться прибор будет от USB. Мои предположения, рассуждения и решения которые я вижу: Если управлять преобразователями при помощи GPIO портов МК, то получится, что как только питание по USB отключится, то прибор выключится быстрее, чем успеет включиться преобразователь работающий от VBAT, ввиду чего я такое решение и отмёл. Использовать небольшую схемку на двух полевых транзисторах в одном корпусе (p и n типа). В симуляторе вроде как всё работает, но вероятно может произойти та же ситуация, что и в случае 1; Использовать микросхему выполняющую данную задачу, но тут играет роль, что достать её сложно, стоит 7$ и выглядит как overkill для такой простой задачи. Покидайтесь, пожалуйста, камнями и критикой решений, своими вариантами решения задачи или же исправлениями к приложенным схемам. ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Если вдруг кого-то заинтересует, то вот ссылка на GitHub проекта, а так же ссылка на GitHub библиотеки. Используются шрифты T-Flex GOST, можно получить по ссылке.
-
Я написал программу последовательного порта с stm32, OP отправляет число, а затем возвращает число, но возвращаемое число - это какой-то неизвестный символ, скорость передачи синхронизирована 9608, стоп-биты данных и т.д. одинаковы, от tx до rx, все еще грязный код. Я поменял 3 помощника для отладки последовательного интерфейса, но они все одинаковые, кто-нибудь знает? Спасибо за ваш ответ.
-
Добрый день. На проект требуется программист микроконтроллеров STM32 с пониманием Ethernet. Проект: плата работает под управлением STM32F413VGT6, представляет собой SIP-приставку для домофона. Для связи с Ethernet используется микросхема ENC424J600-I/P - мост SPI <-> Ethernet. Ниже приведено краткое описание функционала: Устройство должно обеспечивать: 1. Прием голоса из домофоной линии и оцифровка с помощью встроенного в контроллер АЦП. 2. Передача голоса по сети Ethernet по протоколу RTP. В качестве транспорта использовать UDP. 3. Прием голосовых сообщений по Ethernet по протоколу RTP и передачу их на встроенный ЦАП. 4. Микроконтроллер должен обеспечивать связь с внешним миром с помощью интерфейса Ethernet через микросхему ENC424J600-PT. 5. Для установления соединения с сервером голосовых сообщений используется протокол SIP 2.0. с поддержкой методов, описанных в RFC 3261. 6. Прием и отработку команд, приходящих по MQTT: открыть входную дверь, открыть шлагбаум и т.п. 7. WEB-интерфейс для удаленных настроект и мониторинга рабочих параметров устройства. 8. Для работу через VPN-роутер контроллер должен поддерживать STUN. Есть проект для микроконтроллера для аналогичного устройства. Там используется STM32L475RET6. Для связи с Ethernet используется так же ENC424J600-I/P. Устройство успешно звонить по SIP на сервер. Выполняет приходящие MQTT-команды по открыванию дверей. Требуется: поправить ПО под STM32F413VGT6, добавить WEB-интерфейс, добавить возможность удаленного обновления ПО через WEB-интерфейс, добавить возможность перезагрузки устройства через WEB-интерфейс, добавить возможность хранения данных абонентов во FLASH микроконтроллера и возможность синрохизации этих данных с сервером, добавить STUN, исправить метод определения квартиры в которую звонят. Есть ТЗ на ПО.
-
Вопрос такой: как запросить содержимое корневого каталога при использовании библиотеки lfs.h. При этом я имею дело с чужим кодом и там файловая система уже отформатирована (когда-то) и смонтирована (при запуске устройства). Оперировать с каталогами и файлами имена которых я заведомо знаю (или сам создаю) у меня получатся, но для текущей задачи это мне никак не помогает. Вероятно мой вопрос очень простой и для многих очевидный, но я тем не менее не смог с наскока найти на него ответ ни в гугле, ни в lfs.h. Очень извиняюсь за невежество, я новичек
-
Хочу сделать вольтамперметр на базе STM32L151, есть ли какие нибудь особенности при разводке платы? Свой вариант прикрепляю ниже. Буду благодарен за дельные комментарии. ВА-30.dch
-
Добрый день. Прошу помощи в выборе контроллера stm32 под следующую задачу: Bluetooth HC-05 (1 uart) необходимо связывать по uart с: 1) MAX232 (2 uart) по 9600, иногда 115200, 2) с Atmega328 (3 uart) по 115200. Задача stm32 выставлять скорость на hc-05 и соединять между собой нужные uart в соответствии с выбором (4 switch в dip-8 корпусе). Кто может что-то посоветовать? В stm32 пока совсем начинающий. STM32 выбрал потому что в перспективе хочу добавить возможность параллельно выводить данные и на lcd. Зарание благодарен за помощь.
-
Помогите пожалуйста советом. Бьюсь несколько дней с опцией ADC. Я использую двухканальный АЦП IN0 и IN1 на микроконтроллере STM32L010RB через библиотеку HAL. Если проверять по отдельности, все в порядке, но когда я проверяю вместе, у меня все время одна и та же проблема: первый канал перезаписывает данные на втором канале, и у меня одинаковые данные на IN0 и IN1 в терминале Функция для выбора IN0. void ADC_Select_CH0(void) { ADC_ChannelConfTypeDef sConfig_0 = {0}; sConfig_0.Channel = ADC_CHANNEL_0; sConfig_0.Rank = 0; if (HAL_ADC_ConfigChannel(&hadc, &sConfig_0) != HAL_OK) { Error_Handler(); } } Функция для выбора IN1 void ADC_Select_CH1(void) { ADC_ChannelConfTypeDef sConfig_1 = {0}; sConfig_1.Channel = ADC_CHANNEL_1; sConfig_1.Rank = 0; if (HAL_ADC_ConfigChannel(&hadc, &sConfig_1) != HAL_OK) { Error_Handler(); } } основной цикл while(1) { ADC_Select_CH0(); HAL_ADC_Start(&hadc); HAL_ADC_PollForConversion(&hadc, 100); Axis[0] = HAL_ADC_GetValue(&hadc); HAL_ADC_Stop(&hadc); ADC_Select_CH1(); HAL_ADC_Start(&hadc); HAL_ADC_PollForConversion(&hadc, 100); Axis[1] = HAL_ADC_GetValue(&hadc); HAL_ADC_Stop(&hadc); sprintf(Tx_Data, "Axis X: %d;\r\nAxis Y: %d;\r\n\n\n", Axis[0], Axis[1]); HAL_UART_Transmit(&huart2, (uint8_t*)Tx_Data, strlen(Tx_Data), 1000); } ADC конфигурация: static void MX_ADC_Init(void) { hadc.Instance = ADC1; hadc.Init.OversamplingMode = DISABLE; hadc.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2; hadc.Init.Resolution = ADC_RESOLUTION_12B; hadc.Init.SamplingTime = ADC_SAMPLETIME_160CYCLES_5; hadc.Init.ScanConvMode = ADC_SCAN_DIRECTION_FORWARD; hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT; hadc.Init.ContinuousConvMode = ENABLE; hadc.Init.DiscontinuousConvMode = DISABLE; hadc.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; hadc.Init.ExternalTrigConv = ADC_SOFTWARE_START; hadc.Init.DMAContinuousRequests = DISABLE; hadc.Init.EOCSelection = ADC_EOC_SINGLE_CONV; hadc.Init.Overrun = ADC_OVR_DATA_PRESERVED; hadc.Init.LowPowerAutoWait = DISABLE; hadc.Init.LowPowerFrequencyMode = DISABLE; hadc.Init.LowPowerAutoPowerOff = DISABLE; if (HAL_ADC_Init(&hadc) != HAL_OK) { Error_Handler(); } }
-
Здравствуйте! Не могу понять, почему на дисплей выводятся только черные квадраты, если смотреть прямо, а если под углом, то видно строку, которую я вывожу. Как убрать эти квадраты, а строку сделать видимой?
-
Начинаю знакомство с STM32 после AVRок. Решил сделать дрыганог через прерывание по таймеру. Плата Nucleo на базе STM32F446re, частота работы до 180МГц, собираю проект в CubeIDE. Для опыта решил взять таймер6 (на самом деле мне всё равно какой) и вызывать прерывания по переполнению счётчика. По даташиту, его тактирование идёт от APB1, которая работает на 45МГц, с множителем Х2 (т.е получается 90МГЦ). Прескалер выставил в 89 (т.е счёт должен идти с частотой 1 МГц), каунтер на 1 (т.е по идее я должен получать прерывания с частотой 500КГц). static void MX_TIM6_Init(void) { TIM_MasterConfigTypeDef sMasterConfig = {0}; htim6.Instance = TIM6; htim6.Init.Prescaler = 89; htim6.Init.CounterMode = TIM_COUNTERMODE_UP; htim6.Init.Period = 1; htim6.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; if (HAL_TIM_Base_Init(&htim6) != HAL_OK) { Error_Handler(); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim6, &sMasterConfig) != HAL_OK) { Error_Handler(); } } В обработчике прерывания вызываю смену состояния светодиода на PA5. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if(htim->Instance == TIM6) //check if the interrupt comes from TIM1 { HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5); } } Загрузив код и проверив логическим анализатором я получаю частоту 254,5Кгц. Меняя значения прескалера в меньшую сторону увеличения частоты добиться не могу (основной цикл пуст, в программе никаких вычислений кроме этого нет). Почему так происходит?
-
Доброго времени суток, форумчане. Вопрос хотел задать на робофоруме, однако, похоже там сон-час (последние лет 5). На моих роботах стоят raspberryPi с помощью которых я в эклипсе удаленно дебажу и прогаю находящиеся на борту STMки через "openocd": https://www.instructables.com/Wireless-Programming-and-Debugging-With-STM32-and-/ Однако, есть серьезное неудобство. При включении робота, требуется вручную подключаться к пишке по ssh и запускать команду: "sudo openocd", после чего все работает. Пробовал различные варианты автозапуска команды "sudo openocd" при старте пишки, выпавшие в первых страницах гугла, но результата не получил. Быть может, кто-нибудь из местных имеет опыт запуска "openocd" при старте системы? (p.s.: мои распбианы без десктопа)
- 2 replies
-
- rasberry pi
- STM32
-
(and 1 more)
Tagged with:
-
Недавно я использовал Arduino для программирования stm32, и мне нужно использовать ШИМ-выход, но кажется, что частота фиксирована на 550 Гц. Я хотел бы знать, как изменить частоту ШИМ простым и легким способом. Например, я могу использовать analogWriteFreq(3000) для изменения частоты ШИМ на 3 КГц на ESP8266, но эта функция не работает на stm32. есть ли аналогичный метод для stm32?
-
Друзья, привет. Есть код и схема для сборки частотомера на STM32, но нет сейчас возможности проверить работоспособность данного устройства. Если у кого-нибудь есть свободные 5 минут, не могли бы вы хотя бы без запуска, беглым взглядом посмотрев код, подсказать будет ли оно работать или нет и подсказать ошибки. В лучшем случае протестировать работает ли устройство или нет. Если кто поможет, буду чрезвычайно благодарен.
-
Приветсвую! Кто ни будь работал с микросхемой STLED316S? Это драйвер семисегментонго индикатора. Можете привести минимальный кусок кода который выводит любую цифру на дисплей. Из документации не пойму как с ней работать... На форумах инфы почти нет. Из того что есть тоже толку мало. Буду рад любой инфе по этой микросхеме. Ещё правильно же понимаю биты по SPI передаются младшим вперёд, а такты нужно передавать инверсные? В качестве МК применяю STM32.