From 92cc9d0b1c623ac394461360186ee5b1c010b402 Mon Sep 17 00:00:00 2001 From: cgy Date: Mon, 9 Feb 2026 11:14:38 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E6=AD=A5=E5=8A=9F=E8=83=BD=E5=B7=B2?= =?UTF-8?q?=E7=BB=8F=E5=8A=A0=E5=85=A8=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- HARDWARE/ADC/adc.c | 93 ++ HARDWARE/ADC/adc.h | 35 + HARDWARE/SPI/spi.c | 90 ++ HARDWARE/SPI/spi.h | 16 + HARDWARE/TIMER/timer.c | 172 +++ HARDWARE/TIMER/timer.h | 18 + HARDWARE/elemachinery/elemachinery.c | 834 +++++++++++ HARDWARE/elemachinery/elemachinery.h | 27 + OBJ/USART.axf | Bin 326732 -> 357552 bytes OBJ/USART.build_log.htm | 61 +- OBJ/USART.htm | 254 ++-- OBJ/USART.lnp | 9 +- OBJ/USART.sct | 1 - OBJ/USART_USART.dep | 1286 ++++++++++------- OBJ/adc.crf | Bin 0 -> 435299 bytes OBJ/beep.crf | Bin 434286 -> 434286 bytes OBJ/delay.crf | Bin 435046 -> 435046 bytes OBJ/elemachinery.crf | Bin 0 -> 443592 bytes OBJ/key.crf | Bin 435384 -> 435384 bytes OBJ/led.crf | Bin 434327 -> 434327 bytes OBJ/main.crf | Bin 439996 -> 439677 bytes OBJ/misc.crf | Bin 433531 -> 433531 bytes OBJ/spi.crf | Bin 0 -> 435216 bytes OBJ/startup_stm32f40_41xxx.lst | 12 +- OBJ/stm32f4xx_adc.crf | Bin 0 -> 440274 bytes OBJ/stm32f4xx_gpio.crf | Bin 435620 -> 435620 bytes OBJ/stm32f4xx_it.crf | Bin 432941 -> 432941 bytes OBJ/stm32f4xx_rcc.crf | Bin 444154 -> 444154 bytes OBJ/stm32f4xx_spi.crf | Bin 0 -> 438355 bytes OBJ/stm32f4xx_syscfg.crf | Bin 433860 -> 433860 bytes OBJ/stm32f4xx_tim.crf | Bin 0 -> 453509 bytes OBJ/stm32f4xx_usart.crf | Bin 438745 -> 438745 bytes OBJ/sys.crf | Bin 434002 -> 434002 bytes OBJ/system_stm32f4xx.crf | Bin 434722 -> 434722 bytes OBJ/timer.crf | Bin 0 -> 435933 bytes OBJ/usart.crf | Bin 439859 -> 443695 bytes SYSTEM/usart/usart.c | 304 +++- SYSTEM/usart/usart.h | 2 +- USER/USART.uvguix.cgy | 1931 ++++++++++++++++++++++++++ USER/USART.uvoptx | 113 +- USER/USART.uvprojx | 59 +- USER/main.c | 2 +- 42 files changed, 4562 insertions(+), 757 deletions(-) create mode 100644 HARDWARE/ADC/adc.c create mode 100644 HARDWARE/ADC/adc.h create mode 100644 HARDWARE/SPI/spi.c create mode 100644 HARDWARE/SPI/spi.h create mode 100644 HARDWARE/TIMER/timer.c create mode 100644 HARDWARE/TIMER/timer.h create mode 100644 HARDWARE/elemachinery/elemachinery.c create mode 100644 HARDWARE/elemachinery/elemachinery.h create mode 100644 OBJ/adc.crf create mode 100644 OBJ/elemachinery.crf create mode 100644 OBJ/spi.crf create mode 100644 OBJ/stm32f4xx_adc.crf create mode 100644 OBJ/stm32f4xx_spi.crf create mode 100644 OBJ/stm32f4xx_tim.crf create mode 100644 OBJ/timer.crf create mode 100644 USER/USART.uvguix.cgy diff --git a/HARDWARE/ADC/adc.c b/HARDWARE/ADC/adc.c new file mode 100644 index 0000000..cd78655 --- /dev/null +++ b/HARDWARE/ADC/adc.c @@ -0,0 +1,93 @@ +#include "adc.h" +#include "delay.h" +////////////////////////////////////////////////////////////////////////////////// +//本程序只供学习使用,未经作者许可,不得用于其它任何用途 +//ALIENTEK STM32F407开发板 +//ADC 驱动代码 +//正点原子@ALIENTEK +//技术论坛:www.openedv.com +//创建日期:2014/5/6 +//版本:V1.0 +//版权所有,盗版必究。 +//Copyright(C) 广州市星翼电子科技有限公司 2014-2024 +//All rights reserved +////////////////////////////////////////////////////////////////////////////////// + + +//初始化ADC +void Adc_Init(void) +{ + GPIO_InitTypeDef GPIO_InitStructure; + ADC_CommonInitTypeDef ADC_CommonInitStructure; + ADC_InitTypeDef ADC_InitStructure; + + RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//使能GPIOA时钟 + RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); //使能ADC1时钟 + + //先初始化ADC1通道5 IO口 + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;//PA5 通道5 + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;//模拟输入 + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;//不带上下拉 + GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化 + + RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,ENABLE); //ADC1复位 + RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,DISABLE); //复位结束 + + + ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;//独立模式 + ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;//两个采样阶段之间的延迟5个时钟 + ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled; //DMA失能 + ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4;//预分频4分频。ADCCLK=PCLK2/4=84/4=21Mhz,ADC时钟最好不要超过36Mhz + ADC_CommonInit(&ADC_CommonInitStructure);//初始化 + + ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;//12位模式 + ADC_InitStructure.ADC_ScanConvMode = DISABLE;//非扫描模式 + ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;//关闭连续转换 + ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;//禁止触发检测,使用软件触发 + ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//右对齐 + ADC_InitStructure.ADC_NbrOfConversion = 1;//1个转换在规则序列中 也就是只转换规则序列1 + ADC_Init(ADC1, &ADC_InitStructure);//ADC初始化 + + + ADC_Cmd(ADC1, ENABLE);//开启AD转换器 + +} +//获得ADC值 +//ch: @ref ADC_channels +//通道值 0~16取值范围为:ADC_Channel_0~ADC_Channel_16 +//返回值:转换结果 +u16 Get_Adc(u8 ch) +{ + //设置指定ADC的规则组通道,一个序列,采样时间 + ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_480Cycles ); //ADC1,ADC通道,480个周期,提高采样时间可以提高精确度 + + ADC_SoftwareStartConv(ADC1); //使能指定的ADC1的软件转换启动功能 + + while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束 + + return ADC_GetConversionValue(ADC1); //返回最近一次ADC1规则组的转换结果 +} +//获取通道ch的转换值,取times次,然后平均 +//ch:通道编号 +//times:获取次数 +//返回值:通道ch的times次转换结果平均值 +u16 Get_Adc_Average(u8 ch,u8 times) +{ + u32 temp_val=0; + u8 t; + for(t=0;tCR1&=0XFFC7;//位3-5清零,用来设置波特率 + SPI1->CR1|=SPI_BaudRatePrescaler; //设置SPI1速度 + SPI_Cmd(SPI1,ENABLE); //使能SPI1 +} +//SPI1 读写一个字节 +//TxData:要写入的字节 +//返回值:读取到的字节 +u8 SPI1_ReadWriteByte(u8 TxData) +{ + + while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET){}//等待发送区空 + + SPI_I2S_SendData(SPI1, TxData); //通过外设SPIx发送一个byte 数据 + + while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET){} //等待接收完一个byte + + return SPI_I2S_ReceiveData(SPI1); //返回通过SPIx最近接收的数据 + +} + +u8 spi1_read_write_byte(u8 TxData) +{ + SPI1_ReadWriteByte(TxData); +} + + + + + + + + diff --git a/HARDWARE/SPI/spi.h b/HARDWARE/SPI/spi.h new file mode 100644 index 0000000..0c3571a --- /dev/null +++ b/HARDWARE/SPI/spi.h @@ -0,0 +1,16 @@ +#ifndef __SPI_H +#define __SPI_H +#include "sys.h" +////////////////////////////////////////////////////////////////////////////////// + +//SPI 驱动代码 +//STM32F4工程模板-库函数版本 +//淘宝店铺:http://mcudev.taobao.com +////////////////////////////////////////////////////////////////////////////////// + +void SPI1_Init(void); //初始化SPI1口 +void SPI1_SetSpeed(u8 SpeedSet); //设置SPI1速度 +u8 SPI1_ReadWriteByte(u8 TxData);//SPI1总线读写一个字节 + +#endif + diff --git a/HARDWARE/TIMER/timer.c b/HARDWARE/TIMER/timer.c new file mode 100644 index 0000000..97edaa2 --- /dev/null +++ b/HARDWARE/TIMER/timer.c @@ -0,0 +1,172 @@ +#include "timer.h" +#include "led.h" +////////////////////////////////////////////////////////////////////////////////// +//本程序只供学习使用,未经作者许可,不得用于其它任何用途 +//ALIENTEK STM32F407开发板 +//定时器 驱动代码 +//正点原子@ALIENTEK +//技术论坛:www.openedv.com +//创建日期:2014/5/4 +//版本:V1.0 +//版权所有,盗版必究。 +//Copyright(C) 广州市星翼电子科技有限公司 2014-2024 +//All rights reserved +////////////////////////////////////////////////////////////////////////////////// + + +void TIM2_Int_Init(u16 arr,u16 psc) +{ + TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; + NVIC_InitTypeDef NVIC_InitStructure; + + RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); ///使能TIM3时钟 + + TIM_TimeBaseInitStructure.TIM_Period = arr; //自动重装载值 + TIM_TimeBaseInitStructure.TIM_Prescaler=psc; //定时器分频 + TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式 + TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1; + + TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);//初始化TIM3 + + TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE); //允许定时器3更新中断 + TIM_Cmd(TIM2,ENABLE); //使能定时器3 + + NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn; //定时器3中断 + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x01; //抢占优先级1 + NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x03; //子优先级3 + NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; + NVIC_Init(&NVIC_InitStructure); + +} + +u8 led_flag=0; +u16 index=0; + +extern u16 real_dis_data[6]; +extern u16 real_dis_data_bak[6]; +extern u8 double_buffer_flag; + +//定时器3中断服务函数 +void TIM2_IRQHandler(void) +{ + char vcm_cmd[16]; + if(TIM_GetITStatus(TIM2,TIM_IT_Update)==SET) //溢出中断 + { + +#if 1 + if(led_flag == 0) + { + GPIO_SetBits(GPIOE, GPIO_Pin_0); + led_flag = 1; + TIM_ClearITPendingBit(TIM2,TIM_IT_Update); //清除中断标志位 + return; + } + if(led_flag == 1) + { + GPIO_ResetBits(GPIOE, GPIO_Pin_0); + led_flag = 0; + TIM_ClearITPendingBit(TIM2,TIM_IT_Update); //清除中断标志位 + return; + } +#endif +#if 0 + sprintf(vcm_cmd,VCM_DISPLACE_CMD,real_dis_data[index]); + usart_send(USART3, vcm_cmd); + usart_send(USART3, START_MACRO_NUM); + TIM_ClearITPendingBit(TIM2,TIM_IT_Update); //清除中断标志位 + return; + +#endif +#if 0 + if(led_flag == 0) + { + sprintf(vcm_cmd,VCM_DISPLACE_CMD,real_dis_data[index]); + usart_send(USART3, vcm_cmd); + usart_send(USART3, START_MACRO_NUM); + index++; + TIM_ClearITPendingBit(TIM2,TIM_IT_Update); //清除中断标志位 + return; + } + if(led_flag == 1) + { + sprintf(vcm_cmd,VCM_DISPLACE_CMD,real_dis_data_bak[index]); + usart_send(USART3, vcm_cmd); + usart_send(USART3, START_MACRO_NUM); + TIM_ClearITPendingBit(TIM2,TIM_IT_Update); //清除中断标志位 + return; + } + if(index > 199 && led_flag == 0) + { + index = 0; + led_flag = 1; + double_buffer_flag = 0; + usart_send(USART1, "laishuju"); + } + if(index > 199 && led_flag == 1) + { + index = 0; + led_flag = 0; + double_buffer_flag = 1; + usart_send(USART1, "laishuju"); + } +#endif + } + +} + + + + +//通用定时器3中断初始化 +//arr:自动重装值。 +//psc:时钟预分频数 +//定时器溢出时间计算方法:Tout=((arr+1)*(psc+1))/Ft us. +//Ft=定时器工作频率,单位:Mhz +//这里使用的是定时器3! +void TIM3_PWM_Init(u16 arr,u16 psc) +{ + GPIO_InitTypeDef GPIO_InitStructure; + TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; + TIM_OCInitTypeDef TIM_OCInitStructure; + + + RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); ///使能TIM3时钟 + RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); + + GPIO_PinAFConfig(GPIOA,GPIO_PinSource6,GPIO_AF_TIM3); + + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; + GPIO_Init(GPIOA,&GPIO_InitStructure); + + GPIO_ResetBits(GPIOA, GPIO_Pin_6); + + TIM_TimeBaseInitStructure.TIM_Period = arr; //自动重装载值 + TIM_TimeBaseInitStructure.TIM_Prescaler=psc; //定时器分频 + TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式 + TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1; + + TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);//初始化TIM3 + + TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; + TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; + TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; + TIM_OCInitStructure.TIM_Pulse = 100; + + TIM_OC1Init(TIM3, &TIM_OCInitStructure); + + TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable); + + TIM_ARRPreloadConfig(TIM3,ENABLE); + + //TIM_Cmd(TIM3, ENABLE); + +} + +//定时器3中断服务函数 +void TIM3_IRQHandler(void) +{ +} diff --git a/HARDWARE/TIMER/timer.h b/HARDWARE/TIMER/timer.h new file mode 100644 index 0000000..99e837b --- /dev/null +++ b/HARDWARE/TIMER/timer.h @@ -0,0 +1,18 @@ +#ifndef _TIMER_H +#define _TIMER_H +#include "sys.h" +////////////////////////////////////////////////////////////////////////////////// +//本程序只供学习使用,未经作者许可,不得用于其它任何用途 +//ALIENTEK STM32F407开发板 +//定时器 驱动代码 +//正点原子@ALIENTEK +//技术论坛:www.openedv.com +//创建日期:2014/6/16 +//版本:V1.0 +//版权所有,盗版必究。 +//Copyright(C) 广州市星翼电子科技有限公司 2014-2024 +//All rights reserved +////////////////////////////////////////////////////////////////////////////////// + +void TIM3_PWM_Init(u16 arr,u16 psc); +#endif diff --git a/HARDWARE/elemachinery/elemachinery.c b/HARDWARE/elemachinery/elemachinery.c new file mode 100644 index 0000000..cab85ea --- /dev/null +++ b/HARDWARE/elemachinery/elemachinery.c @@ -0,0 +1,834 @@ +#include "elemachinery.h" +//#include "stm32f4xx_hal.h" + +typedef uint32_t u32; +typedef uint16_t u16; +typedef uint8_t u8; + + +#define Poutup(n) GPIO_SetBits(GPIOC, n) //输出 +#define Poutdown(n) GPIO_ResetBits(GPIOC, n) //输出 + + +u32 lcd_key; +char if_mobilemotor_rotate = 0; // 推拉移动电机是否旋转 旋转为1 不旋转为0 +char if_rotatingmotor_rotate = 1; // 旋转采集电机是否旋转 旋转为1 不旋转为0 +char mobile_configure = 0; // 推拉移动电机是否怕配置参数 0为未配置参数 1为配置参数 +char rotating_configure = 0; // 旋转采集电机是否怕配置参数 0为未配置参数 1为配置参数 +char step; + + + +enum process_stage{ + CHANGE_STAGE_TO_RIGHT_LIMIT_POSITION, // 找零阶段向右移动 + CHANGE_STAGE_TO_LEFT_LIMIT_POSITION, // 找零阶段向左移 + CLOESE_THE_LID, // 关盖阶段 左移压紧 + FIND_THE_RIGHT_LIMIT_POSITION, // 找右线位阶段 + FAILD_FIND, // 没有找到试剂 + TESTING_SAMPLES, // 检测阶段 + FIND_THE_LEFT_LIMIT_POSITION, //找右线位阶段 + MOTOR_STOP //电机停止状态 +}; +enum rotating_stage{ + GIVE_CHANGE, // 找零阶段 + ROTATE, // 电机旋转 + RO_MOTOR_STOP, // 找零阶段向左移 + FIND_READ_FROM_CHANGE // 从零点到红色 +}; +enum motor_movement_direction{ + MOVE_LEFT, // 向左移动 + MOVE_RIGHT // 向右移动 +}; + +enum motor_movement_direction motor_move = MOVE_LEFT; +enum process_stage pro_stage = CHANGE_STAGE_TO_RIGHT_LIMIT_POSITION; // 电机启动 进入找零阶段 +enum rotating_stage rot_stage = RO_MOTOR_STOP; + +void TMC2240_CS_LOW(){ + + Poutdown(GPIO_Pin_4); + Poutdown(GPIO_Pin_1); +#if 0 + if(step == 1){ + Poutdown(4); + } + else{ + Poutdown(1); + } +#endif +} +void TMC2240_CS_HIGH(){ + Poutup(GPIO_Pin_4);Poutup(GPIO_Pin_1); +} + +// 向TMC2240写入数据 +void tmc2240_write(uint8_t address, uint8_t data) { + // 先发送地址 + spi1_read_write_byte(address); + // 再发送数据 + spi1_read_write_byte(data); +} + +// TMC2240寄存器写操作(地址+32位数据) +void TMC2240_WriteReg(uint8_t addr, uint32_t data) { + + TMC2240_CS_LOW(); + + spi1_read_write_byte(addr | 0x80); // 写命令(bit7=1)?:ml-citation{ref="1" data="citationList"} + spi1_read_write_byte((data >> 24) & 0xFF); + spi1_read_write_byte((data >> 16) & 0xFF); + spi1_read_write_byte((data >> 8) & 0xFF); + spi1_read_write_byte(data & 0xFF); + +// SoftSPI_TransferByte(addr | 0x80); // 写命令(bit7=1)?:ml-citation{ref="1" data="citationList"} +// SoftSPI_TransferByte((data >> 24) & 0xFF); +// SoftSPI_TransferByte((data >> 16) & 0xFF); +// SoftSPI_TransferByte((data >> 8) & 0xFF); +// SoftSPI_TransferByte(data & 0xFF); + + + TMC2240_CS_HIGH(); +} + +// TMC2240寄存器读操作 +uint32_t TMC2240_ReadReg(uint8_t addr) { + uint32_t data = 0; + + TMC2240_CS_LOW(); + + spi1_read_write_byte(addr & 0x7F); // 读命令(bit7=0)?:ml-citation{ref="1" data="citationList"} + data = (uint32_t)spi1_read_write_byte(0xFF) << 24; + data |= (uint32_t)spi1_read_write_byte(0xFF) << 16; + data |= (uint32_t)spi1_read_write_byte(0xFF) << 8; + data |= spi1_read_write_byte(0xFF); + +// SoftSPI_TransferByte(addr & 0x7F); // 读命令(bit7=0)?:ml-citation{ref="1" data="citationList"} +// data = (uint32_t)SoftSPI_TransferByte(0xFF) << 24; +// data |= (uint32_t)SoftSPI_TransferByte(0xFF) << 16; +// data |= (uint32_t)SoftSPI_TransferByte(0xFF) << 8; +// data |= SoftSPI_TransferByte(0xFF); + + TMC2240_CS_HIGH(); + + return data; +} + + +// direct_mode (Bit 16) +void TMC2240_SetDirectMode(uint8_t value, uint32_t *gconf) { + if (value > 1) return; // 允许值0或1 + *gconf = (*gconf & ~(1 << 16)) | ((value & 0x01) << 16); + TMC2240_WriteReg(0x00, *gconf); +} + +// stop_enable (Bit 15) +void TMC2240_SetStopEnable(uint8_t value, uint32_t *gconf) { + if (value > 1) return; + *gconf = (*gconf & ~(1 << 15)) | ((value & 0x01) << 15); + TMC2240_WriteReg(0x00, *gconf); +} + +// small_hysteresis (Bit 14) +void TMC2240_SetSmallHysteresis(uint8_t value, uint32_t *gconf) { + if (value > 1) return; + *gconf = (*gconf & ~(1 << 14)) | ((value & 0x01) << 14); + TMC2240_WriteReg(0x00, *gconf); +} + +// diag1_pushpull (Bit 13) +void TMC2240_SetDiag1PushPull(uint8_t value, uint32_t *gconf) { + if (value > 1) return; + *gconf = (*gconf & ~(1 << 13)) | ((value & 0x01) << 13); + TMC2240_WriteReg(0x00, *gconf); +} + +// diag0_pushpull (Bit 12) +void TMC2240_SetDiag0PushPull(uint8_t value, uint32_t *gconf) { + if (value > 1) return; + *gconf = (*gconf & ~(1 << 12)) | ((value & 0x01) << 12); + TMC2240_WriteReg(0x00, *gconf); +} + +// diag1_onstate (Bit 10) +void TMC2240_SetDiag1OnState(uint8_t value, uint32_t *gconf) { + if (value > 1) return; + *gconf = (*gconf & ~(1 << 10)) | ((value & 0x01) << 10); + TMC2240_WriteReg(0x00, *gconf); +} + +// diag1_index (Bit 9) +void TMC2240_SetDiag1Index(uint8_t value, uint32_t *gconf) { + if (value > 1) return; + *gconf = (*gconf & ~(1 << 9)) | ((value & 0x01) << 9); + TMC2240_WriteReg(0x00, *gconf); +} + +// diag1_stall (Bit 8) +void TMC2240_SetDiag1Stall(uint8_t value, uint32_t *gconf) { + if (value > 1) return; + *gconf = (*gconf & ~(1 << 8)) | ((value & 0x01) << 8); + TMC2240_WriteReg(0x00, *gconf); +} + +// diag0_stall (Bit 7) +void TMC2240_SetDiag0Stall(uint8_t value, uint32_t *gconf) { + if (value > 1) return; + *gconf = (*gconf & ~(1 << 7)) | ((value & 0x01) << 7); + TMC2240_WriteReg(0x00, *gconf); +} + +// diag0_otpw (Bit 6) +void TMC2240_SetDiag0Otpw(uint8_t value, uint32_t *gconf) { + if (value > 1) return; + *gconf = (*gconf & ~(1 << 6)) | ((value & 0x01) << 6); + TMC2240_WriteReg(0x00, *gconf); +} + +// diag0_error (Bit 5) +void TMC2240_SetDiag0Error(uint8_t value, uint32_t *gconf) { + if (value > 1) return; + *gconf = (*gconf & ~(1 << 5)) | ((value & 0x01) << 5); + TMC2240_WriteReg(0x00, *gconf); +} + +// shaft (Bit 4) +void TMC2240_SetShaft(uint8_t value, uint32_t *gconf) { + if (value > 1) return; + *gconf = (*gconf & ~(1 << 4)) | ((value & 0x01) << 4); + TMC2240_WriteReg(0x00, *gconf); +} + +// multistep_filt (Bit 3) +void TMC2240_SetMultistepFilt(uint8_t value, uint32_t *gconf) { + if (value > 1) return; + *gconf = (*gconf & ~(1 << 3)) | ((value & 0x01) << 3); + TMC2240_WriteReg(0x00, *gconf); +} + +// en_pwm_mode (Bit 2) +void TMC2240_SetEnPwmMode(uint8_t value, uint32_t *gconf) { + if (value > 1) return; + *gconf = (*gconf & ~(1 << 2)) | ((value & 0x01) << 2); + TMC2240_WriteReg(0x00, *gconf); +} + +// fast_standstill (Bit 1) +void TMC2240_SetFastStandstill(uint8_t value, uint32_t *gconf) { + if (value > 1) return; + *gconf = (*gconf & ~(1 << 1)) | ((value & 0x01) << 1); + TMC2240_WriteReg(0x00, *gconf); +} + +void set_GCONF(uint8_t field_selector, uint8_t param_value, uint32_t *gconf) { + switch(field_selector) { + case 0x00: TMC2240_SetDirectMode(param_value, gconf); break; + case 0x01: TMC2240_SetStopEnable(param_value, gconf); break; + case 0x02: TMC2240_SetSmallHysteresis(param_value, gconf); break; + case 0x03: TMC2240_SetDiag1PushPull(param_value, gconf); break; + case 0x04: TMC2240_SetDiag0PushPull(param_value, gconf); break; + case 0x05: TMC2240_SetDiag1OnState(param_value, gconf); break; + case 0x06: TMC2240_SetDiag1Index(param_value, gconf); break; + case 0x07: TMC2240_SetDiag1Stall(param_value, gconf); break; + case 0x08: TMC2240_SetDiag0Stall(param_value, gconf); break; + case 0x09: TMC2240_SetDiag0Otpw(param_value, gconf); break; + case 0x0A: TMC2240_SetDiag0Error(param_value, gconf); break; + case 0x0B: TMC2240_SetShaft(param_value, gconf); break; + case 0x0C: TMC2240_SetMultistepFilt(param_value, gconf); break; + case 0x0D: TMC2240_SetEnPwmMode(param_value, gconf); break; + case 0x0E: TMC2240_SetFastStandstill(param_value, gconf); break; + default: + // 可添加错误处理(如打印无效选择器) + break; + } +} + + +// IRUNDELAY (Bits 27:24) +void TMC2240_SetIRunDelay(uint8_t value, uint32_t *current_config) { + if (value > 15) return; // 错误:超出范围(0-15) + *current_config = (*current_config & 0xF0FFFFFF) | ((value & 0x0F) << 24); + TMC2240_WriteReg(0x10, *current_config); +} + +// IHOLDDELAY (Bits 19:16) +void TMC2240_SetIHoldDelay(uint8_t value, uint32_t *current_config) { + if (value > 15) return; + *current_config = (*current_config & 0xFFF0FFFF) | ((value & 0x0F) << 16); + TMC2240_WriteReg(0x10, *current_config); +} + +// IRUN (Bits 12:8) +void TMC2240_SetIRun(uint8_t value, uint32_t *current_config) { + if (value > 31) return; // 错误:超出范围(0-31) + *current_config = (*current_config & 0xFFFFE0FF) | ((value & 0x1F) << 8); + TMC2240_WriteReg(0x10, *current_config); +} + +// IHOLD (Bits 4:0) +void TMC2240_SetIHold(uint8_t value, uint32_t *current_config) { + if (value > 31) return; + *current_config = (*current_config & 0xFFFFFFE0) | (value & 0x1F); + TMC2240_WriteReg(0x10, *current_config); +} + +// CHOPCONF寄存器配置(0x6C) +void set_IHOLD_IRUN(uint8_t field_selector, uint8_t param_value, uint32_t *current_config) { + switch(field_selector) { + case 0x00: // IHOLD (0-31) + TMC2240_SetIHold(param_value, current_config); + break; + case 0x01: // IRUN (0-31) + TMC2240_SetIRun(param_value, current_config); + break; + case 0x02: // IHOLDDELAY (0-15) + TMC2240_SetIHoldDelay(param_value, current_config); + break; + case 0x03: // IRUNDELAY (0-15) + TMC2240_SetIRunDelay(param_value, current_config); + break; + default: + // 可添加错误处理(如日志输出) + break; + } +} + + +// 设置TOFF(位0-3) +void TMC2240_SetTOFF(uint8_t toff_value, uint32_t *chopconf) { + if (toff_value > 15) return; // 错误:超出范围 + *chopconf = (*chopconf & 0xFFFFFFF0) | (toff_value & 0x0F); + TMC2240_WriteReg(0x6C, *chopconf); +} + +// 设置HSTRT(位4-6) +void TMC2240_SetHSTRT(uint8_t hstrt_value, uint32_t *chopconf) { + if (hstrt_value > 7) return; // 错误:超出范围 + *chopconf = (*chopconf & 0xFFFFF8FF) | ((hstrt_value & 0x07) << 4); + TMC2240_WriteReg(0x6C, *chopconf); +} + +// 设置HEND(位7-10) +void TMC2240_SetHEND(uint8_t hend_value, uint32_t *chopconf) { + if (hend_value > 15) return; // 错误:超出范围 + *chopconf = (*chopconf & 0xFFFFF0FF) | ((hend_value & 0x0F) << 7); + TMC2240_WriteReg(0x6C, *chopconf); +} + +// 设置FD3(位11) +void TMC2240_SetFD3(uint8_t enable, uint32_t *chopconf) { + enable = (enable != 0) ? 1 : 0; // 强制转换为0或1 + *chopconf = (*chopconf & 0xFFFFF7FF) | (enable << 11); + TMC2240_WriteReg(0x6C, *chopconf); +} + +// 设置DISFDCC(位12) +void TMC2240_SetDISFDCC(uint8_t enable, uint32_t *chopconf) { + enable = (enable != 0) ? 1 : 0; + *chopconf = (*chopconf & 0xFFFFEFFF) | (enable << 12); + TMC2240_WriteReg(0x6C, *chopconf); +} + +// 设置RNDTF(位13) +void TMC2240_SetRNDTF(uint8_t enable, uint32_t *chopconf) { + enable = (enable != 0) ? 1 : 0; + *chopconf = (*chopconf & 0xFFFFDFFF) | (enable << 13); + TMC2240_WriteReg(0x6C, *chopconf); +} + +// 设置CHM模式(位14) +void TMC2240_SetCHM(uint8_t enable, uint32_t *chopconf) { + enable = (enable != 0) ? 1 : 0; + *chopconf = (*chopconf & 0xFFFFBFFF) | (enable << 14); + TMC2240_WriteReg(0x6C, *chopconf); +} + +// 设置TBL(位15-16) +void TMC2240_SetTBL(uint8_t tbl_value, uint32_t *chopconf) { + if (tbl_value > 3) return; // 错误:超出范围 + *chopconf = (*chopconf & 0xFFF9FFFF) | ((tbl_value & 0x03) << 15); + TMC2240_WriteReg(0x6C, *chopconf); +} + +// 设置VHIGHFS(位18) +void TMC2240_SetVHIGHFS(uint8_t enable, uint32_t *chopconf) { + enable = (enable != 0) ? 1 : 0; + *chopconf = (*chopconf & 0xFFFBFFFF) | (enable << 18); + TMC2240_WriteReg(0x6C, *chopconf); +} + +// 设置VHIGHCHM(位19) +void TMC2240_SetVHIGHCHM(uint8_t enable, uint32_t *chopconf) { + enable = (enable != 0) ? 1 : 0; + *chopconf = (*chopconf & 0xFFF7FFFF) | (enable << 19); + TMC2240_WriteReg(0x6C, *chopconf); +} + +// 设置TPFD(位20-23) +void TMC2240_SetTPFD(uint8_t tpfd_value, uint32_t *chopconf) { + if (tpfd_value > 15) return; // 错误:超出范围 + *chopconf = (*chopconf & 0xFF0FFFFF) | ((tpfd_value & 0x0F) << 20); + TMC2240_WriteReg(0x6C, *chopconf); +} + +// 设置MRES(位24-27) +void TMC2240_SetMRES(uint8_t mres_value, uint32_t *chopconf) { + if (mres_value > 15) return; // 错误:超出范围 + *chopconf = (*chopconf & 0xF0FFFFFF) | ((mres_value & 0x0F) << 24); + TMC2240_WriteReg(0x6C, *chopconf); +} + +void set_CHOPCONF(uint8_t field_selector, uint8_t param_value, uint32_t *chopconf) { + switch(field_selector) { + case 0x00: TMC2240_SetTOFF(param_value, chopconf); break; // Bits 0-3 + case 0x01: TMC2240_SetHSTRT(param_value, chopconf); break; // Bits 4-6 + case 0x02: TMC2240_SetHEND(param_value, chopconf); break; // Bits 7-10 + case 0x03: TMC2240_SetFD3(param_value, chopconf); break; // Bit 11 + case 0x04: TMC2240_SetDISFDCC(param_value, chopconf); break; // Bit 12 + case 0x05: TMC2240_SetRNDTF(param_value, chopconf); break; // Bit 13 + case 0x06: TMC2240_SetCHM(param_value, chopconf); break; // Bit 14 + case 0x07: TMC2240_SetTBL(param_value, chopconf); break; // Bits 15-16 + case 0x08: TMC2240_SetVHIGHFS(param_value, chopconf); break; // Bit 18 + case 0x09: TMC2240_SetVHIGHCHM(param_value, chopconf); break; // Bit 19 + case 0x0A: TMC2240_SetTPFD(param_value, chopconf); break; // Bits 20-23 + case 0x0B: TMC2240_SetMRES(param_value, chopconf); break; // Bits 24-27 + default: + lcd_key |= 0x80000000; // 假设最高位用作错误标志 + break; + } +} + + +// sfilt (Bit 24) +void TMC2240_SetSFilt(uint8_t value, uint32_t *coolstep_config) { + if (value > 1) return; // 允许值0或1 + *coolstep_config = (*coolstep_config & ~(1 << 24)) | ((value & 0x01) << 24); + TMC2240_WriteReg(0x6D, *coolstep_config); +} + +// sgt (Bits 22:16) 有符号整数范围 -64~63 +void TMC2240_SetSGT(int8_t value, uint32_t *coolstep_config) { + if (value < -64 || value > 63) return; // 错误:超出范围 + *coolstep_config = (*coolstep_config & ~(0x7F << 16)) | ((value & 0x7F) << 16); + TMC2240_WriteReg(0x6D, *coolstep_config); +} + +// seimin (Bit 15) +void TMC2240_SetSEIMin(uint8_t value, uint32_t *coolstep_config) { + if (value > 1) return; + *coolstep_config = (*coolstep_config & ~(1 << 15)) | ((value & 0x01) << 15); + TMC2240_WriteReg(0x6D, *coolstep_config); +} + +// sedn (Bits 14:13) +void TMC2240_SetSEDN(uint8_t value, uint32_t *coolstep_config) { + if (value > 3) return; // 允许值0~3 + *coolstep_config = (*coolstep_config & ~(0x03 << 13)) | ((value & 0x03) << 13); + TMC2240_WriteReg(0x6D, *coolstep_config); +} + +// semax (Bits 11:8) +void TMC2240_SetSEMax(uint8_t value, uint32_t *coolstep_config) { + if (value > 15) return; // 允许值0~15 + *coolstep_config = (*coolstep_config & ~(0x0F << 8)) | ((value & 0x0F) << 8); + TMC2240_WriteReg(0x6D, *coolstep_config); +} + +// seup (Bits 6:5) +void TMC2240_SetSEUp(uint8_t value, uint32_t *coolstep_config) { + if (value > 3) return; // 允许值0~3 + *coolstep_config = (*coolstep_config & ~(0x03 << 5)) | ((value & 0x03) << 5); + TMC2240_WriteReg(0x6D, *coolstep_config); +} + +// semin (Bits 3:0) +void TMC2240_SetSEMin(uint8_t value, uint32_t *coolstep_config) { + if (value > 15) return; // 允许值0~15 + *coolstep_config = (*coolstep_config & ~0x0F) | (value & 0x0F); + TMC2240_WriteReg(0x6D, *coolstep_config); +} + +// COOLCONF寄存器配置函数 +void set_COOLCONF(uint8_t field_selector, uint8_t param_value, uint32_t *coolstep_config) { + switch(field_selector) { + case 0x00: TMC2240_SetSEMin(param_value, coolstep_config); break; + case 0x01: TMC2240_SetSEUp(param_value, coolstep_config); break; + case 0x02: TMC2240_SetSEMax(param_value, coolstep_config); break; + case 0x03: TMC2240_SetSEDN(param_value, coolstep_config); break; + case 0x04: TMC2240_SetSEIMin(param_value, coolstep_config); break; + case 0x05: TMC2240_SetSGT((int8_t)param_value, coolstep_config); break; + case 0x06: TMC2240_SetSFilt(param_value, coolstep_config); break; + default: + // 可添加错误处理(如日志输出) + break; + } +} + +//---- 左右平移电机电机参数配置 +// 0x00 GCONF 参数配置 +uint32_t mobile_gconf = 0x000000C4 | (1 << 7); +// 全局变量声明 +uint32_t mobile_current_config = 0x00180C10; // 地址 0x10 的寄存器值 +// CHOPCONF寄存器配置(地址0x6C) +uint32_t mobile_chopconf = 0x020080C3; +// 全局变量声明 +uint32_t mobile_coolstep_config = 0; // 地址 0x6D 的寄存器值 +//---- 旋转采集电机参数配置 +// 0x00 GCONF 参数配置 +uint32_t rotating_gconf = 0x000000C4 | (1 << 7); +// 全局变量声明 +uint32_t rotating_current_config = 0x00180C10; // 地址 0x10 的寄存器值 +// CHOPCONF寄存器配置(地址0x6C) +uint32_t rotating_chopconf = 0x020080C3; +// 全局变量声明 +uint32_t rotating_coolstep_config = 0; // 地址 0x6D 的寄存器值 + +void motor_left(){ + delay_us(500); + MOVE_THE_MOTOR_TO_THE_LEFT; + TMC2240_SetMRES(6, &mobile_gconf); + motor_move = MOVE_LEFT; + //TMC2240_WriteReg(0x10, 0x00180C10); +} +void motor_right(){ + delay_us(500); + MOVE_THE_MOTOR_TO_THE_RIGHT; + TMC2240_SetMRES(6, &mobile_gconf); + motor_move = MOVE_RIGHT; + //TMC2240_WriteReg(0x10, 0x00180C10); +} +#if 0 +//---- 左右平移电机电机参数配置 +// 0x00 GCONF 参数配置 +uint32_t mobile_gconf = 0x000000C4 | (1 << 7); +// 全局变量声明 +uint32_t mobile_current_config = 0x00180C10; // 地址 0x10 的寄存器值 +// CHOPCONF寄存器配置(地址0x6C) +uint32_t mobile_chopconf = 0x020080C3; +// 全局变量声明 +uint32_t mobile_coolstep_config = 0; // 地址 0x6D 的寄存器值 +//---- 旋转采集电机参数配置 +// 0x00 GCONF 参数配置 +uint32_t rotating_gconf = 0x000000C4 | (1 << 7); +// 全局变量声明 +uint32_t rotating_current_config = 0x00180C10; // 地址 0x10 的寄存器值 +// CHOPCONF寄存器配置(地址0x6C) +uint32_t rotating_chopconf = 0x020080C3; +// 全局变量声明 +uint32_t rotating_coolstep_config = 0; // 地址 0x6D 的寄存器值 + +extern uint16_t Rotation_times; +char rotatingbit = 0; +void change_spi(char *str){ + + uint8_t stepselete = str[0]; + uint8_t reg_addr = str[1]; + uint8_t field_selector = str[2]; + uint16_t param_value = str[3] ; // 合并高/低字节 + if(stepselete == 1){ + mobile_configure = 1; //配置参数结束 + step = 1; + switch(reg_addr) { + case 0x00: // 用于全局状态监控和故障诊断。 + set_CHOPCONF(field_selector, param_value,&mobile_gconf); + break; + case 0x10: // 用于动态调节电机电流以优化能耗和性能 + set_IHOLD_IRUN(field_selector, param_value,&mobile_current_config); + break; + + case 0x6C: // 用于配置静音、高效或高动态的驱动模式。 + set_CHOPCONF(field_selector, param_value,&mobile_chopconf); + break; + + case 0x0D: // 提供实时状态反馈,支持负载检测和温度保护。 + set_COOLCONF(field_selector, param_value,&mobile_coolstep_config); + break; + case 0x01: // 正转 反转 + if(param_value == 1) GPIO_SetBits(GPIOD,GPIO_Pin_8); + else GPIO_ResetBits(GPIOD,GPIO_Pin_8); + break; + case 0xFF: // 电机是否启动 + if_mobilemotor_rotate = param_value; + break; + case 0xF1: // 设置电机旋转圈数 + pro_stage = CLOESE_THE_LID; + rot_stage = GIVE_CHANGE; + rotatingbit = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_15); + ProcessControl(); + OPENMOTOR; + break; + default: + // 可添加错误处理(如日志输出) + break; + } + mobile_configure = 0; //配置参数结束 + } + else{ + switch(reg_addr) { + rotating_configure = 1; //配置参数结束 + step = 2; + case 0x00: // 用于全局状态监控和故障诊断。 + set_CHOPCONF(field_selector, param_value,&rotating_gconf); + break; + case 0x10: // 用于动态调节电机电流以优化能耗和性能 + set_IHOLD_IRUN(field_selector, param_value,&rotating_current_config); + break; + + case 0x6C: // 用于配置静音、高效或高动态的驱动模式。 + set_CHOPCONF(field_selector, param_value,&rotating_chopconf); + break; + + case 0x0D: // 提供实时状态反馈,支持负载检测和温度保护。 + set_COOLCONF(field_selector, param_value,&rotating_coolstep_config); + break; + case 0x01: // 正转 反转 + if(param_value == 1) GPIO_SetBits(GPIOB,GPIO_Pin_14); + else GPIO_ResetBits(GPIOB,GPIO_Pin_14); + break; + case 0xFF: // 电机是否启动 + if_rotatingmotor_rotate = param_value; + break; + case 0xF0: // 设置电机旋转圈数 + Rotation_times = param_value*100; + break; + + default: + // 可添加错误处理(如日志输出) + break; + } + rotating_configure = 0; //配置参数结束 + } +} +extern volatile uint32_t pulse_count; +// 电机移动 +//void motor_move(){ +// step = 1; +// GPIO_SetBits(GPIOD,GPIO_Pin_9); +// delay_us(50); +// GPIO_ResetBits(GPIOD,GPIO_Pin_9); +// Rotation_quantity++; +// if(Rotation_quantity == 1500){ +// delay_us(100); +// // TMC2240_WriteReg(0x10, 0x00190C10); +// TMC2240_SetMRES(7, &mobile_gconf); +// } +// +//} +void accelerate(){ + step = 1; + if(pulse_count == 1600){ + TMC2240_SetMRES(7, &mobile_gconf); + } +} +void motor_left(){ + delay_us(500); + MOVE_THE_MOTOR_TO_THE_LEFT; + TMC2240_SetMRES(6, &mobile_gconf); + motor_move = MOVE_LEFT; + //TMC2240_WriteReg(0x10, 0x00180C10); + pulse_count = 0; +} +void motor_right(){ + delay_us(500); + MOVE_THE_MOTOR_TO_THE_RIGHT; + TMC2240_SetMRES(6, &mobile_gconf); + motor_move = MOVE_RIGHT; + //TMC2240_WriteReg(0x10, 0x00180C10); + pulse_count = 0; +} +uint16_t rotating_rotation_times = 0; // 旋转采集电机需要旋转的圈数 +char number_of_detection_cycles = 0; +// 清除线位 + +extern char right_limit; // 到达右线位 +extern char left_limit; // 到达左线位 +extern char mid_limit; // 到达左线位 +void clean_limit(void){ + right_limit = 0; + left_limit = 0; + mid_limit = 0; +} +// 左右平移电机电机流程控制函数 +void ProcessControl(void){ + step = 1; + switch(pro_stage){ + case CHANGE_STAGE_TO_RIGHT_LIMIT_POSITION: // 找零阶段 + // 向右 + motor_right(); + OPENMOTOR; + break; + case CHANGE_STAGE_TO_LEFT_LIMIT_POSITION: // 找零阶段 + motor_left(); + break; + case CLOESE_THE_LID: // 关盖阶段 左移压紧 + motor_left(); + break; + case FIND_THE_RIGHT_LIMIT_POSITION: // 找右线位阶段 + motor_right(); + /////--------------------还需要开启等光 待完善 + break; + case TESTING_SAMPLES: // 检测阶段 + rotating_rotation_times = 1600; + number_of_detection_cycles = 0; + motor_left(); + break; + case FIND_THE_LEFT_LIMIT_POSITION: //找左线位阶段 + rotating_rotation_times = 1600; // 因为绿色在上时 就是处于0点位置 防止出现校准问题 转开他 + motor_left(); + break; + case FAILD_FIND: + motor_left(); + break; + } +} +extern u8 if_read7683; +void detection_steps(){ + step = 1; + static u32 steps = 0; + static char needstep = 0; //记录上一次是否路过左线位 0为向左的阶段 1为向右的阶段 + if(motor_move == MOVE_LEFT){ + if((steps == 0) && (mid_limit == 1)){ + clean_limit(); + steps = 3000; + } + else if(steps > 0){ + steps --; + if(steps <= 0){ + motor_right(); + } + } + if(pulse_count > START_THE_BLACK_LIGHT){ + if_read7683 = 1; + } + } + else{ + // 右移 到达右限位 + if(right_limit == 1) + { + motor_left(); + clean_limit(); + number_of_detection_cycles++; + if(number_of_detection_cycles >= 8){ //完成8次检测 + pro_stage = FIND_THE_LEFT_LIMIT_POSITION; + ProcessControl(); + number_of_detection_cycles = 0; + } + } + if(pulse_count > END_THE_BLACK_LIGHT){ + if_read7683 = 2; + } + } +} + +// 大电机运动 +void motor_motion(void){ + step = 1; + switch(pro_stage){ + case CHANGE_STAGE_TO_RIGHT_LIMIT_POSITION: + if(right_limit == 1){ + pro_stage = CHANGE_STAGE_TO_LEFT_LIMIT_POSITION; //进入下个阶段 向左移动 + ProcessControl(); + clean_limit(); + } + break; + case CHANGE_STAGE_TO_LEFT_LIMIT_POSITION: // 找零阶段 + if(left_limit == 1){ //找零阶段结束 + clean_limit(); + pro_stage = MOTOR_STOP; + CLOSEMOTOR; + pulse_count = 0; + } + break; + case CLOESE_THE_LID: // 关盖阶段 左移压紧 + if(800 <= pulse_count){ + // 停止左移 进入下一个步骤 + pro_stage = FIND_THE_RIGHT_LIMIT_POSITION; + ProcessControl(); + } + break; + case FIND_THE_RIGHT_LIMIT_POSITION: // 找右线位阶段 + if(rot_stage == RO_MOTOR_STOP){ + rot_stage = FIND_READ_FROM_CHANGE; + rotating_rotation_times = 4800; // 1600 转90度 目的时为了找红色 + } + if((rot_stage != FIND_READ_FROM_CHANGE)||(rotating_rotation_times !=0)) + { + pulse_count = 1498; + } + if(right_limit == 1){ + pro_stage = TESTING_SAMPLES; //进入下个阶段 向左移动 + ProcessControl(); + clean_limit(); + } + if(pulse_count > INFRARED_STARTING_POINT && pulse_count < INFRARED_ENDING_POINT) // 进行AD采集 + if_read7683 = 1; + else if_read7683 = 2; + break; + case TESTING_SAMPLES: // 检测阶段 + detection_steps(); + ///----采集dac数据 待完善 + break; + case FIND_THE_LEFT_LIMIT_POSITION: //找左线位阶段 + if(left_limit == 1){ //找零阶段结束 + clean_limit(); + pro_stage = MOTOR_STOP; + CLOSEMOTOR; + pulse_count =0; + ////---- 是否需要关闭相应的灯光 + } + break; + case FAILD_FIND: + if(left_limit == 1){ //找零阶段结束 + clean_limit(); + pro_stage = MOTOR_STOP; + ///--- 弹出错误预警 + } + break; + case MOTOR_STOP: + break; + }; +} +// 电机旋转 +void rotating_move(){ + GPIO_SetBits(GPIOB,GPIO_Pin_15); + delay_us(100); + GPIO_ResetBits(GPIOB,GPIO_Pin_15); +} +// 小电机运动 +void motor_rotating(void){ + switch(rot_stage){ + case ROTATE: + if(rotating_rotation_times <= 0){ + rot_stage = RO_MOTOR_STOP; + } + rotating_move(); + rotating_rotation_times--; + break; + case RO_MOTOR_STOP: + break; + case GIVE_CHANGE: + if(rotatingbit == 0){ // 在0点上 需要进行移动 + rotatingbit = 1; + rotating_rotation_times = 1600; + } + if(rotating_rotation_times > 0){ + rotating_rotation_times--; + rotating_move(); + } + else{ + rotating_move(); + if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_15) == 0){ + rot_stage = ROTATE; + rotating_rotation_times = 200; + } + } + break; + case FIND_READ_FROM_CHANGE: + if(rotating_rotation_times > 0){ + rotating_move(); + rotating_rotation_times--; + } + break; + } +} + +#endif diff --git a/HARDWARE/elemachinery/elemachinery.h b/HARDWARE/elemachinery/elemachinery.h new file mode 100644 index 0000000..b6b2cc9 --- /dev/null +++ b/HARDWARE/elemachinery/elemachinery.h @@ -0,0 +1,27 @@ +#ifndef __ELEMACHINERY_H +#define __ELEMACHINERY_H +//#include "spi.h" +#include +#include "sys.h" + +#define MOVE_THE_MOTOR_TO_THE_LEFT GPIO_SetBits(GPIOD, GPIO_Pin_3); //电机向左移动 +#define MOVE_THE_MOTOR_TO_THE_RIGHT GPIO_ResetBits(GPIOD, GPIO_Pin_3); // 电机向右移动 + +#define INFRARED_STARTING_POINT 0x08D3 +#define INFRARED_ENDING_POINT 0x242E + +#define START_THE_BLACK_LIGHT 0x0EB0 +#define END_THE_BLACK_LIGHT 0x2273 + + + +void change_spi(char *str); +void tmc2240_write(uint8_t address, uint8_t data); +void TMC2240_WriteReg(uint8_t addr, uint32_t data); +void ProcessControl(void); +void motor_motion(void); +uint32_t TMC2240_ReadReg(uint8_t addr); +void motor_rotating(void); +void accelerate(); +void clean_limit(void); +#endif \ No newline at end of file diff --git a/OBJ/USART.axf b/OBJ/USART.axf index fc095f7252ab1c801934ace838087a526e2d4596..fc31afaba499ecc045e725253c83288b8dfb1a9c 100644 GIT binary patch delta 54967 zcmd6Q3t$x0)&I=S^SX@YRB1p@Q=NojY@9W+$6~P~pEiWPazI zd+#~tzVDs6v+HomV;`lh%}R83#0Ukr9KyO$IkA^XLj21K>*~_Q?scJX?BC*q_=)lB zu5u+ViWlNTxRwAF#s+cMgu6;d3;xYlwu!|t`w|5qUing-K62LA!=H6-aXu^TUw(K{ z<*`Fw9uxLg9~Jg*I4nJJ?9k`Oq;10fJ<5E?1!BCi#WB`#C{B6TajrN`$(EL-$d!+N zA*^yE*n(q%AXK%_+^5_p{ar4-wtc3uTAn0+Z}T(qYoa({^9`{#h+#4N`Z!_#*u!F; zYmc)^SUK-kV)nqQV~56lBf68SF z>~!CHWd8x-$eS9(LDJG24kW?>`!slaQT*IKMs; zmy?)19CwG6jY+xUPn4IFvePQR5wrV)CVeC3%=mod`H8qsSB@kNJvZ@a{A0**!7)Q{ ziZkl>&uHKKPiG=*7G6pc;ssdf#y>BKLi~HcxOeBp3Bo(TAPbv){gVAqiK3h(HOEcwVd!4-XssE@e-~_s)L{Mb!stY06cr9XE>xw-`m0q*HP2q6@JV z+vILVDl-xVln_D4#6>t>xh!*N&Q43(L|p@^bVy|3qS!v|r#zCG9^|TCtS82Cvkfn{ z;fri|p$#w9u=3Z;FU1wgp24FBQ_LeIL8y^6r;s9~Sgaxr2|D)0D;E#R$-V@^$PNrl%GJ^j$%kePlfa8bJ{=m8CXRQ4u?;#b zKt@p#aRW5L>p@!z8YM;aMkIZ^Qkr!^@kDobdvjA)$X)2pySTfhwb|{NG-ZrC(AL&^ zw!5@rnb+&Spt!kUaZ$;If+%e0FAJ+OHt)__?Qm?*SLO_#68?4(l%L(WxMj)Gu24r; zsA*Yadq>+Pp+#MdOS&7EHC-BNT-4SaYU~Ux?`-P`78VpvinyQMP~jJ9whO|W$mir^ zN!9-ImkXN%?maQ$ zQhJv&i-cBm78MG~pT~+HNEuyPxD}lgE+$U=kVq`ticW;fj1%{PlKgZmLM@_T`ElaM zQd$?%Ac|*Fs*pT2PW*&O?=TWV)hP#|*!6MZ=Thb%XEmkS%@n&UPW*yMXKN&gJ`yJ$ zq$KAv#kwhl?Q!D2rOYlZ+=^~e?2S0_5J|CcE4mTxgE;XpDRzCFZ$&p#>~Ng;6--RN zi%~q2vV`Qsc<~649$_Se%8D0{N@*!CIF(mN4<9@}Ui?PN^Hm2Lx|+JWJB4IMC{9_W zIP&u27srdML2v-fe$8Dag;d~y`IJ(y(DxiBk zo?_Q|09rI9uJg*d{8YNvd23lFMuHgjbh`CwS0!EvUC`*|N6fK_h})3F4!OU`MLc6{yxj39djnw@t=8u8ba|M^b0yTb4MR|dc?Ca+U=engY)00aRMTg+( zG>jLLTl-15t0ZY%MzWG9ir`gNSJvyU5t6S5_c2M@l%Yl2&x{sD_UB;kmRyy!OesVo z<6cu%%3UoR8Wal7`Gu&LQttJTXy6iSOo<{$FoCrYs4Uealr3Y2hquQ`x$9-=x0#v( zai#(jh2$AYQtk#>`XDp;cZuRq(!He>jiW!bq@@#oh2#q%uwB+OoENPWlFU&5JAUAB;~ zLXJ?m%FAZfdS{!S`b~fFo)|~|hGFBZp3+l?x2w4(@n-Q(a@87SXV_KET};KE-)G`} zwjNEE%R9Fr;OF(gO|W_auPkthE|&-OytUP)a)SqmkHgw;hGklmtFzR2U#UOL4XrIG z)#HJF9)9n1RdSV55q)iGu%W91-LsjZH7?g&6|xo1h%h;$tB3{>E%w}dNp)tkXeT=j<7R98J$WQMDbM_ld-*UZ%usdAOp z2Do-L(id*6QTPPS7H{o@Ln}1`hP9nH><4uXUn@ikE(FFrXr1tS5$( zWnE#p>FMTy;)n3`m-*p8yIr-VhF8#LmwGEJb(Lg7RRPw!P&1)Ht~|;~Dau!dtTCG9M-R+P*(<711NHFku7m>Wl189X+ z%H8LX?i!^fnP5tz3v;GOxt}s=f2FsAi{C0S`zlL`LhY}Vd%GmP)iVZ+Y0pOt>oxhA zv-Pqh<-R0IYes7czJ?y3mz~K%@+!#hlw7`mFQB)j@aF)+4Gr3;2M%R8(7-Y(jMT5! z30hW3xofz9)&fhpYq7+{md_v$h9*NUl>`@jI{ z?L6gQMQLGws+9Zi02dnDGM=fc&=1y@27Fr8f(Z=!4ScgZlU@4D}hVtt_kOdA5O3{4@s8^><5mDbPK+UK$Y2S?Q)8nVx{~y#%8*V8ZEdgG&|Vv#xl;VH109Qm}`tK zoi3l=yrD;{m=~~gm^Y+}&&P(P{1?V$xk@$DX$mu|V!qKJ*82h`#5_i4V4$zxInf^& z&3LK?^kGq^;H#`DZLrw0FHQU%?D>40TY7&SwdwHX)G`*lF&#-GKtruJSk|=sQjh6{ zdFkSx5$gW&S<;>3DO9ZBDq}gbPMJDsXvt0K;$HCYn2_nhxUNv^;W2>Yx3bGuTT!di z<6XYeK!AZ;CJ&8aH_D@v2A8~;F8&L#+;|p?MV|msEc&e$iw?9{7`SD!%YkWud-CA& z;tcU?MDgKSsicTLZ=xvlTP+G5Xi?}O$>poAXZOmLlLv?I%Mfpjlk#u&pc}xb&CgA$ z56t&*B)jSxd=(YE_d#^C_4`U_Ya|3*kBBf<6ULUE$~VhSz9{Sta}0DKGijolQX3oCiRFH zmVSeHvtTrr8zF7dmXQQ4)lv%#?ZCI9Oh5O zc$ll7JHzGm@iwF!%L4qqO7PVLu%=)Pjej;o+yW=vF$Gd65mX=q*W9YG5tHniJI4UX zu~}RURmm8HIbB|(T}yS98y2DP8!}namXaRcLN4TI(Xh;0skhGL5^v@7GM>Sh09BUN z)akkvNdM6zvGmVy`Eo>3?4qHmHtbc-nmRcA%206^Z2R35sBPG0jNdTB_09F0o_Hcl z{3E2-oV!-Ei2G`4P&M?>SYR>k5hq{nKvAhG^Y}5B(j4d{T@3A;?Oqk($Rb#u8n~f$BnPpZvlolury&7_FhSnr8+^S|SSFERL0p z=ca_;%@U6xJGYf>5M4ZD1Y=H%oYXT56KGyJP@?_3)pxq)&gQ{VQMzlY%k%)5uF@L6 zG5W1CJO>hM1o6=*D5uir*LDo_8C?xHp1eg#;065=MLK9CP^^Q61SaaBnZP6+ zAU|jMChMS;K#3082~5#J7XeS0ug9%qkSlQoLz)&Whe=k`gJmv3O%s-}1T|eSf)-g= zO&g4#HK^%>S%?NTjWBpl(y*qKvS&t0*gaf)G(pOLr%X0maSVn~mdtj*mo5GZGH-g( zDDhPw0k?&EcZ&r|v+Oj~)bp&wSb&cgooM_uX%w9rKcDtyhK=%KYlVxA+-eM;cnqi1xoB|-vR_t=8nj@9 zcz+_6fa_>%L)2T!Gh(Un0v`iIWnpCusf}SFl0&A^aIhCg7i!$7gGHt`;@MHj)O)9L zbojba;qcgCcTiX!k2sO#*EU@lm+-JFF74XK|jeEZydW371htu0zucRnIX}m_dLCDF-mps3O2QHRx`!p6K<~@@Cj)PMGAO zC|Zl`$Zd3mxscgEaEjSUaEjSeaEjSoFbda(h6B)#tJ0-GuE$CZG9{?lx#x+|cybVX+Cg@ucJ4Bwrlp-$p z{B@Su(T(}y?ftMvFWjmOtILtPT9zr74R@XHy>($E9!f|Pg#70mN!XIC4F`Q4q0U83 zt)ULyFk^qRx;E%->t2rCsaovTbB2R4e4&n(wq|WBj8VvZl^Z_41Z3W0v%cAl6Cw8{||LN4?johNfSA zcUOCN7wu)+^wSu15gbiRUw3OKglP|tS|HM{KJ4|iwKjFMbY0HXW^M_hi?lNa=(J6=B?kqIj8LW&zf-vV9&@{rWZ!-Y`>Amk2agst=4o3^Zmvt4)Jdn~Cvlgps<}vHBW8 z*0idr_s*&btuT$ybSe)uHB6+b8s$4qj zf%s}8Q*|}Ro^BO0m*bfvJZ6)BFI2>elyY}%cLFNjBs@4I zY*U)f%TcD+<(zJ<#yubiE1^}&H4ZTqOLNMo`t#$r3F1sg$_|GTt}lrjB8q-T%EQWY z_04e$L^0^VBP?TlHE}PCVuvGTi*ki;bX=xGywZ{XGvyaP_aui%%@kYZYiJLJnuX+t zL5a~Q_0;4D$)%vgY7}3$47c`V}Bz$uLBl;Eed1) zAqIn$)io7@>_XFq)>24*5-l$I5x+kx)8=L>)8-_yE^u%A>F)wHJ%k)*c#MF5hYUE2 z{_JP}URyx-RURg@o2mL*)cUDe~OB9)eRr2_xwwaRmRL7 zdb%|nfod@i&xvYJw{;~Cc}9?aCnoO@#DRkLd|QrlB|YgW?9%gl-04;kPgDvucx*Dq zdFN32xBukHg07n&JO!;zdxfrnMz`Y1asF=!xkfpA-t39r?%_%bj%U3U_pm(W(|NZ! zx~C|s=Pz~a6qJ9?FFD;FehW1|bC6jGQa1_GOJed?vk=geyy6AgX!i_Mb$W1?9<1$x zv!~za5YPK6C6-1F-qui4M|Hp#THf5Ud`VeL7kWKil=7toGAjjV{n>(m7J|WGbwC?= z(DTRm1<6#Z@L)mJX_ik11J{sn+hLQ zobED7&sDF-^%Rsl_Zf$%Jb&TfMRjlmXRL;1Ef|sc1IXg>=Lo_t4MGsRx-&H+?gY`| z5Q;$bWkxteqtUbS_%)viTglE3aOI&fp8h_{!RraJ%rfMww{1C|!WOV2r^#%Gk`ZRl zhJ!SMQ3}e4R2TZ5KEhuEqt60qL3d|U2c8yNqRpM?spfcC93$*fL%ZuMr_KYoFHb5Uw~AIkFE% zJb@fpO@@38L;fxDvWtZPLF9bAq!O7MX~;reZXt=s7`qpt$tprkb|`0sT9atl;aEp+ zqX?O>Ea!}kk$f>i{3W=yp^ccXqAA+6ICnDD)fT_k8>9zPX)UFFsa8MECq`rroePro zJF|uqz=-p3WyR=*3|g8yx!EuT`zj?-Tq#Z_7;svHF$dErGM=on| zrElPdcxe?2janvp%N@#nElrNyf|7ViSTy%v&rq^2 zEkE6zXe{1uqIaBL!tiJ#jV`o(FTDa7k&p)L#yI|Y%; z6mZ>jBjP6uws#Z(9kP{Y>R=?WcY5 zstT_`w&Qvav$W~QL{a*?7^`l4Le5MSIcvYNv3+Pidh1mC<((;AH^A$OXb-0*K-c>* zc)VVW#UhiJc~lTNI}@6=7n&p#9ySdW0X-XGID9xqbv@3mPiU_@D zP5GaN*N|Be*{cujiz2ktENdwxY4&d@0($3xVgek*L}4cXyztnLJrJ`n{o}X`S4$ZsB}e zhs8u_&DF845v5C3uI@hfbX!b^7yK00c34c?CNpm|-PW$juEA^Jv8#-K`^0RyNy2r!@- zyZ>yA(Wz&O)~azf&QK9r=pB%nSz1P14g!8}3d*bD)9&^8i<=e&aUcXM5;2mDp}m{Y zc)5v@pq`r)dMO#&`CPuU`r;>d6C8VMT?d;bzp&16bs3u$bkr#-2juM{bDj6 zlNcy8u2{4zxCo2E$sfW(?6;eC#!vYFC(qhjL(Rd(txecepr$A$kIEIA+m_|cAx!eM z78nalZfa-un>NI#d+w6cmDsCK`<6GhyW?-g^#F2a`Ts&0&zn~lpYHJ-t@Cu? z+K>$G|0s$hZx&-4F7FJq-~|I?8q9^GgOI?*_5A$d4|uA zE$i;AY{F9rrZ4G8Iucr~>3U{dc{^JE^|)rF!j*r*6uTz2Hngm^X?fFBPMAyzHk%+RL07t{RxT8B6&hRvVE)V^d;>;u;b&CM6~&4R;waV!A^_WXk^kT`9IIdv7TfuTd^o*Cwu4 ze!H$o3=qY!EkW6J%N+3%C0C)d5jU?^rb#$s^M%{moV2M1<(`yc#TXHqDWBbTySQTW z|ENPGu}ax^=Q)FD{Sew*0|}OrMx~`tP+xOIP-*!S)Y~Jew2%ktKg0-GS|tPZkw_}7 zjDdPs&}Fxg4)L@I6*E+NMOk%Mcl=O?gWNZdICuzm%K8f&I}?=K*4N<})%Vx`K%Aj8 z-Tec{t_0=nyGO;D`S}o~;K6>% z)SowcD30@(fFJ*|pGk^{R+DN_;_ttHf~FG*?!pC~3bdeDy3uK(FvlP%zrX(>(V<-R zz{Js{PbDrP7QR%ZMnLAmM|dGPP!zqpEdq2!@SqO5%Xp&DPjCAipnjHN}U*$Iw>l3a#U(b z1U1Z+!EvooRP+=?Cr3BPQ>aVZ4E02}&{I5S%pkb)Io(}BoC+84C|7KAoerNx`r+HS zA=}77PcMF;oSi`V-n-#~xXWsG;s2Lr7mh*p{6W_S;`3Th2Q9&B4V2JM7?qcsz}QfW+$#+v~v z4TTXg?-xPC`+)R5V=&ON3{Rh{*@tjQ?*S{L6z}(~2&qkXiD_w{TN%~Mn>5y*(FpT} zl@(}PvZOVnZu(M6n|#p9@Xf9DM7FyH1(OP(%a=B(LUqqKQd+-%bK~p1O6hBvlm(Fr z>)A`^H}QJO1vJI`5a0&%A)*;FhBbFcBithqGN_O6V6%#G)U=~EPg53I7fov|A9{&0 zOgZ%(*ma_2g}HB;U0N>?VMJvcp08^r4Y5elyP^?d)ys836oWMmmcu?)BpXm5TSM03 zqTW4TO31j$D#TyuMG>X4n{=~7>rjLBzFI0WGkZiB)wf!TW@J=9ZfEJ}Z^Wus4-`|B z4LjuicSMjkj*&73-f1NTi_~@FF$lRUf>^BXcgbntySaMas?xf;ikdwAFRRMNy;gJi z%eX;a!g}NLYTp~5cP-wkFiX^^DY|Vz^sa*VQ?42^w>qfD^^vR6kWlcA4l88fRqSdJ4DSg{%Kn3Yzj?j0wm4cKI*6|0v`K>j_> zo#fSm=OGG~ckD0EH$7^-q(x!z9E-wYdGV~4wE5b5aCSRY1a;&gX;AueJ-Fp<-&@X_ z=;6=z;CVyz?tE!$%aY}xW_8p1Qu^@i#}mqs(<^rLEmUN!m^2z^?f46Zf9RB$3ct~6 zTVCOZEz#o=b|%yDoorbS|IO5~?!=X}q=H0x*V2^J)%;M?#5gfQ3@I~S9G1DyMh*ol z*lS$cgzh6l$Jqhj?0`COlsGiNT6QCzP_VqElV1GNb-}X}0ZYGTk<%h3mwjPLR6C@B zbQyfG2U%B!CX&uCBXy~>E2Bkp0@~<;raH%1x?b-}tL+J^Br+6K((R(FCB1+1dgtZg z(mD?M%Nrjfxb6rhWMOhQ!TuldsOu~SCay84lw#;6ONw=rWF1cvH)gy%3Nuw3+mf!z zQefvS7^XVKw8YyDx-$Jm*MK{C%4PnF(pk*U)#M9nz^J*c30M;RnGx}&{9p%EfWevf z_M~g|di!1}Eqq@@`X^d9SmHdDAeDN3x~$iK!)cL%)SR&1iK#>fO(dEpO(;z-r>n20 z$Z=_p8Eli=#Y*iau5Ib;0FDU9VW2@AYs72Ih2%Kf@fEu7qq@*8YH{W>OaF(J0~nvn1?i2{-5oYXSSpdnBw2SrYz-mWbClS0>mH>S7t3 z@m>!WduN3eih=JNig>GWsGLQW$f%;bz#_xqq#E)sJvsA;8>R}4&ocM-wL$URujU`D#og*ws^NgIJA14p#Q|Zj3c4lQ$Yb$ZD?kA_EeQoEKwRJ63 z*1eP#E`^=naBWeOdH;W$!9x!%bUS!(qwTQ>>KbX2TwU;-`OzdvyNc!|AdE)iZ?k5{p^J*+qD2hHIvYPqHQzC35IVF1SNC0B7@=Gl_wBMp7|vl+&Ge zMG}kI4AHqhl3Joq5iQ2!NYVxz1zO?HGwzu27G&th)!8}{3hLn%A;>*g!S!$%E|()P{Ug^ zSE1WcqcDT14vcYU8#H9i74MDudMP5mGpL zQ>&@FBgk~_WslJ12))NHhELx`Ze$fyK^*oG^FI{C-UULzhCaC{nSBLjCA1HLFe-ShzpxJp+M?_`i8?egY^gb_ z{V2kHu){$V-ahz2l-j=7RC{69)p&MhaZe4Q^;jH*_d|tm(hfZOd%R=4*z#Fp<+{r zCN#qjMH8B63entQ_~B?mlT4xdc*OLdXhM@sp^g7SOkYJ4Dlvs#C!r(Jgr*om%4IL6 zxsOJZ@e~+B>hp&&NB%mhl;QDCTk}$io);tAsDaEZumvh(fsREB6!w^TVhiPEp;pDv zIF(u;Yk@HH$QG!a1-d$FAT!U*Kx5gH2o)^UHBm!ZGI0hz-|4eb@|hl`+q`*wDjnI?q47GU1r-nE_*$+U_VbOHN4K%nK$S&ckH7 zujtKeIHBmx3^*b2Nnvhl=LyN1d2mAFW@hvz9*!tc7FDV(8CS zwvsklNNUpnIlcc+EtDc^UHkvcLMc|M&iB99Bw@-!E0BZkGf2jqCk6B4pIa(=u%Ujo z-&>KV{b7SI;~p~{%L7v-1$cO=#|(&vif=2b#mt=4%{@6K>YxMYMxNjn;VVW#V_tgPS#N}fdLb}E8#6Xj3Oe#p zOoZ4hddMmmA;$+R5pq4n*d%y6vn$Ymsg}Qh4Kn)gu#h}#YcA;p3rXGhj+Ea2MGK{f zJucyViIW1=p2}cFIh*9pe%VU(^_XT%q)zn}Q>L)e*JF;sw&#A$W$=_;C40moypwyL zKEyf`Ptq9+E7nyIOo0u$;aA;Y-S55e`LHrNKO8Uy&Cvw{#;`IfUw2bqI*^F3H!X1H zHOvT9lgs*wgd9c#%-!5w)wI1?S6UN1HNT;cjA|E3Qg13Vjlu6zU+~$2^;=qwSFc3j z4s|SVYQ=k=9_<_?SnYAQ*ruYaDE+O^K+%iV+kJ-d=p}jBhfGYbY5HmBSb$qWA82n@ z2aUl9XT63xCOtFj|?QzoMqTv^-Dy!wq&dQVOH>4 z-HM2~BAyiLOOPi@Cj5x$RIz*!9*Rm}-v*!p%@(fG)>wF)Rmj%dlW*$5QbkElOQjW! zo4FMgb@Ux)^XUaG6&@3>m=RA8M2hgb*@p-ofkl#cYU-@OLmGOm)QXUi4eD1%q@X7AOmcHgZ-IFt0+b(Wug(uY!hos~okM@+nch9@=#RXPq20q4> z#3vr{?0|C7hpr1~SP&&n-czulm(d?a2cJ>r_N*Ur>3mF+;JzH4XJW5`cWxn}$$3dbK>%o@kG z_j)o5!8EG4{yGC|Y2WWDTNFi>jpjb+DO*g5(xbEeKja=ICs0{ts{wY8aDPS?WQ&yk zbc(hv$t#}ThFiomFZCH)7>|ac9P!4p_qZSfEBcH}i;A3h0%GJph)tu{D*8&5d`H#w z5OZroYtxDl>(g1$p}mZ>!#2)LbmYx!KO^HmHWqIiX-{MDS2iXei+R}2#(*O{s~T!b z=TsPv%-J;1Esf|=OcAC^-y*t7eG6%-U|5PT8RF>wgltvne}YWH9*m*^l@i=n_H!Y zRp+f5ZFWOhWdr)1N}7BZ{MaB?F`}&|YAc5-2~7;r0Z%OY#M?DO4Ibp6oyUYbI97Kg z%jt=CYS16>s;gedlgR4{dpu?Y{qEK&RSgwvEE2wlyU1TrTk4}n`7!*%9UCxNkXGL; z_G+8;Q6zNRd*vH`APLMpqC^1^%`3e`qPe73Cfw5pufob($V}CYn;3-StV|0}cVh2c zIFu^xCh{*kH=VE0(A!{1kDFv|(A0mkg`$m?20URUX~U%cTdXuTJ{s_(g`^FP(g&F& zUg@cLIG-}<=13^__Tp(hqzu{I6+ExK4T>oX@%Cg%}Ok;uVjlx;b(af zqWx+*GCq&~VFgIL;p1&kb+71^ttZ>uyN<@=L)r*lm=HAQTR#y@oyS*FqVSBp?4G>H z)~Y9;`E*QJ>zI17VM{$$yV!PGG;U#^T==|?uy8&Vx8K9{VQPc$7z}-52I~QN_`nsr zp$stZr_vJ!w0Zkio?A3&)q~*H3}XRCp!ZnD+t)J7F7FDt17W0Y=kQf;L3}@2$U+L) z$yTy#A2OA&2n;zE%M?XVR=w<7XWWNMGHEy*Ps*4C1yeV zC|cM_y@oYcj|K7LXhA3U8q{1z4h!NZ(ZZJW8rED>7Q|1Z1)b7sP;&=C5I@s`hHV>L z1-%Bg>?a7~Kcgk=@$??p++4u(cb33mbCb3Aa%I_Rz*}dQ&}QJCC5x91%eI3c9ig;3_(c3NdV6S zQ4Q|-Wg2>uI|r9TC@#fu5f)kN=Uzx^6q8z0Ca`Zu?Eq3Y-6N-liI>fIyS#!xpSK|1 zZ2ANWR?qd*+)bh43cMU2A!K|bgM_khIfSWrH$GB`zCS^~VT@lsQxH~Zk+^wMbh0P? z=$kqY;iW3X1&QYc^@i`uxry&o8~91!@KL#%OSMZX^!3w#KhPXgPrjXiZC3PLs(g_S+!jdyqXlAOEqLP%UAjE zWgBaHbP_2=A>`w72-|QtfDHbVaQ_CJBdz}L59GwL+i{A(IE^Y8hm*2UV_B$A8_ZDS zo{)#AZzGiB;c4o}KaiWkJ8?w8e#kwIi{)FyVapVa=8LE1($TrPoc(NLQ|#V(kzx_2 z36t0eTn=IFd_7evK`hyb6ZK5NRSRtDMI2LS%C%o$NtcRW#QC%&rxl(?9MU=i&LVT^ zRM@b7EG$W6;&KS9z(6=pwaFEXaq#r&ch8Wf?)XEa+XB@hTdtHIso9J{?O?{0`$5+x%GjHw1rW-Uq zJ06k*w2B@;O?nS#8!j{oMPchPzNT172={Ok=?<|TP9F)nLnv7+2yfx;FjsfO9|bX*68M!FI$Rb{77@0pv@y!vwbg;h-}dxoMPqP3`wuG=WX(udbAb zC2YHd!@plCXQkeHsSXjGAL^yz0{OPcsW=*n zm+!3QJjxYU$*zQhfMnVx_3o?W;R(CjIDDDl!|goU&k$|GDl{6@Vm+n~49mmRv0?e; zLHIg?eprS`2N4VHTg6rKK(UYxV5C&Zy+o%oS{MX&;)Xt4!!hx3kuMiBBica7=u5VlpFWdfiSZDC-!eIfQ%F16Rw_aXyP$ zc#S+^5S^SwYzca!=@+`x%dU~zaI%Z~?ltmXvUea1|H;CEV}G(?hdO?>JUl$p!G+L9 zL97Xw&YdAD#oP(ZJw*72n!HSHSVQ>nOn( zNf798SgsH$fW!?227ynQ%oE|IOyF2xN{8@pVE!WmCq>}!fn)l&Hkk|wgdzkE9J>;j zP9Y)zQfMvkLJR&GFr6{P`CEaTE%>*>f{7mj#xMSQk@%u;DKLG=UEjWENr+<#7O_Kp!IEcsej0QzZ!K z{U`w+2=s{+E)WFfKZ-DH!|QUl+`H%SD1Ew!G5RDAF7Wf(qz5|%P7RUL&0Nw{o>9YV^L7Q9 zA!T(mmy(AbvqX3l@|%DYA@4wf0~2tg|ENrm{5uwTJ0Bi2(l|XSMa%Q0NRYdfn&y3i;9kfKkOX@c{s8d}fq^`} z>aZ=rJAuDJf;+*cohBLe4W5uz7p6C0bUDK zVE&_0ZO0GT_)i1V*bRsT(L5Qd{fXivaiD1VIvWJ@9X#HN6QMwj}J6i)90 zhe^Pmz-R=BHC!YLvuwD{h7}v$YQulkG0zf9Ez%e7i@I(bw`{WO&s7 zNW$sCxm+P?e@KCIKv;`wQ?fKRhz3jYI3c&7v7hk;<| zKf+bOG<;+29}(ti0<7T~gi|@2Gy!VZ1j22=Hy{BbBm=Ji#&$HoaHXN|wOBfED z7F=Z$xWk4w+3-#q{+kUSw&6j8A{8D_IBc5{HG9 zv`7oa+OXG#FRR|i zKr#p)LEt<+z!=~nOs(>CTnKytFb#Go!pXob`qV22c&3iQ#!9;=1a0_o;L9LS!+i3< zjlkU!`hTwRT_Ai90&8`F`+%|Z7GJ63CxL5$c?2&5pKrmx2cB)g?*Y#To~noc3>Y69 zHNqbQz8m9jLxFzSfY=Cpi5?&gcrX@`Xd*!xPXHbd%oUyn>;XnRj2{3#--0g%z6|(} zI{!-G`S`2_4}Sx2xEjl9%*9AxBLx8F0-J!lf#>NFYyU;5FP~KDV^{i;LorzaIcPK>?+-%PbR6<_Xpmn zZwwF~VZ&bFdv(4O2FwM1$%0#f@pEJ7k72z-nB5Hm@(&YUjqn3tSnno_NnkZFs+_@J z2kgfGI~iXRegeD?cp+g-Jst(F+Pd*hd8-&U&bMzYE%!DyHZ?E8$@tdKR1w*rnqM4i z47G-qH7#1&vOLsrd1C~!MGzrq1tb@q&}fMhn`roqnf4tsTPzxjAKl+V$45u(w=qh@ z_UHth&C*1sSQ2RPRW~+vwzn9O_t(CkMs$$X^ViD@)J^N&`fY@KztTp}hITjg7S@DtfDs(bH|UGe;(0JZ5J zd8mXeQm?*89>Q*d_sGNOg8__k7H(iKb5NAW8#KD*Q3fqO@&?5h!@RY1=mvRXjQY{N zvQyoEpPVXAQup2`=ZaIbKV{mV3hhtj)*t^|cFJ3y{e|2atNJ#{_ie3xT>i1e4E3$e z@?mxSCOJ1JiblvkpnYmeJ-A8E6Fq9b$K^8hgD2z>YStF)&sS}c8$i8li@bb* zv8~FsRMq$=<$x%t7d$DKjGO50W{32+@dnq$-7T%nZqFnf<{oHkYdzbIPetQks!O$R zMHdyR&p#=5sP8^2r*ECSRlZC7c7cP>%Bv{w2=%^S$@x+KtDAl; zSF!Zf@QZS8zT10t{ z`j17RMj1_=VbkQ)=Q`o z|MkKNN2aSoUXjPDm9NM-C+El!>N&rb$4HAyPPLv-IKCs12&?Dx0ExQe9eMc4x^v4; zdBT6+ovg0^@KxC@UmOaxGX+o9r|W-Ufe&pN(Ok%;C~L+6uqYUXP)^!-j6 z(2swI{$$|mCtpV8-6*3ao>MKOqmS=TB!ar$?{#_9$@=lCJ>Oa3tb0RtJDTva^(V6X zB#R~mcYZ35mWzrPooewMcYJqJDpWporBBkQ+PH9!oI=`P{T^Dq@1&fLWiy11#cs<8 zf=wv2nFD5s=4?S7^!iEXL6Rk&%hf@j%A+JtD0GS)*~H^#1`*3*oW%$0r?Gt^ak z=*)yf+ zRJ-C677EAmPedKxnxTg#eb8>%0-hWpQ<}gWVVe|;7+yR zZF%I$y7KY2zoXJQMOoXKp+51V?D{tCVd7qS233|6b>UulY*KFvC-K!@wA;&CI!|R7 zs($jWobOn4s>>oLFzH;xRz)ltpImOu`Hq^ADIdsgb>TjF{K=L132O6)a=u*HbUMmB zr9x#sxKEyNa$eL|m=5lf&;IZG6K%+F^)DaG`D)B3^0<@r=c<3nvby0j{FDBvoGle% zE$};ExL4tpn^z$^o)uz{NKq4rZ-JYkFa#tMqM z5KH{u-7*Tb!7Qz}KbEsH`ML?s^9*Y+GdzVc^8~gd$fns$&zC{mcyE)7g`3i`XodEn*d&@&awi@$&in;;ZJnuJ`IS66=B;Er(5*fQN-RBQ@xU>ih9>iJE;x&W&63DBiM6m(^KEtzw{&s{r(?Tn|MY5 delta 34550 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 F{|`lv?+E|^ diff --git a/OBJ/USART.build_log.htm b/OBJ/USART.build_log.htm index b075213..fe50764 100644 --- a/OBJ/USART.build_log.htm +++ b/OBJ/USART.build_log.htm @@ -3,62 +3,51 @@
 

