mx_internal变量读取和设置

本文介绍了Flex框架中mx_internal命名空间的作用,解释了它如何用于隔离可能在未来版本中发生变化的功能和属性。并通过一个示例演示了如何正确地访问和设置mx_internal变量。
  Flex中很多组件的变量都有mx_internal命名空间,这些变量不能直接访问,只能通过mx_internal来访问。
  那么,什么是mx_internal:
  mx_internal is a namespace used by the Flex framework to partition out functions and properties that may change in future releases of the Flex SDK.
  我们如何使用mx_internal?
  我们只要可以读取或设置mx_internal变量即可,下述为一个简单的demo。 flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600" width="523" height="154">
  
  width="387">
  
  
  
   注意:txtNum.mx_internal::inputField.restrict = "0-9";便是设置inputField变量,使其只能输入0-9的数字。然而我们直接使用txtNum.inputField.restrict = "0-9"程序在编译的时候就会报错:"1178: 试图访问不可访问的属性 inputField (通过 static 类型 mx.controls:NumericStepper 引用)。"
/* USER CODE BEGIN Header */ /** ****************************************************************************** * @file : main.c * @brief : Main program body ****************************************************************************** * @attention * * Copyright (c) 2025 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 "fatfs.h" /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include <stdbool.h> // 解决 bool 类型未定义 #include <string.h> #include "usart.h" #include "rf433.h" #include "ymodem.h" #include "tmr.h" #include "eeprom.h" /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ /* USER CODE BEGIN PTD */ /* USER CODE END PTD */ /* Private define ------------------------------------------------------------*/ /* USER CODE BEGIN PD */ // uint8_t rx_buffer[RX_BUFFER_SIZE] = {0}; // 全局接收缓冲区 /* USER CODE END PD */ /* Private macro -------------------------------------------------------------*/ /* USER CODE BEGIN PM */ /* USER CODE END PM */ /* Private variables ---------------------------------------------------------*/ CRC_HandleTypeDef hcrc; SPI_HandleTypeDef hspi1; TIM_HandleTypeDef htim1; UART_HandleTypeDef huart1; /* USER CODE BEGIN PV */ /* USER CODE END PV */ /* Private function prototypes -----------------------------------------------*/ void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_SPI1_Init(void); static void MX_USART1_UART_Init(void); static void MX_TIM1_Init(void); static void MX_CRC_Init(void); static void Enter_Stop_Mode(void); /* USER CODE BEGIN PFP */ // main.c 顶部 /* 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 */ // memcpy((void*)0x20000000, (void*)0x08003000, 0xB4); //0x8000000,0x8000,0x20000000,0x1000 // __HAL_SYSCFG_REMAPMEMORY_SRAM(); //0x8004800,0x10000,0x200000C0,0x1F30 // __enable_irq(); /* 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_SPI1_Init(); MX_USART1_UART_Init(); MX_TIM1_Init(); MX_CRC_Init(); MX_FATFS_Init(); /* USER CODE BEGIN 2 */ // Configure_Wakeup_Pin(); // MX_TIM17_Init(); // printf("ok...\r\n"); LED1_ON(); LED2_OFF(); LED_Control(4, 1000, 1000, 1); // FLASH_ReadData(FLASH_USER_START_ADDR, (uint8_t*)&readBuf, sizeof(readBuf)); // FLASH_ReadData(FLASH_USER_START_ADDR, &readBuffer, 1); HAL_UART_Receive_IT(&huart1, rx_buffer, RX_BUFFER_SIZE); // 启动接收中断,长度为 RX_BUFFER_SIZE // LED_Control(2,80,15,0); /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ Key_Scan(); // 按键扫描 FLASH_Demo(); RF433(); /* USER CODE BEGIN 3 */ HAL_Delay(10000); // 工作10秒 Enter_Stop_Mode(); } /* USER CODE END 3 */ } /** * @brief System Clock Configuration * @retval None */ void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; RCC_PeriphCLKInitTypeDef PeriphClkInit = {0}; /** Initializes the RCC Oscillators according to the specified parameters * in the RCC_OscInitTypeDef structure. */ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; RCC_OscInitStruct.HSIState = RCC_HSI_ON; RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; 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_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK) { Error_Handler(); } PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1; PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK1; if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) { Error_Handler(); } } /** * @brief CRC Initialization Function * @param None * @retval None */ static void MX_CRC_Init(void) { /* USER CODE BEGIN CRC_Init 0 */ /* USER CODE END CRC_Init 0 */ /* USER CODE BEGIN CRC_Init 1 */ /* USER CODE END CRC_Init 1 */ hcrc.Instance = CRC; hcrc.Init.DefaultInitValueUse = DEFAULT_INIT_VALUE_ENABLE; hcrc.Init.InputDataInversionMode = CRC_INPUTDATA_INVERSION_NONE; hcrc.Init.OutputDataInversionMode = CRC_OUTPUTDATA_INVERSION_DISABLE; hcrc.InputDataFormat = CRC_INPUTDATA_FORMAT_BYTES; if (HAL_CRC_Init(&hcrc) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN CRC_Init 2 */ /* USER CODE END CRC_Init 2 */ } /** * @brief SPI1 Initialization Function * @param None * @retval None */ static void MX_SPI1_Init(void) { /* USER CODE BEGIN SPI1_Init 0 */ /* USER CODE END SPI1_Init 0 */ /* USER CODE BEGIN SPI1_Init 1 */ /* USER CODE END SPI1_Init 1 */ /* SPI1 parameter configuration*/ hspi1.Instance = SPI1; hspi1.Init.Mode = SPI_MODE_MASTER; hspi1.Init.Direction = SPI_DIRECTION_2LINES; hspi1.Init.DataSize = SPI_DATASIZE_4BIT; hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; hspi1.Init.NSS = SPI_NSS_SOFT; hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2; hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; hspi1.Init.TIMode = SPI_TIMODE_DISABLE; hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; hspi1.Init.CRCPolynomial = 7; hspi1.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE; hspi1.Init.NSSPMode = SPI_NSS_PULSE_ENABLE; if (HAL_SPI_Init(&hspi1) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN SPI1_Init 2 */ /* USER CODE END SPI1_Init 2 */ } /** * @brief TIM1 Initialization Function * @param None * @retval None */ static void MX_TIM1_Init(void) { /* USER CODE BEGIN TIM1_Init 0 */ /* USER CODE END TIM1_Init 0 */ TIM_ClockConfigTypeDef sClockSourceConfig = {0}; TIM_SlaveConfigTypeDef sSlaveConfig = {0}; TIM_MasterConfigTypeDef sMasterConfig = {0}; TIM_IC_InitTypeDef sConfigIC = {0}; /* USER CODE BEGIN TIM1_Init 1 */ /* USER CODE END TIM1_Init 1 */ htim1.Instance = TIM1; htim1.Init.Prescaler = 72; htim1.Init.CounterMode = TIM_COUNTERMODE_UP; htim1.Init.Period = 9; htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim1.Init.RepetitionCounter = 0; htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; if (HAL_TIM_Base_Init(&htim1) != HAL_OK) { Error_Handler(); } sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; if (HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig) != HAL_OK) { Error_Handler(); } if (HAL_TIM_IC_Init(&htim1) != HAL_OK) { Error_Handler(); } sSlaveConfig.SlaveMode = TIM_SLAVEMODE_RESET; sSlaveConfig.InputTrigger = TIM_TS_ITR0; if (HAL_TIM_SlaveConfigSynchro(&htim1, &sSlaveConfig) != HAL_OK) { Error_Handler(); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK) { Error_Handler(); } sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_RISING; sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI; sConfigIC.ICPrescaler = TIM_ICPSC_DIV1; sConfigIC.ICFilter = 0; if (HAL_TIM_IC_ConfigChannel(&htim1, &sConfigIC, TIM_CHANNEL_1) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN TIM1_Init 2 */ HAL_NVIC_SetPriority(TIM1_CC_IRQn, 0, 2); HAL_NVIC_EnableIRQ(TIM1_CC_IRQn); HAL_TIM_Base_Start_IT(&htim1); /* USER CODE END TIM1_Init 2 */ } /** * @brief USART1 Initialization Function * @param None * @retval None */ static void MX_USART1_UART_Init(void) { /* USER CODE BEGIN USART1_Init 0 */ /* USER CODE END USART1_Init 0 */ /* USER CODE BEGIN USART1_Init 1 */ /* USER CODE END USART1_Init 1 */ huart1.Instance = USART1; huart1.Init.BaudRate = 9600; 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; huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE; huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT; if (HAL_UART_Init(&huart1) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN USART1_Init 2 */ // 在MX_USART1_UART_Init函数中添加 // HAL_UART_Receive_IT(&huart1, rx_analyse_buf, 1); // 启动接收中断 HAL_NVIC_SetPriority(USART1_IRQn, 0, 0); // 优先级设为最高 HAL_NVIC_EnableIRQ(USART1_IRQn); /* USER CODE END USART1_Init 2 */ } /** * @brief GPIO Initialization Function * @param None * @retval None */ static void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; /* USER CODE BEGIN MX_GPIO_Init_1 */ /* USER CODE END MX_GPIO_Init_1 */ /* GPIO Ports Clock Enable */ __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3|GPIO_PIN_10|GPIO_PIN_11, GPIO_PIN_RESET); /*Configure GPIO pins : PA1 PA2 */ GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_2; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_PULLUP; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /*Configure GPIO pins : PA3 PA10 PA11 */ GPIO_InitStruct.Pin = GPIO_PIN_3|GPIO_PIN_10|GPIO_PIN_11; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /*Configure GPIO pin : PA4 */ GPIO_InitStruct.Pin = GPIO_PIN_4; GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /* USER CODE BEGIN MX_GPIO_Init_2 */ // 配置PB7为唤醒引脚(上升沿触发) /* USER CODE END MX_GPIO_Init_2 */ } /* USER CODE BEGIN 4 */ void Configure_Wakeup_Pin(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; // 使能GPIOB时钟 __HAL_RCC_GPIOB_CLK_ENABLE(); // 配置PB7为外部中断唤醒源 GPIO_InitStruct.Pin = GPIO_PIN_7; GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING; // 上升沿触发 GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); // 设置中断优先级 HAL_NVIC_SetPriority(EXTI4_15_IRQn, 0, 0); HAL_NVIC_EnableIRQ(EXTI4_15_IRQn); } #if 1 #pragma import(__use_no_semihosting) //标准库需要的支持函数 struct __FILE { int handle; }; FILE __stdout; //定义_sys_exit()以避免使用半主机模式 void _sys_exit(int x) { x = x; } //重定义fputc函数 int fputc(int ch, FILE *f) { while((USART1->ISR&0X40)==0);//循环发送,直到发送完毕 USART1->TDR = (uint8_t) ch; return ch; } #endif void Enter_Stop_Mode(void) { // 关闭外设 HAL_UART_DeInit(&huart1); HAL_SPI_DeInit(&hspi1); // 禁用外设时钟 __HAL_RCC_SPI1_CLK_DISABLE(); __HAL_RCC_USART1_CLK_DISABLE(); LED1_OFF(); // 配置唤醒源 Configure_Wakeup_Pin(); // 关闭所有外设时钟(除必要唤醒源) HAL_SuspendTick(); // 挂起SysTick,避免唤醒后立即进入中断 // 配置PB7为唤醒源(已在MX_GPIO_Init中配置) HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1); // PB7对应WAKEUP_PIN1 // 进入停止模式(保留RAM内容,低功耗稳压器开启) HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI); // 唤醒后初始化(系统时钟恢复为HSI 16MHz) SystemClock_Config(); // 重新配置系统时钟 MX_GPIO_Init(); MX_USART1_UART_Init(); MX_SPI1_Init(); HAL_ResumeTick(); // 恢复SysTick } void Wakeup_Handler(void ){ LED1_ON(); LED2_OFF(); SystemClock_Config(); // 重新配置系统时钟 MX_GPIO_Init(); MX_USART1_UART_Init(); MX_SPI1_Init(); HAL_ResumeTick(); HAL_UART_Receive_IT(&huart1, rx_buffer, RX_BUFFER_SIZE); // 启动接收中断,长度为 RX_BUFFER_SIZE } /* 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 */ 唤醒之后没有正常工作,这是为什么
11-15
#include "tmr.h" #include <stdbool.h> // 解决 bool 类型未定义 #include <string.h> #define TIMEOUT_VALUE 10000 // 10秒(ms) volatile uint32_t inactivityTimer = TIMEOUT_VALUE; volatile uint8_t activityFlag = 0; volatile uint32_t idle_counter = 0; // 在main.c文件顶部添加外部声明 extern UART_HandleTypeDef huart1; extern SPI_HandleTypeDef hspi1; volatile uint8_t led_cnt=0; //设定led闪烁的次数 volatile uint16_t led_open_time=0; //设定led每次亮的时间 volatile uint16_t led_close_time=0; //设定led每次灭的时间 volatile uint16_t led_time=0; volatile uint16_t led_time_mx=0; static bool is_running = false; // 静态变量,仅在当前文件可见 //TIM_HandleTypeDef htim1; // 修正后的LED_Control函数 void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if (htim->Instance == TIM1) { Variable_Cnt_In_Timer(); // 调用时间计数函数 Key_Scan(); idle_counter++; // 每100ms增加一次 } } void LED_Control(uint8_t cnt, uint16_t open_time, uint16_t close_time, bool start_state) { if (start_state) { is_running = true; led_cnt = cnt; led_open_time = open_time; led_close_time = close_time; led_time = 1; // 启动计数 led_time_mx = open_time; // 初始亮灯时间 LED1_ON(); // 初始状态点亮 } else { is_running = false; led_cnt = 0; // 关键修复:清空计数 led_time = 0; // 停止计时 LED1_OFF(); // 立即熄灭LED } } // 时间计数函数 (1ms中断调用) void Variable_Cnt_In_Timer(void) { // LED控制逻辑 if(is_running && led_time >= 1) { if(++led_time >= led_time_mx) { if(led_cnt > 0) led_cnt--; if(led_cnt == 0) { LED1_OFF(); // 闪烁结束熄灭LED led_time = 0; // 停止计数 } else { LED1_TOGGLE(); // 切换LED状态 led_time = 1; // 重置计数器 // 切换亮/灭时间阈值 led_time_mx = (led_time_mx == led_open_time) ? led_close_time : led_open_time; } } } } void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if (GPIO_Pin == GPIO_PIN_7) { HAL_Delay(20); // 20ms消抖 if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_7)) { activityFlag = 1; } } } // 唤醒后初始化 void Post_Wakeup_Init(void) { __HAL_RCC_PWR_CLK_ENABLE(); // 恢复电源时钟 __HAL_RCC_GPIOA_CLK_ENABLE(); // 开启GPIOA时钟 __HAL_RCC_GPIOF_CLK_ENABLE(); // 开启GPIOF时钟 SystemCoreClockUpdate(); HAL_ResumeTick(); } // PB7唤醒配置(增加内部上拉) void Configure_Wakeup_Pin(void) { __HAL_RCC_GPIOB_CLK_ENABLE(); GPIO_InitTypeDef GPIO_InitStruct = { .Pin = GPIO_PIN_7, .Mode = GPIO_MODE_EVT_RISING, .Pull = GPIO_PULLUP, .Speed = GPIO_SPEED_FREQ_LOW }; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1); } void Enter_Stop_Mode(void) { // 关闭外设 HAL_UART_DeInit(&huart1); HAL_SPI_DeInit(&hspi1); // 禁用外设时钟 __HAL_RCC_SPI1_CLK_DISABLE(); __HAL_RCC_USART1_CLK_DISABLE(); // 配置唤醒源 Configure_Wakeup_Pin(); // 关闭所有外设时钟(除必要唤醒源) HAL_SuspendTick(); // 挂起SysTick,避免唤醒后立即进入中断 // 配置PB7为唤醒源(已在MX_GPIO_Init中配置) HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1); // PB7对应WAKEUP_PIN1 // 进入停止模式(保留RAM内容,低功耗稳压器开启) HAL_SuspendTick(); HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI); // 唤醒后初始化(系统时钟恢复为HSI 16MHz) SystemClock_Config(); // 重新配置系统时钟 // MX_GPIO_Init(); // MX_USART1_UART_Init(); // MX_SPI1_Init(); HAL_ResumeTick(); // 恢复SysTick } void ECU_Sleep(void) { if(activityFlag) { activityFlag = 0; inactivityTimer = TIMEOUT_VALUE; } if(HAL_GetTick() % 100 == 0) { // 每100ms检测 if(inactivityTimer > 0) inactivityTimer--; else Enter_Stop_Mode(); } __WFI(); // 等待中断降低功耗 } /* USER CODE BEGIN Header */ /** ****************************************************************************** * @file : main.c * @brief : Main program body ****************************************************************************** * @attention * * Copyright (c) 2025 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 "fatfs.h" /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include <stdbool.h> // 解决 bool 类型未定义 #include <string.h> #include "usart.h" #include "rf433.h" #include "ymodem.h" #include "tmr.h" /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ /* USER CODE BEGIN PTD */ /* USER CODE END PTD */ /* Private define ------------------------------------------------------------*/ /* USER CODE BEGIN PD */ uint16_t readBuffer = 0; // uint8_t rx_buffer[RX_BUFFER_SIZE] = {0}; // 全局接收缓冲区 /* USER CODE END PD */ /* Private macro -------------------------------------------------------------*/ /* USER CODE BEGIN PM */ /* USER CODE END PM */ /* Private variables ---------------------------------------------------------*/ CRC_HandleTypeDef hcrc; SPI_HandleTypeDef hspi1; TIM_HandleTypeDef htim1; UART_HandleTypeDef huart1; static uint16_t receivedCode = 0; // static限制作用域 /* USER CODE BEGIN PV */ /* USER CODE END PV */ /* Private function prototypes -----------------------------------------------*/ void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_SPI1_Init(void); static void MX_USART1_UART_Init(void); static void MX_TIM1_Init(void); static void MX_CRC_Init(void); /* USER CODE BEGIN PFP */ // main.c 顶部 /* 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 */ MX_GPIO_Init(); MX_SPI1_Init(); MX_USART1_UART_Init(); MX_TIM1_Init(); MX_CRC_Init(); MX_FATFS_Init(); // VerifyFlashData() ; /* USER CODE BEGIN 2 */ // MX_TIM17_Init(); LED1_ON(); LED2_ON(); LED_Control(4, 1000, 1000, 1); FLASH_ReadData(FLASH_USER_START_ADDR, &readBuffer, 1); HAL_UART_Receive_IT(&huart1, rx_buffer, RX_BUFFER_SIZE); // 启动接收中断,长度为 RX_BUFFER_SIZE // LED_Control(2,80,15,0); /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { Key_Scan(); // 按键扫描 if (flag_rf_new_frame) { Process_Data(receivedCode); flag_rf_new_frame = false; // idle_counter = 0; // 检测到活动,重置空闲计数器 } // 检查空闲超时 if (idle_counter >= IDLE_TIMEOUT) { idle_counter = 0; HAL_TIM_Base_Stop_IT(&htim1); // 停止定时器 Enter_Stop_Mode(); // 进入停止模式 HAL_TIM_Base_Start_IT(&htim1); // 唤醒后重启定时器 } HAL_Delay(10); ; // 降低CPU负载 /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ } /** * @brief System Clock Configuration * @retval None */ void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; RCC_PeriphCLKInitTypeDef PeriphClkInit = {0}; /** Initializes the RCC Oscillators according to the specified parameters * in the RCC_OscInitTypeDef structure. */ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; RCC_OscInitStruct.HSIState = RCC_HSI_ON; RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; 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_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK) { Error_Handler(); } PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1; PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK1; if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) { Error_Handler(); } } /** * @brief CRC Initialization Function * @param None * @retval None */ static void MX_CRC_Init(void) { /* USER CODE BEGIN CRC_Init 0 */ /* USER CODE END CRC_Init 0 */ /* USER CODE BEGIN CRC_Init 1 */ /* USER CODE END CRC_Init 1 */ hcrc.Instance = CRC; hcrc.Init.DefaultInitValueUse = DEFAULT_INIT_VALUE_ENABLE; hcrc.Init.InputDataInversionMode = CRC_INPUTDATA_INVERSION_NONE; hcrc.Init.OutputDataInversionMode = CRC_OUTPUTDATA_INVERSION_DISABLE; hcrc.InputDataFormat = CRC_INPUTDATA_FORMAT_BYTES; if (HAL_CRC_Init(&hcrc) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN CRC_Init 2 */ /* USER CODE END CRC_Init 2 */ } /** * @brief SPI1 Initialization Function * @param None * @retval None */ static void MX_SPI1_Init(void) { /* USER CODE BEGIN SPI1_Init 0 */ /* USER CODE END SPI1_Init 0 */ /* USER CODE BEGIN SPI1_Init 1 */ /* USER CODE END SPI1_Init 1 */ /* SPI1 parameter configuration*/ hspi1.Instance = SPI1; hspi1.Init.Mode = SPI_MODE_MASTER; hspi1.Init.Direction = SPI_DIRECTION_2LINES; hspi1.Init.DataSize = SPI_DATASIZE_4BIT; hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; hspi1.Init.NSS = SPI_NSS_SOFT; hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2; hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; hspi1.Init.TIMode = SPI_TIMODE_DISABLE; hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; hspi1.Init.CRCPolynomial = 7; hspi1.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE; hspi1.Init.NSSPMode = SPI_NSS_PULSE_ENABLE; if (HAL_SPI_Init(&hspi1) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN SPI1_Init 2 */ /* USER CODE END SPI1_Init 2 */ } /** * @brief TIM1 Initialization Function * @param None * @retval None */ static void MX_TIM1_Init(void) { /* USER CODE BEGIN TIM1_Init 0 */ /* USER CODE END TIM1_Init 0 */ TIM_ClockConfigTypeDef sClockSourceConfig = {0}; TIM_SlaveConfigTypeDef sSlaveConfig = {0}; TIM_MasterConfigTypeDef sMasterConfig = {0}; TIM_IC_InitTypeDef sConfigIC = {0}; /* USER CODE BEGIN TIM1_Init 1 */ /* USER CODE END TIM1_Init 1 */ htim1.Instance = TIM1; htim1.Init.Prescaler = 72; htim1.Init.CounterMode = TIM_COUNTERMODE_UP; htim1.Init.Period = 9; htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim1.Init.RepetitionCounter = 0; htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; if (HAL_TIM_Base_Init(&htim1) != HAL_OK) { Error_Handler(); } sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; if (HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig) != HAL_OK) { Error_Handler(); } if (HAL_TIM_IC_Init(&htim1) != HAL_OK) { Error_Handler(); } sSlaveConfig.SlaveMode = TIM_SLAVEMODE_RESET; sSlaveConfig.InputTrigger = TIM_TS_ITR0; if (HAL_TIM_SlaveConfigSynchro(&htim1, &sSlaveConfig) != HAL_OK) { Error_Handler(); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK) { Error_Handler(); } sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_RISING; sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI; sConfigIC.ICPrescaler = TIM_ICPSC_DIV1; sConfigIC.ICFilter = 0; if (HAL_TIM_IC_ConfigChannel(&htim1, &sConfigIC, TIM_CHANNEL_1) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN TIM1_Init 2 */ HAL_NVIC_SetPriority(TIM1_CC_IRQn, 0, 2); HAL_NVIC_EnableIRQ(TIM1_CC_IRQn); HAL_TIM_Base_Start_IT(&htim1); /* USER CODE END TIM1_Init 2 */ } /** * @brief USART1 Initialization Function * @param None * @retval None */ static void MX_USART1_UART_Init(void) { /* USER CODE BEGIN USART1_Init 0 */ /* USER CODE END USART1_Init 0 */ /* USER CODE BEGIN USART1_Init 1 */ /* USER CODE END USART1_Init 1 */ huart1.Instance = USART1; huart1.Init.BaudRate = 9600; 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; huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE; huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT; if (HAL_UART_Init(&huart1) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN USART1_Init 2 */ // 在MX_USART1_UART_Init函数中添加 // HAL_UART_Receive_IT(&huart1, rx_analyse_buf, 1); // 启动接收中断 HAL_NVIC_SetPriority(USART1_IRQn, 0, 0); // 优先级设为最高 HAL_NVIC_EnableIRQ(USART1_IRQn); /* USER CODE END USART1_Init 2 */ } /** * @brief GPIO Initialization Function * @param None * @retval None */ static void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; /* USER CODE BEGIN MX_GPIO_Init_1 */ /* USER CODE END MX_GPIO_Init_1 */ /* GPIO Ports Clock Enable */ __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3|GPIO_PIN_10|GPIO_PIN_11, GPIO_PIN_RESET); /*Configure GPIO pins : PA1 PA2 */ GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_2; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_PULLUP; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /*Configure GPIO pins : PA3 PA10 PA11 */ GPIO_InitStruct.Pin = GPIO_PIN_3|GPIO_PIN_10|GPIO_PIN_11; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /*Configure GPIO pin : PA4 */ GPIO_InitStruct.Pin = GPIO_PIN_4; GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /* USER CODE BEGIN MX_GPIO_Init_2 */ // 配置PB7为唤醒引脚(上升沿触发) GPIO_InitStruct.Pin = GPIO_PIN_7; GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); // 设置中断优先级并开启PB7中断 // HAL_NVIC_SetPriority(EXTI9_5_IRQn, 0, 0); // PB7对应EXTI线7,属于EXTI9_5中断组 // HAL_NVIC_EnableIRQ(EXTI9_5_IRQn); /* USER CODE END MX_GPIO_Init_2 */ } /* USER CODE BEGIN 4 */ /* 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 */ #include "rf433.h" #include "usart.h" #include <stdbool.h> // 解决 bool 类型未定义 #include <string.h> #include "main.h" #include "tmr.h" #include "eeprom.h" #define FLASH_TARGET_SECTOR FLASH_SECTOR_11 // 使用扇区11(根据实际芯片调整) #define FLASH_TARGET_ADDR 0x0800F000 // 扇区起始地址 // 按键状态定义 typedef enum { KEY_RELEASED, KEY_FIRST_PRESS, KEY_LONG_PRESS, KEY_SHORT_PRESS } KeyState; // 全局变量 volatile uint32_t keyPressStartTime = 0; volatile uint32_t lastShortPressTime = 0; volatile uint8_t shortPressCount = 0; volatile uint32_t dataReceiveTime = 0; volatile uint8_t dataMatchCount = 0; uint16_t receivedData[32]; uint16_t flashStoredData = 0; KeyState keyState = KEY_RELEASED; // 按键扫描状态机 void Key_Scan(void) { uint32_t currentTime = HAL_GetTick(); if (HAL_GPIO_ReadPin(KEY_GPIO_PORT, KEY_PIN) == KEY_PRESSED_STATE) { switch (keyState) { case KEY_RELEASED: keyPressStartTime = currentTime; keyState = KEY_FIRST_PRESS; break; case KEY_FIRST_PRESS: if ((currentTime - keyPressStartTime) >= 5000) { keyState = KEY_LONG_PRESS; dataMatchCount = 0; // 启动长按计数 LED_Control(4, 3000, 3000, 1); } break; default: break; } } else { if (keyState == KEY_FIRST_PRESS) { // 短按处理 if ((currentTime - lastShortPressTime) <= 3000) { shortPressCount++; } else { shortPressCount = 1; // 重置计数 } lastShortPressTime = currentTime; keyState = KEY_SHORT_PRESS; // 3秒内3次短按擦除 if (shortPressCount >= 3) { FLASH_ErasePage(FLASH_USER_START_ADDR); shortPressCount = 0; } } keyState = KEY_RELEASED; } } // 数据接收处理 void Process_Data(uint16_t rx_analyse_buf) { // 长按期间数据验证 if (keyState == KEY_LONG_PRESS) { if (dataMatchCount == 0 || rx_analyse_buf == receivedData[5]) { receivedData[dataMatchCount] = rx_analyse_buf; if (++dataMatchCount >= 1) { // 写入Flash WriteRxDataToFlash(); // 重置状态 keyState = KEY_RELEASED; LED_Control(4, 3000, 3000, 1); } } else { dataMatchCount = 0; // 数据不匹配重置 } } // 数据匹配检测 if (rx_analyse_buf == flashStoredData) { HAL_GPIO_WritePin(OUTPUT_GPIO_PORT, OUTPUT_PIN, GPIO_PIN_SET); LED_Control(4, 3000, 3000, 1); } else { HAL_GPIO_WritePin(OUTPUT_GPIO_PORT, OUTPUT_PIN, GPIO_PIN_RESET); // LED_Control(4, 3000, 3000, 1); } } void WriteRxDataToFlash(void) { HAL_StatusTypeDef status; uint32_t flash_addr = FLASH_TARGET_ADDR; // 1. 解锁FLASH HAL_FLASH_Unlock(); // 2. 擦除扇区(擦除前必须解锁) FLASH_EraseInitTypeDef erase_config = { .TypeErase = FLASH_TYPEERASE_PAGES, .PageAddress = FLASH_TARGET_ADDR, .NbPages = 1 // 只擦除1个扇区 }; uint32_t sector_error; status = HAL_FLASHEx_Erase(&erase_config, &sector_error); if (status != HAL_OK) { // 错误处理:擦除失败 Error_Handler(); } // 3. 写入数据(按半字写入) for (int i = 0; i < sizeof(rx_analyse_buf); i += 2) { // 合并两个字节为半字 uint16_t data = (uint16_t)rx_analyse_buf[i] | ((uint16_t)rx_analyse_buf[i + 1] << 8); status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, flash_addr, data); if (status != HAL_OK) { // 错误处理:写入失败 break; } flash_addr += 2; // 地址增加2字节 } // 4. 锁定FLASH HAL_FLASH_Lock(); LED_Control(6, 3000, 3000, 1); // 5. 验证写入(可选) // 添加读取校验逻辑... } void VerifyFlashData(void) { uint8_t read_buffer[sizeof(rx_analyse_buf)]; uint32_t addr = FLASH_TARGET_ADDR; for (int i = 0; i < sizeof(read_buffer); i++) { read_buffer[i] = *(volatile uint8_t*)addr; addr++; } // 比较数据 if (memcmp(rx_analyse_buf, read_buffer, sizeof(rx_analyse_buf)) != 0) { // 校验失败处理 Error_Handler(); LED_Control(6, 3000, 3000, 1); } } #include "eeprom.h" #include "stm32f0xx_hal.h" // 擦除Flash页(按地址自动计算页号) HAL_StatusTypeDef FLASH_ErasePage(uint32_t PageAddress) { FLASH_EraseInitTypeDef EraseInitStruct; uint32_t PageError = 0; // 计算页号(从0开始) uint32_t PageNumber = (PageAddress - FLASH_BASE) / FLASH_PAGE_SIZE; EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES; EraseInitStruct.PageAddress = PageAddress; EraseInitStruct.NbPages = 1; // 只擦除1页 HAL_FLASH_Unlock(); // 解锁Flash[^1] // 清除所有标志位 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_WRPERR | FLASH_FLAG_PGERR); // 执行擦除 HAL_StatusTypeDef status = HAL_FLASHEx_Erase(&EraseInitStruct, &PageError); HAL_FLASH_Lock(); // 重新锁定 return status; } // 写入数据(半字/16位为单位) HAL_StatusTypeDef FLASH_WriteData(uint32_t WriteAddr, uint16_t *data, uint16_t len) { if (WriteAddr < FLASH_USER_START_ADDR || WriteAddr + len*2 > FLASH_USER_START_ADDR + FLASH_PAGE_SIZE) { return HAL_ERROR; // 地址越界检查[^4] } HAL_FLASH_Unlock(); __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_WRPERR | FLASH_FLAG_PGERR); for (uint16_t i = 0; i < len; i++) { if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, WriteAddr + i*2, data[i]) != HAL_OK) { HAL_FLASH_Lock(); return HAL_ERROR; // 写入失败 } } HAL_FLASH_Lock(); return HAL_OK; } // 读取数据(半字/16位为单位) void FLASH_ReadData(uint32_t ReadAddr, uint16_t *buffer, uint16_t len) { for (uint16_t i = 0; i < len; i++) { buffer[i] = *(__IO uint16_t*)(ReadAddr + i*2); // 直接地址访问[^1] } } //// 示例:写入并读取配置参数 //void SaveAndReadConfig(void) { // uint16_t configData[4] = {0x1234, 0x5678, 0x9ABC, 0xDEF0}; // uint16_t readBuffer[4]; // // // 1. 擦除最后一页 // if (FLASH_ErasePage(FLASH_USER_START_ADDR) != HAL_OK) { // // 错误处理 // } // // // 2. 写入数据 // if (FLASH_WriteData(FLASH_USER_START_ADDR, configData, 4) != HAL_OK) { // // 错误处理 // } // // // 3. 读取验证 // FLASH_ReadData(FLASH_USER_START_ADDR, readBuffer, 4); // // // 验证数据 (readBuffer 应与 configData 一致) //} 我想用stm32F030x.6的芯片,要求是433接收数据给单片机,当按键按下到5秒以内,然后单片机接收的数据,存到flash里面,433发送数据的时候与flash里面的数据进行匹配,如果说是一样的话,输出一个高电平,单片机没有工作时,10秒之后进行休眠,433的数据,发给单片机时进行唤醒并进行匹配数据.
11-10
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值