Jump to content

Search the Community

Showing results for tags 'Usart'.



More search options

  • Search By Tags

    Type tags separated by commas.
  • Search By Author

Content Type


Forums

  • Вопрос-Ответ. Для начинающих
    • Песочница (Q&A)
    • Дайте схему!
    • Школьникам и студентам
    • Начинающим
    • Паяльник TV
    • Обсуждение материалов с сайта
    • Competition 2019
  • Радиоэлектроника для профессионалов
    • Световые эффекты и LED
    • Роботы и модели на ДУ-управлении
    • Автоматика
    • Самодельные устройства к компьютеру
    • Программное обеспечение
    • Автомобильная электроника
    • Системы охраны и наблюдения. Личная безопасность
    • Питание
    • Электрика
    • Промышленная электроника
    • Ремонт
    • Металлоискатели
    • Измерительная техника
    • Мастерская радиолюбителя
    • Сотовая связь
    • Спутниковое ТВ
    • КВ и УКВ радиосвязь
    • Жучки
    • Телефония и фрикинг
    • Высокое напряжение
    • Идеи и технологии будущего
    • Справочная радиоэлементов
    • Литература
    • Разное
  • Аудио
    • FAQ, Технологии и компоненты
    • Для начинающих
    • Источники звука
    • Предусилители, темброблоки, фильтры
    • Питание аудио аппаратуры
    • Усилители мощности
    • Акустические системы
    • Авто-аудио
    • Ламповая техника
    • Гитарное оборудование
    • Прочее
  • Микроконтроллеры
  • Товары и услуги
  • Разное
  • Переделки's ATX->ЛБП
  • Переделки's разные темы
  • Киловольты юмора's Юмор в youtube
  • Радиолюбительская доска объявлений exDIY's Надежность и группы продавцов

Blogs

There are no results to display.

There are no results to display.

Marker Groups

  • Пользователи форума

Find results in...

Find results that contain...


Date Created

  • Start

    End


Last Updated

  • Start

    End


Filter by number of...

Joined

  • Start

    End


Group


ICQ


Skype


Интересы


Город


Сфера радиоэлектроники


Оборудование