礦ision Build Log

Tool Versions:

-IDE-Version: μVision V5.38.0.0 -Copyright (C) 2022 ARM Ltd and ARM Germany GmbH. All rights reserved. -License Information: baibaila3 baibaila3@163.com, keil, LIC=47GU5-GE5WI-JJF6S-L5PAY-BRK7N-23XAJ +IDE-Version: μVision V5.25.3.0 +Copyright (C) 2018 ARM Ltd and ARM Germany GmbH. All rights reserved. +License Information: cgy cgy, cgy, LIC=CRMFW-QWL2E-RC0JZ-J6WMG-6WJZU-2F249 Tool Versions: -Toolchain: MDK-ARM Plus Version: 5.22 +Toolchain: MDK-ARM Professional Version: 5.15.0 Toolchain Path: C:\Keil_v5\ARM\ARMCC\Bin -C Compiler: Armcc.exe V5.06 update 4 (build 422) -Assembler: Armasm.exe V5.06 update 4 (build 422) -Linker/Locator: ArmLink.exe V5.06 update 4 (build 422) -Library Manager: ArmAr.exe V5.06 update 4 (build 422) -Hex Converter: FromElf.exe V5.06 update 4 (build 422) -CPU DLL: SARMCM3.DLL V5.22 -Dialog DLL: DCM.DLL V1.13.9.0 -Target DLL: STLink\ST-LINKIII-KEIL_SWO.dll V2.0.18.0 -Dialog DLL: TCM.DLL V1.21.0.0 +C Compiler: Armcc.exe V5.05 update 2 (build 169) +Assembler: Armasm.exe V5.05 update 2 (build 169) +Linker/Locator: ArmLink.exe V5.05 update 2 (build 169) +Library Manager: ArmAr.exe V5.05 update 2 (build 169) +Hex Converter: FromElf.exe V5.05 update 2 (build 169) +CPU DLL: SARMCM3.DLL V5.15.0 +Dialog DLL: DCM.DLL V1.13.2.0 +Target DLL: STLink\ST-LINKIII-KEIL_SWO.dll V2.0.15.0_KEIL +Dialog DLL: TCM.DLL V1.14.5.0

Project:

-C:\Users\baiba\Downloads\c0d15-main\c0d15-main\标准例程-库函数版本\2,标准例程-库函数版本\实验4 串口实验\USER\USART.uvprojx -Project File Date: 02/08/2026 +D:\fighterteam\project\gu\make\code\sensor_2026\sensor_2026\USER\USART.uvprojx +Project File Date: 02/09/2026

Output:

-*** Using Compiler 'V5.06 update 4 (build 422)', folder: 'C:\Keil_v5\ARM\ARMCC\Bin' +*** Using Compiler 'V5.05 update 2 (build 169)', folder: 'C:\Keil_v5\ARM\ARMCC\Bin' Build target 'USART' -assembling startup_stm32f40_41xxx.s... -compiling stm32f4xx_usart.c... -compiling delay.c... -compiling misc.c... -compiling stm32f4xx_rcc.c... -compiling beep.c... -compiling main.c... -compiling system_stm32f4xx.c... -compiling stm32f4xx_it.c... -compiling sys.c... -compiling led.c... -compiling key.c... -compiling stm32f4xx_syscfg.c... -compiling stm32f4xx_gpio.c... -compiling usart.c... +compiling stm32f4xx_adc.c... +compiling stm32f4xx_spi.c... +compiling stm32f4xx_tim.c... linking... -Program Size: Code=2932 RO-data=424 RW-data=28 ZI-data=1836 +Program Size: Code=2844 RO-data=424 RW-data=32 ZI-data=1832 FromELF: creating hex file... "..\OBJ\USART.axf" - 0 Error(s), 0 Warning(s).

Software Packages used:

Package Vendor: Keil - http://www.keil.com/pack/Keil.STM32F4xx_DFP.2.11.0.pack - Keil.STM32F4xx_DFP.2.11.0 + http://www.keil.com/pack/Keil.STM32F4xx_DFP.2.14.0.pack + Keil.STM32F4xx_DFP.2.14.0 STMicroelectronics STM32F4 Series Device Support, Drivers and Examples

Collection of Component include folders:

- C:/Keil_v5/ARM/PACK/Keil/STM32F4xx_DFP/2.11.0/Drivers/CMSIS/Device/ST/STM32F4xx/Include + .\RTE\_USART + C:\Keil_v5\ARM\PACK\Keil\STM32F4xx_DFP\2.14.0\Drivers\CMSIS\Device\ST\STM32F4xx\Include

Collection of Component Files used:

-Build Time Elapsed: 00:00:03 +Build Time Elapsed: 00:00:02
diff --git a/OBJ/USART.htm b/OBJ/USART.htm index 20fd37c..c1fa90a 100644 --- a/OBJ/USART.htm +++ b/OBJ/USART.htm @@ -3,7 +3,7 @@ Static Call Graph - [..\OBJ\USART.axf]

Static Call Graph for image ..\OBJ\USART.axf


-

