file-type

LPC2214实验板UART0数据发送C语言项目源码解读

版权申诉
83KB | 更新于2025-08-09 | 124 浏览量 | 0 下载量 举报 收藏
download 限时特惠:#9.90
在标题“UART0_SEND,看c语言源码,c语言程序”中提到的是一个具体的项目案例,其核心内容是围绕着基于LPC2214的ARM7实验板上的UART0数据发送功能,通过分析该项目的C语言源码来学习和理解C语言在实际中的应用。这一项目是学习C语言实战应用的典型案例,因此,我们可以从中提取出多个相关知识点进行详细阐述。 首先,我们来解释标题中的几个关键词:“UART0_SEND”指的是通过UART(Universal Asynchronous Receiver/Transmitter,通用异步收发传输器)的第0个通道发送数据的功能。UART是一种广泛应用于微控制器和计算机串行通信的接口,可以实现全双工通信。 接着,“看c语言源码”和“c语言程序”则是指出本项目是以C语言编写的源代码,通过对源代码的阅读和分析,可以学习到C语言的实际编程技巧和开发流程。 在描述中提到的“基于LPC2214的ARM7实验板”,是指本项目使用的硬件平台。LPC2214是由NXP(原飞利浦半导体)推出的一款基于ARM7核心的微控制器,适用于嵌入式系统的开发。而“UART0数据发送”则是指本项目旨在实现通过微控制器的UART0接口发送数据的功能。 从文件标签“看c语言源码 c语言程序源码”可以看出,该项目非常适合于想要通过阅读源码来提升C语言编程能力的开发者学习和实践。 而文件名称列表中的“3.20实验”可能是本项目的某个版本号或者是实验编号。 现在我们来具体分析这个项目中可能包含的知识点: 1. LPC2214微控制器和ARM7架构: LPC2214是基于ARM7TDMI-S内核的微控制器,具有丰富的外设资源,广泛应用于工业控制、通信等领域。了解ARM7的基本架构和指令集是理解此类微控制器编程的基础。 2. UART通信协议: UART是一种简单但有效的串行通信协议,它主要包括数据位、起始位、停止位和可选的校验位等。在本项目中,通过分析源码,可以学习到如何设置UART0的波特率、字符格式、以及如何发送和接收数据。 3. C语言在嵌入式系统中的应用: C语言以其执行效率高、功能强大而广泛应用于嵌入式系统的开发中。在本项目源码中,可以学习到如何使用C语言操作硬件资源,包括寄存器的读写、中断处理以及I/O操作。 4. 嵌入式系统编程技巧: 通过本项目的源码分析,可以学习到嵌入式系统编程中的内存管理、电源管理、时序控制等方面的技巧。 5. 调试技巧: 在实际的嵌入式系统开发过程中,调试是不可或缺的一个环节。通过本项目的源码学习,可以掌握如何使用调试器、查看寄存器状态、跟踪程序执行等调试方法。 6. 项目实践: 最后,整个项目也是一个完整的C语言项目实践案例,通过这个项目,可以了解一个C语言项目从需求分析、设计、编码到测试的完整过程。 总结来说,通过对“UART0_SEND”项目的源码分析,不仅可以学习到C语言在嵌入式系统中的具体应用,还能掌握嵌入式系统开发中的关键知识和技能。这对于初学者来说是一个非常好的实践项目,也能够为有经验的开发者提供一个深入理解C语言的机会。

相关推荐

filetype

