Search the Community
Showing results for tags 'UART'.
-
Начал изучать 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. Из-за чего могут возникать эти проблемы?
-
Доброго времени суток всем. Выручайте, у меня уже едет крыша. Не могу прочитать uart 1 на pic18f25k22 работает только отправка данных. uart 2 работает нормально и на отправку данных и на чтение. Инициализация обычная void USART_Init(long baud_rate) { TRISCbits.TRISC6 = 1; TRISCbits.TRISC7 = 0; float temp; temp=(( (float) (F_CPU) / (float) baud_rate) - 1); SP1BRG = (int) temp; /* Baud rate=9600 SPBRG=(F_CPU /(64*9600))-1*/ TX1STA = 0x20; /* TX enable; */ RC1STA = 0xB0; /* RX enable and serial port enable*/ } RC1REG всегда 0x00 если пытаюсь читать посылку. отправка работает нормально, если положить байт в TX1REG все отправляется. беру usart 2 на этом же чипе void USART_Init(long baud_rate) { TRISBbits.TRISB7 = 1; TRISBbits.TRISB6 = 0; float temp; temp=(( (float) (F_CPU) / (float) baud_rate) - 1); SP2BRG = (int) temp; /* Baud rate=9600 SPBRG=(F_CPU /(64*9600))-1*/ TX2STA = 0x20; /* TX enable; */ RC2STA = 0xB0; /* RX enable and serial port enable*/ } все прекрасно работает и на чтение и на запись. Мистика. Пробовал через прерывания и без них, usart 2 работает без нареканий, usart 1 только на передачу. соединил два 18F2550 по уарту, все прекрасно один пишет, второй читает. Что не так с 18F25K22 кто подскажет?
-
Здравствуйте, совсем недавно начать освоение микроконтроллеров и в начале пути столкнулся с двумя проблемами: 1) При нажатии кнопки "Run" для запуска проекта выдает ошибку: No ST-LINK detected! Please conncect ST-LINK and restart the debug sesion. При этом ST_Link установлен, создаю bin-файлы и зашиваю через него. 2) есть плата STM32discovery и преобразователь интерфейса uart-usb|com, нужно передать сообщение по данному интерфейсу, но терминальные программы (putty, smarty, realterm) не принимают ничего хотя видят данный порт. Ошибок в коде нет, светодиод мигает.
-
Доброго времени суток!!! Я столкнулся с тем, что не работает UART и не реагирует на AT-команды. Пробовал с 2-мя переходниками: CH340 и FT232RL, тот, что в Arduino. Пробовал и менять контакты RX-TX местами, и скорость менял (должно быть 9600 бод) - терминал молчит от слова совсем. CH340 просто светит своим индикатором приема, а FT232 моргнет при включении и все. Должно выводиться в терминале при включении ON, но не выводится ничего и никак не реагирует. Проверял и обвязкой, и упрощенным подключением (4 провода - 2 питания и 2 UART), и напряжение то 3.3 делал, то 3.7, то питал с аккумулятора - молчание. Подумал, что UART нагнулся из-за моих кривых рук - махнулся с другом на свежую, проверить UART, но результат тот же, полагаю, что в моем даже и не сдох. А сам модуль работает, не считая злосчатного UART. Так в чем может быть проблема?
-
На примере GSM/GPRS Goouuu Tech IOT-GA6-B и ATtiny85. Программа «Звонилка». Программа на BASCOM-AVR. Источник https://178654.blogspot.com/p/uart.html
- 1 reply
-
- Uart
- BASCOM-AVR
-
(and 2 more)
Tagged with:
-
Всем привет. Имеется датчик давления под управлением микрухи MLX90308. Микруха сия собирает показания с 4-х включенных мостом тензометрических датчиков, и отдает обработанное значение в виде аналогового сигнала. Так же есть пин для получения данных в цифре и калибровки/прошивки этой микрухи. Производитель микрухи предлагает бесплатный софт и свою отладочно-прошивочную плату (EVB90308) за 250 бакинских (дорого), которую ждать 8 недель (долго) Судя по докам, там обычный UART, но с другими уровнями. Логический 0 = 0.3*Uвх, т.е. 1.5в, Логическая 1 = 0.7*Uвх, т.е. 3,5в. И всё это засунуто в единственный пин и на прием и на передачу. Универ был давно, да и учился я плохо, подскажите пожалуйста пример схемы чтобы 1) свести tx и rx на одну ногу 2)согласовать уровни для чтения/записи сей микрухи доступными средствами. Например, FTDI. Даташит микрухи: https://www.melexis.com/-/media/files/documents/datasheets/mlx90308-datasheet-melexis.pdf Спасибо заранее! Это датчик из блока АБС мотоцикла, замены нет, б/у запчастей нет, а новый блок стоит как сам мотоцикл.
-
Почему может неправильно работать uart? Подключил 1 uart к пк через usb/uart переходник, а второй к gsm модему. В первый уарт вывожу инфу для дебага, а во второй AT команды. Суть в том, что сообщения для 2 уарта выводятся в 1 уарт и выводятся как то странно не полностью Вот такой вывод постоянно: Begin End AT+CNMI=2,2,0,0,0 AT+CMGEnd AT+CNMI=2,2,0,0,0 а должно быть просто begin end и все полный код https://pastebin.com/zBBZmZue
- 10 replies
-
- STM32F103C8T6
- UART
-
(and 2 more)
Tagged with:
-
Доброго времени суток. Решил пробудить свои скилы по написанию программ под stm32f103. Поигрался с SMT32CUDEMX и HAL, но вернулся к SLP библиотеке. Начал постепенно наращивать программу по примерам, начиная с GPIO, тактирования и на работе c USART встал. Суть в том что передача по UART идет нормально, а вот прием приводит к "зависанию". Устанавливая бесконечные while с мигалками внутри, я выяснил что по все видимости МК не переходит в прерывания USART1_IRQHandler. Я не могу понять в чем ошибка, раньше с таким не сталкивался, хотя написал несколько программ для stm32f100 .____. Среда разработки Atollic TrusStudio 9.0.0. #include "stm32f10x.h" #include "stm32f10x_gpio.h" #include "stm32f10x_rcc.h" #include "stm32f10x_usart.h" #include "misc.h" #include <string.h> // тактовый светодиод для индикации #define LED GPIO_Pin_5 #define RX_BUF_SIZE 80 volatile char RX_FLAG_END_LINE = 0; volatile char RXi; volatile char RXc; volatile char RX_BUF[RX_BUF_SIZE] = {'\0'}; volatile char buffer[80] = {'\0'}; void init_GPIO(void); void SetSysClockTo72(void); void init_uart(void); void clear_RXBuffer(void); void USARTSend(const char *pucBuffer); void USART1_IRQHandler(void) { GPIO_ResetBits(GPIOA, LED); //GPIOA->ODR ^= LED; //USART_ITConfig(USART1, USART_IT_RXNE, DISABLE); //if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) { //if ((USART1->SR & USART_FLAG_RXNE) != RESET) { //if ((USART1->SR & USART_SR_RXNE) != (u16)RESET) { if (USART1->SR & USART_SR_RXNE) { // Сбрасываем флаг прерывания USART1->SR &=~ USART_SR_RXNE; //RXc = USART_ReceiveData(USART1); //RX_BUF[RXi] = RXc; //RXi++; //if (RXc != 13) { // if (RXi > RX_BUF_SIZE-1) { // clear_RXBuffer(); // } //} //else { // RX_FLAG_END_LINE = 1; //} //Echo //USARTSend("Interrapt_UART1\r\n"); //USART_SendData(USART1, RXc); } //return } int main(void) { int i; //SetSysClockTo72(); init_GPIO(); init_uart(); USARTSend("Test USART1\r\n"); while (1) { //if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_9) != 0) { /* Toggle LED which connected to PC13*/ GPIOA->ODR ^= LED; // Invert C13 /* delay */ for(i=0;i<0x100000;i++); /* Toggle LED which connected to PC13*/ GPIOA->ODR ^= LED; /* delay */ for(i=0;i<0x100000;i++); USARTSend("Test USART1\r\n"); //} //else { //GPIO_SetBits(GPIOA, LED); //} } } void init_GPIO(void) { // Создаем класс для постепенной настройки параметров и единовременного применени¤ GPIO_InitTypeDef GPIO_InitStructure; //Настрайваем светодиод, включаем тактирование GPIOA RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // Конфигурация для светодиода, режим работы, максимальная скорость GPIO_InitStructure.GPIO_Pin = LED; // GPIO_Mode_Out_OD выход с открытым стоком, GPIO_Mode_Out_PP выход двумя состояниями // GPIO_Mode_AF_OD выход с открытым стоком для альтернативных функций, GPIO_Mode_AF_PP то же самое, но с двумя состояниями GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); // Устанавливаем начальное значение SetBits -> High level ("1"), ResetBits -> Low level ("0") GPIO_ResetBits(GPIOA, LED); // Настрайваем пин 9, регистра B на вход, для отладки, включаем тактирование регистра B RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // Настрайваем для кнопку, пин, режим, максимальная частота входного сигнала GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; // GPIO_Mode_AIN аналоговый вход, GPIO_Mode_IN_FLOATING вход без подтяжки, болтающийся // GPIO_Mode_IPD вход с подтяжкой к земле, GPIO_Mode_IPU вход с подтяжкой к питанию GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); } void SetSysClockTo72(void) { ErrorStatus HSEStartUpStatus; /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration -----------------------------*/ /* Системный RESET RCC (делать не обязательно, но полезно на этапе отладки) */ RCC_DeInit(); /* Включаем HSE (внешний кварц) */ RCC_HSEConfig( RCC_HSE_ON); /* Ждем пока HSE будет готов */ HSEStartUpStatus = RCC_WaitForHSEStartUp(); /* Если с HSE все в порядке */ if (HSEStartUpStatus == SUCCESS) { /* HCLK = SYSCLK */ /* Смотри на схеме AHB Prescaler. Частота не делится (RCC_SYSCLK_Div1) */ RCC_HCLKConfig( RCC_SYSCLK_Div1); /* PCLK2 = HCLK */ /* Смотри на схеме APB2 Prescaler. Частота не делится (RCC_HCLK_Div1) */ RCC_PCLK2Config( RCC_HCLK_Div1); /* PCLK1 = HCLK/2 */ /* Смотри на схеме APB1 Prescaler. Частота делится на 2 (RCC_HCLK_Div2) потому что на выходе APB1 должно быть не более 36МГц (смотри схему) */ RCC_PCLK1Config( RCC_HCLK_Div2); /* PLLCLK = 8MHz * 9 = 72 MHz */ /* Указываем PLL от куда брать частоту (RCC_PLLSource_HSE_Div1) и на сколько ее умножать (RCC_PLLMul_9) */ /* PLL может брать частоту с кварца как есть (RCC_PLLSource_HSE_Div1) или поделенную на 2 (RCC_PLLSource_HSE_Div2). Смотри схему */ //RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); RCC_PLLConfig(0x00010000, RCC_PLLMul_9); /* Включаем PLL */ RCC_PLLCmd( ENABLE); /* Ждем пока PLL будет готов */ while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) { } /* Переключаем системное тактирование на PLL */ RCC_SYSCLKConfig( RCC_SYSCLKSource_PLLCLK); /* Ждем пока переключиться */ while (RCC_GetSYSCLKSource() != 0x08) { } } else { /* Проблемы с HSE. Тут можно написать свой код, если надо что-то делать когда микроконтроллер не смог перейти на работу с внешним кварцом */ /* Пока тут заглушка - вечный цикл*/ // while (1) { //} } } void init_uart(void) { /* Enable USART1 and GPIOA clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA, ENABLE); /* Configure the GPIOs */ GPIO_InitTypeDef GPIO_InitStructure; /* Configure USART1 Tx (PA.09) as alternate function push-pull */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); /* Configure USART1 Rx (PA.10) as input floating */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); /* Configure the USART1 */ USART_InitTypeDef USART_InitStructure; /* USART1 configuration ------------------------------------------------------*/ /* USART1 configured as follow: - BaudRate = 115200 baud - Word Length = 8 Bits - One Stop Bit - No parity - Hardware flow control disabled (RTS and CTS signals) - Receive and transmit enabled - USART Clock disabled - USART CPOL: Clock is active low - USART CPHA: Data is captured on the middle - USART LastBit: The clock pulse of the last data bit is not output to the SCLK pin */ USART_InitStructure.USART_BaudRate = 9600; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART1, &USART_InitStructure); /* Enable USART1 */ USART_Cmd(USART1, ENABLE); /* Enable the USART1 Receive interrupt: this interrupt is generated when the USART1 receive data register is not empty */ USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); /* NVIC Configuration */ NVIC_InitTypeDef NVIC_InitStructure; /* Enable the USARTx Interrupt */ NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); //NVIC_EnableIRQ(USART1_IRQn); } void clear_RXBuffer(void) { for (RXi=0; RXi<RX_BUF_SIZE; RXi++) RX_BUF[RXi] = '\0'; RXi = 0; } void USARTSend(const char *pucBuffer) { while (*pucBuffer) { USART_SendData(USART1, *pucBuffer++); while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) { } } }
-
Появилась надобность в микроконтрллере STM32 для проектирования устройства. И вопрос вот в чем - в программировании этих стм-ов. Прочитал несколько статей по их программированию - что вообще для этого нужно. Выяснил, что в них (во всех?) есть вшитый bootloader, который может сам прошить МК. То есть для этого необходимо подключить какой-либо ...to UART преобразователь, а именно TX, RX, VCC и gnd к соответсвующим ногам микроконтроллера и все? Или надо еще куда-то подавать управляющий сигнал? Еще вопрос по поводу бутлоадера - если он занимает 8 КБ (или по разному?), то МК с 16 КБ памяти, по сути, будет иметь 8 КБ для программ? Datasheet я только начинаю читать и пока еще не нашел точной информации, так что за помощь буду очень признателен
- 25 replies
-
Здравствуйте. Имеется сигнальный трансформатор 1:1, которому нужно работать на пару сотнях кГц. Одна его обмотка идёт на линию, вторая служит для приёма и передачи сигнала, например с UART. Но как это реализовать? Выходной каскад, скорее всего, на биполярном транзисторе, входной - на ОУ, но имею малые представления о совмещении этого воедино. Прошу объяснить и направить на необходимую литературу. Спасибо.
-
Пытаюсь соединить AVR'ку со SCADA программкой SIMP Light. Она позволяет производить визуальный контроль и управление всем, чем вздумается при помощи микоконтроллера. Я делаю проект (стенд), на котором должно быть 4 тактовых расходомера, 3-4 датчика температуры и 2 реле для управления двумя электронагревателями во всем этом. Стенд отопления, в общем. И вот управление из компьютера всем этим мне показалось очень интересным, однако есть небольшие проблемы. Общение идет по протоколу MODBUS RTU, то есть в команде для, например, считывания состояния пина находятся: [Адрес МК] [Номер команды] [Адрес 1-го пина] [Количество пинов] [Контрольная Сумма]. Содеиняю через USB-to-TTL преобразователь, Скада шлет мне команду [64 02 00 00 00 01 B0 3F], я пытаюсь ответить [64 02 01 00 BF 44]. Но в место этого байты почти всегда идут раздельно, то по 1, то по 2 байта. Однако даже когда посылка доходит вся целиком, то Скаду это все равно не устраивает. False пишет. Ответы составлял по видео от Александра Писанца линк. Вопросы такие: 1. Почему данные идут раздельно, хотя я заношу следующий байт отправки сразу по очищению регистра UDR? Я, конечно, сделал все довольно странно, но как мне кажется отправка должна быть непрерывной. 2. Если кто-нибудь знает/понимает что в ответе для Скады не так тоже прошу помочь, хоть это и не по теме раздела. 3. Можете ли вы помочь мне сделать все не как у меня, а по-человечкски? Если найдете какую-то непотребщину, неправильную логику и прочие ошибки в исходнике, прошу, подскажите как исправить. Исходный файл с нормальным оформлением и с необходимыми комментариями. Писал на жесткой логике, просто чтобы заработало. [main.c] Изначально пытался "оживить" проект Александра из видео на ATMEGA328P (перенес с ATMEGA16), Скада обращалась по адресу, однако реакции от МК никакой. [MADBAS.zip] UPD: Просмотрел код, возможно это из-за того, что неправильно выставлено значение таймера (OCR0A = 70). Когда я запустил только проект, то реакции не было никакой вообще на светодиоде, хотя по логике обращение было к нему, значит надо мигнуть. Потом я сделал автоматический расчет значений для UBRR0H и UBRR0L (UBRRL_value ((F_CPU/(BAUD*16))-1)), светодиод начал отвечать. Изначально были выставлны значения вручную (0 и 103). В этом ли дело?
- 12 replies
-
- SCADA
- SIMP Light
-
(and 1 more)
Tagged with:
-
Все так же думаю о создании подобия отладочной платы для avr'ок, и надумал, чтобы на ней и МК бы прошивался по ISP, а после и общение наладить между компьютером и МК по UART'у. По отдельности проблем никаких нет, а вот совместить одно с другим - не уверен. Я не знаю, будет ли присутствие USBtoUART'а негативно влиять на программирование МК, или будет ли программатор влиять на МК во время передачи данных по UART. При этом, конечно, необходимо подключить все напрямую на постоянной основе и желательно (очень) по 1 USB порту. Могли бы вы подсказать как это возможно сделать, и возможно ли вообще?
-
На схеме программатора USBasp заметил подключенные порты RXD и TXD к разъему, и появился вопрос, а для чего они там? Знаю, что при помощи них можно передавать и принимать данные через UART/USART между устройствами, а можно ли используюя USBasp передавать информацию по 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++); }
-
Всем привет! Задумано следующее: на малинку ставится веб-сервер (именно веб, а не HTTP, т.к. подразумевается тонкий клиент, но возможно я с терминами немного путаю), который обеспечивает управление через тонкий клиент по Ethernet, по Modbus RTU поверх RS-485 малинка должна будет управлять объектом. Т.е. задача такая: на удаленном рабочем месте визуализация объекта и его управление по Modbus. Изначально я хотел под это дело использовать какой-нибудь NUCLEO на процессоре STM32. Но почитал немного о подробностях установки TCP-IP стека и веб-сервера на STM32 и понял, что эту задачу они выполняют, но как-то сложновато. Вроде как Raspberry Pi намного лучше с этим должна справиться. Да и комьюнити намного больше. Ваши мнения, господа?
- 7 replies
-
- raspberry pi
- stm32
-
(and 4 more)
Tagged with:
-
Здравствуйте, имеется задача передачи данных от stm32 на ПК и от ПК в stm по UART. Имеется stm32f411e-disco, созданная программа на пк в Qt creator. UART передатчик - CH340. Программа для stm - Keil, настройка в cubeMX. Основные выдержки из кода Qt (mainwindow.cpp): C++ (Qt)Выделить код 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 // Настройка UART serial = new QSerialPort(this); serial->setPortName("com4"); serial->setBaudRate(QSerialPort::Baud115200); serial->setDataBits(QSerialPort::Data8); serial->setParity(QSerialPort::NoParity); serial->setStopBits(QSerialPort::OneStop); serial->setFlowControl(QSerialPort::NoFlowControl); serial->open(QIODevice::ReadWrite); /*serial->write("ok*"); */ connect(serial, SIGNAL(readyRead()), this, SLOT(serialReceived())); // Запись принятых даннх в текстовое окно void MainWindow::serialReceived() { QByteArray ba; ba=serial->readAll(); ui->label->setText(ba); qDebug()<<ba; } // Отправка "1" и "2" в зависимости от нажатой кнопки void MainWindow::on_pushButton_clicked() { serial->write("1"); } void MainWindow::on_pushButton_2_clicked() { serial->write("2"); } Настроен UART на прием и передачу. При нажатии какой-либо кнопки по UART передаётся 1 или 2ка. Так же принятая информация отображается в текстовом окне label. При замыкании RX и TX у CH340 отправленная 1 или 2 тут же принимаются программой. Программный код для stm создан в CubeMX. Там подключено два UART, один на приём, другой на передачу (можно настроить один для работы в 2 направления). Основные выдержки из кода Keil (main.c): //Настройка UART serial = new QSerialPort(this); serial->setPortName("com4"); serial->setBaudRate(QSerialPort::Baud115200); serial->setDataBits(QSerialPort::Data8); serial->setParity(QSerialPort::NoParity); serial->setStopBits(QSerialPort::OneStop); serial->setFlowControl(QSerialPort::NoFlowControl); serial->open(QIODevice::ReadWrite); /* serial->write("ok*"); */ // Transmiting "ок" to COM Port connect(serial, SIGNAL(readyRead()), this, SLOT(serialReceived())); // Отображение принятых данных в текстовом меню label void MainWindow::serialReceived() { QByteArray ba; ba=serial->readAll(); ui->label->setText(ba); qDebug()<<ba; } // Отправка 1 или 2 в зависимости от нажатой кнопки void MainWindow::on_pushButton_clicked() { serial->write("1"); } void MainWindow::on_pushButton_2_clicked() { serial->write("2"); } Выдержки из кода в Keil (main.c): // Настройка UART static void MX_USART1_UART_Init(void) { huart1.Instance = USART1; huart1.Init.BaudRate = 115200; huart1.Init.WordLength = UART_WORDLENGTH_8B; huart1.Init.StopBits = UART_STOPBITS_1; huart1.Init.Parity = UART_PARITY_NONE; huart1.Init.Mode = UART_MODE_TX_RX; huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart1.Init.OverSampling = UART_OVERSAMPLING_16; if (HAL_UART_Init(&huart1) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); } } // 2 массива для принятия и отправки данных uint8_t strTX[1]; uint8_t strRX[1]; // Попытка сделать что-то адекватное int strTX = 1; while(1) { HAL_UART_Transmit_IT(&huart2, (uint8_t*) strTX, 1); HAL_UART_Receive_IT(&huart2, (uint8_t*) strTX, 1); Код в keil явно кривой, в Qt вроде всё работает. Получается передать из stm в Qt, но из Qt в stm нет. Нужно получить следующее: нажимаем в Qt одну из двух кнопок, отправляется в stm либо 1, либо 2 в зависимости от выбранной кнопки. Stm принимает, обрабатывает, если 1, то загорается один светодиод, если 2, то другой. Дальше stm отправляет обратно в Qt информацию о том, какой светодиод загорелся. P.S: довольно далек от программирования, но стараюсь разобраться. Буду благодарен любой помощти, некоторые скриншоты прилагаю.
-
Всем привет! Почему-то этот код работает: void Send_to_UART(char* string) { char data = 0; while(*string) { while(!(USART_GetFlagStatus(USART1, USART_FLAG_TXE))); data = *string; USART1->TDR = data; string++; } while(!(USART_GetFlagStatus(USART1, USART_FLAG_TXE))); USART_SendData(USART1, 0x0D); while(!(USART_GetFlagStatus(USART1, USART_FLAG_TXE))); USART_SendData(USART1, 0x0A); while(!(USART_GetFlagStatus(USART1, USART_FLAG_TC))); } char hello[13] = {'H','e','l','l','o',' ','W','o','r','l','d','!'}; int main (void) { Init_Clock(); Init_USART1(); Send_to_UART(hello); while(1); } А если написать вот так: int main (void) { Init_Clock(); Init_USART1(); Send_to_UART("Hello World!"); while(1); } то не просто не работает - микроконтролер зависает даже до входа в main(). В Си ведь, насколько я понимаю, строка - это тот же массив символов Объясните, пожалуйста, что я делаю не так? Камень stm32f030, среда CooCox CoIDE
-
Всем привет! Планируется сделать на базе arduino устройство, ведущее обмен данными с переферийным устройством по интерфейсу rs-232 и также необходимо контролировать работу arduino с помощью компьютера тоже посредством интерфейса rs-232. Но у arduino только один такой порт. Первая мысль в связи с этим - сделать ещё один порт и вывести линии RX и TX на другие (например цифровые) ножки порта. Можно ли как-то это сделать? Нет ли готовых библиотек для этого (на данный момент не нашёл таковых в интернете)? Может есть ещё какой-нибудь обходной путь? Заранее спасибо.
-
Доброго времени суток, нашел хорошую статью Usart прием и отправка строки. Настроил на порт Usart3 перестал работать, попробовал на Usart2 перекинуть тоже не работает, как правильно переделать подскажите... stm32-uart-spl.rar
-
Здравствуйте! Дано: BLE модуль JDY-10 Гироскоп + Акселерометр модуль GY-521 USB UART CH340G USB bluetooth адаптер Цель: передавать сигналы датчика гироскопа и акселерометра через bluetooth модуль на ПК. Мои рассуждения: Модуль GY-521 имеет I2C интерфейс, на JDY-10 стоит МК CC2541 который тоже имеет I2C интерфейс. Надо как-то их соединить и заставить отправлять показания на ПК. Как это сделать пока мне не понятно. Иногда приходят мысли что без перепрошивки контроллера не обойтись. Подскажите пожалуйста как это реализовать? П.С. В идеале вообще конечно использовать один контроллер для снятия значений и отправки на ПК, но пока так.
-
Здравствуйте, написал код для приема данных по UART. Записываю данные в буфер и сравниваю его с массивом. Если все данные совпадают увеличиваю значение j до 13. И вывожу данные j ком порт. Пожалуйста помогите исправить код, а то в UART хлам сыпется. unsigned char Buff[250]; unsigned char BuffIndex; unsigned char src[]= {'+','7','9','1','7','6','3','0','0','0','0','0','0'}; char * pch; int f2=0,i,j=0; void setup() { Serial.begin(9600); memset(Buff, '\0', 250); // Initialize the string BuffIndex=0; } void loop() { while(1) { //BuffIndex=0; // put your main code here, to run repeatedly: if(Serial.available()>0) { Buff[BuffIndex] = Serial.read(); BuffIndex++; if(BuffIndex>250) { BuffIndex=0; } for(i=0;i<=13;i++) { if(Buff[i]==src[i]) { j++; f2=10; } } if(j>13 && f2==10) { Serial.print(j); j=0; f2=0; } } } }
-
Всем привет. Сделал устройство с семисегментным индикатором,но понадобилось снимаемые значения еще и на пк выводить. А порт UART'а занят,связь нужна симплексная,т.е. в одну сторону. Можно ли как-то вывести инфу на порт В0?Или проще задействовать реализацию железа,а индикатор перебросить на другие порты?
-
Добрый день. Мне требуется реализовать программный юарт на атмеге16. Он нужен для того, чтобы принятые по нему данные отправить на аппаратный юарт. В интернете нашел примеры кода, но понять его мне трудно. Прошу вас словами в общих чертах объяснить принцип реализации программного юарта. Буду рад примерам, которые, на ваш взгляд, являются наиболее простыми и понятными. Заранее спасибо.
-
Читается порт UART на микроконтроллере Atmega. Применяю типовой алгоритм, но аппаратно вижу ошибки. Что неверное, или отчего они могут быть? unsigned char rx_buffer[128]; //накопительный буфер unsigned char indexW; // индекс при наполнении накопительного буфера unsigned char Count; // счетчик накопительного буфера unsigned char indexR; // индекс при опорожнении накопительного буфера int Max; // максимум до переполнения char tempMessage; // временная переменная int main(void) { Max=100; // пробовал разные while(1) { _delay_us(40); // пробовал от 10 мкс до мс if (Count > 0) { tempMessage=rx_bufferR[indexR]; MesComplite(tempMessage); //тут анализ каждого считанного байта. Это занимает время //поэтому и нужен буфер indexR++; if (indexR>=Max) indexR=0; //Значение Max одинаковое для чтения и записи. Может разные проба? cli(); // для надежности запрет прерывания Count--; sei(); //разрешение if (Count>=Max) Count=0; } } } ISR(USART_RXC_vect) { if (UCSRA & (1<<7)) { rx_buffer[indexW]=UDR; indexW++; if (indexW>=Max) indexW=0; Count++; if (Count>Max) Count=0; } } 1. Задержка нужна в цикле whole? У меня при нуле еще больше ошибок((( 2. Размеры 128 и 100 методом подбора? 3. Инкременты ++ ставить после команды? 4. запреты прерывания нужны? 5. If делаю на "равенство и больше". Верно? 6. Какие есть иные методы повышения надежности, кроме повторной отправки при ошибке?
-
Здравствуйте, на днях собрал ubs-usart на attiny2313 на макетной плате, всё работало. Припаял к плате - не работает. В диспетчере задач показывается, как Неизвестное устройство. В чём может быть проблема, контакты проверил тестером в режиме прозвонки, вроде не коротит ничего.