#<CALLGRAPH># ARM Linker, 5060422: Last Updated: Sun Feb 08 17:42:53 2026 +

#<CALLGRAPH># ARM Linker, 5050169: Last Updated: Mon Feb 09 11:13:49 2026

Maximum Stack Usage = 128 bytes + Unknown(Functions without stacksize, Cycles, Untraceable Function Pointers)

Call chain for Maximum Stack Depth:

@@ -99,8 +99,8 @@ Function Pointers
  • TIM1_CC_IRQHandler from startup_stm32f40_41xxx.o(.text) referenced from startup_stm32f40_41xxx.o(RESET)
  • TIM1_TRG_COM_TIM11_IRQHandler from startup_stm32f40_41xxx.o(.text) referenced from startup_stm32f40_41xxx.o(RESET)
  • TIM1_UP_TIM10_IRQHandler from startup_stm32f40_41xxx.o(.text) referenced from startup_stm32f40_41xxx.o(RESET) -
  • TIM2_IRQHandler from startup_stm32f40_41xxx.o(.text) referenced from startup_stm32f40_41xxx.o(RESET) -
  • TIM3_IRQHandler from startup_stm32f40_41xxx.o(.text) referenced from startup_stm32f40_41xxx.o(RESET) +
  • TIM2_IRQHandler from timer.o(i.TIM2_IRQHandler) referenced from startup_stm32f40_41xxx.o(RESET) +
  • TIM3_IRQHandler from timer.o(i.TIM3_IRQHandler) referenced from startup_stm32f40_41xxx.o(RESET)
  • TIM4_IRQHandler from startup_stm32f40_41xxx.o(.text) referenced from startup_stm32f40_41xxx.o(RESET)
  • TIM5_IRQHandler from startup_stm32f40_41xxx.o(.text) referenced from startup_stm32f40_41xxx.o(RESET)
  • TIM6_DAC_IRQHandler from startup_stm32f40_41xxx.o(.text) referenced from startup_stm32f40_41xxx.o(RESET) @@ -109,12 +109,12 @@ Function Pointers
  • TIM8_CC_IRQHandler from startup_stm32f40_41xxx.o(.text) referenced from startup_stm32f40_41xxx.o(RESET)
  • TIM8_TRG_COM_TIM14_IRQHandler from startup_stm32f40_41xxx.o(.text) referenced from startup_stm32f40_41xxx.o(RESET)
  • TIM8_UP_TIM13_IRQHandler from startup_stm32f40_41xxx.o(.text) referenced from startup_stm32f40_41xxx.o(RESET) -
  • UART4_IRQHandler from startup_stm32f40_41xxx.o(.text) referenced from startup_stm32f40_41xxx.o(RESET) -
  • UART5_IRQHandler from startup_stm32f40_41xxx.o(.text) referenced from startup_stm32f40_41xxx.o(RESET) +
  • UART4_IRQHandler from usart.o(i.UART4_IRQHandler) referenced from startup_stm32f40_41xxx.o(RESET) +
  • UART5_IRQHandler from usart.o(i.UART5_IRQHandler) referenced from startup_stm32f40_41xxx.o(RESET)
  • USART1_IRQHandler from usart.o(i.USART1_IRQHandler) referenced from startup_stm32f40_41xxx.o(RESET) -
  • USART2_IRQHandler from startup_stm32f40_41xxx.o(.text) referenced from startup_stm32f40_41xxx.o(RESET) -
  • USART3_IRQHandler from startup_stm32f40_41xxx.o(.text) referenced from startup_stm32f40_41xxx.o(RESET) -
  • USART6_IRQHandler from startup_stm32f40_41xxx.o(.text) referenced from startup_stm32f40_41xxx.o(RESET) +
  • USART2_IRQHandler from usart.o(i.USART2_IRQHandler) referenced from startup_stm32f40_41xxx.o(RESET) +
  • USART3_IRQHandler from usart.o(i.USART3_IRQHandler) referenced from startup_stm32f40_41xxx.o(RESET) +
  • USART6_IRQHandler from usart.o(i.USART6_IRQHandler) referenced from startup_stm32f40_41xxx.o(RESET)
  • UsageFault_Handler from stm32f4xx_it.o(i.UsageFault_Handler) referenced from startup_stm32f40_41xxx.o(RESET)
  • WWDG_IRQHandler from startup_stm32f40_41xxx.o(.text) referenced from startup_stm32f40_41xxx.o(RESET)
  • __main from __main.o(!!!main) referenced from startup_stm32f40_41xxx.o(.text) @@ -126,8 +126,8 @@ Function Pointers Global Symbols

    __main (Thumb, 8 bytes, Stack size 0 bytes, __main.o(!!!main)) -

    [Calls]