controller-pcba/Core/Src/main.c

424 lines
12 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/* USER CODE BEGIN Header */
/**
******************************************************************************
* @file main.c
* @brief : Main program body
******************************************************************************
* @attention
*
* Copyright (c) 2024 STMicroelectronics.
* All rights reserved.
*
* This software is licensed under terms that can be found in the LICENSE file
* in the root directory of this software component.
* If no LICENSE file comes with this software, it is provided AS-IS.
*
******************************************************************************
*/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "cmsis_os.h"
#include "dma.h"
#include "lwip.h"
#include "spi.h"
#include "tim.h"
#include "usart.h"
#include "gpio.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "stdio.h"
#include "lwip/api.h"
#include "lwip/tcp.h"
#include "ad7124.h"
#include "ht1200m.h"
#include "uart_lcd.h"
#include "user_flash.h"
#include "user_spi.h"
/* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
/* USER CODE END PTD */
/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */
/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */
/* USER CODE END PM */
/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN PV */
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
void MX_FREERTOS_Init(void);
/* USER CODE BEGIN PFP */
/* USER CODE END PFP */
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
uart_t lcd_uart4 = {0};
uart_t hart1_uart6 = {0};
uart_t ble2_uart3 = {0};
uart_t hart2_uart2 = {0};
uart_t hart1_uart5 = {0};
uart_t usb_uart1 = {0};
float current_buff[2] = {12.0f, 0};//设置初始电流为12ma
uint8_t TCA6416_WritePort_buff[2] = {0, 0};
uint8_t tcp_echo_flags_hart1 = 0;
uint8_t tcp_echo_flags_hart2 = 0;
uint8_t tcp_echo_flags_ble1 = 0;
uint8_t tcp_echo_flags_ble2 = 0;
uint8_t tcp_echo_flags_control = 0;
uint8_t send_data_flag_cmd = 0;
uint8_t uart_echo_flags_hart1 = 0;
uint8_t uart_echo_flags_hart2 = 0;
uint8_t uart_echo_flags_ble1 = 0;
uint8_t uart_echo_flags_ble2 = 0;
// TEST
// uint8_t data_flag = 0;
// uint32_t receive_times1 = 0;
// uint32_t receive_times2 = 0;
// ENDTEST
extern struct netif gnetif;
extern ip4_addr_t ipaddr;
/* USER CODE END 0 */
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
//MX_DMA_Init();
dac161s997_spi_init();
dac8568_spi_init();
ad7124_spi_init();
//MX_TIM3_Init();
//MX_SPI1_Init();
MX_USART6_UART_Init();
MX_TIM2_Init();
//MX_UART5_Init();
//MX_USART2_UART_Init();
//MX_USART3_UART_Init();
//MX_TIM1_Init();
//MX_USART1_UART_Init();
//MX_TIM8_Init();
/* USER CODE BEGIN 2 */
//board_spi_init(AD7124); // Initialize SPI2 for AD7124 using the unified initialization function
/*DMA INIT*/
// start
HAL_UARTEx_ReceiveToIdle_DMA(&huart4, lcd_uart4.rx_data_temp, ARRAY_LEN(lcd_uart4.rx_data_temp));
#if (HART1_USART6 == 1)
HAL_UARTEx_ReceiveToIdle_DMA(&huart6, hart1_uart6.rx_data_temp, ARRAY_LEN(hart1_uart6.rx_data_temp));
#endif
HAL_UARTEx_ReceiveToIdle_DMA(&huart3, ble2_uart3.rx_data_temp, ARRAY_LEN(ble2_uart3.rx_data_temp));
HAL_UARTEx_ReceiveToIdle_DMA(&huart5, hart1_uart5.rx_data_temp, ARRAY_LEN(hart1_uart5.rx_data_temp));
HAL_UARTEx_ReceiveToIdle_DMA(&huart2, hart2_uart2.rx_data_temp, ARRAY_LEN(hart2_uart2.rx_data_temp));
HAL_UARTEx_ReceiveToIdle_DMA(&huart1, usb_uart1.rx_data_temp, ARRAY_LEN(usb_uart1.rx_data_temp));
// end
hart_ht1200m_reset(); // HT1200M reset
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1); // HART CLK
HAL_TIM_Encoder_Start(&htim1, TIM_CHANNEL_ALL); // rotary encoder
#if (ENCODE_TIM8 == 1)
HAL_TIM_Encoder_Start(&htim8, TIM_CHANNEL_ALL);
#endif
/* USER CODE END 2 */
/* Call init function for freertos objects (in freertos.c) */
MX_FREERTOS_Init();
/* Start scheduler */
osKernelStart();
/* We should never get here as control is now taken by the scheduler */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
/**
* @brief System Clock Configuration
* @retval None
*/
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
/** Configure the main internal regulator output voltage
*/
__HAL_RCC_PWR_CLK_ENABLE();
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
/** Initializes the RCC Oscillators according to the specified parameters
* in the RCC_OscInitTypeDef structure.
*/
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;
RCC_OscInitStruct.PLL.PLLM = 10;
RCC_OscInitStruct.PLL.PLLN = 200;
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
RCC_OscInitStruct.PLL.PLLQ = 4;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Error_Handler();
}
/** Initializes the CPU, AHB and APB buses clocks
*/
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV4;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_3) != HAL_OK)
{
Error_Handler();
}
}
/* USER CODE BEGIN 4 */
void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
{
if (huart == &huart5)
{
__HAL_UNLOCK(huart);
if (__HAL_UART_GET_FLAG(huart, UART_FLAG_NE))
{
__HAL_UART_CLEAR_FLAG(huart, UART_FLAG_NE); // 清除错误标志
}
HAL_UARTEx_ReceiveToIdle_DMA(&huart5, hart1_uart5.rx_data_temp, ARRAY_LEN(hart1_uart5.rx_data_temp));
}
if (huart == &huart2)
{
__HAL_UNLOCK(huart);
if (__HAL_UART_GET_FLAG(huart, UART_FLAG_NE))
{
__HAL_UART_CLEAR_FLAG(huart, UART_FLAG_NE); // 清除错误标志
}
HAL_UARTEx_ReceiveToIdle_DMA(&huart2, hart2_uart2.rx_data_temp, ARRAY_LEN(hart2_uart2.rx_data_temp));
}
}
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
if (huart == &huart1)
{
__HAL_UNLOCK(huart);
usb_uart1.rx_num = Size;
memset(usb_uart1.rx_data, 0, ARRAY_LEN(usb_uart1.rx_data));
memcpy(usb_uart1.rx_data, usb_uart1.rx_data_temp, Size);
HAL_UARTEx_ReceiveToIdle_DMA(&huart1, usb_uart1.rx_data_temp, ARRAY_LEN(usb_uart1.rx_data_temp));
// dma_usart_send(&huart4, usb_uart1.rx_data_temp, usb_uart1.rx_num);
// IP address assignment
IP4_ADDR(&ipaddr, usb_uart1.rx_data_temp[0], usb_uart1.rx_data_temp[1], usb_uart1.rx_data_temp[2], usb_uart1.rx_data_temp[3]);
gnetif.ip_addr = ipaddr;
if (flash_write_data(FLASH_USER_START_ADDR, usb_uart1.rx_data_temp, Size) == HAL_OK) // 写入flash戝功更新ip地址显示
{
uart_lcd_draw_ipaddr();
}
}
if (huart == &huart4)
{
__HAL_UNLOCK(huart);
lcd_uart4.rx_num = Size;
memset(lcd_uart4.rx_data, 0, ARRAY_LEN(lcd_uart4.rx_data));
memcpy(lcd_uart4.rx_data, lcd_uart4.rx_data_temp, Size);
HAL_UARTEx_ReceiveToIdle_DMA(&huart4, lcd_uart4.rx_data_temp, ARRAY_LEN(lcd_uart4.rx_data_temp));
}
#if (BLE2_USART6 == 1)
if (huart == &huart6)
{
__HAL_UNLOCK(huart);
ble1_uart6.rx_num = Size;
memset(ble1_uart6.rx_data, 0, ARRAY_LEN(ble1_uart6.rx_data));
memcpy(ble1_uart6.rx_data, ble1_uart6.rx_data_temp, Size);
if (tcp_echo_flags_ble1 == 1)
{
uart_echo_flags_ble1 = 1;
// user_send_data_ble1(ble1_uart6.rx_data, Size);
}
HAL_UARTEx_ReceiveToIdle_DMA(&huart6, ble1_uart6.rx_data_temp, ARRAY_LEN(ble1_uart6.rx_data_temp));
}
#endif
if (huart == &huart3)
{
__HAL_UNLOCK(huart);
ble2_uart3.rx_num = Size;
memset(ble2_uart3.rx_data, 0, ARRAY_LEN(ble2_uart3.rx_data));
memcpy(ble2_uart3.rx_data, ble2_uart3.rx_data_temp, Size);
if (tcp_echo_flags_ble2 == 1)
{
uart_echo_flags_ble2 = 1;
// user_send_data_ble2(ble2_uart3.rx_data, Size);
}
HAL_UARTEx_ReceiveToIdle_DMA(&huart3, ble2_uart3.rx_data_temp, ARRAY_LEN(ble2_uart3.rx_data_temp));
}
if (huart == &huart5)
{
__HAL_UNLOCK(huart);
hart1_uart5.rx_num = Size;
memset(hart1_uart5.rx_data, 0, ARRAY_LEN(hart1_uart5.rx_data));
memcpy(hart1_uart5.rx_data, hart1_uart5.rx_data_temp, Size);
if (tcp_echo_flags_hart1 == 1)
{
uart_echo_flags_hart1 = 1;
// user_send_data_hart1(hart1_uart5.rx_data, Size);
}
HAL_UARTEx_ReceiveToIdle_DMA(&huart5, hart1_uart5.rx_data_temp, ARRAY_LEN(hart1_uart5.rx_data_temp));
memset(hart1_uart5.rx_data_temp, 0, ARRAY_LEN(hart1_uart5.rx_data_temp));
}
if (huart == &huart2)
{
__HAL_UNLOCK(huart);
hart2_uart2.rx_num = Size;
memset(hart2_uart2.rx_data, 0, ARRAY_LEN(hart2_uart2.rx_data));
memcpy(hart2_uart2.rx_data, hart2_uart2.rx_data_temp, Size);
if (tcp_echo_flags_hart2 == 1)
{
uart_echo_flags_hart2 = 1;
// user_send_data_hart2(hart2_uart2.rx_data, Size);
}
HAL_UARTEx_ReceiveToIdle_DMA(&huart2, hart2_uart2.rx_data_temp, ARRAY_LEN(hart2_uart2.rx_data_temp));
}
}
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
if (huart == &huart5)
{
HART1_RTS_RECEIVE;
}
if (huart == &huart2)
{
//HART2_RTS_RECEIVE;
}
}
//void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
//{
// if (GPIO_Pin == EC11_KEY_Pin)
// {
// if (ec11_data.confirm_key_flag == 0)
// {
// ec11_data.confirm_key_flag = 1;
// }
// else if (ec11_data.confirm_key_flag == 1)
// {
// ec11_data.confirm_key_flag = 2;
// }
// else if (ec11_data.confirm_key_flag == 2)
// {
// ec11_data.confirm_key_flag = 3;
// }
// }
// if (GPIO_Pin == HART2_OCD_Pin)
// {
// //HAL_GPIO_TogglePin(LED2_R_GPIO_Port, LED2_R_Pin);
// }
// if (GPIO_Pin == HART1_OCD_Pin)
// {
// //HAL_GPIO_TogglePin(LED2_Y_GPIO_Port, LED2_Y_Pin);
// }
//}
/* USER CODE END 4 */
/**
* @brief Period elapsed callback in non blocking mode
* @note This function is called when TIM4 interrupt took place, inside
* HAL_TIM_IRQHandler(). It makes a direct call to HAL_IncTick() to increment
* a global variable "uwTick" used as application time base.
* @param htim : TIM handle
* @retval None
*/
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
/* USER CODE BEGIN Callback 0 */
/* USER CODE END Callback 0 */
if (htim->Instance == TIM4)
{
HAL_IncTick();
}
/* USER CODE BEGIN Callback 1 */
/* USER CODE END Callback 1 */
}
/**
* @brief This function is executed in case of error occurrence.
* @retval None
*/
void Error_Handler(void)
{
/* USER CODE BEGIN Error_Handler_Debug */
/* User can add his own implementation to report the HAL error return state */
// __disable_irq();
// while (1)
// {
// }
/* USER CODE END Error_Handler_Debug */
}
#ifdef USE_FULL_ASSERT
/**
* @brief Reports the name of the source file and the source line number
* where the assert_param error has occurred.
* @param file: pointer to the source file name
* @param line: assert_param error line source number
* @retval None
*/
void assert_failed(uint8_t *file, uint32_t line)
{
/* USER CODE BEGIN 6 */
/* User can add his own implementation to report the file name and line number,
ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
/* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */