Compare commits

...

9 Commits

Author SHA1 Message Date
王绪洁 47000e9b5d 串口输出监测的电流和百分比值 2025-08-01 16:24:56 +08:00
王绪洁 aca21ee3a5 备份 2025-08-01 10:51:40 +08:00
王绪洁 e186b23d28 备份 2025-07-31 18:39:17 +08:00
王绪洁 d8f30dcd94 备份-各组件代码封装 2025-07-31 14:42:05 +08:00
王绪洁 3f4773eaf0 备份 2025-07-30 17:02:33 +08:00
王绪洁 465d561044 备份-封装函数 2025-07-30 16:56:57 +08:00
王绪洁 768f66dd16 备份--曲线绘制 2025-07-30 10:13:30 +08:00
王绪洁 9bf76112e0 删除多余部分代码 2025-07-28 16:50:30 +08:00
王绪洁 78e0073116 首次上传-备份 2025-07-28 16:23:06 +08:00
56 changed files with 10677 additions and 6107 deletions

View File

@ -179,7 +179,6 @@ void start_tcp_task(void const *argument)
/* Infinite loop */
for (;;)
{
// uart_lcd_draw_ipaddr();
osThreadTerminate(NULL);
}
/* USER CODE END start_tcp_task */
@ -198,43 +197,10 @@ void start_led_toggle_task(void const *argument)
/* Infinite loop */
for (;;)
{
if (ec11_data.confirm_key_flag == 0)
{
HAL_GPIO_TogglePin(LED2_Y_GPIO_Port, LED2_Y_Pin);
}
else if (ec11_data.confirm_key_flag == 1)
{
ec11_data.confirm_key_flag_last++;
if (ec11_data.confirm_key_flag_last > 3)
{
current_buff[0] = (float)uart_lcd_state.current_value[0];
current_buff[1] = (float)uart_lcd_state.current_value[1];
ec11_data.confirm_key_flag_last = 0;
ec11_data.confirm_key_flag = 0;
}
}
else if (ec11_data.confirm_key_flag == 2)
{
ec11_data.confirm_key_flag_last = 0;
HAL_GPIO_TogglePin(LED3_G_GPIO_Port, LED3_G_Pin);
if (uart_lcd_state.key_state[0] == 1)
{
uart_lcd_state.key_state[0] = 0;
uart_lcd_state.key_state[1] = 1;
uart_lcd_state.key_state[2] = 0;
}
else if (uart_lcd_state.key_state[0] == 0)
{
uart_lcd_state.key_state[0] = 1;
uart_lcd_state.key_state[1] = 0;
uart_lcd_state.key_state[2] = 1;
}
ec11_data.confirm_key_flag = 0;
uart_lcd_channel_switch(uart_lcd_state.key_state[0]);
}
vTaskDelay(400);
uart_lcd_ecll_control_current_out();
vTaskDelay(300);
}
/* USER CODE END start_led_toggle_task */
}
@ -253,10 +219,10 @@ void start_dac_task(void const *argument)
/* Infinite loop */
for (;;)
{
osThreadSuspend(adc_taskHandle);
osThreadSuspend(adc_taskHandle); // Suspend ADC task to prevent conflicts with ADC task.
dac161s997_output(DAC161S997_1, current_buff[0]);
dac161s997_output(DAC161S997_2, current_buff[1]);
osThreadResume(adc_taskHandle);
osThreadResume(adc_taskHandle); // Resume ADC task.
vTaskDelay(100);
}
/* USER CODE END start_dac_task */
@ -276,22 +242,13 @@ void start_adc_task(void const *argument)
/* Infinite loop */
for (;;)
{
osThreadSuspend(dac_taskHandle);
osThreadSuspend(dac_taskHandle); // Suspend DAC task to prevent conflicts with DAC task.
uint8_t ch = 0;
for (ch = STOP_NC_ADC; ch < AD7124_CHANNEL_EN_MAX; ch++)
{
ad7124_get_analog(ch);
}
// HAL_GPIO_TogglePin(LED2_Y_GPIO_Port, LED2_Y_Pin);
if (huart5.RxState == HAL_UART_STATE_READY)
{
HAL_UARTEx_ReceiveToIdle_DMA(&huart5, hart1_uart5.rx_data_temp, ARRAY_LEN(hart1_uart5.rx_data_temp));
}
if (huart2.RxState == HAL_UART_STATE_READY)
{
HAL_UARTEx_ReceiveToIdle_DMA(&huart2, hart2_uart2.rx_data_temp, ARRAY_LEN(hart2_uart2.rx_data_temp));
}
osThreadResume(dac_taskHandle);
osThreadResume(dac_taskHandle); // Resume DAC task.
vTaskDelay(10);
}
/* USER CODE END start_adc_task */
@ -310,37 +267,7 @@ void start_gpio_di_do_task(void const *argument)
/* Infinite loop */
for (;;)
{
uint8_t di_ch = 0;
uint8_t tx_data_len = 7 + DI_MAX;
uint8_t tx_data[32] = {0};
tx_data[0] = FRAME_HEAD; // 帧头
tx_data[1] = COM_OK; // 状<>?<3F>
tx_data[2] = DEVICE_NUM; // 设备<E8AEBE>??
tx_data[3] = SEND_STATE_CMD; // 命令<E591BD>??
tx_data[4] = DI_MAX; // 数据长度
for (di_ch = 0; di_ch < DI_MAX; di_ch++)
{
di_state_now[di_ch] = gpio_di_test(di_ch);
if (di_state_last[di_ch] != di_state_now[di_ch])
{
di_state_last[di_ch] = di_state_now[di_ch];
send_data_flag_cmd = 1;
}
tx_data[5 + di_ch] = di_state_now[di_ch];
}
if ((send_data_flag_cmd != 0) && (1 == tcp_echo_flags_control))
{
tx_data[5 + DI_MAX] = xor_compute(tx_data + 1, tx_data_len - 3); // 异或校验
tx_data[6 + DI_MAX] = FRAME_TAIL; // 帧尾
user_send_data_control(tx_data, tx_data_len);
send_data_flag_cmd++;
if (send_data_flag_cmd > 3) // 连续三次上位机没有回应,则停止发送数据包
{
send_data_flag_cmd = 0;
}
}
vTaskDelay(100);
osThreadTerminate(NULL);
}
/* USER CODE END start_gpio_di_do_task */
}
@ -358,56 +285,7 @@ void start_ec11_task(void const *argument)
/* Infinite loop */
for (;;)
{
ec11_data.direction = __HAL_TIM_IS_TIM_COUNTING_DOWN(&htim1);
ec11_data.encode_num = (short)__HAL_TIM_GET_COUNTER(&htim1);
if ((ec11_data.direction == 0) && (ec11_data.encode_num > ec11_data.encode_num_last))
{
if (uart_lcd_state.key_state[0] == 0)
{
uart_lcd_state.current_value[0] += 1;
if (uart_lcd_state.current_value[0] > 20)
{
uart_lcd_state.current_value[0] = 20;
}
}
else if (uart_lcd_state.key_state[0] == 1)
{
uart_lcd_state.current_value[1] += 1;
if (uart_lcd_state.current_value[1] > 20)
{
uart_lcd_state.current_value[1] = 20;
}
}
// current_buff[0] = (float)uart_lcd_state.current_value[0];
}
if ((ec11_data.direction == 1) && (ec11_data.encode_num < ec11_data.encode_num_last))
{
if (uart_lcd_state.key_state[0] == 0)
{
if (uart_lcd_state.current_value[0] < 2)
{
uart_lcd_state.current_value[0] = 0;
}
else
{
uart_lcd_state.current_value[0] -= 1;
}
}
else if (uart_lcd_state.key_state[0] == 1)
{
if (uart_lcd_state.current_value[1] < 2)
{
uart_lcd_state.current_value[1] = 0;
}
else
{
uart_lcd_state.current_value[1] -= 1;
}
}
// current_buff[1] = (float)uart_lcd_state.current_value[1];
}
uart_lcd_current_out(uart_lcd_state.key_state[0]);
ec11_data.encode_num_last = ec11_data.encode_num;
uart_lcd_ec11_control_current();
vTaskDelay(100);
}
/* USER CODE END start_ec11_task */
@ -427,7 +305,8 @@ void start_lcd_task(void const *argument)
/* Infinite loop */
for (;;)
{
vTaskDelay(10);
uart_lcd_refresh_screen();
vTaskDelay(100);
}
/* USER CODE END start_lcd_task */
}

View File