#include "stm8s.h" #include "string.h" volatile uint16_t ms_counter = 0; static uint8_t sec_count = 0; uint8_t flag_1s = 0; // 1秒标志 uint8_t flag_30s = 0; // 30秒标志 uint8_t flag_pireq_received = 0; // 接收到PIREQ命令标志 uint8_t flag_brightness_received = 0; // 接收到亮度命令标志 uint8_t brightness = 56; const char fixedMsg[] = "$PFEC,musts,1,306,29,1,2,60,64.0,1,4124,,,4661,,*71\r\n"; const char target_cmd[] = "$PFEC,pireq*43"; const char brightness_cmd_prefix[] = "$ECDDC,,"; // 亮度控制命令前缀 #define RX_BUF_SIZE 64 char rx_buf[RX_BUF_SIZE]; uint8_t rx_index = 0; // 时钟配置 (内部16MHz HSI) void CLK_Config(void) { CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1); // 16MHz } // 计算NMEA校验和 uint8_t calculateChecksum(const char* data) { uint8_t crc = 0; while (*data) { crc ^= *data++; } return crc; } // UART1配置 (4800 8N1) void UART1_Config(void) { GPIO_Init(GPIOD, GPIO_PIN_5, GPIO_MODE_OUT_PP_HIGH_FAST); // TX引脚 GPIO_Init(GPIOD, GPIO_PIN_6, GPIO_MODE_IN_PU_NO_IT); // RX引脚(上拉输入) UART1_DeInit(); UART1_Init( 4800, // 波特率4800 UART1_WORDLENGTH_8D, // 8位数据 UART1_STOPBITS_1, // 1位停止 UART1_PARITY_NO, // 无校验 UART1_SYNCMODE_CLOCK_DISABLE, // 异步模式 UART1_MODE_TX_ENABLE | UART1_MODE_RX_ENABLE ); UART1_ITConfig(UART1_IT_RXNE, ENABLE); // 使能接收中断 UART1_Cmd(ENABLE); // 设置UART1接收中断为最高优先级 (0级) ITC_SetSoftwarePriority(ITC_IRQ_UART1_RX, ITC_PRIORITYLEVEL_0); } // TIM4配置 (1ms中断) void TIM4_Config(void) { TIM4_TimeBaseInit(TIM4_PRESCALER_128, 125); // 16MHz/128=125kHz, 125分频=1ms TIM4_ITConfig(TIM4_IT_UPDATE, ENABLE); TIM4_Cmd(ENABLE); // 设置TIM4中断为中等优先级 (2级) ITC_SetSoftwarePriority(ITC_IRQ_TIM4_OVF, ITC_PRIORITYLEVEL_2); } // TIM2配置 (2kHz PWM) void TIM2_Config(void) { // 配置PD3为TIM2 CH2输出 GPIO_Init(GPIOD, GPIO_PIN_3, GPIO_MODE_OUT_PP_HIGH_FAST); TIM2_TimeBaseInit( TIM2_PRESCALER_8, // 16MHz/8=2MHz 1000 - 1 // 2MHz/1000=2kHz ); // 配置通道2 PWM模式 TIM2_OC2Init( TIM2_OCMODE_PWM1, // PWM模式1 TIM2_OUTPUTSTATE_ENABLE, 560, // 初始占空比56% (1000*0.56=560) TIM2_OCPOLARITY_HIGH // 高电平有效 ); TIM2_OC2PreloadConfig(ENABLE); TIM2_ARRPreloadConfig(ENABLE); TIM2_Cmd(ENABLE); } void updatePWM(uint8_t brightness) { // 确保亮度在1-99范围内 if (brightness < 1) brightness = 1; if (brightness > 99) brightness = 99; uint16_t duty_cycle = brightness * 10; // 计算占空比值 (0.01% * 1000 = 10, 10% * 1000 = 100, 99% * 1000 = 990) TIM2_SetCompare2(duty_cycle); // 更新PWM占空比 } // 发送字符串函数 void UART1_SendString(const char* str) { while (*str) { UART1_SendData8(*str++); while (UART1_GetFlagStatus(UART1_FLAG_TXE) == RESET); } } // 轻量级整数转字符串 static void u8_to_str(uint8_t val, char* buf) { if (val >= 100) { *buf++ = '0' + val / 100; val %= 100; } if (val >= 10 || buf[-1] != '\0') { *buf++ = '0' + val / 10; } *buf++ = '0' + val % 10; *buf = '\0'; } // 发送亮度状态信息(内存优化版) void sendBrightnessStatus(uint8_t brightness) { // 使用静态缓冲区减少栈使用 static char temp[20] = "$IIDDC,,"; char* p = temp + 9; // 指向亮度值位置 // 添加亮度值 u8_to_str(brightness, p); p += strlen(p); // 添加固定后缀 const char suffix[] = ",,R*"; memcpy(p, suffix, sizeof(suffix) - 1); p += sizeof(suffix) - 1; // 计算校验和 uint8_t cs = calculateChecksum(temp + 1); // 跳过$ *p++ = "0123456789ABCDEF"[cs >> 4]; *p++ = "0123456789ABCDEF"[cs & 0x0F]; *p++ = '\r'; *p++ = '\n'; *p = '\0'; UART1_SendString(temp); } // 十六进制字符转数值 uint8_t hexCharToByte(char c) { if (c >= '0' && c <= '9') return c - '0'; if (c >= 'A' && c <= 'F') return c - 'A' + 10; if (c >= 'a' && c <= 'f') return c - 'a' + 10; return 0; } // 解析亮度控制命令(无sscanf版) uint8_t parseBrightnessCommand(const char* cmd) { // 基本格式检查 if (cmd[0] != '$' || strlen(cmd) < 15) return 0; // 查找星号位置 const char* star_pos = strchr(cmd, '*'); if (!star_pos || star_pos - cmd < 12 || strlen(star_pos) < 3) return 0; // 提取校验和 uint8_t expected_checksum = (hexCharToByte(star_pos[1]) << 4); expected_checksum |= hexCharToByte(star_pos[2]); // 计算实际校验和 uint8_t actual_checksum = 0; const char* ptr = cmd + 1; // 跳过$ while (ptr < star_pos) { actual_checksum ^= *ptr++; } // 校验和验证 if (actual_checksum != expected_checksum) return 0; // 跳过命令前缀 ptr = cmd + strlen("$ECDDC,,"); uint8_t value = 0; // 解析亮度值 while (*ptr >= '0' && *ptr <= '9') { value = value * 10 + (*ptr - '0'); ptr++; } // 值范围检查 if (value < 1 || value > 99) return 0; brightness = value; return 1; } // TIM4中断服务程序 (1ms定时) INTERRUPT_HANDLER(TIM4_UPD_OVF_IRQHandler, 23) { TIM4_ClearFlag(TIM4_FLAG_UPDATE); if (++ms_counter >= 1000) { // 1秒到达 ms_counter = 0; flag_1s = 1; if (++sec_count >= 30) { // 30秒到达 sec_count = 0; flag_30s = 1; } } } // UART1接收中断服务程序 INTERRUPT_HANDLER(UART1_RX_IRQHandler, 18) { char c = UART1_ReceiveData8(); // 读取接收到的字符 // 处理缓冲区溢出 if (UART1_GetITStatus(UART1_IT_RXNE) == SET){ if (rx_index >= RX_BUF_SIZE - 1) { rx_index = 0; // 缓冲区溢出,重置 } rx_buf[rx_index++] = c; // 存储字符 // 检查是否收到完整命令 (以换行符结束) if (c == '\n') { rx_buf[rx_index] = '\0'; // 终止字符串 if (strstr(rx_buf, target_cmd) != NULL) { // 检查是否收到PIREQ命令 flag_pireq_received = 1; } else if (strstr(rx_buf, brightness_cmd_prefix) != NULL) { // 检查是否收到亮度控制命令 flag_brightness_received = 1; } rx_index = 0; // 重置接收缓冲区 } } } void main(void) { CLK_Config(); UART1_Config(); TIM2_Config(); TIM4_Config(); rx_index = 0; rx_buf[0] = '\0'; // 启用全局中断 rim(); while (1) { if (flag_pireq_received) { flag_pireq_received = 0; UART1_SendString("$PFEC,pidat,0,MU-190*69\r\n"); UART1_SendString(fixedMsg); UART1_SendString("$PFEC,pidat,1,2651020-01.03*56\r\n"); UART1_SendString("$PFEC,pidat,3,001822*6E\r\n"); } if (flag_brightness_received) { flag_brightness_received = 0; if (parseBrightnessCommand(rx_buf)) { updatePWM(brightness); sendBrightnessStatus(brightness); } rx_index = 0; } if (flag_1s) { flag_1s = 0; UART1_SendString(fixedMsg); } if (flag_30s) { flag_30s = 0; sendBrightnessStatus(brightness); } } } #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(u8* file, u32 line) { /* 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) */ /* Infinite loop */ while (1) { } } #endif /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ 我现在编译没错了,但是手头上没有硬件,有没有别的办法测试代码