Found 18 results

  1. На схеме программатора USBasp заметил подключенные порты RXD и TXD к разъему, и появился вопрос, а для чего они там? Знаю, что при помощи них можно передавать и принимать данные через UART/USART между устройствами, а можно ли используюя USBasp передавать информацию по UART от МК к компьютеру и наоборот? И если можно, то как?
  2. Добрый день Проблема с оценочной платой STM32F4-DISCOVERY в части работы USART суть вопроса по USART шлется и принимается блоки данных по 3 байта (в принципе сколько угодно) при этом если подключен USB разъем ST-LINKа то все работает должным образом (данные снуют туда сюда без проблем), но при отключении USB ST-LINKа данные из платы STM32F4-DISCOVERY идут а вот принимать данные плата отказывается (естественно подаю внешнее питание +5 вольт на одноименный контакт). Если кто сталкивался с подобной проблемой прошу хотя бы направить в сторону железа или софта. На плате STM32F4-DISCOVERY убраны перемычки SB11(T_NRST) и SB12(T_SWO) а так же отпаян резистор R68 (MCO). Плата при этом прошивается без проблем, и стартует при внешнем питании(не от USB ST-LINKа) тоже без каких то заморочек. код прикладывать на данный момент не вижу смысла там все просто, при чем при подключении USB ST-LINKа программа работает. Проект пишется на IARe, конфигурация формируется в STM32Cube. Заранее спасибо за ответ
  3. LoKeR

    Stm32f1 usart

    Доброго времени суток, нашел хорошую статью Usart прием и отправка строки. Настроил на порт Usart3 перестал работать, попробовал на Usart2 перекинуть тоже не работает, как правильно переделать подскажите... stm32-uart-spl.rar
  4. Доброго времени суток. Решил пробудить свои скилы по написанию программ под 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) { } } }
  5. Помогите передать данные ADC по SMS. UART.zip
  6. Помогите пожалуйста разобраться, программа не работает. Есть задумка через bluetooth terminal на телефоне передавать команду(ноль или единицу) на bluetooth модуль HC-05, подключенный к atmega328p и таким образом управлять светодиодом. Но почему то светодиод не загорается. Соединил выходы bluetooth модуля и атмеги так: tx -> rx, rx -> tx, светодиод подключен к нулевому биту порта B(PB0). В чём может быть ошибка? question.txt question.txt
  7. Доброго времени суток, писал код обмен данных между двумя ардуинкой, отправляю из одной ардуинку "9" а из другого получаю фигню #include <SoftwareSerial.h> SoftwareSerial port(2, 3); // RX, TX int otp=9; void setup() { // put your setup code here, to run once: Serial.begin(9600); port.begin(9600); } void loop() { // put your main code here, to run repeatedly: port.println(otp); Serial.println(otp); delay(1000); } подскажите пожалуйста, где я ошибаюсь, или не тот делаю
  8. Добрый вечер. Решил недавно поиграться с микроконтроллерами, ибо были в загашнике такие платы: Ппробовал погонять данные по USART. В обычном режиме - все работает нормально, но вот с прерываниями - немного не получается. Я взял пример из стандартной библиотеки, скомпилил, залил и прерывание не срабатывает. #include <stm32f10x.h> #include <misc.h> volatile char received_string[MAX_STRLEN+1]; void Delay(__IO uint32_t nCount) { while(nCount--) { } } void init_USART1(uint32_t baudrate){ GPIO_InitTypeDef GPIO_InitStruct; USART_InitTypeDef USART_InitStruct; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStruct); GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStruct); USART_InitStruct.USART_BaudRate = baudrate; USART_InitStruct.USART_WordLength = USART_WordLength_8b; USART_InitStruct.USART_StopBits = USART_StopBits_1; USART_InitStruct.USART_Parity = USART_Parity_No; USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStruct.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; USART_Init(USART1, &USART_InitStruct); USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); USART_Cmd(USART1, ENABLE); } void USART_puts(USART_TypeDef* USARTx, volatile char *s){ while(*s){ while( !(USARTx->SR & 0x00000040) ); USART_SendData(USARTx, *s); *s++; } } int main(void) { init_USART1(9600); // initialize USART1 @ 9600 baud USART_puts(USART1, "Init complete! Hello World!\r\n"); // just send a message to indicate that it works while (1){ /* * You can do whatever you want in here */ } } void USART1_IRQHandler(void){ // check if the USART1 receive interrupt flag was set if( USART_GetITStatus(USART1, USART_IT_RXNE) ){ static uint8_t cnt = 0; // this counter is used to determine the string length char t = USART1->DR; // the character from the USART1 data register is saved in t // check if the received character is not the LF character (used to determine end of string) // or the if the maximum string length has been been reached if( (t != '\n') && (cnt < MAX_STRLEN) ){ received_string[cnt] = t; cnt++; } else{ // otherwise reset the character counter and print the received string cnt = 0; USART_puts(USART1, received_string); } } } Решил упростить задачу и поморгать светодиодом: void USART2_IRQHandler(void){ USART_ClearITPendingBit(USART2, USART_IT_TC); USART_ClearITPendingBit(USART2, USART_IT_RXNE); static uint8_t isSet = SET; GPIO_WriteBit(GPIOC , GPIO_Pin_13 , isSet); isSet = !isSet; } Оно в обработчик вообще не попадает. Подскажите, может что не так делаю? Отладчика пока нету, заказал - жду. Есть FTD USB-UART преобразователи, через них прошиваю и проверяю. А еще я в основной цикл добавил постоянную отправку строки, и оно таки прерывается, когда я шлю байт с компа, но в обработчик оно, походу, не попадает. Пробовал на USART2 - такая же фигня.
  9. Плата Sstm32f4discovery. Использую HAL. Стандартная инициализация не вырезана. Тактирование настраивается так: RCC_ClkInitTypeDef RCC_ClkInitStruct; RCC_OscInitTypeDef RCC_OscInitStruct; // Enable Power Control clock __PWR_CLK_ENABLE(); // The voltage scaling allows optimizing the power consumption when the // device is clocked below the maximum system frequency, to update the // voltage scaling value regarding system frequency refer to product // datasheet. __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); // Enable HSE Oscillator and activate PLL with HSE as source RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; // This assumes the HSE_VALUE is a multiple of 1MHz. If this is not // your case, you have to recompute these PLL constants. RCC_OscInitStruct.PLL.PLLM = (HSE_VALUE/1000000u); RCC_OscInitStruct.PLL.PLLN = 336; RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; RCC_OscInitStruct.PLL.PLLQ = 7; HAL_RCC_OscConfig(&RCC_OscInitStruct); // Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 // clocks dividers RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | 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; HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5); То есть тактируемтся от 16 MHz HSI, все делители - 1. Сам код передачи/приёма тоже HAL: #include <stm32f4xx_hal.h> UART_HandleTypeDef comp; uint8_t for_send[] = {0}; uint8_t for_receive[] = {1}; void init_led ( void ) { GPIO_InitTypeDef led; __HAL_RCC_GPIOD_CLK_ENABLE( ); led.Mode = GPIO_MODE_OUTPUT_PP; led.Pin = GPIO_PIN_14 | GPIO_PIN_15; led.Speed = GPIO_SPEED_LOW; led.Pull = GPIO_NOPULL; HAL_GPIO_Init( GPIOD, &led ); } void HAL_UART_MspInit ( UART_HandleTypeDef * huart ) { __HAL_RCC_USART1_CLK_ENABLE( ); __HAL_RCC_GPIOB_CLK_ENABLE( ); GPIO_InitTypeDef gpio; gpio.Mode = GPIO_MODE_AF_PP; gpio.Pin = GPIO_PIN_6 | GPIO_PIN_6; gpio.Pull = GPIO_PULLUP; gpio.Alternate = GPIO_AF7_USART1; gpio.Speed = GPIO_SPEED_MEDIUM; HAL_GPIO_Init( GPIOD, &gpio ); HAL_NVIC_EnableIRQ( USART1_IRQn ); } int main ( void ) { comp.Init.BaudRate = 9600; comp.Init.Mode = UART_MODE_TX_RX; comp.Init.HwFlowCtl = UART_HWCONTROL_NONE; comp.Init.WordLength = UART_WORDLENGTH_8B; comp.Init.OverSampling = UART_OVERSAMPLING_16; comp.Init.Parity = UART_PARITY_NONE; comp.Init.StopBits = UART_STOPBITS_1; comp.Instance = USART1; comp.State = 0; HAL_UART_Init( &comp ); __HAL_USART_ENABLE_IT( &comp, UART_IT_TXE ); __HAL_USART_ENABLE_IT( &comp, UART_IT_RXNE ); init_led( ); HAL_GPIO_WritePin( GPIOD, GPIO_PIN_15, SET ); while ( 1 ) { for( volatile int i = 0; i < 100000; i ++ ) { ; } HAL_GPIO_TogglePin( GPIOD, GPIO_PIN_14 ); } } void USART1_IRQHandler( void ) { if ( __HAL_UART_GET_FLAG( &comp, UART_FLAG_TXE ) ) { __HAL_UART_DISABLE_IT( &comp, UART_IT_TXE ); HAL_UART_Transmit( &comp, for_send, 1, 0 ); __HAL_UART_CLEAR_FLAG( &comp, UART_FLAG_TXE ); } if ( __HAL_UART_GET_FLAG( &comp, UART_FLAG_RXNE)) { __HAL_UART_DISABLE_IT( &comp, UART_FLAG_RXNE ); HAL_UART_Receive( &comp, for_receive, 1, 0 ); HAL_GPIO_WritePin( GPIOD, GPIO_PIN_15, RESET ); __HAL_UART_CLEAR_FLAG( &comp, UART_FLAG_RXNE ); } } Всё просто. Включаем передачу, приём. Передаём, в приёмнике забираем информацию и гасим включенный светодиод. ЗАходит в прерывание по TXE отправляет данные (Должны ли мы увидеть изменение регистра DR в отладчике, просто он остаётся пустой) Отослал, вышел из прерывания, начитает мигать светодиодом( просто как индикатор что схема работает). Но приёма не происходит. Все инициализации сверены с user_manual. По всему коду прошёлся с отладчиком, все биты HAL выставляет правильно. PB6 и PB7 просто перемычкой соединены.
  10. Доброго времени суток! Может кто-нибудь объяснить, в чём смысл и преимущества использования специализированных программаторов для STM32 типа ST-Link и клонов, работающих по интерфейсам SWD/JTAG, если записать флеш можно прямо по UART/ISP или быстрее по USB (при его наличии)? Я так понимаю, что программаторы, кроме записи в память, ещё умеют выполнять отладку - и это их единственное отличие. А если отладка не нужна? Вернее, часто ли она используется при написании каких-нибудь маленьких прикладных программ типа реле времени? Я собираюсь развести свою печатную плату для STM32F107, а потом хочется поэкспериментировать с STM32F407ZGT - в них в обоих есть USB интерфейс, они оба есть в списке поддерживаемых USB DFU (согласно AN 3156). Но на форуме я прочитал, что пока все сидят на дискавери, в основном из-за того, что в ней есть встроенный программатор ST-LINK прямо на плате, но почему его наличие так важно и не заменяется возможностью программирования по UART/ISP или по USB? Есть ли какое-либо отличие кроме возможности отладки? Может быть, как и в случае со фьюзами у AVR, у STM32 есть какие-то функции/настройки, которые можно использовать/изменять только программатором ST-LINK? И да, разве скорость программирования по USB будет существенно ниже, чем по тому же JTAG или SWD? Заранее спасибо за ответы! Заранее предупрежу, чот с микроконтроллерами я раньше работал, но вот от ST что-то более-менее делал только на STM32F030...
  11. Здравствуйте уважаемые любители МК) Пытаюсь организовать такую задачу на STM32f407VG: 1. Принимаем данные по USART, помещаем их во временный буфер( Recieve_buff). 2. Если попадается символ '+' читаем (Recieve_buff) и записываем данные после '+' в массив данных (massive). 3. Выводим данные на жки wh1602. с 1 и 3 пунктом проблем как бы нет, но вот со вторым вовсе не клеится. К примеру: отправляю +suprima, после 1, а то и 3 отправки приходит только один символ 's', т.е. и не каждый раз выводятся данные. Прошу помощи у Гуру сообщества. Всем Благ! #include "main.h" uint16_t delay_count=0; uint32_t i; uint32_t i3; int i2=123; char str1[50]; uint8_t massive[256]; // massive buffer uint8_t Recieve_buff[256]; // recieved buffer uint8_t Recieve_W=0, Recieve_R=0, Recieve_C=0; char Send_buffer[100]; uint8_t Send_count=0; void SysTick_Handler(void)// counter { if (delay_count > 0) { delay_count --; } } void(delay_ms(uint16_t delay_temp)) // schitayem nashe vremya, kotoroe zadano v osnovnom tele { delay_count = delay_temp; while(delay_count) {} } //---------------------------------------------------// //recieved data interrupt //---------------------------------------------------// void USART2_IRQHandler(void) { if(USART_GetITStatus(USART2, USART_IT_RXNE) == SET) // if flag interrupt set up we will do next... { USART_ClearITPendingBit(USART2, USART_IT_RXNE); // reset interrupt Recieve_buff[Recieve_W] =USART_ReceiveData(USART2); Recieve_W++; Recieve_C++; } } //---------------------------------------------------// int main(void) { USART2_init(); SystemCoreClockUpdate(); SysTick_Config(SystemCoreClock/1000);// 1ms delay_ms(50); LCD_ini(); while(1) { if(Recieve_C>0) { if(Recieve_buff[Recieve_R++]=='+') { massive[i3++]=Recieve_buff[Recieve_R++]; sprintf(str1, "%s", massive); //sprintf(str7, "%s %d %s", "one", i2, str); LCD_Send_String8(0,str1); } Recieve_C--; Recieve_R++; } } }
  12. Здравствуйте! Пытаюсь отправить слово с МК Avr attiny2313 через com port и выловить его программой, пока что просто программой "терминал". Прошу помощи! Почему присылаются какие-то арабские символы или что угодно, но не то, что я отсылаю? Сейчас я думаю дело в частоте, но как бы я ее точно не пытался откорректировать, все равно присылается какая-то белиберда. # define F_CPU 3993600UL #include <avr/io.h> #include <avr/iotn2313.h> #include <avr/interrupt.h> void USART_Transmit( unsigned char data ); void USART_Init (unsigned int baud); void USART_Init (unsigned int baud) { UBRRH = (unsigned char)(baud>>8); UBRRL = (unsigned char)baud; // 9600 UCSRB = (1<<RXEN)|(1<<TXEN); //|(1<<TXCIE)|(1<<UDRIE) UCSRC = (1<<USBS)|(1<<UCSZ0); //|(1<<UPM1)|(1<<UPM0) } void USART_Transmit( unsigned char data ) { while ( !(UCSRA & (1<<UDRE)) ); UDR = data; } int main(void) { //const unsigned int BAUDRATE = 9600; //const unsigned int BAUDDIVIDER = ((F_CPU/(16UL*BAUDRATE))-1); USART_Init(25); while(1) { USART_Transmit('h'); USART_Transmit('e'); USART_Transmit('l'); USART_Transmit('l'); USART_Transmit('o'); USART_Transmit('1'); USART_Transmit('2'); USART_Transmit(0x01); USART_Transmit(0x02); USART_Transmit(0x0A); USART_Transmit(0x0D); } }
  13. Доброго времени суток! Я по USART передаю цифру, например 5, ко второму МК. Также ко второму МК подключена кнопка и настроен он на прерывания от нее. В нем (втором МК) хочу сравнить данные пришедшие от первого МК и количество нажатий кнопки. И после их совпадения, подать логическую единицу или ноль на любую ножку, например PC1. МК - две восьмые Атмеги вот часть кода: \\данные из другого МК по USART i=UDR; i=5; int num0 = 0; \\вектор прерывания. который при срабатывании увеличивает num0 на один ISR( INT0_vect) { num0 ++; } \\ сам код без инициализации юсартов и векторов прерываний с ними все в порядке, проверял \\ проблема в самом коде или в векторе прерывания int main(void) { while(1) { if (num0 = i) { PORTC |= (1<<PC1); } } } не работает сравнение! Что делаю не так?
  14. Всем добрый день, с толкнулся с такой проблемой , что при написании кода для UART в протеусе симуляция не работает, то есть терминал вылазит, символы печатаю в терминале все отображается, но Микроконтроллер не реагирует на них, пробовал разные коды , с разных сайтов , если открыть готовый проект в протеусе то все работает , создаю свой проект либо исправляю готовый , на нужный мне МК , он перестает , работать , вот один из примеров кода /***************************************************** This program was produced by the CodeWizardAVR V2.05.0 Evaluation Automatic Program Generator © Copyright 1998-2010 Pavel Haiduc, HP InfoTech s.r.l. http://www.hpinfotech.com Project : RS485 Test Version : Date : 15.10.2014 Author : Brain Company : Comments: Chip type : ATmega8515 Program type : Application AVR Core Clock frequency: 8,000000 MHz Memory model : Small External RAM size : 0 Data Stack size : 128 *****************************************************/ #include <mega8515.h> // Standard Input/Output functions #include <stdio.h> char read; // Declare your global variables here void main(void) { DDRA=0xFF; DDRD=0x00; // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: Timer 0 Stopped // Mode: Normal top=0xFF // OC0 output: Disconnected TCCR0=0x00; TCNT0=0x00; OCR0=0x00; // Timer/Counter 1 initialization // Clock source: System Clock // Clock value: Timer1 Stopped // Mode: Normal top=0xFFFF // OC1A output: Discon. // OC1B output: Discon. // Noise Canceler: Off // Input Capture on Falling Edge // Timer1 Overflow Interrupt: Off // Input Capture Interrupt: Off // Compare A Match Interrupt: Off // Compare B Match Interrupt: Off TCCR1A=0x00; TCCR1B=0x00; TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; // External Interrupt(s) initialization // INT0: Off // INT1: Off // INT2: Off MCUCR=0x00; EMCUCR=0x00; // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x00; // USART initialization // Communication Parameters: 8 Data, 1 Stop, No Parity // USART Receiver: On // USART Transmitter: On // USART Mode: Asynchronous // USART Baud Rate: 9600 UCSRA=0x00; UCSRB=0x18; UCSRC=0x86; UBRRH=0x00; UBRRL=0x33; // Analog Comparator initialization // Analog Comparator: Off // Analog Comparator Input Capture by Timer/Counter 1: Off ACSR=0x80; // SPI initialization // SPI disabled SPCR=0x00; while (1) { // Place your code here read=getchar(); // if( read == 'A') PORTA.0 = 1; if( read == 'B') PORTA.0 = 0; if( read == 'C') PORTA.1 = 1; if( read == 'D') PORTA.1 = 0; if( read == 'E'){ PORTA.1 = 0; PORTA.0 = 1; } } }
  15. Доброго времени суток. Начнем! Есть ПК , есть atmega16 , есть переходник USB UART из аппаратуры это все. Написана программа дла работы с ком портом , которая отлично работает. ДАННЫЕ------->ПК------->переходник------->atmega16 в идеале загорается светодиод если данные пришли без потерь Но в том то и дело что данные приходят иногда не приходят иногда приходят с пятого, седьмого, пятнадцатого раза настройки соединения USART в atmega16 // USART initialization // Communication Parameters: 8 Data, 1 Stop, No Parity // USART Receiver: On // USART Transmitter: On // USART Mode: Asynchronous // USART Baud Rate: 9600 UCSRA=0x00; UCSRB=0xD8; UCSRC=0x86; UBRRH=0x00; UBRRL=0x33; Настройки в программе такиеже 8 дата 1 стоп NO PARity режим асинхронный есть предположение что нужно соединить общий провод на переходнике и atmega16 код приема данных // USART Receiver interrupt service routine interrupt [uSART_RXC] void usart_rx_isr(void) { char status,data; status=UCSRA; data=UDR; nomer_bita++; x[nomer_bita]=data; if(nomer_bita==5) { nomer_bita=0; } if((x[1]=='1') && (x[2]=='2') && (x[3]=='3') && (x[4]=='4') && (x[5]=='5')) { PORTA.7=1; } else { PORTA.7=0; } if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0) { rx_buffer[rx_wr_index++]=data; #if RX_BUFFER_SIZE == 256 // special case for receiver buffer size=256 if (++rx_counter == 0) { #else if (rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0; if (++rx_counter == RX_BUFFER_SIZE) { rx_counter=0; #endif rx_buffer_overflow=1; } } } внимание вопрос как избежать данного бага потери данных?
  16. Работает ли usart от внутреннего кварца? Прога передача параметра по usart от ПК к МК. Кварц внутренний использовал в tiny 2313 на 8 мГц скорость 9600. Параметр передать не удалось.
  17. Столкнулся с тем, что в некоторых даташитах на микроконтроллеры в таблицах, где указаны значения для определенных скоростей обмена есть ошибки. Программы для расчета в интеренете не нашел, а калькулятором не очень хотелось пользоваться... Пришлось программу написать свою. За одно добавил расчет значений для выбранной скорости обмена при различных значениях тактовой частоты - теперь удобно определиться с частотой кварца. http://www.vovka.sv19.com/CalcUART
  18. Добрый вечер! Накидал небольшую программку для того что бы передавать данные с USART0 на USART1 и наоборот, реализовал на Mega162. Весь смысл заключается в том, что мы смотрим в while за флагами RXC регистров UCSR0A и UCSR1A. Как только из него выходим тут же определяем в какой регистр пришли данные с помощью if и флага RXC, и выполняем условия оператора. Но вот беда если с ожиданием все в поряде, то вот со сравнением флагов - косяк, программа действует так как будто оба флага установлены в 1 и выполняет все подряд не взирая на условия. Всю голову себе сломал, ни как не догоняю что не так. #include <mega162.h> #include <stdio.h> void main(void) { unsigned char data; #pragma optsize- CLKPR=0x80; CLKPR=0x00; #ifdef _OPTIMIZE_SIZE_ #pragma optsize+ #endif PORTB=0x00; DDRB=0x01; PORTC=0x00; DDRC=0x07; PORTD=0x00; DDRD=0x04; UCSR0A=0x00; UCSR0B=0x18; UCSR0C=0x86; UBRR0H=0x00; UBRR0L=0x52; UCSR1A=0x00; UCSR1B=0x18; UCSR1C=0x86; UBRR1H=0x00; UBRR1L=0x52; ACSR=0x80; while (1) { PORTB=0x00; PORTD=0x00; while(((UCSR0A & 10000000)|(UCSR1A & 10000000))==0); if((UCSR0A & 10000000)==1); { PORTB=0x01; PORTC=0x02; data=UDR0; while ((UCSR1A & 100000)==0); UDR1=data; PORTB=0x00; PORTC=0x00; } if((UCSR1A & 10000000)==1); { PORTD=0x04; PORTC=0x04; data=UDR1; while ((UCSR0A & 100000)==0); UDR0=data; PORTD=0x00; PORTC=0x00; } } }
×
×
  • Create New...