error MSB8011: 未能注冊输出。请尝试启用“逐用户重定向”

本文介绍了一个在VS2010中创建MFC ActiveX控件项目时遇到的注册问题,并提供了解决方案。通过更改项目的“逐用户重定向”设置,可以成功避免注册失败的错误。


    初试MFC就遇到困难了。vs2010创建一个MFC ActiveX控件项目。


    什么都还没做呢,就出现故障了?


    郁闷呀。!


1>C:\Program Files\MSBuild\Microsoft.Cpp\v4.0\Microsoft.CppCommon.targets(732,5): warning MSB3075: 命令“regsvr32 /s "E:\MFC\Demo\Debug\Demo.ocx"”已退出。代码为 5。

请验证您是否有足够的权限来执行此命令。 1> 上一错误已转换为警告。由于调用任务时指定了 ContinueOnError=true。 1> 继续生成,由于任务“Exec”的“ContinueOnError”设置为“true”。 1>C:\Program Files\MSBuild\Microsoft.Cpp\v4.0\Microsoft.CppCommon.targets(744,5): error MSB8011: 未能注冊输出。请尝试启用“逐用户重定向”。或者使用提升的权限从命令提示符处注冊该组件。

1>


    额。网上好像是有解决方式的吧,我自己还是记录一下。


   点击“Demo”(我的项目名字)属性。出现以下界面:


将“逐用户重定向”的“否”改为”是“,就OK了。