filetype

import sensor import image import time import math import pyb # 初始化摄像头 sensor.reset() sensor.set_pixformat(sensor.RGB565) sensor.set_framesize(sensor.QVGA) # 320x240分辨率 sensor.set_auto_gain(False) # 关闭自动增益 sensor.set_auto_whitebal(False) # 关闭自动白平衡 sensor.skip_frames(time=1000) # 等待设置生效 # 初始化串口通信(连接云台控制器) uart = pyb.UART(3, 115200, timeout_char=1000) # 波特率115200,根据实际连接调整 # 矩形检测参数 RECT_THRESHOLD = 3000 # 矩形检测阈值(值越大检测越严格) MIN_RECT_AREA = 5000 # 最小矩形面积(像素) ASPECT_RATIO = math.sqrt(2) # A4纸长宽比≈1.414 ASPECT_TOLERANCE = 0.2 # 长宽比容差 # 云台控制参数 MAX_OFFSET_X = 160 # 水平方向最大偏移量(图像中心到边缘) MAX_OFFSET_Y = 120 # 垂直方向最大偏移量 SMOOTHING_FACTOR = 0.2 # 平滑滤波系数 # 历史位置记录(用于平滑滤波) prev_offset_x = 0 prev_offset_y = 0 def calculate_center(rect): """计算矩形中心点坐标""" # 使用矩形的x,y,w,h属性计算中心 center_x = rect.x() + rect.w() // 2 center_y = rect.y() + rect.h() // 2 return center_x, center_y def send_to_gimbal(offset_x, offset_y): """通过串口发送偏移量给云台控制器""" # 使用二进制协议提高传输效率 data = bytearray([0xFF, (offset_x >> 8) & 0xFF, offset_x & 0xFF, (offset_y >> 8) & 0xFF, offset_y & 0xFF]) uart.write(data) # 调试信息(可选) print("Offset: ({}, {})".format(offset_x, offset_y)) def is_a4_paper(rect): """判断矩形是否为A4纸(根据长宽比)""" w, h = rect.w(), rect.h() if w < h: # 确保w为长边 w, h = h, w aspect = w / h return abs(aspect - ASPECT_RATIO) < ASPECT_TOLERANCE def get_rect_area(rect): """计算矩形面积(w*h)""" return rect.w() * rect.h() while True: img = sensor.snapshot() # 增强图像对比度(提高不同光照条件下的稳定性) img.histeq(adaptive=True, clip_limit=3.0) # 检测矩形 rects = img.find_rects(threshold=RECT_THRESHOLD) if rects: # 筛选符合条件的矩形(A4纸) valid_rects = [] for rect in rects: area = get_rect_area(rect) if area > MIN_RECT_AREA and is_a4_paper(rect): valid_rects.append(rect) if valid_rects: # 选择面积最大的矩形 largest_rect = max(valid_rects, key=get_rect_area) # 计算中心点坐标 center_x, center_y = calculate_center(largest_rect) # 绘制矩形和中心点 img.draw_rectangle(largest_rect.rect(), color=(255, 0, 0)) # 红色边框 img.draw_cross(center_x, center_y, color=(0, 255, 0), size=10) # 绿色中心点 # 计算与画面中心的偏移量 img_center_x = img.width() // 2 img_center_y = img.height() // 2 offset_x = center_x - img_center_x offset_y = center_y - img_center_y # 应用平滑滤波 filtered_x = int(SMOOTHING_FACTOR * offset_x + (1 - SMOOTHING_FACTOR) * prev_offset_x) filtered_y = int(SMOOTHING_FACTOR * offset_y + (1 - SMOOTHING_FACTOR) * prev_offset_y) prev_offset_x = filtered_x prev_offset_y = filtered_y # 发送控制指令给云台 send_to_gimbal(filtered_x, filtered_y) else: # 未检测到有效矩形,发送停止信号 send_to_gimbal(0, 0) else: # 未检测到任何矩形,发送停止信号 send_to_gimbal(0, 0) time.sleep_ms(50) # 控制循环频率约20Hz 这段代码能控制下面这段代码吗/* USER CODE BEGIN Header */ /** ****************************************************************************** * @file : main.c * @brief : Main program body ****************************************************************************** * @attention * * Copyright (c) 2023 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 "tim.h" #include "usart.h" #include "gpio.h" /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include "PID.h" //PB1ÉÏ϶æ»ú PB0×óÓÒ¶æ»ú ´®¿Ú1ΪOPenmvͨÐÅ /* 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 */ uint8_t rx1; uint8_t rxx1[4]; uint8_t rx2; uint8_t rxx2[9]; char t[10]; short right_encoder; short left_encoder; uint8_t blob_mub=0; extern float last_error_up; extern float last_error_around; extern float error_up; extern float error_around; extern float integral_up; extern float integral_around; extern float derivative_up; extern float derivative_around; uint8_t rx_flag2=0; _Bool jiaodu_biao=0; float jiaodu_yaw=0; float jiaodu_roll=0; float jiaodu_yaw_init=0; /* USER CODE END PM */ /* Private variables ---------------------------------------------------------*/ /* USER CODE BEGIN PV */ /* USER CODE END PV */ /* Private function prototypes -----------------------------------------------*/ void SystemClock_Config(void); /* USER CODE BEGIN PFP */ /* USER CODE END PFP */ /* Private user code ---------------------------------------------------------*/ /* USER CODE BEGIN 0 */ /* 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 */ // ³õʼ»¯ HAL_Init(); // ³õʼ»¯HAL¿â SystemClock_Config(); // ÅäÖÃϵͳʱÖÓ MX_GPIO_Init(); // ³õʼ»¯GPIO MX_USART1_UART_Init(); // ³õʼ»¯UART1(OpenMV) MX_TIM3_Init(); // ³õʼ»¯TIM3(¶æ»úPWM) MX_USART2_UART_Init(); // ³õʼ»¯UART2(ÍÓÂÝÒÇ) // Æô¶¯ÖжϽÓÊÕ UART_Start_Receive_IT(&huart1, &rx1, 1); // Æô¶¯UART1½ÓÊÕÖÐ¶Ï // Æô¶¯PWMÊä³ö HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_3); // ˮƽ¶æ»úPWM HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_4); // ´¹Ö±¶æ»úPWM // ³õʼ»¯¶æ»úλÖÃ(ÖÐλ) servo_up(1500); // ´¹Ö±¶æ»ú³õʼ90¶ÈλÖà servo_around(1500); // ˮƽ¶æ»ú³õʼ90¶ÈλÖà HAL_Delay(10000); // 10ÃëÑÓʱ(µÈ´ýϵͳÎȶ¨) jiaodu_yaw_init = jiaodu_yaw; // ¼Ç¼³õʼƫº½½Ç /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ if(blob_mub==1)//±íʾÊÕµ½openmvµÄСÇòÐÅÏ¢ { PID_servo();// Ö´ÐÐÔÆÌ¨PID¿ØÖÆ } } /* USER CODE END 3 */ } /** * @brief System Clock Configuration * @retval None */ void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; /** 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.HSEPredivValue = RCC_HSE_PREDIV_DIV1; RCC_OscInitStruct.HSIState = RCC_HSI_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9; 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_DIV2; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) { Error_Handler(); } } /* USER CODE BEGIN 4 */ uint8_t blob_flag=0; uint8_t blob_shu=0; uint8_t rx_biao2=0; void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if(huart == &huart1) // OpenMVÊý¾Ý´¦Àí { UART_Start_Receive_IT(&huart1, &rx1, 1); // ÖØÐÂÆôÓýÓÊÕ if(blob_flag == 0) // °üÍ·¼ì²â½×¶Î { if(rx1 == 0xff) // ¼ì²âµ½ÓÐЧÊý¾Ý°üÍ· { blob_flag = 1; // ½øÈëÊý¾Ý½ÓÊÕ״̬ } else if(rx1 == 0xfe) // ÎÞÄ¿±ê±êÖ¾ { blob_mub = 0; // Çå³ýÊý¾ÝÓÐЧ±êÖ¾ } } else // Êý¾Ý½ÓÊÕ½×¶Î { rxx1[blob_shu] = rx1; // ´æ´¢Êý¾Ý blob_shu++; // Êý¾Ý¼ÆÊýÔö¼Ó if(blob_shu == 4) // ÊÕµ½ÍêÕûÊý¾Ý°ü { blob_shu = 0; // ÖØÖüÆÊýÆ÷ blob_flag = 0; // ÖØÖñêÖ¾ blob_mub = 1; // ÉèÖÃÊý¾ÝÓÐЧ±êÖ¾ } } } } /* USER CODE END 4 */ /** * @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 */

