mirror of
https://gitea.ecohim.ru:3000/RS485_Relay/RS485_Relay2_fw.git
synced 2025-08-07 16:20:30 +03:00
RS485 UART переделал на DMA по образцу HVD4
This commit is contained in:
16
.mxproject
16
.mxproject
@@ -9,17 +9,17 @@ CDefines=USE_HAL_DRIVER;STM32F030x6;USE_HAL_DRIVER;USE_HAL_DRIVER;
|
|||||||
[PreviousGenFiles]
|
[PreviousGenFiles]
|
||||||
AdvancedFolderStructure=true
|
AdvancedFolderStructure=true
|
||||||
HeaderFileListSize=3
|
HeaderFileListSize=3
|
||||||
HeaderFiles#0=Y:/Projects_Eagle/Ecros/RS485_Relay_V1R1/STM32/Relay_RS485/Core/Inc/stm32f0xx_it.h
|
HeaderFiles#0=..\Core\Inc\stm32f0xx_it.h
|
||||||
HeaderFiles#1=Y:/Projects_Eagle/Ecros/RS485_Relay_V1R1/STM32/Relay_RS485/Core/Inc/stm32f0xx_hal_conf.h
|
HeaderFiles#1=..\Core\Inc\stm32f0xx_hal_conf.h
|
||||||
HeaderFiles#2=Y:/Projects_Eagle/Ecros/RS485_Relay_V1R1/STM32/Relay_RS485/Core/Inc/main.h
|
HeaderFiles#2=..\Core\Inc\main.h
|
||||||
HeaderFolderListSize=1
|
HeaderFolderListSize=1
|
||||||
HeaderPath#0=Y:/Projects_Eagle/Ecros/RS485_Relay_V1R1/STM32/Relay_RS485/Core/Inc
|
HeaderPath#0=..\Core\Inc
|
||||||
HeaderFiles=;
|
HeaderFiles=;
|
||||||
SourceFileListSize=3
|
SourceFileListSize=3
|
||||||
SourceFiles#0=Y:/Projects_Eagle/Ecros/RS485_Relay_V1R1/STM32/Relay_RS485/Core/Src/stm32f0xx_it.c
|
SourceFiles#0=..\Core\Src\stm32f0xx_it.c
|
||||||
SourceFiles#1=Y:/Projects_Eagle/Ecros/RS485_Relay_V1R1/STM32/Relay_RS485/Core/Src/stm32f0xx_hal_msp.c
|
SourceFiles#1=..\Core\Src\stm32f0xx_hal_msp.c
|
||||||
SourceFiles#2=Y:/Projects_Eagle/Ecros/RS485_Relay_V1R1/STM32/Relay_RS485/Core/Src/main.c
|
SourceFiles#2=..\Core\Src\main.c
|
||||||
SourceFolderListSize=1
|
SourceFolderListSize=1
|
||||||
SourcePath#0=Y:/Projects_Eagle/Ecros/RS485_Relay_V1R1/STM32/Relay_RS485/Core/Src
|
SourcePath#0=..\Core\Src
|
||||||
SourceFiles=;
|
SourceFiles=;
|
||||||
|
|
||||||
|
@@ -13,6 +13,6 @@
|
|||||||
#define REL_AUX_BIT (1u<<1)
|
#define REL_AUX_BIT (1u<<1)
|
||||||
|
|
||||||
void loop_iterate();
|
void loop_iterate();
|
||||||
|
void timer1_ovf_isr(void);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@@ -24,7 +24,7 @@ enum send_state {SEND_IDLE, SEND_BUSY};
|
|||||||
|
|
||||||
void UART_RxCpltCallback(void);
|
void UART_RxCpltCallback(void);
|
||||||
void UART_TxCpltCallback(void);
|
void UART_TxCpltCallback(void);
|
||||||
|
void process_incoming_packet();
|
||||||
void modbus_loop_iterate();
|
void modbus_loop_iterate();
|
||||||
uint8_t read_register(uint16_t address, uint16_t* value);
|
uint8_t read_register(uint16_t address, uint16_t* value);
|
||||||
uint8_t write_register(uint16_t address, uint16_t value);
|
uint8_t write_register(uint16_t address, uint16_t value);
|
||||||
|
@@ -51,6 +51,7 @@ void HardFault_Handler(void);
|
|||||||
void SVC_Handler(void);
|
void SVC_Handler(void);
|
||||||
void PendSV_Handler(void);
|
void PendSV_Handler(void);
|
||||||
void SysTick_Handler(void);
|
void SysTick_Handler(void);
|
||||||
|
void DMA1_Channel2_3_IRQHandler(void);
|
||||||
void TIM1_BRK_UP_TRG_COM_IRQHandler(void);
|
void TIM1_BRK_UP_TRG_COM_IRQHandler(void);
|
||||||
void TIM1_CC_IRQHandler(void);
|
void TIM1_CC_IRQHandler(void);
|
||||||
void USART1_IRQHandler(void);
|
void USART1_IRQHandler(void);
|
||||||
|
@@ -1,13 +0,0 @@
|
|||||||
#ifndef __UART_H
|
|
||||||
#define __UART_H
|
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
#define RET_OK 0
|
|
||||||
#define RET_OVERFLOW 1
|
|
||||||
#define RET_TIMEOUT 2
|
|
||||||
|
|
||||||
uint8_t UART_Transmit_IT(uint8_t * data, uint16_t len, uint16_t timeout);
|
|
||||||
uint8_t UART_Receive_IT(uint8_t * data, uint16_t len, uint16_t timeout);
|
|
||||||
extern void UART_TxCpltCallback(void);
|
|
||||||
extern void UART_RxCpltCallback(void);
|
|
||||||
#endif
|
|
@@ -47,6 +47,8 @@ TIM_HandleTypeDef htim1;
|
|||||||
TIM_HandleTypeDef htim3;
|
TIM_HandleTypeDef htim3;
|
||||||
|
|
||||||
UART_HandleTypeDef huart1;
|
UART_HandleTypeDef huart1;
|
||||||
|
DMA_HandleTypeDef hdma_usart1_rx;
|
||||||
|
DMA_HandleTypeDef hdma_usart1_tx;
|
||||||
|
|
||||||
/* USER CODE BEGIN PV */
|
/* USER CODE BEGIN PV */
|
||||||
|
|
||||||
@@ -55,6 +57,7 @@ UART_HandleTypeDef huart1;
|
|||||||
/* Private function prototypes -----------------------------------------------*/
|
/* Private function prototypes -----------------------------------------------*/
|
||||||
void SystemClock_Config(void);
|
void SystemClock_Config(void);
|
||||||
static void MX_GPIO_Init(void);
|
static void MX_GPIO_Init(void);
|
||||||
|
static void MX_DMA_Init(void);
|
||||||
static void MX_TIM3_Init(void);
|
static void MX_TIM3_Init(void);
|
||||||
static void MX_USART1_UART_Init(void);
|
static void MX_USART1_UART_Init(void);
|
||||||
static void MX_TIM1_Init(void);
|
static void MX_TIM1_Init(void);
|
||||||
@@ -95,11 +98,11 @@ int main(void)
|
|||||||
|
|
||||||
/* Initialize all configured peripherals */
|
/* Initialize all configured peripherals */
|
||||||
MX_GPIO_Init();
|
MX_GPIO_Init();
|
||||||
|
MX_DMA_Init();
|
||||||
MX_TIM3_Init();
|
MX_TIM3_Init();
|
||||||
MX_USART1_UART_Init();
|
MX_USART1_UART_Init();
|
||||||
MX_TIM1_Init();
|
MX_TIM1_Init();
|
||||||
/* USER CODE BEGIN 2 */
|
/* USER CODE BEGIN 2 */
|
||||||
__HAL_UART_ENABLE_IT(&huart1, UART_IT_RXNE); // включить прерывания usart'a
|
|
||||||
HAL_TIM_Base_Start_IT(&htim1);
|
HAL_TIM_Base_Start_IT(&htim1);
|
||||||
|
|
||||||
/* USER CODE END 2 */
|
/* USER CODE END 2 */
|
||||||
@@ -290,6 +293,22 @@ static void MX_USART1_UART_Init(void)
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enable DMA controller clock
|
||||||
|
*/
|
||||||
|
static void MX_DMA_Init(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
/* DMA controller clock enable */
|
||||||
|
__HAL_RCC_DMA1_CLK_ENABLE();
|
||||||
|
|
||||||
|
/* DMA interrupt init */
|
||||||
|
/* DMA1_Channel2_3_IRQn interrupt configuration */
|
||||||
|
HAL_NVIC_SetPriority(DMA1_Channel2_3_IRQn, 2, 0);
|
||||||
|
HAL_NVIC_EnableIRQ(DMA1_Channel2_3_IRQn);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief GPIO Initialization Function
|
* @brief GPIO Initialization Function
|
||||||
* @param None
|
* @param None
|
||||||
|
@@ -6,11 +6,13 @@
|
|||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include "main.h"
|
#include "main.h"
|
||||||
#include "uart.h"
|
|
||||||
#include "modbus_logic.h"
|
#include "modbus_logic.h"
|
||||||
|
|
||||||
volatile uint8_t recv_buffer[BUFFERS_SIZE];
|
extern UART_HandleTypeDef huart1;
|
||||||
volatile uint8_t send_buffer[BUFFERS_SIZE];
|
extern DMA_HandleTypeDef hdma_usart1_rx;
|
||||||
|
|
||||||
|
uint8_t recv_buffer[BUFFERS_SIZE];
|
||||||
|
uint8_t send_buffer[BUFFERS_SIZE];
|
||||||
|
|
||||||
uint16_t bytes_to_send = 0;
|
uint16_t bytes_to_send = 0;
|
||||||
uint16_t last_rx_time = 0xFFFF;
|
uint16_t last_rx_time = 0xFFFF;
|
||||||
@@ -19,37 +21,37 @@ enum send_state cmd_sending = SEND_IDLE;
|
|||||||
uint16_t tranfer_errors_count;
|
uint16_t tranfer_errors_count;
|
||||||
extern uint16_t led_time_act;
|
extern uint16_t led_time_act;
|
||||||
|
|
||||||
static void process_incoming_packet();
|
void process_incoming_packet();
|
||||||
|
|
||||||
void UART_RxCpltCallback(void)
|
#define TXEN_ON HAL_GPIO_WritePin(TXEN_GPIO_Port, TXEN_Pin, GPIO_PIN_SET)
|
||||||
|
#define TXEN_OFF HAL_GPIO_WritePin(TXEN_GPIO_Port, TXEN_Pin, GPIO_PIN_RESET)
|
||||||
|
|
||||||
|
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
|
||||||
{
|
{
|
||||||
uint16_t pdu_size;
|
if (huart->Instance == USART1)
|
||||||
uint16_t remaining_size;
|
|
||||||
if (cmd_receiving == RECV_READ_HEADER)
|
|
||||||
{
|
{
|
||||||
// Check destination address
|
|
||||||
if (recv_buffer[5] != BOARD_ADRESS)
|
if (recv_buffer[5] != BOARD_ADRESS)
|
||||||
{
|
{
|
||||||
cmd_receiving = RECV_ERROR;
|
cmd_receiving = RECV_ERROR;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check function code
|
// Check function code
|
||||||
if (recv_buffer[6] == 3 || recv_buffer[6] == 4 || recv_buffer[6] == 6)
|
if (recv_buffer[6] == 3 || recv_buffer[6] == 4 || recv_buffer[6] == 6)
|
||||||
{
|
{
|
||||||
cmd_receiving = RECV_READ_COMPLETE;
|
if(Size==MODBUS_HEADER_SIZE)cmd_receiving = RECV_READ_COMPLETE;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
else if (recv_buffer[6] == 0x10)
|
else if (recv_buffer[6] == 0x10)
|
||||||
{
|
{
|
||||||
cmd_receiving = RECV_READ_DATA;
|
uint16_t pdu_size = *((uint16_t*)(recv_buffer + 2));
|
||||||
pdu_size = *((uint16_t*)(recv_buffer + 2));
|
uint16_t remaining_size = pdu_size - (MODBUS_HEADER_SIZE - 4) + 2;
|
||||||
// Receive remaining PDU and checksum
|
if (remaining_size + MODBUS_HEADER_SIZE == Size)
|
||||||
remaining_size = pdu_size - (MODBUS_HEADER_SIZE - 4) + 2;
|
cmd_receiving = RECV_READ_COMPLETE;
|
||||||
if (remaining_size + MODBUS_HEADER_SIZE <= BUFFERS_SIZE)
|
|
||||||
UART_Receive_IT(recv_buffer + MODBUS_HEADER_SIZE, remaining_size, 5000);
|
|
||||||
else
|
else
|
||||||
|
{
|
||||||
|
cmd_receiving = RECV_ERROR;
|
||||||
tranfer_errors_count++;
|
tranfer_errors_count++;
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -59,15 +61,16 @@ void UART_RxCpltCallback(void)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (cmd_receiving == RECV_READ_DATA)
|
|
||||||
{
|
|
||||||
cmd_receiving = RECV_READ_COMPLETE;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void UART_TxCpltCallback()
|
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
|
||||||
{
|
{
|
||||||
|
if (huart->Instance == USART1)
|
||||||
|
{
|
||||||
cmd_sending = SEND_IDLE;
|
cmd_sending = SEND_IDLE;
|
||||||
|
TXEN_OFF;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void modbus_loop_iterate()
|
void modbus_loop_iterate()
|
||||||
@@ -76,19 +79,22 @@ void modbus_loop_iterate()
|
|||||||
{
|
{
|
||||||
if (cmd_receiving == RECV_ERROR)
|
if (cmd_receiving == RECV_ERROR)
|
||||||
{
|
{
|
||||||
//delay_ms(30); // poor man's way to synchronize packets
|
// poor man's way to synchronize packets
|
||||||
if(last_rx_time>=BUS_IDLE_TIME)
|
//if(last_rx_time>=BUS_IDLE_TIME)
|
||||||
{
|
//{
|
||||||
cmd_receiving = RECV_IDLE;
|
cmd_receiving = RECV_IDLE;
|
||||||
//TXEN_485 = 1;
|
//TXEN_485 = 1;
|
||||||
//delay_us(10);
|
//delay_us(10);
|
||||||
//TXEN_485 = 0;
|
//TXEN_485 = 0;
|
||||||
}
|
//}
|
||||||
}
|
}
|
||||||
if (cmd_receiving == RECV_IDLE)
|
if (cmd_receiving == RECV_IDLE)
|
||||||
|
{
|
||||||
|
if(HAL_UARTEx_ReceiveToIdle_DMA(&huart1, recv_buffer, BUFFERS_SIZE)==HAL_OK)
|
||||||
{
|
{
|
||||||
cmd_receiving = RECV_READ_HEADER;
|
cmd_receiving = RECV_READ_HEADER;
|
||||||
UART_Receive_IT(recv_buffer, MODBUS_HEADER_SIZE, 5000);
|
__HAL_DMA_DISABLE_IT(&hdma_usart1_rx, DMA_IT_HT);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (cmd_receiving == RECV_READ_COMPLETE)
|
else if (cmd_receiving == RECV_READ_COMPLETE)
|
||||||
{
|
{
|
||||||
@@ -98,7 +104,8 @@ void modbus_loop_iterate()
|
|||||||
}
|
}
|
||||||
else if (cmd_sending == SEND_BUSY && bytes_to_send != 0)
|
else if (cmd_sending == SEND_BUSY && bytes_to_send != 0)
|
||||||
{
|
{
|
||||||
UART_Transmit_IT(send_buffer, bytes_to_send, 1000);
|
TXEN_ON;
|
||||||
|
HAL_UART_Transmit_DMA(&huart1, send_buffer, bytes_to_send);
|
||||||
bytes_to_send = 0;
|
bytes_to_send = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -23,6 +23,9 @@
|
|||||||
/* USER CODE BEGIN Includes */
|
/* USER CODE BEGIN Includes */
|
||||||
|
|
||||||
/* USER CODE END Includes */
|
/* USER CODE END Includes */
|
||||||
|
extern DMA_HandleTypeDef hdma_usart1_rx;
|
||||||
|
|
||||||
|
extern DMA_HandleTypeDef hdma_usart1_tx;
|
||||||
|
|
||||||
/* Private typedef -----------------------------------------------------------*/
|
/* Private typedef -----------------------------------------------------------*/
|
||||||
/* USER CODE BEGIN TD */
|
/* USER CODE BEGIN TD */
|
||||||
@@ -94,9 +97,9 @@ void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base)
|
|||||||
/* Peripheral clock enable */
|
/* Peripheral clock enable */
|
||||||
__HAL_RCC_TIM1_CLK_ENABLE();
|
__HAL_RCC_TIM1_CLK_ENABLE();
|
||||||
/* TIM1 interrupt Init */
|
/* TIM1 interrupt Init */
|
||||||
HAL_NVIC_SetPriority(TIM1_BRK_UP_TRG_COM_IRQn, 0, 0);
|
HAL_NVIC_SetPriority(TIM1_BRK_UP_TRG_COM_IRQn, 3, 0);
|
||||||
HAL_NVIC_EnableIRQ(TIM1_BRK_UP_TRG_COM_IRQn);
|
HAL_NVIC_EnableIRQ(TIM1_BRK_UP_TRG_COM_IRQn);
|
||||||
HAL_NVIC_SetPriority(TIM1_CC_IRQn, 0, 0);
|
HAL_NVIC_SetPriority(TIM1_CC_IRQn, 3, 0);
|
||||||
HAL_NVIC_EnableIRQ(TIM1_CC_IRQn);
|
HAL_NVIC_EnableIRQ(TIM1_CC_IRQn);
|
||||||
/* USER CODE BEGIN TIM1_MspInit 1 */
|
/* USER CODE BEGIN TIM1_MspInit 1 */
|
||||||
|
|
||||||
@@ -230,8 +233,41 @@ void HAL_UART_MspInit(UART_HandleTypeDef* huart)
|
|||||||
GPIO_InitStruct.Alternate = GPIO_AF1_USART1;
|
GPIO_InitStruct.Alternate = GPIO_AF1_USART1;
|
||||||
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
|
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
|
||||||
|
|
||||||
|
/* USART1 DMA Init */
|
||||||
|
/* USART1_RX Init */
|
||||||
|
hdma_usart1_rx.Instance = DMA1_Channel3;
|
||||||
|
hdma_usart1_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
|
||||||
|
hdma_usart1_rx.Init.PeriphInc = DMA_PINC_DISABLE;
|
||||||
|
hdma_usart1_rx.Init.MemInc = DMA_MINC_ENABLE;
|
||||||
|
hdma_usart1_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
|
||||||
|
hdma_usart1_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
|
||||||
|
hdma_usart1_rx.Init.Mode = DMA_NORMAL;
|
||||||
|
hdma_usart1_rx.Init.Priority = DMA_PRIORITY_LOW;
|
||||||
|
if (HAL_DMA_Init(&hdma_usart1_rx) != HAL_OK)
|
||||||
|
{
|
||||||
|
Error_Handler();
|
||||||
|
}
|
||||||
|
|
||||||
|
__HAL_LINKDMA(huart,hdmarx,hdma_usart1_rx);
|
||||||
|
|
||||||
|
/* USART1_TX Init */
|
||||||
|
hdma_usart1_tx.Instance = DMA1_Channel2;
|
||||||
|
hdma_usart1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
|
||||||
|
hdma_usart1_tx.Init.PeriphInc = DMA_PINC_DISABLE;
|
||||||
|
hdma_usart1_tx.Init.MemInc = DMA_MINC_ENABLE;
|
||||||
|
hdma_usart1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
|
||||||
|
hdma_usart1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
|
||||||
|
hdma_usart1_tx.Init.Mode = DMA_NORMAL;
|
||||||
|
hdma_usart1_tx.Init.Priority = DMA_PRIORITY_LOW;
|
||||||
|
if (HAL_DMA_Init(&hdma_usart1_tx) != HAL_OK)
|
||||||
|
{
|
||||||
|
Error_Handler();
|
||||||
|
}
|
||||||
|
|
||||||
|
__HAL_LINKDMA(huart,hdmatx,hdma_usart1_tx);
|
||||||
|
|
||||||
/* USART1 interrupt Init */
|
/* USART1 interrupt Init */
|
||||||
HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);
|
HAL_NVIC_SetPriority(USART1_IRQn, 1, 0);
|
||||||
HAL_NVIC_EnableIRQ(USART1_IRQn);
|
HAL_NVIC_EnableIRQ(USART1_IRQn);
|
||||||
/* USER CODE BEGIN USART1_MspInit 1 */
|
/* USER CODE BEGIN USART1_MspInit 1 */
|
||||||
|
|
||||||
@@ -262,6 +298,10 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef* huart)
|
|||||||
*/
|
*/
|
||||||
HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9|GPIO_PIN_10);
|
HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9|GPIO_PIN_10);
|
||||||
|
|
||||||
|
/* USART1 DMA DeInit */
|
||||||
|
HAL_DMA_DeInit(huart->hdmarx);
|
||||||
|
HAL_DMA_DeInit(huart->hdmatx);
|
||||||
|
|
||||||
/* USART1 interrupt DeInit */
|
/* USART1 interrupt DeInit */
|
||||||
HAL_NVIC_DisableIRQ(USART1_IRQn);
|
HAL_NVIC_DisableIRQ(USART1_IRQn);
|
||||||
/* USER CODE BEGIN USART1_MspDeInit 1 */
|
/* USER CODE BEGIN USART1_MspDeInit 1 */
|
||||||
|
@@ -56,6 +56,8 @@
|
|||||||
|
|
||||||
/* External variables --------------------------------------------------------*/
|
/* External variables --------------------------------------------------------*/
|
||||||
extern TIM_HandleTypeDef htim1;
|
extern TIM_HandleTypeDef htim1;
|
||||||
|
extern DMA_HandleTypeDef hdma_usart1_rx;
|
||||||
|
extern DMA_HandleTypeDef hdma_usart1_tx;
|
||||||
extern UART_HandleTypeDef huart1;
|
extern UART_HandleTypeDef huart1;
|
||||||
/* USER CODE BEGIN EV */
|
/* USER CODE BEGIN EV */
|
||||||
|
|
||||||
@@ -141,6 +143,21 @@ void SysTick_Handler(void)
|
|||||||
/* please refer to the startup file (startup_stm32f0xx.s). */
|
/* please refer to the startup file (startup_stm32f0xx.s). */
|
||||||
/******************************************************************************/
|
/******************************************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function handles DMA1 channel 2 and 3 interrupts.
|
||||||
|
*/
|
||||||
|
void DMA1_Channel2_3_IRQHandler(void)
|
||||||
|
{
|
||||||
|
/* USER CODE BEGIN DMA1_Channel2_3_IRQn 0 */
|
||||||
|
|
||||||
|
/* USER CODE END DMA1_Channel2_3_IRQn 0 */
|
||||||
|
HAL_DMA_IRQHandler(&hdma_usart1_tx);
|
||||||
|
HAL_DMA_IRQHandler(&hdma_usart1_rx);
|
||||||
|
/* USER CODE BEGIN DMA1_Channel2_3_IRQn 1 */
|
||||||
|
|
||||||
|
/* USER CODE END DMA1_Channel2_3_IRQn 1 */
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief This function handles TIM1 break, update, trigger and commutation interrupts.
|
* @brief This function handles TIM1 break, update, trigger and commutation interrupts.
|
||||||
*/
|
*/
|
||||||
@@ -175,8 +192,6 @@ void TIM1_CC_IRQHandler(void)
|
|||||||
void USART1_IRQHandler(void)
|
void USART1_IRQHandler(void)
|
||||||
{
|
{
|
||||||
/* USER CODE BEGIN USART1_IRQn 0 */
|
/* USER CODE BEGIN USART1_IRQn 0 */
|
||||||
USER_UART1_IRQHandler(&huart1);
|
|
||||||
return;
|
|
||||||
|
|
||||||
/* USER CODE END USART1_IRQn 0 */
|
/* USER CODE END USART1_IRQn 0 */
|
||||||
HAL_UART_IRQHandler(&huart1);
|
HAL_UART_IRQHandler(&huart1);
|
||||||
|
102
Core/Src/uart.c
102
Core/Src/uart.c
@@ -1,102 +0,0 @@
|
|||||||
#include "uart.h"
|
|
||||||
#include "main.h"
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
uint8_t * uart_tx_buf;
|
|
||||||
uint8_t uart_tx_busy=0;
|
|
||||||
uint16_t uart_tx_counter=0;
|
|
||||||
uint16_t uart_tx_len=0;
|
|
||||||
|
|
||||||
uint8_t * uart_rx_buf;
|
|
||||||
uint8_t uart_rx_busy=0;
|
|
||||||
uint16_t uart_rx_counter=0;
|
|
||||||
uint16_t uart_rx_len=0;
|
|
||||||
extern uint16_t last_rx_time;
|
|
||||||
|
|
||||||
extern UART_HandleTypeDef huart1;
|
|
||||||
|
|
||||||
#define TXEN_ON HAL_GPIO_WritePin(TXEN_GPIO_Port, TXEN_Pin, GPIO_PIN_SET)
|
|
||||||
#define TXEN_OFF HAL_GPIO_WritePin(TXEN_GPIO_Port, TXEN_Pin, GPIO_PIN_RESET)
|
|
||||||
|
|
||||||
void USER_UART1_IRQHandler(UART_HandleTypeDef *huart)
|
|
||||||
{
|
|
||||||
uint8_t data;
|
|
||||||
|
|
||||||
if((huart1.Instance->ISR & USART_ISR_RXNE) != RESET)
|
|
||||||
{
|
|
||||||
last_rx_time = 0;
|
|
||||||
data = (uint8_t)(huart1.Instance->RDR & (uint8_t)0x00FF); // читает байт из регистра
|
|
||||||
if(uart_rx_busy)
|
|
||||||
{
|
|
||||||
uart_rx_buf[uart_rx_counter]=data;
|
|
||||||
if(++uart_rx_counter == uart_rx_len)
|
|
||||||
{
|
|
||||||
uart_rx_busy = 0;
|
|
||||||
UART_RxCpltCallback();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
if((uart_tx_busy)&&((huart1.Instance->ISR & USART_ISR_TC) != RESET))
|
|
||||||
{
|
|
||||||
if(++uart_tx_counter == uart_tx_len)
|
|
||||||
{
|
|
||||||
TXEN_OFF;
|
|
||||||
uart_tx_busy = 0;
|
|
||||||
UART_TxCpltCallback();
|
|
||||||
__HAL_UART_DISABLE_IT(&huart1, UART_IT_TC);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
//putchar(uart_tx_buf[uart_tx_counter]);
|
|
||||||
huart->Instance->TDR=uart_tx_buf[uart_tx_counter];
|
|
||||||
}
|
|
||||||
huart->Instance->ICR=0xFFFFFFFF;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint8_t UART_Receive_IT(uint8_t * data, uint16_t len, uint16_t timeout)
|
|
||||||
{
|
|
||||||
uint16_t i;
|
|
||||||
|
|
||||||
//if(len>UART_RX_LEN)return RET_OVERFLOW;
|
|
||||||
for(i=0;i<timeout;i++)
|
|
||||||
{
|
|
||||||
if(uart_rx_busy!=0)
|
|
||||||
HAL_Delay(1);
|
|
||||||
else
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if(i==timeout) return RET_TIMEOUT;
|
|
||||||
uart_rx_counter = 0;
|
|
||||||
uart_rx_len = len;
|
|
||||||
uart_rx_buf = data;
|
|
||||||
uart_rx_busy = 1;
|
|
||||||
return RET_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
uint8_t UART_Transmit_IT(uint8_t * data, uint16_t len, uint16_t timeout)
|
|
||||||
{
|
|
||||||
uint16_t i;
|
|
||||||
|
|
||||||
for(i=0;i<timeout;i++)
|
|
||||||
{
|
|
||||||
if(uart_tx_busy!=0)
|
|
||||||
HAL_Delay(1);
|
|
||||||
else
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if(i==timeout) return RET_TIMEOUT;
|
|
||||||
uart_tx_busy = 1;
|
|
||||||
TXEN_ON;
|
|
||||||
HAL_Delay(1);
|
|
||||||
uart_tx_buf = data;
|
|
||||||
uart_tx_counter = 0;
|
|
||||||
uart_tx_len = len;
|
|
||||||
huart1.Instance->TDR=uart_tx_buf[0];
|
|
||||||
//putchar(uart_tx_buf[0]);
|
|
||||||
__HAL_UART_ENABLE_IT(&huart1, UART_IT_TC);
|
|
||||||
return RET_OK;
|
|
||||||
}
|
|
@@ -38,7 +38,7 @@
|
|||||||
<stringAttribute key="com.st.stm32cube.ide.mcu.debug.stlink.stlink_txt_serial_number" value=""/>
|
<stringAttribute key="com.st.stm32cube.ide.mcu.debug.stlink.stlink_txt_serial_number" value=""/>
|
||||||
<stringAttribute key="com.st.stm32cube.ide.mcu.debug.stlink.watchdog_config" value="none"/>
|
<stringAttribute key="com.st.stm32cube.ide.mcu.debug.stlink.watchdog_config" value="none"/>
|
||||||
<booleanAttribute key="com.st.stm32cube.ide.mcu.debug.stlinkenable_rtos" value="false"/>
|
<booleanAttribute key="com.st.stm32cube.ide.mcu.debug.stlinkenable_rtos" value="false"/>
|
||||||
<stringAttribute key="com.st.stm32cube.ide.mcu.debug.stlinkrestart_configurations" value="{"fItems":[{"fDisplayName":"Reset","fIsSuppressible":false,"fResetAttribute":"Software system reset","fResetStrategies":[{"fDisplayName":"Software system reset","fLaunchAttribute":"system_reset","fGdbCommands":["monitor reset\r\n"],"fCmdOptions":["-g"]},{"fDisplayName":"Hardware reset","fLaunchAttribute":"hardware_reset","fGdbCommands":["monitor reset hardware\r\n"],"fCmdOptions":["-g"]},{"fDisplayName":"Core reset","fLaunchAttribute":"core_reset","fGdbCommands":["monitor reset core\r\n"],"fCmdOptions":["-g"]},{"fDisplayName":"None","fLaunchAttribute":"no_reset","fGdbCommands":[],"fCmdOptions":["-g"]}],"fGdbCommandGroup":{"name":"Additional commands","commands":[]}}]}"/>
|
<stringAttribute key="com.st.stm32cube.ide.mcu.debug.stlinkrestart_configurations" value="{"fVersion":1,"fItems":[{"fDisplayName":"Reset","fIsSuppressible":false,"fResetAttribute":"Software system reset","fResetStrategies":[{"fDisplayName":"Software system reset","fLaunchAttribute":"system_reset","fGdbCommands":["monitor reset\r\n"],"fCmdOptions":["-g"]},{"fDisplayName":"Hardware reset","fLaunchAttribute":"hardware_reset","fGdbCommands":["monitor reset hardware\r\n"],"fCmdOptions":["-g"]},{"fDisplayName":"Core reset","fLaunchAttribute":"core_reset","fGdbCommands":["monitor reset core\r\n"],"fCmdOptions":["-g"]},{"fDisplayName":"None","fLaunchAttribute":"no_reset","fGdbCommands":[],"fCmdOptions":["-g"]}],"fGdbCommandGroup":{"name":"Additional commands","commands":[]},"fStartApplication":true}]}"/>
|
||||||
<booleanAttribute key="com.st.stm32cube.ide.mcu.rtosproxy.enableRtosProxy" value="false"/>
|
<booleanAttribute key="com.st.stm32cube.ide.mcu.rtosproxy.enableRtosProxy" value="false"/>
|
||||||
<stringAttribute key="com.st.stm32cube.ide.mcu.rtosproxy.rtosProxyCustomProperties" value=""/>
|
<stringAttribute key="com.st.stm32cube.ide.mcu.rtosproxy.rtosProxyCustomProperties" value=""/>
|
||||||
<stringAttribute key="com.st.stm32cube.ide.mcu.rtosproxy.rtosProxyDriver" value="threadx"/>
|
<stringAttribute key="com.st.stm32cube.ide.mcu.rtosproxy.rtosProxyDriver" value="threadx"/>
|
||||||
|
@@ -1,15 +1,38 @@
|
|||||||
#MicroXplorer Configuration settings - do not modify
|
#MicroXplorer Configuration settings - do not modify
|
||||||
|
Dma.Request0=USART1_RX
|
||||||
|
Dma.Request1=USART1_TX
|
||||||
|
Dma.RequestsNb=2
|
||||||
|
Dma.USART1_RX.0.Direction=DMA_PERIPH_TO_MEMORY
|
||||||
|
Dma.USART1_RX.0.Instance=DMA1_Channel3
|
||||||
|
Dma.USART1_RX.0.MemDataAlignment=DMA_MDATAALIGN_BYTE
|
||||||
|
Dma.USART1_RX.0.MemInc=DMA_MINC_ENABLE
|
||||||
|
Dma.USART1_RX.0.Mode=DMA_NORMAL
|
||||||
|
Dma.USART1_RX.0.PeriphDataAlignment=DMA_PDATAALIGN_BYTE
|
||||||
|
Dma.USART1_RX.0.PeriphInc=DMA_PINC_DISABLE
|
||||||
|
Dma.USART1_RX.0.Priority=DMA_PRIORITY_LOW
|
||||||
|
Dma.USART1_RX.0.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority
|
||||||
|
Dma.USART1_TX.1.Direction=DMA_MEMORY_TO_PERIPH
|
||||||
|
Dma.USART1_TX.1.Instance=DMA1_Channel2
|
||||||
|
Dma.USART1_TX.1.MemDataAlignment=DMA_MDATAALIGN_BYTE
|
||||||
|
Dma.USART1_TX.1.MemInc=DMA_MINC_ENABLE
|
||||||
|
Dma.USART1_TX.1.Mode=DMA_NORMAL
|
||||||
|
Dma.USART1_TX.1.PeriphDataAlignment=DMA_PDATAALIGN_BYTE
|
||||||
|
Dma.USART1_TX.1.PeriphInc=DMA_PINC_DISABLE
|
||||||
|
Dma.USART1_TX.1.Priority=DMA_PRIORITY_LOW
|
||||||
|
Dma.USART1_TX.1.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority
|
||||||
File.Version=6
|
File.Version=6
|
||||||
GPIO.groupedBy=
|
GPIO.groupedBy=
|
||||||
KeepUserPlacement=false
|
KeepUserPlacement=false
|
||||||
|
Mcu.CPN=STM32F030K6T6
|
||||||
Mcu.Family=STM32F0
|
Mcu.Family=STM32F0
|
||||||
Mcu.IP0=NVIC
|
Mcu.IP0=DMA
|
||||||
Mcu.IP1=RCC
|
Mcu.IP1=NVIC
|
||||||
Mcu.IP2=SYS
|
Mcu.IP2=RCC
|
||||||
Mcu.IP3=TIM1
|
Mcu.IP3=SYS
|
||||||
Mcu.IP4=TIM3
|
Mcu.IP4=TIM1
|
||||||
Mcu.IP5=USART1
|
Mcu.IP5=TIM3
|
||||||
Mcu.IPNb=6
|
Mcu.IP6=USART1
|
||||||
|
Mcu.IPNb=7
|
||||||
Mcu.Name=STM32F030K6Tx
|
Mcu.Name=STM32F030K6Tx
|
||||||
Mcu.Package=LQFP32
|
Mcu.Package=LQFP32
|
||||||
Mcu.Pin0=PF0-OSC_IN
|
Mcu.Pin0=PF0-OSC_IN
|
||||||
@@ -34,15 +57,16 @@ Mcu.UserConstants=
|
|||||||
Mcu.UserName=STM32F030K6Tx
|
Mcu.UserName=STM32F030K6Tx
|
||||||
MxCube.Version=6.4.0
|
MxCube.Version=6.4.0
|
||||||
MxDb.Version=DB.6.0.40
|
MxDb.Version=DB.6.0.40
|
||||||
|
NVIC.DMA1_Channel2_3_IRQn=true\:2\:0\:true\:false\:true\:false\:true\:true
|
||||||
NVIC.ForceEnableDMAVector=true
|
NVIC.ForceEnableDMAVector=true
|
||||||
NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false
|
NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
|
||||||
NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:true\:false\:false
|
NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
|
||||||
NVIC.PendSV_IRQn=true\:0\:0\:false\:false\:true\:false\:false
|
NVIC.PendSV_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
|
||||||
NVIC.SVC_IRQn=true\:0\:0\:false\:false\:true\:false\:false
|
NVIC.SVC_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:true
|
||||||
NVIC.SysTick_IRQn=true\:0\:0\:false\:false\:true\:false\:true
|
NVIC.SysTick_IRQn=true\:0\:0\:false\:false\:true\:false\:true\:false
|
||||||
NVIC.TIM1_BRK_UP_TRG_COM_IRQn=true\:0\:0\:false\:false\:true\:true\:true
|
NVIC.TIM1_BRK_UP_TRG_COM_IRQn=true\:3\:0\:true\:false\:true\:true\:true\:true
|
||||||
NVIC.TIM1_CC_IRQn=true\:0\:0\:false\:false\:true\:true\:true
|
NVIC.TIM1_CC_IRQn=true\:3\:0\:true\:false\:true\:true\:true\:true
|
||||||
NVIC.USART1_IRQn=true\:0\:0\:false\:false\:true\:true\:true
|
NVIC.USART1_IRQn=true\:1\:0\:true\:false\:true\:true\:true\:true
|
||||||
PA10.Locked=true
|
PA10.Locked=true
|
||||||
PA10.Mode=Asynchronous
|
PA10.Mode=Asynchronous
|
||||||
PA10.Signal=USART1_RX
|
PA10.Signal=USART1_RX
|
||||||
@@ -115,7 +139,7 @@ ProjectManager.StackSize=0x400
|
|||||||
ProjectManager.TargetToolchain=STM32CubeIDE
|
ProjectManager.TargetToolchain=STM32CubeIDE
|
||||||
ProjectManager.ToolChainLocation=
|
ProjectManager.ToolChainLocation=
|
||||||
ProjectManager.UnderRoot=true
|
ProjectManager.UnderRoot=true
|
||||||
ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-SystemClock_Config-RCC-false-HAL-false,3-MX_TIM3_Init-TIM3-false-HAL-true,4-MX_USART1_UART_Init-USART1-false-HAL-true,5-MX_TIM1_Init-TIM1-false-HAL-true
|
ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-SystemClock_Config-RCC-false-HAL-false,3-MX_DMA_Init-DMA-false-HAL-true,4-MX_TIM3_Init-TIM3-false-HAL-true,5-MX_USART1_UART_Init-USART1-false-HAL-true,6-MX_TIM1_Init-TIM1-false-HAL-true
|
||||||
RCC.AHBFreq_Value=48000000
|
RCC.AHBFreq_Value=48000000
|
||||||
RCC.APB1Freq_Value=48000000
|
RCC.APB1Freq_Value=48000000
|
||||||
RCC.APB1TimFreq_Value=48000000
|
RCC.APB1TimFreq_Value=48000000
|
||||||
|
Reference in New Issue
Block a user