@ -99,6 +99,7 @@ int main(void)
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
@ -126,18 +127,18 @@ int main(void)
MX_TIM1_Init();
MX_USART1_UART_Init();
/* USER CODE BEGIN 2 */
/*閰濈疆鍧勪覆鍧殑DMA鎺ユ敹*/
/*Configure serial port DMA reception*/
// start
HAL_UARTEx_ReceiveToIdle_DMA(&huart4, lcd_uart4.rx_data_temp, ARRAY_LEN(lcd_uart4.rx_data_temp));
HAL_UARTEx_ReceiveToIdle_DMA(&huart6, ble1_uart6.rx_data_temp, ARRAY_LEN(ble1_uart6.rx_data_temp));
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));
// HAL_UARTEx_ReceiveToIdle_DMA(&huart6, ble1_uart6.rx_data_temp, ARRAY_LEN(ble1_uart6.rx_data_temp));
// 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(); // 鍒濆鍖朒T1200M妯″潡
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1); // PWM杈撳嚭锛岀敤浜庨┍鍔℉T1200M妯″潡
HAL_TIM_Encoder_Start(&htim1, TIM_CHANNEL_ALL); // 鏃嬭浆缂栫牆鍣ㄨ緭锟<EFBFBD>??
hart_ht1200m_reset(); // Reset HT1200M
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1); // PWM output, used to drive the HT1200M module
HAL_TIM_Encoder_Start(&htim1, TIM_CHANNEL_ALL); // rotary encoder
/* USER CODE END 2 */
/* Call init function for freertos objects (in freertos.c) */
@ -212,13 +213,11 @@ void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t 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鍦板潃淇敼澶勭悊
// UART receives IP address
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)
{
// uart_lcd_draw_ipaddr();
}
}
if (huart == &huart4)
@ -228,7 +227,6 @@ void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t 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));
// dma_usart_send(&huart4, lcd_uart4.rx_data_temp, lcd_uart4.rx_num);
}
if (huart == &huart6)
{
@ -291,7 +289,26 @@ void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
}
if (huart == &huart4)
{
HART2_RTS_RECEIVE;
uart_lcd_state.lcd_flag = 0; // Reset the LCD flag after sending data
}
}
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;
}
}
}
/* USER CODE END 4 */
@ -330,7 +347,6 @@ void Error_Handler(void)
// while (1)
// {
// }
// TODO 这里暂时注释导致原因为DMA发送太快导致发送失败
/* USER CODE END Error_Handler_Debug */
}

View File

@ -92,8 +92,8 @@ extern TIM_HandleTypeDef htim4;
/* Cortex-M4 Processor Interruption and Exception Handlers */
/******************************************************************************/
/**
* @brief This function handles Non maskable interrupt.
*/
* @brief This function handles Non maskable interrupt.
*/
void NMI_Handler(void)
{
/* USER CODE BEGIN NonMaskableInt_IRQn 0 */
@ -107,8 +107,8 @@ void NMI_Handler(void)
}
/**
* @brief This function handles Hard fault interrupt.
*/
* @brief This function handles Hard fault interrupt.
*/
void HardFault_Handler(void)
{
/* USER CODE BEGIN HardFault_IRQn 0 */
@ -122,8 +122,8 @@ void HardFault_Handler(void)
}
/**
* @brief This function handles Memory management fault.
*/
* @brief This function handles Memory management fault.
*/
void MemManage_Handler(void)
{
/* USER CODE BEGIN MemoryManagement_IRQn 0 */
@ -137,8 +137,8 @@ void MemManage_Handler(void)
}
/**
* @brief This function handles Pre-fetch fault, memory access fault.
*/
* @brief This function handles Pre-fetch fault, memory access fault.
*/
void BusFault_Handler(void)
{
/* USER CODE BEGIN BusFault_IRQn 0 */
@ -152,8 +152,8 @@ void BusFault_Handler(void)
}
/**
* @brief This function handles Undefined instruction or illegal state.
*/
* @brief This function handles Undefined instruction or illegal state.
*/
void UsageFault_Handler(void)
{
/* USER CODE BEGIN UsageFault_IRQn 0 */
@ -167,8 +167,8 @@ void UsageFault_Handler(void)
}
/**
* @brief This function handles Debug monitor.
*/
* @brief This function handles Debug monitor.
*/
void DebugMon_Handler(void)
{
/* USER CODE BEGIN DebugMonitor_IRQn 0 */
@ -187,8 +187,8 @@ void DebugMon_Handler(void)
/******************************************************************************/
/**
* @brief This function handles EXTI line1 interrupt.
*/
* @brief This function handles EXTI line1 interrupt.
*/
void EXTI1_IRQHandler(void)
{
/* USER CODE BEGIN EXTI1_IRQn 0 */
@ -201,8 +201,8 @@ void EXTI1_IRQHandler(void)
}
/**
* @brief This function handles EXTI line3 interrupt.
*/
* @brief This function handles EXTI line3 interrupt.
*/
void EXTI3_IRQHandler(void)
{
/* USER CODE BEGIN EXTI3_IRQn 0 */
@ -215,8 +215,8 @@ void EXTI3_IRQHandler(void)
}
/**
* @brief This function handles DMA1 stream0 global interrupt.
*/
* @brief This function handles DMA1 stream0 global interrupt.
*/
void DMA1_Stream0_IRQHandler(void)
{
/* USER CODE BEGIN DMA1_Stream0_IRQn 0 */
@ -229,8 +229,8 @@ void DMA1_Stream0_IRQHandler(void)
}
/**
* @brief This function handles DMA1 stream1 global interrupt.
*/
* @brief This function handles DMA1 stream1 global interrupt.
*/
void DMA1_Stream1_IRQHandler(void)
{
/* USER CODE BEGIN DMA1_Stream1_IRQn 0 */
@ -243,8 +243,8 @@ void DMA1_Stream1_IRQHandler(void)
}
/**
* @brief This function handles DMA1 stream2 global interrupt.
*/
* @brief This function handles DMA1 stream2 global interrupt.
*/
void DMA1_Stream2_IRQHandler(void)
{
/* USER CODE BEGIN DMA1_Stream2_IRQn 0 */
@ -257,8 +257,8 @@ void DMA1_Stream2_IRQHandler(void)
}
/**
* @brief This function handles DMA1 stream3 global interrupt.
*/
* @brief This function handles DMA1 stream3 global interrupt.
*/
void DMA1_Stream3_IRQHandler(void)
{
/* USER CODE BEGIN DMA1_Stream3_IRQn 0 */
@ -271,8 +271,8 @@ void DMA1_Stream3_IRQHandler(void)
}
/**
* @brief This function handles DMA1 stream4 global interrupt.
*/
* @brief This function handles DMA1 stream4 global interrupt.
*/
void DMA1_Stream4_IRQHandler(void)
{
/* USER CODE BEGIN DMA1_Stream4_IRQn 0 */
@ -285,8 +285,8 @@ void DMA1_Stream4_IRQHandler(void)
}
/**
* @brief This function handles DMA1 stream5 global interrupt.
*/
* @brief This function handles DMA1 stream5 global interrupt.
*/
void DMA1_Stream5_IRQHandler(void)
{
/* USER CODE BEGIN DMA1_Stream5_IRQn 0 */
@ -299,8 +299,8 @@ void DMA1_Stream5_IRQHandler(void)
}
/**
* @brief This function handles DMA1 stream6 global interrupt.
*/
* @brief This function handles DMA1 stream6 global interrupt.
*/
void DMA1_Stream6_IRQHandler(void)
{
/* USER CODE BEGIN DMA1_Stream6_IRQn 0 */
@ -313,8 +313,8 @@ void DMA1_Stream6_IRQHandler(void)
}
/**
* @brief This function handles EXTI line[9:5] interrupts.
*/
* @brief This function handles EXTI line[9:5] interrupts.
*/
void EXTI9_5_IRQHandler(void)
{
/* USER CODE BEGIN EXTI9_5_IRQn 0 */
@ -322,20 +322,13 @@ void EXTI9_5_IRQHandler(void)
/* USER CODE END EXTI9_5_IRQn 0 */
HAL_GPIO_EXTI_IRQHandler(EC11_KEY_Pin);
/* USER CODE BEGIN EXTI9_5_IRQn 1 */
if (ec11_data.confirm_key_flag == 1)
{
ec11_data.confirm_key_flag = 2;
}
else if (ec11_data.confirm_key_flag == 0)
{
ec11_data.confirm_key_flag = 1;
}
/* USER CODE END EXTI9_5_IRQn 1 */
}
/**
* @brief This function handles TIM4 global interrupt.
*/
* @brief This function handles TIM4 global interrupt.
*/
void TIM4_IRQHandler(void)
{
/* USER CODE BEGIN TIM4_IRQn 0 */
@ -348,8 +341,8 @@ void TIM4_IRQHandler(void)
}
/**
* @brief This function handles USART1 global interrupt.
*/
* @brief This function handles USART1 global interrupt.
*/
void USART1_IRQHandler(void)
{
/* USER CODE BEGIN USART1_IRQn 0 */
@ -362,8 +355,8 @@ void USART1_IRQHandler(void)
}
/**
* @brief This function handles USART2 global interrupt.
*/
* @brief This function handles USART2 global interrupt.
*/
void USART2_IRQHandler(void)
{
/* USER CODE BEGIN USART2_IRQn 0 */
@ -375,8 +368,8 @@ void USART2_IRQHandler(void)
}
/**
* @brief This function handles USART3 global interrupt.
*/
* @brief This function handles USART3 global interrupt.
*/
void USART3_IRQHandler(void)
{
/* USER CODE BEGIN USART3_IRQn 0 */
@ -389,8 +382,8 @@ void USART3_IRQHandler(void)
}
/**
* @brief This function handles DMA1 stream7 global interrupt.
*/
* @brief This function handles DMA1 stream7 global interrupt.
*/
void DMA1_Stream7_IRQHandler(void)
{
/* USER CODE BEGIN DMA1_Stream7_IRQn 0 */
@ -403,8 +396,8 @@ void DMA1_Stream7_IRQHandler(void)
}
/**
* @brief This function handles UART4 global interrupt.
*/
* @brief This function handles UART4 global interrupt.
*/
void UART4_IRQHandler(void)
{
/* USER CODE BEGIN UART4_IRQn 0 */
@ -416,8 +409,8 @@ void UART4_IRQHandler(void)
}
/**
* @brief This function handles UART5 global interrupt.
*/
* @brief This function handles UART5 global interrupt.
*/
void UART5_IRQHandler(void)
{
/* USER CODE BEGIN UART5_IRQn 0 */
@ -428,8 +421,8 @@ void UART5_IRQHandler(void)
}
/**
* @brief This function handles DMA2 stream1 global interrupt.
*/
* @brief This function handles DMA2 stream1 global interrupt.
*/
void DMA2_Stream1_IRQHandler(void)
{
/* USER CODE BEGIN DMA2_Stream1_IRQn 0 */
@ -442,8 +435,8 @@ void DMA2_Stream1_IRQHandler(void)
}
/**
* @brief This function handles DMA2 stream2 global interrupt.
*/
* @brief This function handles DMA2 stream2 global interrupt.
*/
void DMA2_Stream2_IRQHandler(void)
{
/* USER CODE BEGIN DMA2_Stream2_IRQn 0 */
@ -456,8 +449,8 @@ void DMA2_Stream2_IRQHandler(void)
}
/**
* @brief This function handles Ethernet global interrupt.
*/
* @brief This function handles Ethernet global interrupt.
*/
void ETH_IRQHandler(void)
{
/* USER CODE BEGIN ETH_IRQn 0 */
@ -470,8 +463,8 @@ void ETH_IRQHandler(void)
}
/**
* @brief This function handles DMA2 stream6 global interrupt.
*/
* @brief This function handles DMA2 stream6 global interrupt.
*/
void DMA2_Stream6_IRQHandler(void)
{
/* USER CODE BEGIN DMA2_Stream6_IRQn 0 */
@ -484,8 +477,8 @@ void DMA2_Stream6_IRQHandler(void)
}
/**
* @brief This function handles DMA2 stream7 global interrupt.
*/
* @brief This function handles DMA2 stream7 global interrupt.
*/
void DMA2_Stream7_IRQHandler(void)
{
/* USER CODE BEGIN DMA2_Stream7_IRQn 0 */
@ -498,8 +491,8 @@ void DMA2_Stream7_IRQHandler(void)
}
/**
* @brief This function handles USART6 global interrupt.
*/
* @brief This function handles USART6 global interrupt.
*/
void USART6_IRQHandler(void)
{
/* USER CODE BEGIN USART6_IRQn 0 */

View File

@ -21,6 +21,7 @@
#include "usart.h"
/* USER CODE BEGIN 0 */
#include "uart_lcd.h"
/* USER CODE END 0 */
UART_HandleTypeDef huart4;
@ -772,8 +773,15 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef *uartHandle)
*/
void dma_usart_send(UART_HandleTypeDef *huart, uint8_t *buf, uint8_t len)
{
if (HAL_UART_Transmit_DMA(huart, buf, len) != HAL_OK) // 判断是否发é?ć­Łĺ¸¸ďźŒĺŚ‚ćžœĺ‡şçŽ°ĺź‚ĺ¸¸ĺˆ™čż›ĺ…Ľĺź‚ĺ¸¸ä¸­ć–­ĺ‡˝ć•?
if (huart == &huart4)
{
while (uart_lcd_state.lcd_flag != 0)
{
}
uart_lcd_state.lcd_flag = 1; // 设置标志位,表示正在发送数据
}
if (HAL_UART_Transmit_DMA(huart, buf, len) != HAL_OK)
{
Error_Handler();
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

View File

@ -0,0 +1 @@
<DrawPage name="current_out" bk_transparent="0" bk_color="255;255;255" bk_image="" size_option="0" width="240" height="320"><item name="Button1" id="1" type="button" button_type="1" focus="0" notify_disable="1" key_code="a" key_type="0" init_state="0" button_style="0" longpress_delay="0" url_down="" url_up="" popup_menu_id="0" input_text_id="0" switch="" switch_effect="0" switch_area="0" switch_area_left="0" switch_area_right="0" switch_area_top="0" switch_area_bottom="0" action="" xOffset="0" yOffset="0" width="320" height="59" cut_up="0" cut_up_offset_x="0" cut_up_offset_y="0" cut_down="0" cut_down_offset_x="0" cut_down_offset_y="0" custom_data_up="" custom_data_down="" external_data_up="" external_data_down="" external_data_delay="100" child_screen="0" need_login="0" login_password="888888" show_text_state="1" font="10" font_color_up="0;0;0" font_color_down="0;0;0" text_state_up="第一路输出控制" text_state_down="第二路输出控制" bind_variant="" show_condition="0" condition_variant="" condition_value="0"/><item name="Button2" id="2" type="button" button_type="1" focus="1" notify_disable="0" key_code="a" key_type="0" init_state="1" button_style="0" longpress_delay="0" url_down="Images\780.jpg" url_up="" popup_menu_id="0" input_text_id="0" switch="" switch_effect="0" switch_area="0" switch_area_left="0" switch_area_right="0" switch_area_top="0" switch_area_bottom="0" action="" xOffset="4" yOffset="70" width="60" height="60" cut_up="0" cut_up_offset_x="0" cut_up_offset_y="0" cut_down="0" cut_down_offset_x="0" cut_down_offset_y="0" custom_data_up="" custom_data_down="" external_data_up="" external_data_down="" external_data_delay="100" child_screen="0" need_login="0" login_password="888888" show_text_state="0" font="7" font_color_up="255;255;255" font_color_down="255;255;255" text_state_up="" text_state_down="" bind_variant="" show_condition="0" condition_variant="" condition_value="0"/><item name="Button3" id="3" type="button" button_type="1" focus="1" notify_disable="0" key_code="a" key_type="0" init_state="0" button_style="0" longpress_delay="0" url_down="images\780.jpg" url_up="" popup_menu_id="0" input_text_id="0" switch="" switch_effect="0" switch_area="0" switch_area_left="0" switch_area_right="0" switch_area_top="0" switch_area_bottom="0" action="" xOffset="4" yOffset="150" width="60" height="60" cut_up="0" cut_up_offset_x="4" cut_up_offset_y="150" cut_down="0" cut_down_offset_x="0" cut_down_offset_y="0" custom_data_up="" custom_data_down="" external_data_up="" external_data_down="" external_data_delay="100" child_screen="0" need_login="0" login_password="888888" show_text_state="0" font="7" font_color_up="255;255;255" font_color_down="255;255;255" text_state_up="" text_state_down="" bind_variant="" show_condition="0" condition_variant="" condition_value="0"/><item name="Slider1" id="4" type="slider" xOffset="71" yOffset="70" width="245" height="60" value="0" start_value="0" end_value="20" input="1" notify="0" direction="0" mark_type="0" mark_count="10" mark_color="0;0;0" show_value="1" left_space="24" right_space="24" bkg_type="1" bkg_image_path="" bkg_color="255;255;255" cursor_type="0" cursor_direction="0" cursor_offset="14" cursor_width="24" cursor_height="24" cursor_image_path="" bind_variant="" show_condition="0" condition_variant="" condition_value="0"/><item name="Slider2" id="5" type="slider" xOffset="69" yOffset="150" width="245" height="60" value="0" start_value="0" end_value="20" input="1" notify="0" direction="0" mark_type="0" mark_count="10" mark_color="0;0;0" show_value="1" left_space="24" right_space="24" bkg_type="1" bkg_image_path="" bkg_color="255;255;255" cursor_type="0" cursor_direction="0" cursor_offset="14" cursor_width="24" cursor_height="24" cursor_image_path="" bind_variant="" show_condition="0" condition_variant="" condition_value="0"/></DrawPage>

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,24 @@
[tcpip]
dhcp=n
ipaddr=192.168.1.100
netmask=255.255.255.0
gw=192.168.1.1
dns=192.168.1.1
server_port=5050
remote_ip=192.168.1.200
network_transfer=0
network_mode=0
[ctrlboard]
lcd_width=320
lcd_height=240
baudrate=115200
enable_keysound=0
audiolevel=100
[wifi]
wifi_mode=0
ssid=
password=
secumode=0

View File

@ -0,0 +1 @@
<EFBFBD>uc<EFBFBD>

View File

@ -0,0 +1,37 @@
------------------------------------
-- 提示
-- 如果使用其他Lua编辑工具编辑此文档请将VisualTFT软件中打开的此文件编辑器视图关闭
-- 因为VisualTFT具有自动保存功能其他软件修改时不能同步到VisualTFT编辑视图
-- VisualTFT定时保存时其他软件修改的内容将被恢复。
--
-- Attention
-- If you use other Lua Editor to edit this file, please close the file editor view
-- opened in the VisualTFT, Because VisualTFT has an automatic save function,
-- other Lua Editor cannot be synchronized to the VisualTFT edit view when it is modified.
-- When VisualTFT saves regularly, the content modified by other Lua Editor will be restored.
------------------------------------
--下面列出了常用的回调函数
--更多功能请阅读<<LUA脚本API.pdf>>
--初始化函数
--function on_init()
--end
--定时回调函数系统每隔1秒钟自动调用。
--function on_systick()
--end
--定时器超时回调函数当设置的定时器超时时执行此回调函数timer_id为对应的定时器ID
--function on_timer(timer_id)
--end
--用户通过触摸修改控件后,执行此回调函数。
--点击按钮控件,修改文本控件、修改滑动条都会触发此事件。
--function on_control_notify(screen,control,value)
--end
--当画面切换时执行此回调函数screen为目标画面。
--function on_screen_change(screen)
--end

View File

@ -0,0 +1,2 @@
[setting]
font0=wqymicrohei.ttf

View File

@ -0,0 +1,32 @@
<fonts ttf="wqyMicroHei.ttf">
<font id="0" type="2" name="ASC_CHS_8" width="4" height="8"/>
<font id="1" type="2" name="ASC_CHS_10" width="5" height="10"/>
<font id="2" type="2" name="ASC_CHS_12" width="6" height="12"/>
<font id="3" type="2" name="ASC_CHS_14" width="7" height="14"/>
<font id="4" type="2" name="ASC_CHS_16" width="8" height="16"/>
<font id="5" type="2" name="ASC_CHS_18" width="9" height="18"/>
<font id="6" type="2" name="ASC_CHS_20" width="10" height="20"/>
<font id="7" type="2" name="ASC_CHS_22" width="11" height="22"/>
<font id="8" type="2" name="ASC_CHS_24" width="12" height="24"/>
<font id="9" type="2" name="ASC_CHS_26" width="13" height="26"/>
<font id="10" type="2" name="ASC_CHS_28" width="14" height="28"/>
<font id="11" type="2" name="ASC_CHS_30" width="15" height="30"/>
<font id="12" type="2" name="ASC_CHS_32" width="16" height="32"/>
<font id="13" type="2" name="ASC_CHS_36" width="18" height="36"/>
<font id="14" type="2" name="ASC_CHS_40" width="20" height="40"/>
<font id="15" type="2" name="ASC_CHS_44" width="22" height="44"/>
<font id="16" type="2" name="ASC_CHS_48" width="24" height="48"/>
<font id="17" type="2" name="ASC_CHS_52" width="26" height="52"/>
<font id="18" type="2" name="ASC_CHS_56" width="28" height="56"/>
<font id="19" type="2" name="ASC_CHS_60" width="30" height="60"/>
<font id="20" type="2" name="ASC_CHS_64" width="32" height="64"/>
<font id="21" type="2" name="ASC_CHS_80" width="40" height="80"/>
<font id="22" type="2" name="ASC_CHS_96" width="48" height="96"/>
<font id="23" type="2" name="ASC_CHS_112" width="56" height="112"/>
<font id="24" type="2" name="ASC_CHS_128" width="64" height="128"/>
<font id="25" type="2" name="ASC_CHS_144" width="72" height="144"/>
<font id="26" type="2" name="ASC_CHS_160" width="80" height="160"/>
<font id="27" type="2" name="ASC_CHS_176" width="88" height="176"/>
<font id="28" type="2" name="ASC_CHS_192" width="96" height="192"/>
<font id="29" type="2" name="ASC_CHS_200" width="100" height="200"/>
</fonts>

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 101 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

View File

@ -0,0 +1,37 @@
------------------------------------
-- 提示
-- 如果使用其他Lua编辑工具编辑此文档请将VisualTFT软件中打开的此文件编辑器视图关闭
-- 因为VisualTFT具有自动保存功能其他软件修改时不能同步到VisualTFT编辑视图
-- VisualTFT定时保存时其他软件修改的内容将被恢复。
--
-- Attention
-- If you use other Lua Editor to edit this file, please close the file editor view
-- opened in the VisualTFT, Because VisualTFT has an automatic save function,
-- other Lua Editor cannot be synchronized to the VisualTFT edit view when it is modified.
-- When VisualTFT saves regularly, the content modified by other Lua Editor will be restored.
------------------------------------
--下面列出了常用的回调函数
--更多功能请阅读<<LUA脚本API.pdf>>
--初始化函数
--function on_init()
--end
--定时回调函数系统每隔1秒钟自动调用。
--function on_systick()
--end
--定时器超时回调函数当设置的定时器超时时执行此回调函数timer_id为对应的定时器ID
--function on_timer(timer_id)
--end
--用户通过触摸修改控件后,执行此回调函数。
--点击按钮控件,修改文本控件、修改滑动条都会触发此事件。
--function on_control_notify(screen,control,value)
--end
--当画面切换时执行此回调函数screen为目标画面。
--function on_screen_change(screen)
--end

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,31 @@
//创建画面current_out的命令索引ID
#define _SCREEN_CURRENT_OUT 0
//创建画面monitoring的命令索引ID
#define _SCREEN_MONITORING 1
#define _BTN_CURRENT_OUT_BUTTON1 1
#define _BTN_CURRENT_OUT_BUTTON2 2
//画面current_out中按钮Button3按下时的图片
#define _IMG_CURRENT_OUT_BUTTON3_DOWN 0
#define _BTN_CURRENT_OUT_BUTTON3 3
#define _SLIDER_CURRENT_OUT_SLIDER1 4
#define _SLIDER_CURRENT_OUT_SLIDER2 5
#define _TXT_DIS__MONITORING_TEXT_DISPLAY2 5
#define _TXT_DIS__MONITORING_TEXT_DISPLAY4 6
#define _TXT_DIS__MONITORING_TEXT_DISPLAY8 7
#define _GRAPH_MONITORING_GRAPH1 14
#define _BTN_MONITORING_BUTTON1 1
#define _BTN_MONITORING_BUTTON2 2

View File

@ -0,0 +1,2 @@
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz`1234567890-=[];',./~!@#$%^&*()_+{}:"<>? 年月日时分秒星期一二三四五六日
第路输出控制

View File

@ -0,0 +1 @@
<controls count="11"><control type="16" count="5"/><control type="17" count="3"/><control type="19" count="2"/><control type="24" count="1"/></controls>

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,13 @@
<Resource>
<pages>
<page name="current_out" id="0" />
<page name="monitoring" id="1" />
</pages>
<images>
<image id="0" url="e:\work\代码-项目\positioner_testing\signal_generator\lcd\signal generator\Images\780.jpg" effect_width="60" effect_height="60" />
<image id="1" url="C:\Users\WANGXU~1\AppData\Local\Temp\slider_0_4.png" effect_width="60" effect_height="245" />
<image id="2" url="C:\Users\WANGXU~1\AppData\Local\Temp\cursor_0_0.png" effect_width="24" effect_height="24" />
<image id="3" url="C:\Users\WANGXU~1\AppData\Local\Temp\slider_0_5.png" effect_width="60" effect_height="245" />
</images>
<waves />
</Resource>

View File

@ -0,0 +1,2 @@
[setting]
font0=wqymicrohei.ttf

Binary file not shown.

View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<VisualTFT Name="signal generator" OutputDirectory="output\" StartupPage="current_out" StartupAction="" StartupActionLoop="1" DeviceType="28000" DeviceEnableControl="1" DeviceEnableTouchPane="1" DeviceEnableBuzzer="2" DeviceEnableCRC="0" DeviceBaudRate="7" DeviceCoordinateUpdateMode="4" DeviceControlNotify="3" DeviceScreenNotify="1" DeviceScreenRvs="1" DeviceBacklightAutoControl="0" DeviceBacklightTime="10" DeviceBacklightOn="200" DeviceBacklightOff="50" DeviceBacklightNotify="0" DeviceLockConfig="1" DeviceStartupVoice="0" DeviceVoiceVolume="100" DeviceEnableSlidingScreen="0" BeginSlidingScreen="" EndSlidingScreen="" CompatibleScreenRotate="1" AddResourceFloder="1" FastRefreshScreen="0" DelayInitScreen="0" ImageDithering="1" ImageFormat="1" JPEGQuality="95" StartupLogo="" DHCP="0" IPAddress="192.168.1.100" NetMask="255.255.255.0" Gateway="192.168.1.1" DNS="192.168.1.1" NetworkMode="0" ServerAddress="192.168.1.200" ServicePort="5050" NetworkTransfer="0" WifiMode="0" WifiSSID="" WifiPassword="" FlashType="1" PartitionSize0="100" PartitionSize1="10" PartitionSize2="0" Repartition="1" FormatPartition="1" UartDownloadSpeed="0" PKGSetting="0" PKGControl="1" PKGImage="1" PKGFont="1" PKGOther="1" Version="1.0" EnableSlidingRange="0" EnableKeysound="0" BacklightAutoControl="0" BacklightNotify="0" StandbyPage="" ServerPort="5050" WifiSSI="">
<Pages><Page RelativePath="current_out.tft"/><Page RelativePath="monitoring.tft"/></Pages>
<Images/>
<Waves/>
</VisualTFT>

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

File diff suppressed because one or more lines are too long

View File

@ -145,27 +145,10 @@
<SetRegEntry>
<Number>0</Number>
<Key>ST-LINKIII-KEIL_SWO</Key>
<Name>-U090F00028316303030303032 -O2254 -SF10000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P1 -N00("ARM CoreSight SW-DP (ARM Core") -D00(2BA01477) -L00(0) -TO131090 -TC10000000 -TT10000000 -TP21 -TDS8000 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC800 -FN1 -FF0STM32F4xx_1024.FLM -FS08000000 -FL0100000 -FP0($$Device:STM32F407VGTx$CMSIS\Flash\STM32F4xx_1024.FLM)</Name>
<Name>-UB -O2254 -SF10000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P1 -N00("ARM CoreSight SW-DP (ARM Core") -D00(2BA01477) -L00(0) -TO131090 -TC10000000 -TT10000000 -TP21 -TDS8000 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC800 -FN1 -FF0STM32F4xx_1024.FLM -FS08000000 -FL0100000 -FP0($$Device:STM32F407VGTx$CMSIS\Flash\STM32F4xx_1024.FLM)</Name>
</SetRegEntry>
</TargetDriverDllRegistry>
<Breakpoint>
<Bp>
<Number>0</Number>
<Type>0</Type>
<LineNumber>1404</LineNumber>
<EnabledFlag>1</EnabledFlag>
<Address>134235956</Address>
<ByteObject>0</ByteObject>
<HtxType>0</HtxType>
<ManyObjects>0</ManyObjects>
<SizeOfObject>0</SizeOfObject>
<BreakByAccess>0</BreakByAccess>
<BreakIfRCount>1</BreakIfRCount>
<Filename>../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c</Filename>
<ExecCommand></ExecCommand>
<Expression>\\signal_generator\../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c\1404</Expression>
</Bp>
</Breakpoint>
<Breakpoint/>
<WatchWindow1>
<Ww>
<count>0</count>
@ -187,6 +170,61 @@
<WinNumber>1</WinNumber>
<ItemText>current_buff</ItemText>
</Ww>
<Ww>
<count>4</count>
<WinNumber>1</WinNumber>
<ItemText>ad7124_analog</ItemText>
</Ww>
<Ww>
<count>5</count>
<WinNumber>1</WinNumber>
<ItemText>lcd_makecurve_data</ItemText>
</Ww>
<Ww>
<count>6</count>
<WinNumber>1</WinNumber>
<ItemText>uart_makecurve_data</ItemText>
</Ww>
<Ww>
<count>7</count>
<WinNumber>1</WinNumber>
<ItemText>test_num</ItemText>
</Ww>
<Ww>
<count>8</count>
<WinNumber>1</WinNumber>
<ItemText>lcd_set_button1_data</ItemText>
</Ww>
<Ww>
<count>9</count>
<WinNumber>1</WinNumber>
<ItemText>uart_lcd_button_data</ItemText>
</Ww>
<Ww>
<count>10</count>
<WinNumber>1</WinNumber>
<ItemText>lcd_set_button1_data</ItemText>
</Ww>
<Ww>
<count>11</count>
<WinNumber>1</WinNumber>
<ItemText>txt_len</ItemText>
</Ww>
<Ww>
<count>12</count>
<WinNumber>1</WinNumber>
<ItemText>txt_value_str,0x0A</ItemText>
</Ww>
<Ww>
<count>13</count>
<WinNumber>1</WinNumber>
<ItemText>uart_lcd_txt_data</ItemText>
</Ww>
<Ww>
<count>14</count>
<WinNumber>1</WinNumber>
<ItemText>txt_value_str</ItemText>
</Ww>
</WatchWindow1>
<Tracepoint>
<THDelay>0</THDelay>
@ -450,7 +488,7 @@
<Group>
<GroupName>Drivers/STM32F4xx_HAL_Driver</GroupName>
<tvExp>1</tvExp>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel>
<RteFlg>0</RteFlg>

View File

@ -16,8 +16,8 @@
<TargetCommonOption>
<Device>STM32F407VGTx</Device>
<Vendor>STMicroelectronics</Vendor>
<PackID>Keil.STM32F4xx_DFP.2.17.1</PackID>
<PackURL>https://www.keil.com/pack/</PackURL>
<PackID>Keil.STM32F4xx_DFP.2.12.0</PackID>
<PackURL>http://www.keil.com/pack</PackURL>
<Cpu>IRAM(0x20000000-0x2001BFFF) IRAM2(0x2001C000-0x2001FFFF) IROM(0x8000000-0x80FFFFF) CLOCK(25000000) FPU2 CPUTYPE("Cortex-M4") TZ</Cpu>
<FlashUtilSpec></FlashUtilSpec>
<StartupFile></StartupFile>
@ -138,7 +138,7 @@
</Flash1>
<bUseTDR>1</bUseTDR>
<Flash2>BIN\UL2V8M.DLL</Flash2>
<Flash3></Flash3>
<Flash3>"" ()</Flash3>
<Flash4></Flash4>
<pFcarmOut></pFcarmOut>
<pFcarmGrp></pFcarmGrp>

File diff suppressed because it is too large Load Diff

View File

@ -1,24 +1,219 @@
/*
* @Author: wangxujie wangxujie@wuxismart.com
* @Date: 2025-03-10 15:05:20
* @LastEditors: wangxujie wangxujie@wuxismart.com
* @LastEditTime: 2025-08-01 16:19:35
* @FilePath: \signal_generator\User\driver\uart_lcd.c
* @Description: ,`customMade`, koroFileHeader查看配置 : https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/
#include "uart_lcd.h"
#include "usart.h"
#include "lwip.h"
#include "tim.h"
#include "ad7124.h"
extern ip4_addr_t ipaddr;
uart_lcd_t uart_lcd_state = {0};
uint8_t uart_lcd_data[24] = {0xEE, 0xB1, 0x12, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x01, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0xFF, 0xFC, 0xFF, 0xFF};
lcd_makecurve_t lcd_makecurve_data = {0}; // 绘制曲线数据界面ID 1控件ID 14
static void uart_lcd_current_channel1(void);
static void uart_lcd_current_channel2(void);
lcd_set_button_t lcd_set_button1_data = {0}; // 输出通道文本按钮界面ID 0控件ID 1
lcd_set_button_t lcd_set_button2_data = {0}; // 第一路AO输出箭头按钮界面ID 0控件ID 2
lcd_set_button_t lcd_set_button3_data = {0}; // 第二路AO输出箭头按钮界面ID 0控件ID 3
lcd_set_button_t lcd_set_button4_data = {0}; // SW1状态按钮界面ID 1控件ID 1
lcd_set_button_t lcd_set_button5_data = {0}; // SW2状态按钮界面ID 1控件ID 2
lcd_set_txt_t lcd_set_txt1_data = {0}; // 文本设置数据界面ID 1控件ID 5
lcd_set_txt_t lcd_set_txt2_data = {0}; // 文本设置数据界面ID 1控件ID 6
lcd_set_txt_t lcd_set_txt3_data = {0}; // 文本设置数据界面ID 1控件ID 7
lcd_set_slidervalue_t lcd_set_slidervalue1_data = {0}; // 进度条设置数据界面ID 0控件ID 4
lcd_set_slidervalue_t lcd_set_slidervalue2_data = {0}; // 进度条设置数据界面ID 0控件ID 5
lcd_switchscreen_t lcd_switchscreen_data = {0}; // 切换画面数据
extern float current_buff[2];
extern ad7124_analog_t ad7124_analog[AD7124_CHANNEL_EN_MAX];
static void uart_lcd_page_init(lcd_switchscreen_t *screen_data)
{
screen_data->cmd_head = LCD_CMD_HEAD;
screen_data->cmd_type = LCD_CMD_TYPE;
screen_data->cmd_ctrl_type = LCD_CMD_CTRL_TYPE_SWITCH_SCREEN;
screen_data->cmd_screen_id = LCD_SCREEN_ID_CRUUENT; // 默认切换到主界面
screen_data->cmd_tail = LCD_CMD_TAIL;
}
static void uart_lcd_button_init(lcd_set_button_t *button_data, uint16_t screen_id, uint16_t ctrl_id)
{
button_data->cmd_head = LCD_CMD_HEAD;
button_data->cmd_type = LCD_CMD_TYPE;
button_data->cmd_ctrl_type = LCD_CMD_CTRL_TYPE_SET_BUTTON;
button_data->cmd_screen_id = screen_id;
button_data->cmd_ctrl_id = ctrl_id;
button_data->cmd_button_status = 0; // 默认按钮状态为未按下
button_data->cmd_tail = LCD_CMD_TAIL;
}
static void uart_lcd_slidervalue_init(lcd_set_slidervalue_t *slidervalue_data, uint16_t screen_id, uint16_t ctrl_id)
{
slidervalue_data->cmd_head = LCD_CMD_HEAD;
slidervalue_data->cmd_type = LCD_CMD_TYPE;
slidervalue_data->cmd_ctrl_type = LCD_CMD_CTRL_TYPE_SET_SLIDERVALUE;
slidervalue_data->cmd_screen_id = screen_id;
slidervalue_data->cmd_ctrl_id = ctrl_id;
slidervalue_data->cmd_slidervalue = 0; // 默认滑块数值为0
slidervalue_data->cmd_tail = LCD_CMD_TAIL;
}
static void uart_lcd_markcurve_init(lcd_makecurve_t *curve_data, uint16_t screen_id, uint16_t ctrl_id)
{
curve_data->cmd_head = LCD_CMD_HEAD;
curve_data->cmd_type = LCD_CMD_TYPE;
curve_data->cmd_ctrl_type = LCD_CMD_CTRL_TYPE_MAKE_CURVE;
curve_data->cmd_screen_id = screen_id;
curve_data->cmd_ctrl_id = ctrl_id;
curve_data->cmd_curve_channel = 0; // 曲线通道
curve_data->cmd_data_len = 1; // 数据长度
memset(curve_data->cmd_data, 0, sizeof(curve_data->cmd_data)); // 清空数据内容
curve_data->cmd_tail = LCD_CMD_TAIL;
}
static void uart_lcd_txt_init(lcd_set_txt_t *txt_data, uint16_t screen_id, uint16_t ctrl_id)
{
txt_data->cmd_head = LCD_CMD_HEAD;
txt_data->cmd_type = LCD_CMD_TYPE;
txt_data->cmd_ctrl_type = LCD_CMD_CTRL_TYPE_SET_TXT;
txt_data->cmd_screen_id = screen_id;
txt_data->cmd_ctrl_id = ctrl_id;
txt_data->cmd_txt_data = 0.0f; // 默认文本内容为0.0
txt_data->cmd_tail = LCD_CMD_TAIL;
}
/**
* @brief LCD按钮状态
*
* LCD上的按钮状态
*
* @param button_data
*/
static void uart_lcd_set_button_status(lcd_set_button_t *button_data, uint8_t status)
{
if (button_data == NULL)
{
return;
}
while (uart_lcd_state.lcd_flag != 0)
{
}
button_data->cmd_button_status = status; // 设置按钮状态
static uint8_t uart_lcd_button_data[sizeof(lcd_set_button_t)] = {0};
uart_lcd_button_data[0] = button_data->cmd_head; // 帧头
uart_lcd_button_data[1] = button_data->cmd_type; // 命令类型
uart_lcd_button_data[2] = button_data->cmd_ctrl_type; // 控制类型
uart_lcd_button_data[3] = (button_data->cmd_screen_id >> 8) & 0xFF; // 画面ID高位
uart_lcd_button_data[4] = button_data->cmd_screen_id & 0xFF; // 画面ID低位
uart_lcd_button_data[5] = (button_data->cmd_ctrl_id >> 8) & 0xFF; // 控件ID高位
uart_lcd_button_data[6] = button_data->cmd_ctrl_id & 0xFF; // 控件ID低位
uart_lcd_button_data[7] = button_data->cmd_button_status; // 按钮状态
uart_lcd_button_data[8] = (button_data->cmd_tail >> 24) & 0xFF; // 帧尾
uart_lcd_button_data[9] = (button_data->cmd_tail >> 16) & 0xFF; // 帧尾
uart_lcd_button_data[10] = (button_data->cmd_tail >> 8) & 0xFF; // 帧尾
uart_lcd_button_data[11] = button_data->cmd_tail & 0xFF; // 帧尾
dma_usart_send(&huart4, uart_lcd_button_data, sizeof(lcd_set_button_t));
}
/**
* @brief LCD屏幕上的滑块数值
*
* UART接口向LCD屏幕发送命令
*
* @param slidervalue_data
* @param value
*/
static void uart_lcd_set_slidervalue(lcd_set_slidervalue_t *slidervalue_data, uint32_t value)
{
if (slidervalue_data == NULL)
{
return;
}
while (uart_lcd_state.lcd_flag != 0)
{
}
slidervalue_data->cmd_slidervalue = value; // 设置滑块数值
static uint8_t uart_lcd_slidervalue_data[sizeof(lcd_set_slidervalue_t)] = {0};
uart_lcd_slidervalue_data[0] = slidervalue_data->cmd_head; // 帧头
uart_lcd_slidervalue_data[1] = slidervalue_data->cmd_type; // 命令类型
uart_lcd_slidervalue_data[2] = slidervalue_data->cmd_ctrl_type; // 控制类型
uart_lcd_slidervalue_data[3] = (slidervalue_data->cmd_screen_id >> 8) & 0xFF; // 画面ID高位
uart_lcd_slidervalue_data[4] = slidervalue_data->cmd_screen_id & 0xFF; // 画面ID低位
uart_lcd_slidervalue_data[5] = (slidervalue_data->cmd_ctrl_id >> 8) & 0xFF; // 控件ID高位
uart_lcd_slidervalue_data[6] = slidervalue_data->cmd_ctrl_id & 0xFF; // 控件ID低位
uart_lcd_slidervalue_data[7] = (slidervalue_data->cmd_slidervalue >> 24) & 0xFF; // 滑块数值高位
uart_lcd_slidervalue_data[8] = (slidervalue_data->cmd_slidervalue >> 16) & 0xFF; // 滑块数值高位
uart_lcd_slidervalue_data[9] = (slidervalue_data->cmd_slidervalue >> 8) & 0xFF; // 滑块数值低位
uart_lcd_slidervalue_data[10] = slidervalue_data->cmd_slidervalue & 0xFF; // 滑块数值低位
uart_lcd_slidervalue_data[11] = (slidervalue_data->cmd_tail >> 24) & 0xFF; // 帧尾
uart_lcd_slidervalue_data[12] = (slidervalue_data->cmd_tail >> 16) & 0xFF; // 帧尾
uart_lcd_slidervalue_data[13] = (slidervalue_data->cmd_tail >> 8) & 0xFF; // 帧尾
uart_lcd_slidervalue_data[14] = slidervalue_data->cmd_tail & 0xFF; // 帧尾
dma_usart_send(&huart4, uart_lcd_slidervalue_data, sizeof(lcd_set_slidervalue_t));
}
/**
* @brief LCD屏幕上的文本内容
*
* UART接口向LCD屏幕发送文本内容
*
* @param txt_data lcd_set_txt_t结构体的指针
* @param value
*/
static void uart_lcd_set_txt(lcd_set_txt_t *txt_data, float value)
{
if (txt_data == NULL)
{
return;
}
while (uart_lcd_state.lcd_flag != 0)
{
}
txt_data->cmd_txt_data = value; // 设置文本内容
static uint8_t uart_lcd_txt_data[sizeof(lcd_set_txt_t)] = {0};
uart_lcd_txt_data[0] = txt_data->cmd_head; // 帧头
uart_lcd_txt_data[1] = txt_data->cmd_type; // 命令类型
uart_lcd_txt_data[2] = txt_data->cmd_ctrl_type; // 控件类型
uart_lcd_txt_data[3] = (txt_data->cmd_screen_id >> 8) & 0xFF; // 画面ID高位
uart_lcd_txt_data[4] = txt_data->cmd_screen_id & 0xFF; // 画面ID低位
uart_lcd_txt_data[5] = (txt_data->cmd_ctrl_id >> 8) & 0xFF; // 控件ID高位
uart_lcd_txt_data[6] = txt_data->cmd_ctrl_id & 0xFF; // 控件ID低位
// 将浮点数转换为字符串形式
char txt_value_str[16] = {0};
snprintf(txt_value_str, sizeof(txt_value_str), "%.2f", txt_data->cmd_txt_data);
// 将字符串内容复制到数据包中
size_t txt_len = strlen(txt_value_str);
for (size_t i = 0; i < txt_len; ++i)
{
uart_lcd_txt_data[7 + i] = txt_value_str[i]; // 文本内容
}
uart_lcd_txt_data[7 + txt_len] = 0xFF; // 帧尾
uart_lcd_txt_data[8 + txt_len] = 0xFC; // 帧尾
uart_lcd_txt_data[9 + txt_len] = 0xFF; // 帧尾
uart_lcd_txt_data[10 + txt_len] = 0xFF; // 帧尾
dma_usart_send(&huart4, uart_lcd_txt_data, 11 + txt_len);
}
static void uart_lcd_current_channel1(void)
{
// uint8_t uart_lcd_data[24] = {0xEE, 0xB1, 0x12, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x01, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0xFF, 0xFC, 0xFF, 0xFF};
dma_usart_send(&huart4, uart_lcd_data, ARRAY_LEN(uart_lcd_data));
// 输出文本按钮状态0第一路AO状态1第二路AO状态0
// lcd_set_button1_data.cmd_button_status = 0; // 第一路AO输出文本按钮状态为未按下
uart_lcd_set_button_status(&lcd_set_button1_data, 0);
// lcd_set_button2_data.cmd_button_status = 1; // 第一路AO输出箭头按钮状态为按下
uart_lcd_set_button_status(&lcd_set_button2_data, 1);
// lcd_set_button3_data.cmd_button_status = 0; // 第二路AO输出箭头按钮状态为未按下
uart_lcd_set_button_status(&lcd_set_button3_data, 0);
}
uint8_t uart_lcd_data2[24] = {0xEE, 0xB1, 0x12, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x03, 0x00, 0x01, 0x01, 0xFF, 0xFC, 0xFF, 0xFF};
static void uart_lcd_current_channel2(void)
{
dma_usart_send(&huart4, uart_lcd_data2, ARRAY_LEN(uart_lcd_data2));
// 输出文本按钮状态1第一路AO状态0第二路AO状态1
// lcd_set_button1_data.cmd_button_status = 1;
uart_lcd_set_button_status(&lcd_set_button1_data, 1);
// lcd_set_button2_data.cmd_button_status = 0;
uart_lcd_set_button_status(&lcd_set_button2_data, 0);
// lcd_set_button3_data.cmd_button_status = 1;
uart_lcd_set_button_status(&lcd_set_button3_data, 1);
}
/**
@ -50,38 +245,60 @@ void uart_lcd_draw_ipaddr(void)
void uart_lcd_init(void)
{
uart_lcd_state.page_num = 0;
uart_lcd_state.key_state[0] = 0;
uart_lcd_state.key_state[1] = 1;
uart_lcd_state.key_state[2] = 0;
// 初始化屏幕
uart_lcd_state.page_num = LCD_SCREEN_ID_CRUUENT;
uart_lcd_page_init(&lcd_switchscreen_data); // 初始化页面数据
uart_lcd_page_switch(uart_lcd_state.page_num); // 切换到第一个页面
// 初始化按钮
uart_lcd_button_init(&lcd_set_button1_data, LCD_SCREEN_ID_CRUUENT, LCD_CTRL_ID_BUTTON1);
uart_lcd_button_init(&lcd_set_button2_data, LCD_SCREEN_ID_CRUUENT, LCD_CTRL_ID_BUTTON2);
uart_lcd_button_init(&lcd_set_button3_data, LCD_SCREEN_ID_CRUUENT, LCD_CTRL_ID_BUTTON3);
uart_lcd_button_init(&lcd_set_button4_data, LCD_SCREEN_ID_CURVE, LCD_CTRL_ID_BUTTON4);
uart_lcd_button_init(&lcd_set_button5_data, LCD_SCREEN_ID_CURVE, LCD_CTRL_ID_BUTTON5);
uart_lcd_state.current_out_channel = 0;
uart_lcd_current_out_channel_switch(uart_lcd_state.current_out_channel);
uart_lcd_set_button_status(&lcd_set_button4_data, 0); // 设置按钮状态
uart_lcd_set_button_status(&lcd_set_button5_data, 0); // 设置按钮状态
// 初始化滑块
uart_lcd_slidervalue_init(&lcd_set_slidervalue1_data, LCD_SCREEN_ID_CRUUENT, LCD_CTRL_ID_SLIDERVALUE1); // 第一路滑块
uart_lcd_slidervalue_init(&lcd_set_slidervalue2_data, LCD_SCREEN_ID_CRUUENT, LCD_CTRL_ID_SLIDERVALUE2); // 第二路滑块
uart_lcd_state.current_value[0] = 0;
uart_lcd_state.current_value[1] = 0;
uart_lcd_channel_switch(uart_lcd_state.key_state[0]);
HAL_Delay(10);
uart_lcd_current_out(0);
HAL_Delay(10);
uart_lcd_current_out(1);
uart_lcd_set_slidervalue(&lcd_set_slidervalue1_data, uart_lcd_state.current_value[0]); // 设置滑块值
uart_lcd_set_slidervalue(&lcd_set_slidervalue2_data, uart_lcd_state.current_value[1]); // 设置滑块值
// 初始化曲线
uart_lcd_markcurve_init(&lcd_makecurve_data, LCD_SCREEN_ID_CURVE, LCD_CTRL_ID_MAKE_CURVE); // 曲线数据初始化
// 初始化文本
uart_lcd_txt_init(&lcd_set_txt1_data, LCD_SCREEN_ID_CURVE, LCD_CTRL_ID_TXT1);
uart_lcd_txt_init(&lcd_set_txt2_data, LCD_SCREEN_ID_CURVE, LCD_CTRL_ID_TXT2);
uart_lcd_txt_init(&lcd_set_txt3_data, LCD_SCREEN_ID_CURVE, LCD_CTRL_ID_TXT3);
uart_lcd_set_txt(&lcd_set_txt1_data, 0.0f); // 设置文本内容
uart_lcd_set_txt(&lcd_set_txt2_data, 0.0f); // 设置文本内容
uart_lcd_set_txt(&lcd_set_txt3_data, 0.0f); // 设置文本内容
}
uint8_t lcd_channel[15] = {0xEE, 0xB1, 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFC, 0xFF, 0xFF};
void uart_lcd_current_out(uint8_t channel)
{
if (channel == 0)
switch (channel)
{
lcd_channel[6] = 0x04;
lcd_channel[10] = uart_lcd_state.current_value[0];
dma_usart_send(&huart4, lcd_channel, ARRAY_LEN(lcd_channel));
}
else if (channel == 1)
{
lcd_channel[6] = 0x05;
lcd_channel[10] = uart_lcd_state.current_value[1];
dma_usart_send(&huart4, lcd_channel, ARRAY_LEN(lcd_channel));
case 0:
uart_lcd_set_slidervalue(&lcd_set_slidervalue1_data, uart_lcd_state.current_value[0]); // 设置滑块值
break;
case 1:
uart_lcd_set_slidervalue(&lcd_set_slidervalue2_data, uart_lcd_state.current_value[1]); // 设置滑块值
break;
default:
uart_lcd_set_slidervalue(&lcd_set_slidervalue1_data, uart_lcd_state.current_value[0]); // 设置滑块值
break;
}
}
void uart_lcd_channel_switch(uint8_t channel)
void uart_lcd_current_out_channel_switch(uint8_t channel)
{
switch (channel)
{
@ -96,3 +313,201 @@ void uart_lcd_channel_switch(uint8_t channel)
break;
}
}
void uart_lcd_page_switch(uint8_t page)
{
while (uart_lcd_state.lcd_flag != 0)
{
}
static uint8_t uart_switchscreen_data[sizeof(lcd_switchscreen_t)] = {0};
lcd_switchscreen_data.cmd_screen_id = (uint16_t)page; // 更新当前页面状态
uart_switchscreen_data[0] = lcd_switchscreen_data.cmd_head; // 帧头
uart_switchscreen_data[1] = lcd_switchscreen_data.cmd_type; // 命令类型
uart_switchscreen_data[2] = lcd_switchscreen_data.cmd_ctrl_type; // 控制类型
uart_switchscreen_data[3] = (lcd_switchscreen_data.cmd_screen_id >> 8) & 0xFF; // 画面ID高位地址
uart_switchscreen_data[4] = lcd_switchscreen_data.cmd_screen_id & 0xFF; // 画面ID低位地址
uart_switchscreen_data[5] = (lcd_switchscreen_data.cmd_tail >> 24) & 0xFF; // 帧尾
uart_switchscreen_data[6] = (lcd_switchscreen_data.cmd_tail >> 16) & 0xFF; // 帧尾
uart_switchscreen_data[7] = (lcd_switchscreen_data.cmd_tail >> 8) & 0xFF; // 帧尾
uart_switchscreen_data[8] = lcd_switchscreen_data.cmd_tail & 0xFF; // 帧尾
dma_usart_send(&huart4, uart_switchscreen_data, sizeof(lcd_switchscreen_t)); // 发送切换画面数据
}
void uart_lcd_ecll_control_current_out(void)
{
if (ec11_data.confirm_key_flag == 0)
{
}
else if (ec11_data.confirm_key_flag == 1) // Confirm button - confirms current output
{
ec11_data.confirm_key_flag_last++;
if (ec11_data.confirm_key_flag_last > 2)
{
current_buff[0] = (float)uart_lcd_state.current_value[0];
current_buff[1] = (float)uart_lcd_state.current_value[1];
ec11_data.confirm_key_flag_last = 0;
ec11_data.confirm_key_flag = 0;
}
}
else if (ec11_data.confirm_key_flag == 2) // Switch the current output channel
{
ec11_data.confirm_key_flag_last++;
if (ec11_data.confirm_key_flag_last > 2)
{
if (uart_lcd_state.current_out_channel == 1)
{
uart_lcd_state.current_out_channel = 0;
}
else if (uart_lcd_state.current_out_channel == 0)
{
uart_lcd_state.current_out_channel = 1;
}
ec11_data.confirm_key_flag_last = 0;
ec11_data.confirm_key_flag = 0;
uart_lcd_current_out_channel_switch(uart_lcd_state.current_out_channel);
}
}
else if (ec11_data.confirm_key_flag == 3) // 切换界面
{
if (uart_lcd_state.page_num == 0)
{
uart_lcd_state.page_num = 1;
}
else if (uart_lcd_state.page_num == 1)
{
uart_lcd_state.page_num = 0;
}
ec11_data.confirm_key_flag_last = 0;
ec11_data.confirm_key_flag = 0;
uart_lcd_page_switch(uart_lcd_state.page_num);
}
}
void uart_lcd_ec11_control_current(void)
{
if (uart_lcd_state.page_num == 0) // 当前页面为电流调节页面时才对EC11编码器进行计数处理
{
ec11_data.direction = __HAL_TIM_IS_TIM_COUNTING_DOWN(&htim1);
ec11_data.encode_num = (short)__HAL_TIM_GET_COUNTER(&htim1);
if ((ec11_data.direction == 0) && (ec11_data.encode_num > ec11_data.encode_num_last))
{
if (uart_lcd_state.current_out_channel == 0)
{
uart_lcd_state.current_value[0] += 1;
if (uart_lcd_state.current_value[0] > 20)
{
uart_lcd_state.current_value[0] = 20;
}
}
else if (uart_lcd_state.current_out_channel == 1)
{
uart_lcd_state.current_value[1] += 1;
if (uart_lcd_state.current_value[1] > 20)
{
uart_lcd_state.current_value[1] = 20;
}
}
uart_lcd_current_out(uart_lcd_state.current_out_channel);
}
if ((ec11_data.direction == 1) && (ec11_data.encode_num < ec11_data.encode_num_last))
{
if (uart_lcd_state.current_out_channel == 0)
{
if (uart_lcd_state.current_value[0] < 2)
{
uart_lcd_state.current_value[0] = 0;
}
else
{
uart_lcd_state.current_value[0] -= 1;
}
}
else if (uart_lcd_state.current_out_channel == 1)
{
if (uart_lcd_state.current_value[1] < 2)
{
uart_lcd_state.current_value[1] = 0;
}
else
{
uart_lcd_state.current_value[1] -= 1;
}
}
uart_lcd_current_out(uart_lcd_state.current_out_channel);
}
ec11_data.encode_num_last = ec11_data.encode_num;
}
}
void uart_lcd_makecurvet(lcd_makecurve_t *makecurve_data)
{
static uint8_t uart_makecurve_data[256] = {0}; // 发送数据缓冲区最大长度为256字节
uart_makecurve_data[0] = makecurve_data->cmd_head; // 帧头
uart_makecurve_data[1] = makecurve_data->cmd_type; // 命令类型
uart_makecurve_data[2] = makecurve_data->cmd_ctrl_type; // 控制类型
uart_makecurve_data[3] = (makecurve_data->cmd_screen_id >> 8) & 0xFF; // 画面ID高位地址
uart_makecurve_data[4] = makecurve_data->cmd_screen_id & 0xFF; // 画面ID低位地址
uart_makecurve_data[5] = (makecurve_data->cmd_ctrl_id >> 8) & 0xFF; // 控件ID高位地址
uart_makecurve_data[6] = makecurve_data->cmd_ctrl_id & 0xFF; // 控件ID低位地址
uart_makecurve_data[7] = makecurve_data->cmd_curve_channel; // 曲线通道
uart_makecurve_data[8] = (makecurve_data->cmd_data_len >> 8) & 0xFF; // 数据长度高位地址
uart_makecurve_data[9] = makecurve_data->cmd_data_len & 0xFF; // 数据长度低位地址
MEMCPY(uart_makecurve_data + 10, makecurve_data->cmd_data, makecurve_data->cmd_data_len); // 数据内容
uart_makecurve_data[10 + makecurve_data->cmd_data_len] = (makecurve_data->cmd_tail >> 24) & 0xFF; // 帧尾
uart_makecurve_data[11 + makecurve_data->cmd_data_len] = (makecurve_data->cmd_tail >> 16) & 0xFF; // 帧尾
uart_makecurve_data[12 + makecurve_data->cmd_data_len] = (makecurve_data->cmd_tail >> 8) & 0xFF; // 帧尾
uart_makecurve_data[13 + makecurve_data->cmd_data_len] = makecurve_data->cmd_tail & 0xFF; // 帧尾
dma_usart_send(&huart4, uart_makecurve_data, makecurve_data->cmd_data_len + 14);
}
void uart_lcd_refresh_screen(void)
{
char usb_pv_str[128] = {0};
// 刷新屏幕数据
uart_lcd_set_txt(&lcd_set_txt1_data, ad7124_analog[P1_DI1_ADC].current); // 刷新文本内容
if (ad7124_analog[P1_DI1_ADC].current > 2.1f)
{
uart_lcd_set_button_status(&lcd_set_button4_data, 0); // 设置按钮状态
}
else if (ad7124_analog[P1_DI1_ADC].current < 1.2f)
{
uart_lcd_set_button_status(&lcd_set_button4_data, 1); // 设置按钮状态
}
uart_lcd_set_txt(&lcd_set_txt2_data, ad7124_analog[P1_DI2_ADC].current); // 刷新文本内容
if (ad7124_analog[P1_DI2_ADC].current > 2.1f)
{
uart_lcd_set_button_status(&lcd_set_button5_data, 0); // 设置按钮状态
}
else if (ad7124_analog[P1_DI2_ADC].current < 1.2f)
{
uart_lcd_set_button_status(&lcd_set_button5_data, 1); // 设置按钮状态
}
lcd_makecurve_data.cmd_data[0] = (ad7124_analog[P1_AI_ADC].current - 4) * 100 / 16; // 填充数据内容
uart_lcd_makecurvet(&lcd_makecurve_data); // 调用函数发送数据
uart_lcd_set_txt(&lcd_set_txt3_data, ad7124_analog[P1_AI_ADC].current); // 设置文本内容
snprintf(usb_pv_str, sizeof(usb_pv_str), "Current = %.2fmA\t P.V = %.2f\t", (float)(ad7124_analog[P1_AI_ADC].current), (float)(ad7124_analog[P1_AI_ADC].current - 4) * 100 / 16);
size_t txt_len = strlen(usb_pv_str);
for (size_t i = 0; i < txt_len; ++i)
{
usb_uart1.tx_data[i] = usb_pv_str[i]; // 文本内容
}
dma_usart_send(&huart1, usb_uart1.tx_data, txt_len); // 发送USB数据
}
void uart_lcd_makecurve_test(void)
{
lcd_makecurve_data.cmd_data_len = 1; // 假设数据长度为1
// if (uart_lcd_state.page_num == 1)
{
lcd_makecurve_data.cmd_data[0] = (current_buff[1] - 4) * 100 / 16; // 填充数据内容
uart_lcd_makecurvet(&lcd_makecurve_data); // 调用函数发送数据
uart_lcd_set_txt(&lcd_set_txt3_data, current_buff[1]); // 设置文本内容
}
}

View File

@ -1,13 +1,133 @@
/*
* @Author: wangxujie wangxujie@wuxismart.com
* @Date: 2025-03-10 15:05:20
* @LastEditors: wangxujie wangxujie@wuxismart.com
* @LastEditTime: 2025-08-01 10:36:24
* @FilePath: \signal_generator\User\driver\uart_lcd.h
* @Description: ,`customMade`, koroFileHeader查看配置 : https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/
#ifndef __UART_LCD_H__
#define __UART_LCD_H__
#include "main.h"
#define LCD_CMD_HEAD 0xEE // LCD指令帧头
#define LCD_CMD_TYPE 0xB1 // LCD指令类型对控件操作基本都为0xB1具体查询手册
#define LCD_CMD_CTRL_TYPE_SWITCH_SCREEN 0x00 // 切换屏幕命令
#define LCD_CMD_CTRL_TYPE_SET_BUTTON 0x10 // 设置按钮状态命令
#define LCD_CMD_CTRL_TYPE_SET_TXT 0x10 // 设置文本命令
#define LCD_CMD_CTRL_TYPE_SET_SLIDERVALUE 0x10 // 设置滑块值命令
#define LCD_CMD_CTRL_TYPE_MAKE_CURVE 0x32 // 绘制曲线命令
#define LCD_CMD_TAIL 0xFFFCFFFF
#define LCD_SCREEN_ID_CRUUENT 0x00 // 电流输出界面ID
#define LCD_SCREEN_ID_CURVE 0x01 // 绘制曲线界面ID
#define LCD_CTRL_ID_BUTTON1 0x01 // 按钮控件ID
#define LCD_CTRL_ID_BUTTON2 0x02 // 按钮控件ID
#define LCD_CTRL_ID_BUTTON3 0x03 // 按钮控件ID
#define LCD_CTRL_ID_BUTTON4 0x01 // 按钮控件ID
#define LCD_CTRL_ID_BUTTON5 0x02 // 按钮控件ID
#define LCD_CTRL_ID_TXT1 0x05 // 文本控件ID
#define LCD_CTRL_ID_TXT2 0x06 // 文本控件ID
#define LCD_CTRL_ID_TXT3 0x07 // 文本控件ID
#define LCD_CTRL_ID_SLIDERVALUE1 0x04 // 滑块控件ID
#define LCD_CTRL_ID_SLIDERVALUE2 0x05 // 滑块控件ID
#define LCD_CTRL_ID_MAKE_CURVE 0x0E // 曲线控件ID
#define LCD_CMD_SET_BUTTON_LEN 0x0C // 设置按钮状态命令长度
#pragma pack(1)
typedef struct
{
uint8_t cmd_head; // 帧头
uint8_t cmd_type; // 命令类型
uint8_t cmd_ctrl_type; // 控制类型
uint16_t cmd_screen_id; // 画面ID
uint16_t cmd_ctrl_id; // 控件ID
uint8_t cmd_curve_channel; // 曲线通道
uint16_t cmd_data_len; // 数据长度
uint8_t cmd_data[256]; // 数据内容
uint32_t cmd_tail; // 帧尾
} lcd_makecurve_t; // lcd绘制曲线结构体
#pragma pack()
extern lcd_makecurve_t lcd_makecurve_data;
#pragma pack(1)
typedef struct
{
uint8_t cmd_head; // 帧头
uint8_t cmd_type; // 命令类型
uint8_t cmd_ctrl_type; // 控制类型
uint16_t cmd_screen_id; // 画面ID
uint16_t cmd_ctrl_id; // 控件ID
uint8_t cmd_button_status; // 按钮状态
uint32_t cmd_tail; // 帧尾
} lcd_set_button_t; // lcd设置按钮状态结构体
#pragma pack()
extern lcd_set_button_t lcd_set_button1_data;
extern lcd_set_button_t lcd_set_button2_data;
extern lcd_set_button_t lcd_set_button3_data;
extern lcd_set_button_t lcd_set_button4_data;
extern lcd_set_button_t lcd_set_button5_data;
#pragma pack(1)
typedef struct
{
uint8_t cmd_head; // 帧头
uint8_t cmd_type; // 命令类型
uint8_t cmd_ctrl_type; // 控制类型
uint16_t cmd_screen_id; // 画面ID
uint16_t cmd_ctrl_id; // 控件ID
float cmd_txt_data; // 文本内容应该为字符串形式且长度不定当前项目中只需要上传浮点需要浮点转ASCII码
uint32_t cmd_tail; // 帧尾
} lcd_set_txt_t; // lcd设置按钮状态结构体
#pragma pack()
extern lcd_set_txt_t lcd_set_txt1_data;
extern lcd_set_txt_t lcd_set_txt2_data;
extern lcd_set_txt_t lcd_set_txt3_data;
#pragma pack(1)
typedef struct
{
uint8_t cmd_head; // 帧头
uint8_t cmd_type; // 命令类型
uint8_t cmd_ctrl_type; // 控制类型
uint16_t cmd_screen_id; // 画面ID
uint16_t cmd_ctrl_id; // 控件ID
uint32_t cmd_slidervalue; // 滑块数值
uint32_t cmd_tail; // 帧尾
} lcd_set_slidervalue_t; // lcd设置滑块结构体
#pragma pack(1)
extern lcd_set_slidervalue_t lcd_set_slidervalue1_data;
extern lcd_set_slidervalue_t lcd_set_slidervalue2_data;
#pragma pack(1)
typedef struct
{
uint8_t cmd_head; // 帧头
uint8_t cmd_type; // 命令类型
uint8_t cmd_ctrl_type; // 控制类型
uint16_t cmd_screen_id; // 画面ID
uint32_t cmd_tail; // 帧尾
} lcd_switchscreen_t; // 切换画面
#pragma pack()
extern lcd_switchscreen_t lcd_switchscreen_data;
typedef struct
{
uint8_t page_num;
uint8_t key_state[3];
uint8_t current_value[2];
uint8_t current_out_channel; // 当前输出通道
uint32_t current_value[2];
uint8_t lcd_flag;
} uart_lcd_t;
extern uart_lcd_t uart_lcd_state;
@ -24,5 +144,11 @@ extern ec11_t ec11_data;
void uart_lcd_draw_ipaddr(void);
void uart_lcd_init(void);
void uart_lcd_current_out(uint8_t channel);
void uart_lcd_channel_switch(uint8_t channel);
void uart_lcd_current_out_channel_switch(uint8_t channel);
void uart_lcd_page_switch(uint8_t page);
void uart_lcd_ecll_control_current_out(void);
void uart_lcd_ec11_control_current(void);
void uart_lcd_makecurvet(lcd_makecurve_t *makecurve_data);
void uart_lcd_refresh_screen(void);
void uart_lcd_makecurve_test(void);
#endif