filetype

帮我修改一下代码,现在这个代码无法控制舵机跟随小球,你帮我完成。#include "mcusys.h" #include "delay.h" #include "led.h" #include "key.h" #include "can.h" #include "pwm.h" #include "usart.h" // ?????? u8 Position[8]; u16 start = 17000, end = 18000; u16 cx = 160, cy = 120; u16 pwm_num = 1500; // PWM????? // ??????(??????CAN??) void position_control(u16 s, u16 e) { if (s < e) Position[1] = 0x00; // ?????? else Position[1] = 0x01; // ?????? Position[0] = 0xA5; // ?? Position[2] = 0x00; // ??? Position[3] = 0x00; // ??? Position[4] = e % 256; // ?????8? Position[5] = e / 256; // ?????8? Position[6] = 0x00; // ??? Position[7] = 0x00; // ??? } // X???????????? u16 check_x_range(u16 x) { if (x <= 20 || x == 0) { // ?????? return 160; } else if (x < 150) { // ????,????? end += 50; } else if (x > 170) { // ????,????? end -= 50; } // ??????? if (end > 30000) end = 30000; return x; } // Y????????PWM?? void adjust_pwm(u16 y) { if (y < 90 || y > 150) { // ????????PWM? pwm_num = 240; } else if (y == 0) { // ????? pwm_num = 110; } else if (y == 110 || y == 130) { // ??????????? TIM_SetCompare1(TIM14, 2); return; } // ??PWM??? TIM_SetCompare1(TIM14, pwm_num); } int main(void) { u8 canbuf[8] = {0xA5, 0x01, 0x00, 0x00, 0x50, 0x46, 0x00, 0x00}; u8 cmd[8] = {0x9C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; u8 res[8] = {0x00}; // ????? NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); CAN1_Mode_Init(CAN_SJW_1tq, CAN_BS2_6tq, CAN_BS1_7tq, 6, CAN_Mode_Normal); uart_init(115200); delay_init(168); TIM14_PWM_Init(20000-1, 84-1); TIM_SetCompare1(TIM14, pwm_num); // ??PWM?? delay_ms(200); while (1) { // 1. ??????(????:XXX[???]YYY,??"123_456") if (USART2_RX_STA) { // ??USART2_RX_STA??????? cx = (USART2_RX_BUF[0]-'0')*100 + (USART2_RX_BUF[1]-'0')*10 + (USART2_RX_BUF[2]-'0'); cy = (USART2_RX_BUF[4]-'0')*100 + (USART2_RX_BUF[5]-'0')*10 + (USART2_RX_BUF[6]-'0'); USART2_RX_STA = 0; // ?????? } // 2. X????:????????? check_x_range(cx); // 3. Y????:PWM?? adjust_pwm(cy); // 4. ?????CAN?? position_control(start, end); CAN1_Send_Msg(Position, 8); start = end; // ?????? // 5. ????(??) printf("%4d%4d%4d%4d%4d%4d%4d%4d\r\n", USART2_RX_BUF[0], USART2_RX_BUF[1], USART2_RX_BUF[2], USART2_RX_BUF[3], USART2_RX_BUF[4], USART2_RX_BUF[5], USART2_RX_BUF[6], USART2_RX_BUF[7]); printf("CX: %6d CY: %6d\r\n", cx, cy); delay_ms(20); // ?????? } }

thongzzz
  • 粉丝: 339
上传资源 快速赚钱