/* Includes ------------------------------------------------------------------*/ #include "main.h" /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include <stdio.h> #include <string.h> #include "stm32f1xx_hal.h" /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ /* USER CODE BEGIN PTD */ /* USER CODE END PTD */ /* Private define ------------------------------------------------------------*/ /* USER CODE BEGIN PD */ // ADS1256 寄存器地址定义 #define ADS1256_REG_STATUS 0x00 // 状态寄存器 #define ADS1256_REG_MUX 0x01 // 多路选择器寄存器 #define ADS1256_REG_ADCON 0x02 // 控制寄存器 #define ADS1256_REG_DRate 0x03 // 数据速率寄存器 // GPIO 定义(与硬件接线完全匹配) #define ADS1256_CS_PIN GPIO_PIN_7 #define ADS1256_CS_PORT GPIOA #define ADS1256_DRDY_PIN GPIO_PIN_11 #define ADS1256_DRDY_PORT GPIOB #define ADS1256_RST_PIN GPIO_PIN_1 #define ADS1256_RST_PORT GPIOC // 命令定义 #define ADS1256_CMD_RDATA 0x01 // 读取数据命令 #define ADS1256_CMD_WREG 0x50 // 写寄存器命令(0x50 | 寄存器地址低4位) #define ADS1256_CMD_SYNC 0xFC // 同步命令(手册Table 24) #define ADS1256_CMD_WAKEUP 0xFF // 唤醒命令(手册Table 24) /* USER CODE END PD */ /* Private macro -------------------------------------------------------------*/ /* USER CODE BEGIN PM */ #define DRDY_STATE HAL_GPIO_ReadPin(ADS1256_DRDY_PORT, ADS1256_DRDY_PIN) /* USER CODE END PM */ /* Private variables ---------------------------------------------------------*/ SPI_HandleTypeDef hspi2; UART_HandleTypeDef huart1; /* USER CODE BEGIN PV */ uint8_t ads1256Data[3]; // 存储ADS1256输出的3字节数据 int32_t ads1256Value; // 24位补码转换后的数值 char debugBuffer[100]; // 调试信息缓冲区 /* USER CODE END PV */ /* Private function prototypes -----------------------------------------------*/ void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_SPI2_Init(void); static void MX_USART1_UART_Init(void); /* USER CODE BEGIN PFP */ void ADS1256_Select(void); // 使能片选 void ADS1256_Deselect(void); // 禁用片选 void ADS1256_Reset(void); // 硬件复位 void ADS1256_Init(void); // 初始化寄存器 void ADS1256_WriteRegister(uint8_t reg, uint8_t data); // 写寄存器 int32_t ADS1256_ReadData(void); // 读取数据 void SPI2_SendByte(uint8_t byte); // SPI发送单字节 uint8_t SPI2_ReceiveByte(void); // SPI接收单字节 void ADS1256_Sync(void); // 同步转换(关键!) uint8_t ADS1256_ReadRegister(uint8_t reg); // 读寄存器函数 /* USER CODE END PFP */ /* Private user code ---------------------------------------------------------*/ /* USER CODE BEGIN 0 */ // 串口重定向,支持printf int fputc(int ch, FILE *f) { HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 1000); return ch; } /* 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_SPI2_Init(); MX_USART1_UART_Init(); /* 串口初始化后立即测试输出(关键验证点) */ printf("=== UART INIT SUCCESS! ===\r\n"); /* USER CODE BEGIN 2 */ printf("=== ADS1256振动数据采集系统 ===\r\n"); printf("1. 硬件复位...\r\n"); ADS1256_Reset(); printf("2. 初始化寄存器...\r\n"); ADS1256_Init(); printf("3. 启动转换...\r\n"); ADS1256_Sync(); // 强制同步转换 /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ // 等待数据就绪(DRDY低电平有效) while (DRDY_STATE == GPIO_PIN_SET) { printf("Waiting for data ready (DRDY=high)\r\n"); HAL_Delay(100); } // 读取24位数据 ads1256Value = ADS1256_ReadData(); // 打印原始数据和转换后的值 printf("Raw data (MSB->LSB): 0x%02X 0x%02X 0x%02X\r\n", ads1256Data[0], ads1256Data[1], ads1256Data[2]); printf("Converted value (24-bit two's complement): %ld (0x%08lX)\r\n", ads1256Value, ads1256Value); printf("----------------------------\r\n"); HAL_Delay(100); // 控制采集频率 } /* 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(); } } /** * @brief SPI2 Initialization Function * @param None * @retval None */ static void MX_SPI2_Init(void) { /* SPI2 parameter configuration*/ hspi2.Instance = SPI2; hspi2.Init.Mode = SPI_MODE_MASTER; hspi2.Init.Direction = SPI_DIRECTION_2LINES; hspi2.Init.DataSize = SPI_DATASIZE_8BIT; hspi2.Init.CLKPolarity = SPI_POLARITY_LOW; hspi2.Init.CLKPhase = SPI_PHASE_1EDGE; hspi2.Init.NSS = SPI_NSS_SOFT; hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16; hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB; hspi2.Init.TIMode = SPI_TIMODE_DISABLE; hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; hspi2.Init.CRCPolynomial = 10; if (HAL_SPI_Init(&hspi2) != HAL_OK) { Error_Handler(); } } /** * @brief USART1 Initialization Function * @param None * @retval None */ static void MX_USART1_UART_Init(void) { /* USART1 parameter configuration*/ huart1.Instance = USART1; huart1.Init.BaudRate = 115200; huart1.Init.WordLength = UART_WORDLENGTH_8B; huart1.Init.StopBits = UART_STOPBITS_1; huart1.Init.Parity = UART_PARITY_NONE; huart1.Init.Mode = UART_MODE_TX_RX; huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart1.Init.OverSampling = UART_OVERSAMPLING_16; if (HAL_UART_Init(&huart1) != HAL_OK) { Error_Handler(); } } /** * @brief GPIO Initialization Function * @param None * @retval None */ static void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; /* GPIO Ports Clock Enable */ __HAL_RCC_GPIOC_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(GPIOC, ADS1256_RST_PIN, GPIO_PIN_SET); HAL_GPIO_WritePin(ADS1256_CS_PORT, ADS1256_CS_PIN, GPIO_PIN_SET); /* ADS1256 控制引脚配置 */ // RST(PC1)输出 GPIO_InitStruct.Pin = ADS1256_RST_PIN; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM; HAL_GPIO_Init(ADS1256_RST_PORT, &GPIO_InitStruct); // CS(PA7)输出 GPIO_InitStruct.Pin = ADS1256_CS_PIN; HAL_GPIO_Init(ADS1256_CS_PORT, &GPIO_InitStruct); // DRDY(PB11)输入 GPIO_InitStruct.Pin = ADS1256_DRDY_PIN; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_PULLUP; HAL_GPIO_Init(ADS1256_DRDY_PORT, &GPIO_InitStruct); /* USART1 引脚配置(关键修正!) */ // TX(PA9)复用推挽输出 GPIO_InitStruct.Pin = GPIO_PIN_9; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // RX(PA10)浮空输入 GPIO_InitStruct.Pin = GPIO_PIN_10; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); } /** * @brief 使能ADS1256片选(CS拉低) */ void ADS1256_Select(void) { HAL_GPIO_WritePin(ADS1256_CS_PORT, ADS1256_CS_PIN, GPIO_PIN_RESET); } /** * @brief 禁用ADS1256片选(CS拉高) */ void ADS1256_Deselect(void) { HAL_GPIO_WritePin(ADS1256_CS_PORT, ADS1256_CS_PIN, GPIO_PIN_SET); } /** * @brief 硬件复位ADS1256 */ void ADS1256_Reset(void) { printf("Hardware reset started...\r\n"); HAL_GPIO_WritePin(ADS1256_RST_PORT, ADS1256_RST_PIN, GPIO_PIN_RESET); HAL_Delay(500); HAL_GPIO_WritePin(ADS1256_RST_PORT, ADS1256_RST_PIN, GPIO_PIN_SET); HAL_Delay(500); printf("Reset completed\r\n"); } /** * @brief 初始化寄存器 */ void ADS1256_Init(void) { printf("Starting to initialize ADS1256...\r\n"); // 配置单端输入模式:AIN0+ / AINCOM-(MUX寄存器0x80) ADS1256_WriteRegister(ADS1256_REG_MUX, 0x80); uint8_t mux_val = ADS1256_ReadRegister(ADS1256_REG_MUX); printf("MUX register read-back value: 0x%02X\r\n", mux_val); // 配置PGA增益8,关闭传感器检测(ADCON寄存器0x06) ADS1256_WriteRegister(ADS1256_REG_ADCON, 0x06); uint8_t adcon_val = ADS1256_ReadRegister(ADS1256_REG_ADCON); printf("ADCON register read-back value: 0x%02X\r\n", adcon_val); // 启用输入缓冲器(STATUS寄存器0x03) ADS1256_WriteRegister(ADS1256_REG_STATUS, 0x03); uint8_t status_val = ADS1256_ReadRegister(ADS1256_REG_STATUS); printf("STATUS register read-back value: 0x%02X\r\n", status_val); printf("Registers initialization completed\r\n"); } /** * @brief 同步转换(发送SYNC+WAKEUP命令启动转换) */ void ADS1256_Sync(void) { printf("Sending SYNC+WAKEUP command...\r\n"); ADS1256_Select(); SPI2_SendByte(ADS1256_CMD_SYNC); SPI2_SendByte(ADS1256_CMD_WAKEUP); ADS1256_Deselect(); HAL_Delay(10); } /** * @brief 写寄存器 */ void ADS1256_WriteRegister(uint8_t reg, uint8_t data) { uint8_t cmd = ADS1256_CMD_WREG | (reg & 0x0F); ADS1256_Select(); if (HAL_SPI_Transmit(&hspi2, &cmd, 1, 100) != HAL_OK) { printf("Write register 0x%02X failed\r\n", reg); Error_Handler(); } if (HAL_SPI_Transmit(&hspi2, &data, 1, 100) != HAL_OK) { printf("Write data 0x%02X failed\r\n", data); Error_Handler(); } ADS1256_Deselect(); } /** * @brief 读取数据(带错误检查和符号扩展) */ int32_t ADS1256_ReadData(void) { uint8_t retry = 3; uint8_t rdata_cmd = ADS1256_CMD_RDATA; while (retry--) { ADS1256_Select(); if (HAL_SPI_Transmit(&hspi2, &rdata_cmd, 1, 100) != HAL_OK) { printf("Read data command send failed, retrying...\r\n"); continue; } if (HAL_SPI_Receive(&hspi2, &ads1256Data[0], 1, 100) != HAL_OK || HAL_SPI_Receive(&hspi2, &ads1256Data[1], 1, 100) != HAL_OK || HAL_SPI_Receive(&hspi2, &ads1256Data[2], 1, 100) != HAL_OK) { printf("Data receive failed, retrying...\r\n"); continue; } ADS1256_Deselect(); printf("Successfully received raw data: 0x%02X 0x%02X 0x%02X\r\n", ads1256Data[0], ads1256Data[1], ads1256Data[2]); int32_t value = ((int32_t)ads1256Data[0] << 16) | ((int32_t)ads1256Data[1] << 8) | ads1256Data[2]; if (ads1256Data[0] & 0x80) value |= 0xFF000000; return value; } Error_Handler(); return 0; } /** * @brief SPI发送单字节 */ void SPI2_SendByte(uint8_t byte) { if (HAL_SPI_Transmit(&hspi2, &byte, 1, 100) != HAL_OK) { printf("SPI send error: 0x%02X\r\n", byte); Error_Handler(); } } /** * @brief SPI接收单字节 */ uint8_t SPI2_ReceiveByte(void) { uint8_t byte; if (HAL_SPI_Receive(&hspi2, &byte, 1, 100) != HAL_OK) { printf("SPI receive error\r\n"); Error_Handler(); } return byte; } /** * @brief 读寄存器函数 */ uint8_t ADS1256_ReadRegister(uint8_t reg) { uint8_t cmd = 0x10 | (reg & 0x0F); uint8_t data; ADS1256_Select(); HAL_SPI_Transmit(&hspi2, &cmd, 1, 100); HAL_SPI_Receive(&hspi2, &data, 1, 100); ADS1256_Deselect(); return data; } /** * @brief 错误处理函数 */ void Error_Handler(void) { printf("System error! Program terminated\r\n"); while (1) { HAL_Delay(1000); } } #ifdef USE_FULL_ASSERT void assert_failed(uint8_t *file, uint32_t line) { printf("Assertion failed: File %s, Line %d\r\n", file, line); } #endif /* USE_FULL_ASSERT */
05-13
/* USER CODE BEGIN Header */ /** ****************************************************************************** * @file : main.c * @brief : 主程序体 ****************************************************************************** ** 本声明适用于文件中所有不在USER CODE BEGIN和 * USER CODE END注释对之间的部分。文件中其他部分, * 无论是用户插入的还是软件开发工具插入的, * 均属于其各自版权所有者。 * * 版权所有(c) 2020 STMicroelectronics * * 在满足以下条件的前提下,允许以源代码和二进制形式重新分发和使用: * 1. 源代码的再分发必须保留上述版权声明、 * 本条件列表和以下免责声明。 * 2. 二进制形式的再分发必须在文档和/或其他提供的 * 材料中复制上述版权声明、本条件列表和以下免责声明。 * 3. 未经事先书面许可,不得使用STMicroelectronics及其贡献者的名称 * 来认可或推广源自本软件的产品。 * * 本软件按"原样"提供,不提供任何明示或暗示的担保, * 包括但不限于适销性和特定用途适用性的暗示担保。 * 在任何情况下,版权持有者或贡献者均不对任何直接、间接、偶然、特殊、 * 惩戒性或后果性损害(包括但不限于采购替代商品或服务; * 使用损失、数据损失或利润损失;或业务中断)承担责任, * 无论是因合同、严格责任或侵权行为(包括疏忽或其他原因)引起, * 即使已被告知发生此类损害的可能性。 * ****************************************************************************** */ /* USER CODE END Header */ /* 包含文件 ------------------------------------------------------------------*/ #include "main.h" // 主头文件,包含HAL库定义和项目配置 /* 私有包含文件 ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ // 用户自定义包含文件开始 /* USER CODE END Includes */ // 用户自定义包含文件结束 /* 私有类型定义 -----------------------------------------------------------*/ /* USER CODE BEGIN PTD */ // 用户自定义类型定义开始 /* USER CODE END PTD */ // 用户自定义类型定义结束 /* 私有宏定义 ------------------------------------------------------------*/ /* USER CODE BEGIN PD */ // 用户自定义宏定义开始 /* USER CODE END PD */ // 用户自定义宏定义结束 /* 私有宏 -------------------------------------------------------------*/ /* USER CODE BEGIN PM */ // 用户自定义宏开始 /* USER CODE END PM */ // 用户自定义宏结束 /* 私有变量 ---------------------------------------------------------*/ SPI_HandleTypeDef hspi1; // SPI1外设句柄 UART_HandleTypeDef huart1; // USART1外设句柄 /* USER CODE BEGIN PV */ // 用户私有变量开始 unsigned int Angle = 0; // 存储角度值(未使用) uint32_t AngleIn24bits = 0; // 存储24位原始角度数据 // SPI发送数据:命令0x83(连续读取),后跟3个0xFF(填充字节) uint8_t Spi_TxData[4]={0x83,0xff,0xff,0xff}; uint8_t Spi_pRxData[4]={0}; // SPI接收数据缓冲区 /* USER CODE END PV */ // 用户私有变量结束 /* 私有函数原型 -----------------------------------------------*/ void SystemClock_Config(void); // 系统时钟配置函数 static void MX_GPIO_Init(void); // GPIO初始化函数 static void MX_SPI1_Init(void); // SPI1初始化函数 static void MX_USART1_UART_Init(void); // USART1初始化函数 /* USER CODE BEGIN PFP */ // 用户私有函数原型开始 /* USER CODE END PFP */ // 用户私有函数原型结束 /* 用户代码 ---------------------------------------------------------*/ /* USER CODE BEGIN 0 */ ////////////////////////////////////////////////////////////////// // 加入以下代码支持printf函数,无需使用MicroLIB #if 1 #pragma import(__use_no_semihosting) // 禁用半主机模式 // 标准库需要的支持函数 struct __FILE { int handle; // 文件句柄 }; FILE __stdout; // 标准输出文件流 // 定义_sys_exit()以避免使用半主机模式 void _sys_exit(int x) { x = x; // 空实现 } // 重定义fputc函数(将printf重定向到USART1) int fputc(int ch, FILE *f) { while((USART1->SR&0X40)==0); // 等待发送寄存器空(TXE标志) USART1->DR = (uint8_t) ch; // 发送字符 return ch; // 返回发送的字符 } #endif /** * @brief 读取磁编码器角度值 * @retval 24位原始角度数据(包含CRC校验位) */ uint32_t ReadAngle(void) { // 使用突发模式读取角度数据 // 拉低片选信号(开始SPI通信) HAL_GPIO_WritePin(MT68XX_CSN_GPIO_Port, MT68XX_CSN_Pin, GPIO_PIN_RESET); // 发送命令并接收数据(连续3字节) HAL_SPI_TransmitReceive(&hspi1, &Spi_TxData[0], &Spi_pRxData[0],0x03,0xffff); // 拉高片选信号(结束SPI通信) HAL_GPIO_WritePin(MT68XX_CSN_GPIO_Port, MT68XX_CSN_Pin, GPIO_PIN_SET); // 组合3字节接收数据为24位值 AngleIn24bits= (Spi_pRxData[0]<<16)|(Spi_pRxData[1]<<8)|(Spi_pRxData[2]); return (AngleIn24bits); // 返回原始24位数据(高18位为角度,低6位为CRC) } /** * @brief CRC6校验计算 * @param data: 待校验数据指针 * @param length: 数据长度(字节数) * @retval 6位CRC校验值 */ uint8_t crc6(uint8_t *data, uint8_t length) { uint8_t i; uint8_t crc = 0; // CRC初始值 while(length--) { crc ^= *data++; // 异或当前数据字节 for (i=6; i>0; --i) // 处理每个字节的6位 { if (crc & 0x20) // 检查最高位(第6位) crc = (crc << 1) ^ 0x03; // 多项式异或 else crc = (crc << 1); // 移位 } } return crc & 0x3f; // 返回6位CRC值 } /* USER CODE END 0 */ /** * @brief 应用程序入口 * @retval int */ int main(void) { /* USER CODE BEGIN 1 */ uint8_t s[3]; // 存储角度数据字节(用于CRC计算) // uint8_t crcvalue = 0; // CRC计算值 uint32_t AngleInHex = 0; // 原始角度数据(24位) /* USER CODE END 1 */ /* MCU配置--------------------------------------------------------*/ /* 复位所有外设,初始化Flash接口和Systick */ HAL_Init(); /* USER CODE BEGIN Init */ // 用户初始化代码开始 /* USER CODE END Init */ // 用户初始化代码结束 /* 配置系统时钟 */ SystemClock_Config(); /* USER CODE BEGIN SysInit */ // 用户系统初始化开始 /* USER CODE END SysInit */ // 用户系统初始化结束 /* 初始化所有已配置的外设 */ MX_GPIO_Init(); MX_SPI1_Init(); MX_USART1_UART_Init(); /* USER CODE BEGIN 2 */ // 用户外设初始化后代码开始 /* USER CODE END 2 */ // 用户外设初始化后代码结束 /* 主循环 */ /* USER CODE BEGIN WHILE */ while (1) { // 读取原始角度数据(24位) AngleInHex = ReadAngle(); // 提取高18位数据(分成3个6位段) s[0]=AngleInHex>>18; // 最高6位 s[1]=AngleInHex>>12; // 中间6位 s[2]=AngleInHex>>6; // 低6位(角度部分) // 校验CRC(比较接收的CRC和计算的CRC) if(crc6(s, 3)==(AngleInHex&0x3f)) { // CRC校验成功 printf("\r\n接收CRC=0x%x\r\n",AngleInHex&0x3F); // 打印接收的CRC printf("计算CRC=0x%x\r\n",crc6(s, 3)&0x3F); // 打印计算的CRC // 角度转换:高14位(>>10) * 360 / 16384.0 printf("角度值: %.2f°\r\n",(AngleInHex>>10)*360/16384.0); printf("原始数据: %X\r\n",AngleInHex); // 打印原始16进制值 HAL_Delay(5); printf("\n-------------------\n"); HAL_Delay(5); } else { // CRC校验失败 printf("\r\n接收CRC=0x%x\r\n",AngleInHex&0x3F); printf("计算CRC=0x%x\r\n",crc6(s, 3)&0x3F); printf("CRC校验错误!\r\n"); // 仍然显示角度值(但数据可能不可靠) printf("角度值(可能错误): %.2f°\r\n",(AngleInHex>>10)*360/16384.0); HAL_Delay(5); printf("\n\r--------------------\n\r"); } HAL_Delay(5); // 主循环延时 /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ } // 以下为STM32CubeMX生成的初始化代码(添加简要注释) /** * @brief 系统时钟配置 * @retval 无 */ void SystemClock_Config(void) { // ... [CubeMX生成的时钟配置代码,保持原样] } /** * @brief SPI1初始化 * @param 无 * @retval 无 */ static void MX_SPI1_Init(void) { // ... [CubeMX生成的SPI配置代码,保持原样] } /** * @brief USART1初始化 * @param 无 * @retval 无 */ static void MX_USART1_UART_Init(void) { // ... [CubeMX生成的USART配置代码,保持原样] } /** * @brief GPIO初始化 * @param 无 * @retval 无 */ static void MX_GPIO_Init(void) { // ... [CubeMX生成的GPIO配置代码,保持原样] } /* USER CODE BEGIN 4 */ // 用户自定义函数区域开始 /* USER CODE END 4 */ // 用户自定义函数区域结束 /** * @brief 错误处理函数 * @retval 无 */ void Error_Handler(void) { // ... [错误处理代码] } #ifdef USE_FULL_ASSERT // ... [断言处理代码] #endif
最新发布
07-22
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值