/** ****************************************************************************** * @file usart.c * @brief This file provides code for the configuration * of the USART instances. ****************************************************************************** * @attention * *

© Copyright (c) 2023 STMicroelectronics. * All rights reserved.

* * This software component is licensed by ST under BSD 3-Clause license, * the "License"; You may not use this file except in compliance with the * License. You may obtain a copy of the License at: * opensource.org/licenses/BSD-3-Clause * ****************************************************************************** */ /* Includes ------------------------------------------------------------------*/ #include "usart.h" #include "stdbool.h" #include "struct.h" /* USER CODE BEGIN 0 */ __IO bool UART_ERROR = 0; __IO bool TX_OK = 0, RX_OK = 0; const uint32_t BAUDRATE[] = {4800, 7200, 9600, 14400, 19200, 38400, 57600, 115200, 128000, 230400}; //uint32_t - если ставлю 16 то не работает!!!! extern __IO UserData_TypeDef currentData; extern uint8_t buff[16]; extern bool needSave; extern bool setbaud; extern uint16_t delayREDE; /* USER CODE END 0 */ UART_HandleTypeDef huart1; /* USART1 init function */ void MX_USART1_UART_Init(void) { /* USER CODE BEGIN USART1_Init 0 */ /* USER CODE END USART1_Init 0 */ /* USER CODE BEGIN USART1_Init 1 */ /* USER CODE END USART1_Init 1 */ huart1.Instance = USART1; huart1.Init.BaudRate = BAUDRATE[currentData.BAUD]; switch(currentData.INFB) { case 0: //NONE huart1.Init.WordLength = UART_WORDLENGTH_8B; huart1.Init.Parity = UART_PARITY_NONE; break; case 1: //ODD huart1.Init.WordLength = UART_WORDLENGTH_9B; huart1.Init.Parity = UART_PARITY_ODD; break; case 2: //EVEN huart1.Init.WordLength = UART_WORDLENGTH_9B; huart1.Init.Parity = UART_PARITY_EVEN; break; } //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(currentData.INFB < 9) huart1.Init.OverSampling = UART_OVERSAMPLING_16; else huart1.Init.OverSampling = UART_OVERSAMPLING_8; if (HAL_UART_Init(&huart1) != HAL_OK) { Error_Handler(); } /* todo: раскоментить заставить работать if(__HAL_UART_GET_FLAG(&huart1, UART_FLAG_ORE)) __HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_ORE); if(__HAL_UART_GET_FLAG(&huart1, UART_FLAG_PE)) __HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_PE); if(__HAL_UART_GET_FLAG(&huart1, UART_FLAG_FE)) __HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_FE); if(__HAL_UART_GET_FLAG(&huart1, UART_FLAG_NE)) __HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_NE); HAL_GPIO_WritePin(RE_GPIO_Port, RE_Pin, GPIO_PIN_RESET); SET_BIT(huart1.Instance->CR1, USART_CR1_RXNEIE | USART_CR1_PEIE); // разрешение прерываний по RENotEMPTY и ошибки четности */ /* USER CODE BEGIN USART1_Init 2 */ /* USER CODE END USART1_Init 2 */ } void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle) { GPIO_InitTypeDef GPIO_InitStruct = {0}; if(uartHandle->Instance==USART1) { /* USER CODE BEGIN USART1_MspInit 0 */ /* USER CODE END USART1_MspInit 0 */ /* USART1 clock enable */ __HAL_RCC_USART1_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); /**USART1 GPIO Configuration PA9 ------> USART1_TX PA10 ------> USART1_RX */ GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF7_USART1; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /* USER CODE BEGIN USART1_MspInit 1 */ HAL_NVIC_SetPriority(USART1_IRQn, 5, 0); HAL_NVIC_EnableIRQ(USART1_IRQn); /* USER CODE END USART1_MspInit 1 */ } } void HAL_UART_MspDeInit(UART_HandleTypeDef* uartHandle) { if(uartHandle->Instance==USART1) { /* USER CODE BEGIN USART1_MspDeInit 0 */ /* USER CODE END USART1_MspDeInit 0 */ /* Peripheral clock disable */ __HAL_RCC_USART1_CLK_DISABLE(); /**USART1 GPIO Configuration PA9 ------> USART1_TX PA10 ------> USART1_RX */ HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9|GPIO_PIN_10); /* USER CODE BEGIN USART1_MspDeInit 1 */ /* USER CODE END USART1_MspDeInit 1 */ } } void MX_USART1_UART_DeInit(void) { if(HAL_UART_DeInit(&huart1) != HAL_OK) { Error_Handler(); } HAL_NVIC_DisableIRQ(USART1_IRQn); } void USART1_IRQHandler(void) { HAL_UART_IRQHandler(&huart1); if(__HAL_UART_GET_FLAG(&huart1, UART_FLAG_ORE)) //jошибка переполнения __HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_ORE); if(__HAL_UART_GET_FLAG(&huart1, UART_FLAG_PE)) //ошибка четности __HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_PE); if(__HAL_UART_GET_FLAG(&huart1, UART_FLAG_FE)) //ошика кадра-пакета __HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_FE); if(__HAL_UART_GET_FLAG(&huart1, UART_FLAG_NE)) //ошибка шума __HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_NE); if(__HAL_UART_GET_FLAG(&huart1, UART_FLAG_NE)) //ошибка шума __HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_NE); } void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) { __IO uint16_t a; a = delayREDE; while(a) { a--; a++; a--; a++; a--; } if(setbaud) { setbaud = false; needSave = true; SetBaudRate(); } //__HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_TC); //HAL_GPIO_WritePin(RE_GPIO_Port, RE_Pin, GPIO_PIN_RESET); } void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { Receive_Complete(); HAL_UART_Receive_IT(&huart1, (uint8_t*)buff, 1); } void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart) { RX_OK = TX_OK = false; HAL_GPIO_WritePin(USART1_RE_GPIO_Port, USART1_RE_Pin, GPIO_PIN_RESET); UART_ERROR = true; //HAL_UART_Abort_IT(huart); //todo: отключил. При первом запуске влетал туда и отключал прерывания } /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/