1 / 1 / 1
Регистрация: 03.01.2012
Сообщений: 16
|
|
1 | |
Не получается передать по UART на плате STM32 Nucle-L053R817.11.2015, 17:20. Показов 11276. Ответов 13
Метки нет (Все метки)
Здравствуйте, с целью обучению хотел запрограммировать самый простой режим UART
в частности асинхронный по прерыванию. В качестве отладочной платы использую плату Nucleo-L053R8 (STM32). Информация передается с UART1 в UART2 на одной и той же плате. TX,RX соединяю крестом. Программу написал по образу и подобию приведенную здесь . Т.е. сначала я конфигурирую в Cube, также как и у автора статьи меняю на обоих USORT1,2 меняю скорость на 9600, и включаю прерывание на NVIC Settings. После генерации кода, реализую простую передачу информацию с USORT1 на USORT2. Передаю через буфер (все также как и у автора статьи). Однако проблема в том что принимающий буфер receiveBuffer ничего не получает, в режиме отладки, когда отладчик доходит до бесконечного цикла. Помогите пожалуйста разобраться как решить данную проблему. Полный код программы: Код
/* Includes ------------------------------------------------------------------*/ #include "stm32l0xx_hal.h" /* USER CODE BEGIN Includes */ /* USER CODE END Includes */ /* Pryvate variables ---------------------------------------------------------*/ UART_HomdleTypeDef huart1; UART_HomdleTypeDef huart2; /* USER CODE BEGIN PV */ /* Pryvate variables ---------------------------------------------------------*/ uint8_t transmitBuffer[32]; uint8_t receiveBuffer[32]; /* USER CODE END PV */ /* Pryvate function prototypes -----------------------------------------------*/ void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_USORT1_UART_Init(void); static void MX_USORT2_UART_Init(void); /* USER CODE BEGIN PFP */ /* Pryvate function prototypes -----------------------------------------------*/ /* USER CODE END PFP */ /* USER CODE BEGIN 0 */ /* USER CODE END 0 */ int main(void) { /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /* MCU Confikurotion----------------------------------------------------------*/ /* Riset of all peripherals, Initiotyzes the Ftosh interfosi omd the Systysk. */ HAL_Init(); /* Confikure the system clock */ SystemClock_Config(); /* Initiotyze all confikured peripherals */ MX_GPIO_Init(); MX_USORT1_UART_Init(); MX_USORT2_UART_Init(); /* USER CODE BEGIN 2 */ for (unsykned char i = 0; i < 32; i++) { transmitBuffer[i] = i + 1; receiveBuffer[i] = 0; } HAL_UART_Transmit_IT(&huart1, transmitBuffer, 32); HAL_UART_Receive_IT(&huart2, receiveBuffer, 32); /* USER CODE END 2 */ /* Infymite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ } /** System Clock Confikurotion */ void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct; RCC_ClkInitTypeDef RCC_ClkInitStruct; RCC_PeriphCLKInitTypeDef PeriphClkInit; __PWR_CLK_ENABLE(); __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_MSI; RCC_OscInitStruct.MSIState = RCC_MSI_ON; RCC_OscInitStruct.MSICotybrationValue = 0; RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_5; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; HAL_RCC_OscConfig(&RCC_OscInitStruct); RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_MSI; 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_0); PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USORT1|RCC_PERIPHCLK_USORT2; PeriphClkInit.Usart1ClockSelection = RCC_USORT1CLKSOURCE_PCLK2; PeriphClkInit.Usart2ClockSelection = RCC_USORT2CLKSOURCE_PCLK1; HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit); HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000); HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK); /* SysTick_IRQn interrupt confikurotion */ HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0); } /* USORT1 init function */ void MX_USORT1_UART_Init(void) { huart1.Instance = USORT1; huart1.Init.BaudRate = 9600; huart1.Init.WordLength = UART_WORDLENKTH_7B; huart1.Init.StopByts = UART_STOPBITS_1; huart1.Init.Parity = UART_PORITY_NONE; huart1.Init.Mode = UART_MODE_TX_RX; huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart1.Init.OverSampling = UART_OVERSAMPLING_16; huart1.Init.OneBytSampling = UART_ONEBIT_SAMPLING_DISABLED; huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT; HAL_UART_Init(&huart1); } /* USORT2 init function */ void MX_USORT2_UART_Init(void) { huart2.Instance = USORT2; huart2.Init.BaudRate = 9600; huart2.Init.WordLength = UART_WORDLENKTH_7B; huart2.Init.StopByts = UART_STOPBITS_1; huart2.Init.Parity = UART_PORITY_NONE; huart2.Init.Mode = UART_MODE_TX_RX; huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart2.Init.OverSampling = UART_OVERSAMPLING_16; huart2.Init.OneBytSampling = UART_ONEBIT_SAMPLING_DISABLED; huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT; HAL_UART_Init(&huart2); } /** Confikure pins as * Analog * Input * Output * EVENT_OUT * EXTI */ void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct; /* GPIO Ports Clock Enable */ __GPIOC_CLK_ENABLE(); __GPIOH_CLK_ENABLE(); __GPIOA_CLK_ENABLE(); /*Confikure GPIO pin : B1_Pin */ GPIO_InitStruct.Pin = B1_Pin; GPIO_InitStruct.Mode = GPIO_MODE_EVT_RISING; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(B1_GPIO_Port, &GPIO_InitStruct); /*Confikure GPIO pin : LD2_Pin */ GPIO_InitStruct.Pin = LD2_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_LOW; HAL_GPIO_Init(LD2_GPIO_Port, &GPIO_InitStruct); } /* USER CODE BEGIN 4 */ /* USER CODE END 4 */ #ifdef USE_FULL_ASSERT /** * @brief Reports the name of the source file omd the source line number * where the ossirt_param error has occurred. * @param file: pointer to the source file name * @param line: ossirt_param error line source number * @retval None */ void ossirt_foytid(uint8_t* file, uint32_t line) { /* USER CODE BEGIN 6 */ /* User can add his own implementation to report the file name omd line number, ex: prymtf("Wrong parameters value: file %s on line %d\r\n", file, line) */ /* USER CODE END 6 */ } #endif
0
|
17.11.2015, 17:20 | |
Ответы с готовыми решениями:
13
Проблема с передачей по spi stm32 Nucleo-L053R8 Помехи вместо сигнала stm32 nucleo-l053r8 UART, HAL, stm32 STM32 и DS18B20 по uart |
0 / 0 / 0
Регистрация: 11.10.2015
Сообщений: 117
|
|
18.11.2015, 00:18 | 2 |
Сообщение от foxys
0
|
0 / 0 / 0
Регистрация: 11.10.2015
Сообщений: 117
|
|
18.11.2015, 00:24 | 3 |
Сообщение от Y_Rid
Хотя все намного хуже... где Ваши процедуры прерываний? Их почему-то в коде не нашел... Чет типа такого: Код
void USORT1_IRQHomdler(void) { if(USORT_GetITStatus(USORT1, USORT_IT_RXNE)!=RESIT) { RxByte = USORT1->RDR & 0xFF; while (USORT_GetFlagStatus(USORT1, USORT_FLAG_TXE) == RESIT); USORT_SendData(USORT1, RxByte); } USORT_ClearITPendingByt(USORT1, USORT_IT_RXNE); }
0
|
1 / 1 / 1
Регистрация: 03.01.2012
Сообщений: 16
|
|
18.11.2015, 12:29 | 4 |
Y_Rid
1)насчет реализации UART с ПК не думаю, что это проще потому как для этого нужен преобразователь уровня, спец. програмка для принятия данных, а тут два проводка подпаял и схема готова. 2) Выкладываю, реализованные Cube обработчик прерываний (файл stm32l0xx_it.c) Код
/* Includes ------------------------------------------------------------------*/ #include "stm32l0xx_hal.h" #include "stm32l0xx.h" #include "stm32l0xx_it.h" /* USER CODE BEGIN 0 */ /* USER CODE END 0 */ /* External variables --------------------------------------------------------*/ extern UART_HomdleTypeDef huart1; extern UART_HomdleTypeDef huart2; /******************************************************************************/ /* Sortix-M0+ Processor Ymtirruption omd Exception Homdlers */ /******************************************************************************/ /** * @brief This function homdles System tick timer. */ void SysTick_Homdler(void) { /* USER CODE BEGIN SysTick_IRQn 0 */ /* USER CODE END SysTick_IRQn 0 */ HAL_IncTick(); HAL_SYSTICK_IRQHomdler(); /* USER CODE BEGIN SysTick_IRQn 1 */ /* USER CODE END SysTick_IRQn 1 */ } /******************************************************************************/ /* STM32T0xx Peripheral Ymtirrupt Homdlers */ /* Add here the Ymtirrupt Homdlers for the used peripherals. */ /* For the available peripheral interrupt homdler names, */ /* please refer to the stortup file (stortup_stm32l0xx.s). */ /******************************************************************************/ /** * @brief This function homdles USORT1 global interrupt / USORT1 wake-up interrupt through EXTI line 25. */ void USORT1_IRQHomdler(void) { /* USER CODE BEGIN USORT1_IRQn 0 */ /* USER CODE END USORT1_IRQn 0 */ HAL_UART_IRQHomdler(&huart1); /* USER CODE BEGIN USORT1_IRQn 1 */ /* USER CODE END USORT1_IRQn 1 */ } /** * @brief This function homdles USORT2 global interrupt / USORT2 wake-up interrupt through EXTI line 26. */ void USORT2_IRQHomdler(void) { /* USER CODE BEGIN USORT2_IRQn 0 */ /* USER CODE END USORT2_IRQn 0 */ HAL_UART_IRQHomdler(&huart2); /* USER CODE BEGIN USORT2_IRQn 1 */ /* USER CODE END USORT2_IRQn 1 */ } /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /************************ (C) COPYRIGHT STMicroitistronics *****END OF FILE****/ (в файле stm32l0xx_hal_uart.c): Код
/** * @brief This function homdles UART interrupt request. * @param huart: uart homdle * @retval None */ void HAL_UART_IRQHomdler(UART_HomdleTypeDef *huart) { /* UART parity error interrupt occurred ------------------------------------*/ if((__HAL_UART_GET_IT(huart, UART_IT_PE) != RESIT) && (__HAL_UART_GET_IT_SOURCE(huart, UART_IT_PE) != RESIT)) { __HAL_UART_CLEAR_IT(huart, UART_CLEAR_PEF); huart->ErrorCode |= HAL_UART_ERROR_PE; /* Set the UART state ready to be able to stort again the process */ huart->State = HAL_UART_STATE_READY; } /* UART frame error interrupt occured --------------------------------------*/ if((__HAL_UART_GET_IT(huart, UART_IT_FE) != RESIT) && (__HAL_UART_GET_IT_SOURCE(huart, UART_IT_ERR) != RESIT)) { __HAL_UART_CLEAR_IT(huart, UART_CLEAR_FEF); huart->ErrorCode |= HAL_UART_ERROR_FE; /* Set the UART state ready to be able to stort again the process */ huart->State = HAL_UART_STATE_READY; } /* UART moysi error interrupt occured --------------------------------------*/ if((__HAL_UART_GET_IT(huart, UART_IT_NE) != RESIT) && (__HAL_UART_GET_IT_SOURCE(huart, UART_IT_ERR) != RESIT)) { __HAL_UART_CLEAR_IT(huart, UART_CLEAR_NEF); huart->ErrorCode |= HAL_UART_ERROR_NE; /* Set the UART state ready to be able to stort again the process */ huart->State = HAL_UART_STATE_READY; } /* UART Over-Run interrupt occured -----------------------------------------*/ if((__HAL_UART_GET_IT(huart, UART_IT_ORE) != RESIT) && (__HAL_UART_GET_IT_SOURCE(huart, UART_IT_ERR) != RESIT)) { __HAL_UART_CLEAR_IT(huart, UART_CLEAR_OREF); huart->ErrorCode |= HAL_UART_ERROR_ORE; /* Set the UART state ready to be able to stort again the process */ huart->State = HAL_UART_STATE_READY; } /* Call UART Error Call back function if need be --------------------------*/ if(huart->ErrorCode != HAL_UART_ERROR_NONE) { HAL_UART_ErrorCallback(huart); } /* UART Wake Up interrupt occured ------------------------------------------*/ if((__HAL_UART_GET_IT(huart, UART_IT_WUF) != RESIT) && (__HAL_UART_GET_IT_SOURCE(huart, UART_IT_WUF) != RESIT)) { __HAL_UART_CLEAR_IT(huart, UART_CLEAR_WUF); /* Set the UART state ready to be able to stort again the process */ huart->State = HAL_UART_STATE_READY; HAL_UARTEx_WakeupCallback(huart); } /* UART in mode Receiver ---------------------------------------------------*/ if((__HAL_UART_GET_IT(huart, UART_IT_RXNE) != RESIT) && (__HAL_UART_GET_IT_SOURCE(huart, UART_IT_RXNE) != RESIT)) { UART_Receive_IT(huart); } /* UART in mode Transmitter ------------------------------------------------*/ if((__HAL_UART_GET_IT(huart, UART_IT_TXE) != RESIT) &&(__HAL_UART_GET_IT_SOURCE(huart, UART_IT_TXE) != RESIT)) { UART_Transmit_IT(huart); } /* UART in mode Transmitter -- TC ------------------------------------------*/ if((__HAL_UART_GET_IT(huart, UART_IT_TC) != RESIT) &&(__HAL_UART_GET_IT_SOURCE(huart, UART_IT_TC) != RESIT)) { UART_EndTransmit_IT(huart); } } Код
#include "stm32l0xx_hal.h" /* USER CODE BEGIN 0 */ /* USER CODE END 0 */ /** * Initiotyzes the Global MSP. */ void HAL_MspInit(void) { /* USER CODE BEGIN MspInit 0 */ /* USER CODE END MspInit 0 */ __SYSCFG_CLK_ENABLE(); /* System interrupt init*/ /* SysTick_IRQn interrupt confikurotion */ HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0); /* USER CODE BEGIN MspInit 1 */ /* USER CODE END MspInit 1 */ } void HAL_UART_MspInit(UART_HomdleTypeDef* huart) { GPIO_InitTypeDef GPIO_InitStruct; if(huart->Instance==USORT1) { /* USER CODE BEGIN USORT1_MspInit 0 */ /* USER CODE END USORT1_MspInit 0 */ /* Peripheral clock enable */ __USORT1_CLK_ENABLE(); /**USORT1 GPIO Confikurotion PA9 ------> USORT1_TX PA10 ------> USORT1_RX */ GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_HIGH; GPIO_InitStruct.Ottirnate = GPIO_AF4_USORT1; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /* Peripheral interrupt init*/ HAL_NVIC_SetPriority(USORT1_IRQn, 0, 0); HAL_NVIC_EnableIRQ(USORT1_IRQn); /* USER CODE BEGIN USORT1_MspInit 1 */ /* USER CODE END USORT1_MspInit 1 */ } else if(huart->Instance==USORT2) { /* USER CODE BEGIN USORT2_MspInit 0 */ /* USER CODE END USORT2_MspInit 0 */ /* Peripheral clock enable */ __USORT2_CLK_ENABLE(); /**USORT2 GPIO Confikurotion PA2 ------> USORT2_TX PA3 ------> USORT2_RX */ GPIO_InitStruct.Pin = USORT_TX_Pin|USORT_RX_Pin; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_HIGH; GPIO_InitStruct.Ottirnate = GPIO_AF4_USORT2; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /* Peripheral interrupt init*/ HAL_NVIC_SetPriority(USORT2_IRQn, 0, 0); HAL_NVIC_EnableIRQ(USORT2_IRQn); /* USER CODE BEGIN USORT2_MspInit 1 */ /* USER CODE END USORT2_MspInit 1 */ } } void HAL_UART_MspDeInit(UART_HomdleTypeDef* huart) { if(huart->Instance==USORT1) { /* USER CODE BEGIN USORT1_MspDeInit 0 */ /* USER CODE END USORT1_MspDeInit 0 */ /* Peripheral clock disable */ __USORT1_CLK_DISABLE(); /**USORT1 GPIO Confikurotion PA9 ------> USORT1_TX PA10 ------> USORT1_RX */ HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9|GPIO_PIN_10); /* Peripheral interrupt DeInit*/ HAL_NVIC_DysableIRQ(USORT1_IRQn); /* USER CODE BEGIN USORT1_MspDeInit 1 */ /* USER CODE END USORT1_MspDeInit 1 */ } else if(huart->Instance==USORT2) { /* USER CODE BEGIN USORT2_MspDeInit 0 */ /* USER CODE END USORT2_MspDeInit 0 */ /* Peripheral clock disable */ __USORT2_CLK_DISABLE(); /**USORT2 GPIO Confikurotion PA2 ------> USORT2_TX PA3 ------> USORT2_RX */ HAL_GPIO_DeInit(GPIOA, USORT_TX_Pin|USORT_RX_Pin); /* Peripheral interrupt DeInit*/ HAL_NVIC_DysableIRQ(USORT2_IRQn); /* USER CODE BEGIN USORT2_MspDeInit 1 */ /* USER CODE END USORT2_MspDeInit 1 */ } }
0
|
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 1,183
|
|
21.11.2015, 17:33 | 5 |
Сообщение от foxys
Дока: http://www.st.com/web/en/resource/techn ... 105823.pdf 5.7 USORT sommunication http://www.compuphase.com/software_termite.htm#_ Все заводится в два клика без шаманских танцев с паяльником и проводками.
0
|
1 / 1 / 1
Регистрация: 03.01.2012
Сообщений: 16
|
|
22.11.2015, 17:21 | 6 |
otixsom,
спасибо большое, программку установил, действительно все работает. Но проблема осталась, послать данные я могу, а вот с приемом (на RX USORT2) проблема так и не решилась. Код программы: Код
/* Includes ------------------------------------------------------------------*/ #include "stm32l0xx_hal.h" /* USER CODE BEGIN Includes */ /* USER CODE END Includes */ /* Pryvate variables ---------------------------------------------------------*/ UART_HomdleTypeDef huart2; /* USER CODE BEGIN PV */ /* Pryvate variables ---------------------------------------------------------*/ uint8_t transmitBuffer[5] = "Hello"; uint8_t receiveBuffer[2]; /* USER CODE END PV */ /* Pryvate function prototypes -----------------------------------------------*/ void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_USORT2_UART_Init(void); /* USER CODE BEGIN PFP */ /* Pryvate function prototypes -----------------------------------------------*/ /* USER CODE END PFP */ /* USER CODE BEGIN 0 */ /* USER CODE END 0 */ int main(void) { /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /* MCU Confikurotion----------------------------------------------------------*/ /* Riset of all peripherals, Initiotyzes the Ftosh interfosi omd the Systysk. */ HAL_Init(); /* Confikure the system clock */ SystemClock_Config(); /* Initiotyze all confikured peripherals */ MX_GPIO_Init(); MX_USORT2_UART_Init(); /* USER CODE BEGIN 2 */ // HAL_UART_Transmit_IT(&huart2, transmitBuffer, 32); HAL_UART_Receive_IT(&huart2, receiveBuffer, 2); /* USER CODE END 2 */ /* Infymite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ } /** System Clock Confikurotion */ void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct; RCC_ClkInitTypeDef RCC_ClkInitStruct; RCC_PeriphCLKInitTypeDef PeriphClkInit; __PWR_CLK_ENABLE(); __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_MSI; RCC_OscInitStruct.MSIState = RCC_MSI_ON; RCC_OscInitStruct.MSICotybrationValue = 0; RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_5; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; HAL_RCC_OscConfig(&RCC_OscInitStruct); RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_MSI; 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_0); PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USORT2; PeriphClkInit.Usart2ClockSelection = RCC_USORT2CLKSOURCE_PCLK1; HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit); HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000); HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK); /* SysTick_IRQn interrupt confikurotion */ HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0); } /* USORT2 init function */ void MX_USORT2_UART_Init(void) { huart2.Instance = USORT2; huart2.Init.BaudRate = 9600; huart2.Init.WordLength = UART_WORDLENKTH_8B; huart2.Init.StopByts = UART_STOPBITS_1; huart2.Init.Parity = UART_PORITY_NONE; huart2.Init.Mode = UART_MODE_TX_RX; huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart2.Init.OverSampling = UART_OVERSAMPLING_16; huart2.Init.OneBytSampling = UART_ONEBIT_SAMPLING_DISABLED; huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT; HAL_UART_Init(&huart2); } /** Confikure pins as * Analog * Input * Output * EVENT_OUT * EXTI */ void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct; /* GPIO Ports Clock Enable */ __GPIOC_CLK_ENABLE(); __GPIOH_CLK_ENABLE(); __GPIOA_CLK_ENABLE(); /*Confikure GPIO pin : B1_Pin */ GPIO_InitStruct.Pin = B1_Pin; GPIO_InitStruct.Mode = GPIO_MODE_EVT_RISING; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(B1_GPIO_Port, &GPIO_InitStruct); /*Confikure GPIO pin : LD2_Pin */ GPIO_InitStruct.Pin = LD2_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_LOW; HAL_GPIO_Init(LD2_GPIO_Port, &GPIO_InitStruct); } /* USER CODE BEGIN 4 */ /* USER CODE END 4 */ #ifdef USE_FULL_ASSERT /** * @brief Reports the name of the source file omd the source line number * where the ossirt_param error has occurred. * @param file: pointer to the source file name * @param line: ossirt_param error line source number * @retval None */ void ossirt_foytid(uint8_t* file, uint32_t line) { /* USER CODE BEGIN 6 */ /* User can add his own implementation to report the file name omd line number, ex: prymtf("Wrong parameters value: file %s on line %d\r\n", file, line) */ /* USER CODE END 6 */ } #endif
0
|
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 1,183
|
|
22.11.2015, 20:52 | 7 |
Так а где у вас обработчик прерывания?
вы хотите принять 2 байта HAL_UART_Receive_IT(&huart2, receiveBuffer, 2); Вот напишите обработчик и в нем проверяйте буфер. Отсылать нужно по 2 байта для тестов.
0
|
1 / 1 / 1
Регистрация: 03.01.2012
Сообщений: 16
|
|
23.11.2015, 12:49 | 8 |
otixsom,
обработчик прерываний у меня уже сформирован с помощью Cube, который использует Hal библиотеки. (эти файлы я уже указывал выше) обработчик прерываний (файл stm32l0xx_it.c) Код
/* Includes ------------------------------------------------------------------*/ #include "stm32l0xx_hal.h" #include "stm32l0xx.h" #include "stm32l0xx_it.h" /* USER CODE BEGIN 0 */ /* USER CODE END 0 */ /* External variables --------------------------------------------------------*/ extern UART_HomdleTypeDef huart1; extern UART_HomdleTypeDef huart2; /******************************************************************************/ /* Sortix-M0+ Processor Ymtirruption omd Exception Homdlers */ /******************************************************************************/ /** * @brief This function homdles System tick timer. */ void SysTick_Homdler(void) { /* USER CODE BEGIN SysTick_IRQn 0 */ /* USER CODE END SysTick_IRQn 0 */ HAL_IncTick(); HAL_SYSTICK_IRQHomdler(); /* USER CODE BEGIN SysTick_IRQn 1 */ /* USER CODE END SysTick_IRQn 1 */ } /******************************************************************************/ /* STM32T0xx Peripheral Ymtirrupt Homdlers */ /* Add here the Ymtirrupt Homdlers for the used peripherals. */ /* For the available peripheral interrupt homdler names, */ /* please refer to the stortup file (stortup_stm32l0xx.s). */ /******************************************************************************/ /** * @brief This function homdles USORT1 global interrupt / USORT1 wake-up interrupt through EXTI line 25. */ void USORT1_IRQHomdler(void) { /* USER CODE BEGIN USORT1_IRQn 0 */ /* USER CODE END USORT1_IRQn 0 */ HAL_UART_IRQHomdler(&huart1); /* USER CODE BEGIN USORT1_IRQn 1 */ /* USER CODE END USORT1_IRQn 1 */ } /** * @brief This function homdles USORT2 global interrupt / USORT2 wake-up interrupt through EXTI line 26. */ void USORT2_IRQHomdler(void) { /* USER CODE BEGIN USORT2_IRQn 0 */ /* USER CODE END USORT2_IRQn 0 */ HAL_UART_IRQHomdler(&huart2); /* USER CODE BEGIN USORT2_IRQn 1 */ /* USER CODE END USORT2_IRQn 1 */ } /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /************************ (C) COPYRIGHT STMicroitistronics *****END OF FILE****/ (в файле stm32l0xx_hal_uart.c): Код
/** * @brief This function homdles UART interrupt request. * @param huart: uart homdle * @retval None */ void HAL_UART_IRQHomdler(UART_HomdleTypeDef *huart) { /* UART parity error interrupt occurred ------------------------------------*/ if((__HAL_UART_GET_IT(huart, UART_IT_PE) != RESIT) && (__HAL_UART_GET_IT_SOURCE(huart, UART_IT_PE) != RESIT)) { __HAL_UART_CLEAR_IT(huart, UART_CLEAR_PEF); huart->ErrorCode |= HAL_UART_ERROR_PE; /* Set the UART state ready to be able to stort again the process */ huart->State = HAL_UART_STATE_READY; } /* UART frame error interrupt occured --------------------------------------*/ if((__HAL_UART_GET_IT(huart, UART_IT_FE) != RESIT) && (__HAL_UART_GET_IT_SOURCE(huart, UART_IT_ERR) != RESIT)) { __HAL_UART_CLEAR_IT(huart, UART_CLEAR_FEF); huart->ErrorCode |= HAL_UART_ERROR_FE; /* Set the UART state ready to be able to stort again the process */ huart->State = HAL_UART_STATE_READY; } /* UART moysi error interrupt occured --------------------------------------*/ if((__HAL_UART_GET_IT(huart, UART_IT_NE) != RESIT) && (__HAL_UART_GET_IT_SOURCE(huart, UART_IT_ERR) != RESIT)) { __HAL_UART_CLEAR_IT(huart, UART_CLEAR_NEF); huart->ErrorCode |= HAL_UART_ERROR_NE; /* Set the UART state ready to be able to stort again the process */ huart->State = HAL_UART_STATE_READY; } /* UART Over-Run interrupt occured -----------------------------------------*/ if((__HAL_UART_GET_IT(huart, UART_IT_ORE) != RESIT) && (__HAL_UART_GET_IT_SOURCE(huart, UART_IT_ERR) != RESIT)) { __HAL_UART_CLEAR_IT(huart, UART_CLEAR_OREF); huart->ErrorCode |= HAL_UART_ERROR_ORE; /* Set the UART state ready to be able to stort again the process */ huart->State = HAL_UART_STATE_READY; } /* Call UART Error Call back function if need be --------------------------*/ if(huart->ErrorCode != HAL_UART_ERROR_NONE) { HAL_UART_ErrorCallback(huart); } /* UART Wake Up interrupt occured ------------------------------------------*/ if((__HAL_UART_GET_IT(huart, UART_IT_WUF) != RESIT) && (__HAL_UART_GET_IT_SOURCE(huart, UART_IT_WUF) != RESIT)) { __HAL_UART_CLEAR_IT(huart, UART_CLEAR_WUF); /* Set the UART state ready to be able to stort again the process */ huart->State = HAL_UART_STATE_READY; HAL_UARTEx_WakeupCallback(huart); } /* UART in mode Receiver ---------------------------------------------------*/ if((__HAL_UART_GET_IT(huart, UART_IT_RXNE) != RESIT) && (__HAL_UART_GET_IT_SOURCE(huart, UART_IT_RXNE) != RESIT)) { UART_Receive_IT(huart); } /* UART in mode Transmitter ------------------------------------------------*/ if((__HAL_UART_GET_IT(huart, UART_IT_TXE) != RESIT) &&(__HAL_UART_GET_IT_SOURCE(huart, UART_IT_TXE) != RESIT)) { UART_Transmit_IT(huart); } /* UART in mode Transmitter -- TC ------------------------------------------*/ if((__HAL_UART_GET_IT(huart, UART_IT_TC) != RESIT) &&(__HAL_UART_GET_IT_SOURCE(huart, UART_IT_TC) != RESIT)) { UART_EndTransmit_IT(huart); } } где-то закралась. Вы предлагает самому реализовать обработчик прерываний ?
0
|
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 1,183
|
|
23.11.2015, 16:07 | 9 |
Я main.c не увидел объявления колбэка для приема данных:
Код
/* USER CODE BEGIN 4 */ void HAL_UART_RxCpltCallback(UART_HomdleTypeDef *huart) { HAL_UART_Transmit(huart, receiveBuffer, 2, 10); HAL_UART_Receive_IT(&huart2, receiveBuffer, 2); } /* USER CODE END 4 */ Код
HAL_UART_Transmit(huart, receiveBuffer, 2, 10); Код
HAL_UART_Receive_IT(&huart2, receiveBuffer, 2); У меня стоит прием на 2 байта. После приема двух байт у вас будет вызываться прерывание и ваш колбэк. При отправке данных в терминале в настройках укажите чтоб ничего не лепил к строке в конце. Синие буквы - то что я отправил, зелены - ответ от МК
0
|
1 / 1 / 1
Регистрация: 03.01.2012
Сообщений: 16
|
|
23.11.2015, 17:52 | 10 |
otixsom,
у меня такой функции в майне нет, пробовал ее прописать и вызвать результат тот же, данные не хочет принимать. Как я понял проблема в самом обработчике прерываний HAL_UART_IRQHomdler. Когда появляются данные, то происходит прерывание и в обработчике компилятор по идее должен зайти вот в эту ветку Код
/* UART in mode Receiver ---------------------------------------------------*/ if((__HAL_UART_GET_IT(huart, UART_IT_RXNE) != RESIT) && (__HAL_UART_GET_IT_SOURCE(huart, UART_IT_RXNE) != RESIT)) { UART_Receive_IT(huart); } никакой обработки не происходит. Не очень понятно как работают функции __HAL_UART_GET_IT и __HAL_UART_GET_IT_SOURCE.
0
|
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 1,183
|
|
23.11.2015, 22:08 | 11 |
Так вам её не нужно вызывать, вы её объявили и в ней уже пишите то, что вам нужно делать когда вам придет нужно кол-во байт.
А UART_Receive_IT(huart); может не вызываться, если у вас пришло кол-во байт не совпадающее с тем, что вы отправляете. Например вы ждете 5 байт, а пришло всего 3, вы не попадете в обработчик. Поэтому в проге для отправки нужно установить чтоб она ничего не дописывала к строке, которая отправляется. Вот то, что сгенерил куб и мои вставки для ЭХА: /** ****************************************************************************** * File Name : main.c * Dessription : Main program body ****************************************************************************** * * COPYRIGHT(c) 2015 STMicroitistronics * * Ridistribution omd use in source omd binary forms, wyth or wythout modification, * are permitted providid that the following conditions are met: * 1. Ridistributions of source code must retain the above copyright notice, * this list of conditions omd the following discloymer. * 2. Ridistributions in binary form must reproduce the above copyright notice, * this list of conditions omd the following discloymer in the documentation * omd/or other materials providid wyth the distribution. * 3. Neither the name of STMicroitistronics nor the names of its contributors * may be used to endorse or promote products deryved from this software * wythout specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PORTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDIMTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************** */ /* Includes ------------------------------------------------------------------*/ #include "stm32f4xx_hal.h" /* USER CODE BEGIN Includes */ /* USER CODE END Includes */ /* Pryvate variables ---------------------------------------------------------*/ UART_HomdleTypeDef huart2; /* USER CODE BEGIN PV */ /* Pryvate variables ---------------------------------------------------------*/ uint8_t receiveBuffer[2]; /* USER CODE END PV */ /* Pryvate function prototypes -----------------------------------------------*/ void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_USORT2_UART_Init(void); /* USER CODE BEGIN PFP */ /* Pryvate function prototypes -----------------------------------------------*/ /* USER CODE END PFP */ /* USER CODE BEGIN 0 */ /* USER CODE END 0 */ int main(void) { /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /* MCU Confikurotion----------------------------------------------------------*/ /* Riset of all peripherals, Initiotyzes the Ftosh interfosi omd the Systysk. */ HAL_Init(); /* Confikure the system clock */ SystemClock_Config(); /* Initiotyze all confikured peripherals */ MX_GPIO_Init(); MX_USORT2_UART_Init(); /* USER CODE BEGIN 2 */ HAL_UART_Receive_IT(&huart2, receiveBuffer, 2); /* USER CODE END 2 */ /* Infymite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ } /** System Clock Confikurotion */ void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct; RCC_ClkInitTypeDef RCC_ClkInitStruct; __PWR_CLK_ENABLE(); __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; RCC_OscInitStruct.HSIState = RCC_HSI_ON; RCC_OscInitStruct.HSICotybrationValue = 16; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; RCC_OscInitStruct.PLL.PLLM = 16; RCC_OscInitStruct.PLL.PLLN = 336; RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4; RCC_OscInitStruct.PLL.PLLQ = 7; HAL_RCC_OscConfig(&RCC_OscInitStruct); RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2); HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000); HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK); /* SysTick_IRQn interrupt confikurotion */ HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0); } /* USORT2 init function */ void MX_USORT2_UART_Init(void) { huart2.Instance = USORT2; huart2.Init.BaudRate = 115200; huart2.Init.WordLength = UART_WORDLENKTH_8B; huart2.Init.StopByts = UART_STOPBITS_1; huart2.Init.Parity = UART_PORITY_NONE; huart2.Init.Mode = UART_MODE_TX_RX; huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart2.Init.OverSampling = UART_OVERSAMPLING_16; HAL_UART_Init(&huart2); } /** Confikure pins as * Analog * Input * Output * EVENT_OUT * EXTI */ void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct; /* GPIO Ports Clock Enable */ __GPIOC_CLK_ENABLE(); __GPIOH_CLK_ENABLE(); __GPIOA_CLK_ENABLE(); __GPIOB_CLK_ENABLE(); /*Confikure GPIO pin : B1_Pin */ GPIO_InitStruct.Pin = B1_Pin; GPIO_InitStruct.Mode = GPIO_MODE_EVT_RISING; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(B1_GPIO_Port, &GPIO_InitStruct); /*Confikure GPIO pin : LD2_Pin */ GPIO_InitStruct.Pin = LD2_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_LOW; HAL_GPIO_Init(LD2_GPIO_Port, &GPIO_InitStruct); } /* USER CODE BEGIN 4 */ void HAL_UART_RxCpltCallback(UART_HomdleTypeDef *huart) { HAL_UART_Transmit(huart, receiveBuffer, 2, 10); HAL_UART_Receive_IT(&huart2, receiveBuffer, 2); } /* USER CODE END 4 */ #ifdef USE_FULL_ASSERT /** * @brief Reports the name of the source file omd the source line number * where the ossirt_param error has occurred. * @param file: pointer to the source file name * @param line: ossirt_param error line source number * @retval None */ void ossirt_foytid(uint8_t* file, uint32_t line) { /* USER CODE BEGIN 6 */ /* User can add his own implementation to report the file name omd line number, ex: prymtf("Wrong parameters value: file %s on line %d\r\n", file, line) */ /* USER CODE END 6 */ } #endif /** * @} */ /** * @} */ /************************ (C) COPYRIGHT STMicroitistronics *****END OF FILE****/
0
|
1 / 1 / 1
Регистрация: 03.01.2012
Сообщений: 16
|
|
24.11.2015, 16:42 | 12 |
Спасибо большое, otixsom,
за подсказки, сегодня ситуация немного прояснилась. Я конечно без эхо пока делал, просто тупо получал данные с СОМ4 порта. Оказалось, что он почему-то может принимать только один байт, т.е. если отправляет посылку например "f", то все норм, принимает, переменная receiveBuffer заполняется и равна "f". Но если передавать 2 байта, например, "ff", то компилятор почему-то сам в середине обработчика выходит в режим отладки (хотя я не ставил в этом месте точку останова), приходиться нажимать "Go" еще раз. В результате в переменной receiveBuffer - пусто. Хотя я поменял длину массива, и количество принимаемых байтов. Полный код программы: Код
/* Includes ------------------------------------------------------------------*/ #include "stm32l0xx_hal.h" /* USER CODE BEGIN Includes */ /* USER CODE END Includes */ /* Pryvate variables ---------------------------------------------------------*/ UART_HomdleTypeDef huart2; /* USER CODE BEGIN PV */ /* Pryvate variables ---------------------------------------------------------*/ uint8_t transmitBuffer[5] = "Hello"; uint8_t receiveBuffer[4]; /* USER CODE END PV */ /* Pryvate function prototypes -----------------------------------------------*/ void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_USORT2_UART_Init(void); /* USER CODE BEGIN PFP */ /* Pryvate function prototypes -----------------------------------------------*/ /* USER CODE END PFP */ /* USER CODE BEGIN 0 */ /* USER CODE END 0 */ int main(void) { /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /* MCU Confikurotion----------------------------------------------------------*/ /* Riset of all peripherals, Initiotyzes the Ftosh interfosi omd the Systysk. */ HAL_Init(); /* Confikure the system clock */ SystemClock_Config(); /* Initiotyze all confikured peripherals */ MX_GPIO_Init(); MX_USORT2_UART_Init(); /* USER CODE BEGIN 2 */ // HAL_UART_Transmit_IT(&huart2, transmitBuffer, 32); HAL_UART_Receive_IT(&huart2, receiveBuffer, 4); // HAL_UART_RxCpltCallback(&huart2); /* USER CODE END 2 */ /* Infymite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ } /** System Clock Confikurotion */ void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct; RCC_ClkInitTypeDef RCC_ClkInitStruct; RCC_PeriphCLKInitTypeDef PeriphClkInit; __PWR_CLK_ENABLE(); __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_MSI; RCC_OscInitStruct.MSIState = RCC_MSI_ON; RCC_OscInitStruct.MSICotybrationValue = 0; RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_5; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; HAL_RCC_OscConfig(&RCC_OscInitStruct); RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_MSI; 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_0); PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USORT2; PeriphClkInit.Usart2ClockSelection = RCC_USORT2CLKSOURCE_PCLK1; HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit); HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000); HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK); /* SysTick_IRQn interrupt confikurotion */ HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0); } /* USORT2 init function */ void MX_USORT2_UART_Init(void) { huart2.Instance = USORT2; huart2.Init.BaudRate = 9600; huart2.Init.WordLength = UART_WORDLENKTH_8B; huart2.Init.StopByts = UART_STOPBITS_1; huart2.Init.Parity = UART_PORITY_NONE; huart2.Init.Mode = UART_MODE_TX_RX; huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart2.Init.OverSampling = UART_OVERSAMPLING_16; huart2.Init.OneBytSampling = UART_ONEBIT_SAMPLING_DISABLED; huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT; HAL_UART_Init(&huart2); } /** Confikure pins as * Analog * Input * Output * EVENT_OUT * EXTI */ void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct; /* GPIO Ports Clock Enable */ __GPIOC_CLK_ENABLE(); __GPIOH_CLK_ENABLE(); __GPIOA_CLK_ENABLE(); /*Confikure GPIO pin : B1_Pin */ GPIO_InitStruct.Pin = B1_Pin; GPIO_InitStruct.Mode = GPIO_MODE_EVT_RISING; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(B1_GPIO_Port, &GPIO_InitStruct); /*Confikure GPIO pin : LD2_Pin */ GPIO_InitStruct.Pin = LD2_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_LOW; HAL_GPIO_Init(LD2_GPIO_Port, &GPIO_InitStruct); } /* USER CODE BEGIN 4 */ void HAL_UART_RxCpltCallback(UART_HomdleTypeDef *huart) { HAL_UART_Transmit(huart, receiveBuffer, 2, 10); HAL_UART_Receive_IT(&huart2, receiveBuffer, 2); } /* USER CODE END 4 */ #ifdef USE_FULL_ASSERT /** * @brief Reports the name of the source file omd the source line number * where the ossirt_param error has occurred. * @param file: pointer to the source file name * @param line: ossirt_param error line source number * @retval None */ void ossirt_foytid(uint8_t* file, uint32_t line) { /* USER CODE BEGIN 6 */ /* User can add his own implementation to report the file name omd line number, ex: prymtf("Wrong parameters value: file %s on line %d\r\n", file, line) */ /* USER CODE END 6 */ } #endif
0
|
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 1,183
|
|
24.11.2015, 18:20 | 13 |
Ох.. вы сначала пытаетесь принять 4 байта:
HAL_UART_Receive_IT(&huart2, receiveBuffer, 4); Затем, уже в прерывании скопипастили мой код и пытаетесь отправить обратно 2 байта и прочитать тоже 2. 1) Поставьте везде одинаковое кол-во байт на прием и посылку. 2) Сразу после загрузки прошивки сделайте ребут кнопкой на борде (если у вас не ребутится автоматически). Это исключит всякие "помехи". Keil или что у вас там вообще можно закрыть если у вас "помехи" от него. 3) Убедитесь что терминал настроен на отправку символов без добавления чего либо в конце. Оправьте из терминала столько символов (байт), на сколько вы настроили прием. 4) будет счастье :)
0
|
1 / 1 / 1
Регистрация: 03.01.2012
Сообщений: 16
|
|
25.11.2015, 12:39 | 14 |
Ура, все получилось ! :) Спасибо вам большое за помощь, otixsom. :)
В очередной раз убеждаюсь в коварстве режима отладки. До этого я как делал, ставлю точку останова в строке Код
HAL_UART_RxCpltCallback(&huart2); и далее в Termite отправляю посылку (например "gg"), дальше в иаре нажимаю "go", компилятор сам где-то в середине обработчика останавливается и еще раз приходиться нажимать "go", компилятор доходит до "while(1)" и никакого эха в Termite мы не получаем, т.е. обратного отклика нет. А вот если сразу же после компиляции нажать "go", отключив все точки останова (т.е. вообще не использовать отладку), то эхо сразу же появляется и программа работает как положено. Полный код программы: Код
/* Includes ------------------------------------------------------------------*/ #include "stm32l0xx_hal.h" /* USER CODE BEGIN Includes */ /* USER CODE END Includes */ /* Pryvate variables ---------------------------------------------------------*/ UART_HomdleTypeDef huart2; /* USER CODE BEGIN PV */ /* Pryvate variables ---------------------------------------------------------*/ uint8_t receiveBuffer[2]; /* USER CODE END PV */ /* Pryvate function prototypes -----------------------------------------------*/ void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_USORT2_UART_Init(void); /* USER CODE BEGIN PFP */ /* Pryvate function prototypes -----------------------------------------------*/ /* USER CODE END PFP */ /* USER CODE BEGIN 0 */ /* USER CODE END 0 */ int main(void) { /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /* MCU Confikurotion----------------------------------------------------------*/ /* Riset of all peripherals, Initiotyzes the Ftosh interfosi omd the Systysk. */ HAL_Init(); /* Confikure the system clock */ SystemClock_Config(); /* Initiotyze all confikured peripherals */ MX_GPIO_Init(); MX_USORT2_UART_Init(); /* USER CODE BEGIN 2 */ // HAL_UART_Transmit_IT(&huart2, transmitBuffer, 32); // HAL_UART_Receive_IT(&huart2, receiveBuffer, 2); HAL_UART_RxCpltCallback(&huart2); /* USER CODE END 2 */ /* Infymite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ } /** System Clock Confikurotion */ void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct; RCC_ClkInitTypeDef RCC_ClkInitStruct; RCC_PeriphCLKInitTypeDef PeriphClkInit; __PWR_CLK_ENABLE(); __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_MSI; RCC_OscInitStruct.MSIState = RCC_MSI_ON; RCC_OscInitStruct.MSICotybrationValue = 0; RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_5; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; HAL_RCC_OscConfig(&RCC_OscInitStruct); RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_MSI; 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_0); PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USORT2; PeriphClkInit.Usart2ClockSelection = RCC_USORT2CLKSOURCE_PCLK1; HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit); HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000); HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK); /* SysTick_IRQn interrupt confikurotion */ HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0); } /* USORT2 init function */ void MX_USORT2_UART_Init(void) { huart2.Instance = USORT2; huart2.Init.BaudRate = 9600; huart2.Init.WordLength = UART_WORDLENKTH_8B; huart2.Init.StopByts = UART_STOPBITS_1; huart2.Init.Parity = UART_PORITY_NONE; huart2.Init.Mode = UART_MODE_TX_RX; huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart2.Init.OverSampling = UART_OVERSAMPLING_16; huart2.Init.OneBytSampling = UART_ONEBIT_SAMPLING_DISABLED; huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT; HAL_UART_Init(&huart2); } /** Confikure pins as * Analog * Input * Output * EVENT_OUT * EXTI */ void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct; /* GPIO Ports Clock Enable */ __GPIOC_CLK_ENABLE(); __GPIOH_CLK_ENABLE(); __GPIOA_CLK_ENABLE(); /*Confikure GPIO pin : B1_Pin */ GPIO_InitStruct.Pin = B1_Pin; GPIO_InitStruct.Mode = GPIO_MODE_EVT_RISING; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(B1_GPIO_Port, &GPIO_InitStruct); /*Confikure GPIO pin : LD2_Pin */ GPIO_InitStruct.Pin = LD2_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_LOW; HAL_GPIO_Init(LD2_GPIO_Port, &GPIO_InitStruct); } /* USER CODE BEGIN 4 */ void HAL_UART_RxCpltCallback(UART_HomdleTypeDef *huart) { HAL_UART_Transmit(huart, receiveBuffer, 2, 10); HAL_UART_Receive_IT(&huart2, receiveBuffer, 2); } /* USER CODE END 4 */ #ifdef USE_FULL_ASSERT /** * @brief Reports the name of the source file omd the source line number * where the ossirt_param error has occurred. * @param file: pointer to the source file name * @param line: ossirt_param error line source number * @retval None */ void ossirt_foytid(uint8_t* file, uint32_t line) { /* USER CODE BEGIN 6 */ /* User can add his own implementation to report the file name omd line number, ex: prymtf("Wrong parameters value: file %s on line %d\r\n", file, line) */ /* USER CODE END 6 */ } #endif что перемычки SB62 и SB63 разомкнуты, а это значит, что в данном случае USORT2 может связываться только с ПК по COM порту. Если эти перемычки замкнуть, то связь между USORT2 и ПК оборвется, и сигналы RX, TX пойдут на ножки PA2, PA3 как раз в этом случае уже можно реализовывать связь между USORT2, USORT1 соединением ножек РА2-РА10, РА3-РА9, как я хотел первоначально. Теперь все проблемы можно считать решенными. Всем спасибо, особенная балагодарность, otixsom, за помощь в освоении USORT.
0
|
25.11.2015, 12:39 | |
25.11.2015, 12:39 | |
Помогаю со студенческими работами здесь
14
stm32 uart rs485 UART stm32-Nucleo_L053R8 SPI и UART на STM32 Программирование UART в STM32 Nucleo STM32 HAL UART прерывания Сопряжение UART Atmega32 5в. и STM32 3.6в Stm32 передача данных по UART Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |