/********************************** * 主函数文件 * 功能:系统初始化、硬件配置和主循环 * 说明: * 1. 初始化系统时钟和硬件 * 2. 配置PWM输出,默认占空比50% * 3. 测试串口通信功能 **********************************/ #include "main.h" #include "led_app.h" #include #define PRINT_LEN 8 static __IO uint32_t uwTimingDelay; // 延时计数器 uint8_t speed=0; /** * @brief 简化版时钟信息打印(仅打印关键信息) */ //static void Print_Clock_Info_Simple(void) //{ // RCC_ClocksTypeDef RCC_Clocks; // RCC_GetClocksFreq(&RCC_Clocks); // // printf("\r\n=== Clock Info ===\r\n"); // printf("HSE: %u MHz\r\n", HSE_VALUE/1000000); // printf("SYSCLK: %u MHz\r\n", RCC_Clocks.SYSCLK_Frequency/1000000); // printf("HCLK: %u MHz\r\n", RCC_Clocks.HCLK_Frequency/1000000); // printf("PCLK1: %u MHz (TIM2-5: %u MHz)\r\n", // RCC_Clocks.PCLK1_Frequency/1000000, // (RCC_Clocks.PCLK1_Frequency == RCC_Clocks.HCLK_Frequency) ? // RCC_Clocks.PCLK1_Frequency/1000000 : RCC_Clocks.PCLK1_Frequency*2/1000000); // printf("PCLK2: %u MHz (TIM1: %u MHz, USART1: %u MHz)\r\n", // RCC_Clocks.PCLK2_Frequency/1000000, // (RCC_Clocks.PCLK2_Frequency == RCC_Clocks.HCLK_Frequency) ? // RCC_Clocks.PCLK2_Frequency/1000000 : RCC_Clocks.PCLK2_Frequency*2/1000000, // RCC_Clocks.PCLK2_Frequency/1000000); // printf("USART1 Baud Rate: %u bps\r\n", // RCC_Clocks.PCLK2_Frequency / USART1->BRR); // printf("================\r\n\r\n"); //} /** * @brief 主函数 * @param 无 * @retval 无 */ int main(void) { // 初始化硬件 hard_init(); // 初始化LED应用 led_app_init(); // 初始化串口通信 uart_communication_init(); //Print_Clock_Info_Simple(); foc_algorithm_initialize(); if(get_offset_flag==0) { get_offset_flag = 1; TIM_CtrlPWMOutputs(PWM_TIM,ENABLE); } // 主循环 while (1) { #define PRINT_LEN 8 float data_print[PRINT_LEN] = {0}; const uint8_t tail[4] = {0x00, 0x00, 0x80, 0x7f}; // 帧尾 // 准备打印数据并直接发送到 DMA 缓冲区 uint8_t dma_tx_buffer[PRINT_LEN * sizeof(float) + 4]; #ifdef OPENLOOP_TEST data_print[0] = theta; data_print[1] = Vbus; data_print[2] = 0; data_print[3] = get_foc_input()->Id_ref; data_print[4] = get_foc_input()->Iq_ref; data_print[5] = get_curr_dq()->Id; data_print[6] = get_curr_dq()->Iq; data_print[7] = Temp; #else // data_print[0] = FOC_Input.ia; // data_print[1] = FOC_Input.ib; // data_print[2] = FOC_Input.ic; // data_print[3] = FOC_Input.theta; // data_print[4] = FOC_Input.Iq_ref; // data_print[5] = FOC_Input.Id_ref; // data_print[6] = Speed_Ref; // data_print[7] = Speed_Fdk/(2 * PI); extern CURRENT_DQ_DEF Current_Idq; // data_print[0] = FOC_Input.ia; // data_print[1] = FOC_Input.ib; // data_print[2] = FOC_Input.ic; // data_print[3] = FOC_Input.theta; // data_print[4] = FOC_Input.Iq_ref; // data_print[5] = FOC_Input.Id_ref; // data_print[6] = Current_Idq.Id; // data_print[7] = Current_Idq.Iq; data_print[0] = FOC_Output.Tcmp1; data_print[1] = FOC_Output.Tcmp2; data_print[2] = FOC_Output.Tcmp3; data_print[3] = FOC_Input.theta; data_print[4] = FOC_Input.Iq_ref; data_print[5] = FOC_Input.Id_ref; data_print[6] = Current_Idq.Id; data_print[7] = Current_Idq.Iq; #endif // 合并数据包到 DMA 缓冲区 memcpy(dma_tx_buffer, (uint8_t*)data_print, PRINT_LEN * sizeof(float)); memcpy(&dma_tx_buffer[PRINT_LEN * sizeof(float)], tail, 4); // 使用 DMA 发送数据(10kHz 频率) DMA_USART_COMM_Send(dma_tx_buffer, PRINT_LEN * sizeof(float) + 4); } } /** * @brief 延时函数 * @param nTime: 延时时间(毫秒) * @retval 无 */ void Delay(__IO uint32_t nTime) { uwTimingDelay = nTime; while(uwTimingDelay != 0); } /** * @brief 延时计数器递减函数 * @param 无 * @retval 无 * @note 在SysTick中断中调用 */ void TimingDelay_Decrement(void) { if (uwTimingDelay != 0x00) { uwTimingDelay--; } } #ifdef USE_FULL_ASSERT /** * @brief 断言失败处理函数 * @param file: 文件名称 * @param line: 行号 * @retval 无 */ void assert_failed(uint8_t* file, uint32_t line) { while (1) { } } #endif