Commit b941ea94 by 刘大爷来也

修改超声波雷达和温度传感器

parent 9520ebf2
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -3,9 +3,6 @@ ...@@ -3,9 +3,6 @@
#include "stm32f10x.h" #include "stm32f10x.h"
#define D14_GET() (((GPIOD->IDR >> 14) & 1) ? 1 : 0)
// 定义系统状态的枚举类型 // 定义系统状态的枚举类型
typedef enum { typedef enum {
STATE_IDLE, // 系统处于空闲状态 STATE_IDLE, // 系统处于空闲状态
...@@ -28,5 +25,11 @@ void Total_GPIO_Init(void); ...@@ -28,5 +25,11 @@ void Total_GPIO_Init(void);
void Total_EXTI_Init(void); void Total_EXTI_Init(void);
//温度传感器时序
void TIM7_Init(void) ;
void delay_us(uint16_t us);
#endif // COMMON #endif // COMMON
...@@ -3,33 +3,31 @@ ...@@ -3,33 +3,31 @@
#include "stm32f10x.h" #include "stm32f10x.h"
// 引脚定义 // 引脚定义
#define DS18B20_DQ_PIN (1 << 12) // PD12
#define DS18B20_PORT GPIOD
// 设置 DQ 引脚为输出模式 #define DS18B20_DQ_OUT_HIGH (GPIOD->BSRR = (1 << 12)) // 设置PD12为高电平
#define DQ_OUT() { \ #define DS18B20_DQ_OUT_LOW (GPIOD->BRR = (1 << 12)) // 设置PD12为低电平
GPIOD->CRH &= ~(0xF << (4 * 4)); /* 清除配置 */ \ #define DS18B20_DQ_IN ((GPIOD->IDR & (1 << 12)) != 0) // 读取PD12的电平
GPIOD->CRH |= (0x3 << (4 * 4)); /* 设置为推挽输出模式,最大50MHz */ \
}
// 设置 DQ 引脚为输入模式 // 设置DD12 输入模式(浮空输入)
#define DQ_IN() { \ #define DQ_IN() { GPIOD->CRH &= ~(0xF << 16); GPIOD->CRH |= (0x4 << 16); }
GPIOD->CRH &= ~(0xF << (4 * 4)); /* 清除配置 */ \
GPIOD->CRH |= (0x4 << (4 * 4)); /* 设置为浮空输入模式 */ \
}
// 获取 DQ 引脚的电平变化 void TIM7_Init(void) ;
#define DQ_GET() ((GPIOD->IDR & DS18B20_DQ_PIN) ? 1 : 0)
// DQ 输出高电平或低电平 void delay_us(uint16_t us);
#define DQ(x) ((x) ? (GPIOD->BSRR = DS18B20_DQ_PIN) : (GPIOD->BRR = DS18B20_DQ_PIN))
void DS18B20_IO_IN(void);
void DS18B20_IO_OUT(void);
uint8_t DS18B20_Init(void);
void DS18B20_Rst(void);
uint8_t DS18B20_Check(void); uint8_t DS18B20_Check(void);
char DS18B20_Init(void);
void DS18B20_Start(void);
float DS18B20_GetTemperture(void); uint8_t DS18B20_Read_Bit(void);
uint8_t DS18B20_Read_Byte(void);
void DS18B20_Write_Byte(uint8_t data);
void DS18B20_Start(void);
short DS18B20_Get_Temperature(void);
#endif // DS18B20_H #endif // DS18B20_H
#ifndef ONEWIRE_H
#define ONEWIRE_H
#include "stm32f10x.h"
// 引脚定义
#define ONEWIRE_PIN (1 << 12) // PD12
#define ONEWIRE_PORT GPIOD
// 初始化 One-Wire 总线 (PE1)
void Onewire_Init(void);
// 设置引脚为输出模式
void Onewire_Pin_Output(void);
// 设置引脚为输入模式
void Onewire_Pin_Input(void);
// 复位 One-Wire 总线并检测传感器是否存在
uint8_t Onewire_Reset(void);
// 向 One-Wire 设备发送一位数据
void Onewire_SendBit(unsigned char Bit);
// 从 One-Wire 设备接收一位数据
unsigned char Onewire_ReceiveBit(void);
// 向 One-Wire 设备发送一个字节数据
void Onewire_SendByte(unsigned char Byte);
// 从 One-Wire 设备接收一个字节数据
unsigned char Onewire_ReceiveByte(void);
#endif // ONEWIRE_H
...@@ -3,26 +3,25 @@ ...@@ -3,26 +3,25 @@
#include "stm32f10x.h" // 包含STM32F103的寄存器定义头文件 #include "stm32f10x.h" // 包含STM32F103的寄存器定义头文件
#define CALCULATE_DISTANCE(pulse_time) ((pulse_time) * 0.017f)
// 全局变量 // 全局变量
extern volatile uint32_t pulse_time ; // 脉宽时间 extern volatile uint32_t pulse_time ; // 脉宽时间
extern volatile double distance_cm ; // 距离 extern volatile float distance_cm ; // 距离
extern volatile uint8_t capture_state ; // 捕获状态标志 extern volatile uint8_t capture_state ; // 捕获状态标志
// 动态配置 PE0 - PE15 引脚 // 动态配置 PE0 - PE15 引脚
void Configure_PE_Pin(uint8_t pin, uint8_t mode); void Configure_PE_Pin(uint8_t pin, uint8_t mode);
void WaitForEdgeAndCalculatePulseWidth(void);
// 初始化 TIM2 为捕获模式 // 初始化 TIM2 为捕获模式
void TIM2_Capture_Init(void); void TIM2_Capture_Init(void);
// 发送触发信号 // 发送触发信号
void SendTriggerSignal(void); void SendTriggerSignal(uint8_t pin);
double CalculateDistance();
void Parking_Sensor_Interruption(void); void Parking_Sensor_Interruption(void);
......
// ds18b20.h
#ifndef TEMPERATURE_SENSOR_H
#define TEMPERATURE_SENSOR_H
void TemperatureSensor_ConvertT(void); // 启动温度转换
float TemperatureSensor_ReadT(void); // 读取温度数据
#endif
...@@ -15,4 +15,6 @@ void Serial_Write(char ch); ...@@ -15,4 +15,6 @@ void Serial_Write(char ch);
// 打印格式化字符串 // 打印格式化字符串
void Serial_Printf(const char *format, ...); void Serial_Printf(const char *format, ...);
void Serial_PrintFloat(float num);
#endif // UART_LOG_H #endif // UART_LOG_H
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
#include "emergency_stop.h" #include "emergency_stop.h"
#include "uart_log.h" #include "uart_log.h"
void Delay(uint32_t time, char unit) { void Delay(uint32_t time, char unit) {
uint32_t cycles = 0; uint32_t cycles = 0;
...@@ -39,6 +40,7 @@ void Delay(uint32_t time, char unit) { ...@@ -39,6 +40,7 @@ void Delay(uint32_t time, char unit) {
void Total_GPIO_Init(void) { void Total_GPIO_Init(void) {
//RCC->APB2ENR |= 1 << 0;
//电机配置01 //电机配置01
// 使能 GPIOC 和 GPIOF 的时钟 // 使能 GPIOC 和 GPIOF 的时钟
RCC->APB2ENR |= RCC_APB2ENR_IOPCEN; RCC->APB2ENR |= RCC_APB2ENR_IOPCEN;
...@@ -115,14 +117,16 @@ void Total_GPIO_Init(void) { ...@@ -115,14 +117,16 @@ void Total_GPIO_Init(void) {
//倒车雷达 //倒车雷达
// 配置PE10-PE15为推挽输出,默认为低电平 // 配置PE10-PE15为推挽输出,默认为低电平
GPIOE->CRH &= ~(0xFFFFF << 8); // 清空PE10-PE15配置 //GPIOE->CRH &= ~(0xFFFFF << 8); // 清空PE10-PE15配置
GPIOE->CRH |= 0x11111 << 8; // 设置PE10-PE15为推挽输出 //GPIOE->CRH |= 0x11111 << 8; // 设置PE10-PE15为推挽输出
GPIOE->BRR = 0xFC00; // 默认低电平(PE10到PE15) //GPIOE->BRR = 0xFC00; // 默认低电平(PE10到PE15)
// 配置 PD14 为上拉输入模式 // 配置 PD14 为上拉输入模式
GPIOD->CRH &= ~(0xF << 24); // 清空 PD14 的配置 GPIOD->CRH &= ~(0xF << 24); // 清空 PD14 的配置
GPIOD->CRH |= (0x4 << 24); // 设置为上拉/下拉输入模式 GPIOD->CRH |= (0x4 << 24); // 设置为输入模式,并且配置为下拉模式
//GPIOD->ODR &= ~(1 << 14); // 配置 PD14 为下拉
//行走距离开关 distance_switch //行走距离开关 distance_switch
...@@ -162,21 +166,18 @@ void Total_GPIO_Init(void) { ...@@ -162,21 +166,18 @@ void Total_GPIO_Init(void) {
void Total_EXTI_Init(void) { void Total_EXTI_Init(void) {
// 设置优先级组为组2 (2位抢占优先级 + 2位子优先级) // 设置优先级组为组2 (2位抢占优先级 + 2位子优先级)
//SCB->AIRCR = (0x05FA << 16) | (2 << 8); // 设置优先级分组 SCB->AIRCR = (0x05FA << 16) | (2 << 8); // 设置优先级分组
// 倒车雷达中断 // 倒车雷达中断
AFIO->EXTICR[3] &= ~AFIO_EXTICR4_EXTI14; // 清除EXTI14 AFIO->EXTICR[3] &= ~AFIO_EXTICR4_EXTI14; // 清除EXTI14
AFIO->EXTICR[3] |= AFIO_EXTICR4_EXTI14_PD; // 将PD14连接到EXTI14 AFIO->EXTICR[3] |= AFIO_EXTICR4_EXTI14_PD; // 将PD14连接到EXTI14
EXTI->FTSR &= ~EXTI_FTSR_TR14; // 先清除下降沿触发配置
EXTI->RTSR &= ~EXTI_RTSR_TR14; // 先清除上升沿触发配置
EXTI->RTSR |= EXTI_RTSR_TR14; // 上升沿触发 EXTI->RTSR |= EXTI_RTSR_TR14; // 上升沿触发
EXTI->FTSR |= EXTI_RTSR_TR14; // 下降沿触发 EXTI->FTSR |= EXTI_FTSR_TR14; // 下降沿触发
EXTI->IMR |= EXTI_IMR_MR14; // 使能中断
EXTI->IMR |= EXTI_IMR_MR14; // 使能中断
NVIC_EnableIRQ(EXTI15_10_IRQn); NVIC_EnableIRQ(EXTI15_10_IRQn); // 注意:EXTI10-15 共享一个中断向量
NVIC_SetPriority(EXTI15_10_IRQn, 0x02); // 设置中断优先级 NVIC_SetPriority(EXTI15_10_IRQn, 0x06); // 设置中断优先级
// 行走距离开关中断 // 行走距离开关中断
AFIO->EXTICR[1] &= ~(AFIO_EXTICR2_EXTI6); // 清除EXTI6的配置 AFIO->EXTICR[1] &= ~(AFIO_EXTICR2_EXTI6); // 清除EXTI6的配置
...@@ -184,14 +185,14 @@ void Total_EXTI_Init(void) { ...@@ -184,14 +185,14 @@ void Total_EXTI_Init(void) {
AFIO->EXTICR[3] &= ~(AFIO_EXTICR4_EXTI15); // 清除EXTI15的配置 AFIO->EXTICR[3] &= ~(AFIO_EXTICR4_EXTI15); // 清除EXTI15的配置
AFIO->EXTICR[3] |= AFIO_EXTICR4_EXTI15_PG; // 连接PG15到EXTI15 AFIO->EXTICR[3] |= AFIO_EXTICR4_EXTI15_PG; // 连接PG15到EXTI15
EXTI->RTSR |= EXTI_RTSR_TR6 | EXTI_RTSR_TR15; // 配置上升沿触发 EXTI->RTSR |= EXTI_RTSR_TR6 | EXTI_RTSR_TR15; // 配置上升沿触发
EXTI->FTSR |= EXTI_FTSR_TR6 | EXTI_FTSR_TR15; // 配置下降沿触发 EXTI->FTSR |= EXTI_FTSR_TR6 | EXTI_FTSR_TR15; // 配置下降沿触发
EXTI->IMR |= EXTI_IMR_MR6 | EXTI_IMR_MR15; // 使能中断线6和15 EXTI->IMR |= EXTI_IMR_MR6 | EXTI_IMR_MR15; // 使能中断线6和15
// 使能EXTI9_5_IRQn中断 // 使能EXTI9_5_IRQn中断
//NVIC_EnableIRQ(EXTI9_5_IRQn); // PD6 属于 EXTI9_5_IRQn //NVIC_EnableIRQ(EXTI9_5_IRQn); // PD6 属于 EXTI9_5_IRQn
NVIC_SetPriority(EXTI9_5_IRQn, 0x0B); // 设置中断优先级 //NVIC_SetPriority(EXTI9_5_IRQn, 0x0B); // 设置中断优先级
// 使能EXTI15_10_IRQn中断 // 使能EXTI15_10_IRQn中断
//NVIC_EnableIRQ(EXTI15_10_IRQn); // EXTI15 属于 EXTI15_10_IRQn //NVIC_EnableIRQ(EXTI15_10_IRQn); // EXTI15 属于 EXTI15_10_IRQn
...@@ -206,7 +207,7 @@ void Total_EXTI_Init(void) { ...@@ -206,7 +207,7 @@ void Total_EXTI_Init(void) {
AFIO->EXTICR[0] |= AFIO_EXTICR1_EXTI0_PE; // 连接PE0到EXTI0 AFIO->EXTICR[0] |= AFIO_EXTICR1_EXTI0_PE; // 连接PE0到EXTI0
EXTI->RTSR |= EXTI_RTSR_TR9 | EXTI_RTSR_TR0; // 配置上升沿触发 EXTI->RTSR |= EXTI_RTSR_TR9 | EXTI_RTSR_TR0; // 配置上升沿触发
EXTI->FTSR |= EXTI_FTSR_TR9 | EXTI_FTSR_TR0; // 配置下降沿触发 EXTI->FTSR |= EXTI_FTSR_TR9 | EXTI_FTSR_TR0; // 配置下降沿触发
EXTI->IMR |= EXTI_IMR_MR9 | EXTI_IMR_MR0; // 使能中断线9和0 EXTI->IMR |= EXTI_IMR_MR9 | EXTI_IMR_MR0; // 使能中断线9和0
// 使能EXTI9_5_IRQn中断 // 使能EXTI9_5_IRQn中断
...@@ -266,13 +267,13 @@ void EXTI9_5_IRQHandler(void) { ...@@ -266,13 +267,13 @@ void EXTI9_5_IRQHandler(void) {
// 处理 PD6 中断 // 处理 PD6 中断
StateMachineHandler(STATE_DISTANCE_SWITCH_ACTIVE); StateMachineHandler(STATE_DISTANCE_SWITCH_ACTIVE);
// 清除中断标志位 // 清除中断标志位
EXTI->PR = EXTI_PR_PR6; EXTI->PR |= EXTI_PR_PR6;
} }
if (EXTI->PR & EXTI_PR_PR9) { // 检查是否是 EXTI 线 9 触发了中断 if (EXTI->PR & EXTI_PR_PR9) { // 检查是否是 EXTI 线 9 触发了中断
// 处理 PB9 中断 // 处理 PB9 中断
StateMachineHandler(STATE_PHOTOELECTRIC_SWITCH_ACTIVE); StateMachineHandler(STATE_PHOTOELECTRIC_SWITCH_ACTIVE);
// 清除中断标志位 // 清除中断标志位
EXTI->PR = EXTI_PR_PR9; EXTI->PR |= EXTI_PR_PR9;
} }
} }
...@@ -282,7 +283,7 @@ void EXTI0_IRQHandler(void) { ...@@ -282,7 +283,7 @@ void EXTI0_IRQHandler(void) {
// 处理PE0中断 // 处理PE0中断
StateMachineHandler(STATE_PHOTOELECTRIC_SWITCH_ACTIVE); StateMachineHandler(STATE_PHOTOELECTRIC_SWITCH_ACTIVE);
// 清除中断标志位 // 清除中断标志位
EXTI->PR = EXTI_PR_PR0; EXTI->PR |= EXTI_PR_PR0;
} }
} }
...@@ -292,13 +293,14 @@ void EXTI0_IRQHandler(void) { ...@@ -292,13 +293,14 @@ void EXTI0_IRQHandler(void) {
void EXTI15_10_IRQHandler(void) { void EXTI15_10_IRQHandler(void) {
// 处理 PD14 中断 // 处理 PD14 中断
if (EXTI->PR & EXTI_PR_PR14) { // 检查是否是EXTI线14触发了中断 if (EXTI->PR & EXTI_PR_PR14) { // 检查是否是EXTI线14触发了中断
StateMachineHandler(STATE_PARKING_SENSOR_ACTIVE); StateMachineHandler(STATE_PARKING_SENSOR_ACTIVE);
EXTI->PR = EXTI_PR_PR14; // 清除中断标志位 //EXTI->PR |= EXTI_PR_PR14; // 清除中断标志位
} }
if (EXTI->PR & EXTI_PR_PR15) { // 检查是否是EXTI线15触发了中断 if (EXTI->PR & EXTI_PR_PR15) { // 检查是否是EXTI线15触发了中断
Serial_Print("EXTI15 triggered\n"); Serial_Print("EXTI15 triggered\n");
StateMachineHandler(STATE_DISTANCE_SWITCH_ACTIVE); StateMachineHandler(STATE_DISTANCE_SWITCH_ACTIVE);
EXTI->PR = EXTI_PR_PR15; // 清除中断标志位 EXTI->PR |= EXTI_PR_PR15; // 清除中断标志位
} }
} }
...@@ -308,6 +310,40 @@ void EXTI2_IRQHandler(void) { ...@@ -308,6 +310,40 @@ void EXTI2_IRQHandler(void) {
// 处理PE2中断(急停按钮) // 处理PE2中断(急停按钮)
StateMachineHandler(STATE_EMERGENCY_STOP); StateMachineHandler(STATE_EMERGENCY_STOP);
// 清除中断标志位 // 清除中断标志位
EXTI->PR = EXTI_PR_PR2; EXTI->PR |= EXTI_PR_PR2;
} }
} }
void TIM7_Init(void) {
// 使能TIM7时钟
RCC->APB1ENR |= RCC_APB1ENR_TIM7EN;
// 设定预分频器,让定时器的时钟为1MHz(假设系统时钟为16MHz)
// 16MHz / 16 = 1MHz
TIM7->PSC = 71;
// 自动重装载值(最大值)
TIM7->ARR = 0xFFFF;
// 计数器从0开始
TIM7->CNT = 0;
// 不启动定时器(启动时可以调用`TIM7->CR1 |= TIM_CR1_CEN;`)
}
void delay_us(uint16_t us)
{
uint16_t differ = 0xFFFF - us - 5;
TIM7->CNT = differ;
// 使能定时器
TIM7->CR1 |= TIM_CR1_CEN;
while (TIM7->CNT < 0xFFFF - 5)
{
// 等待计数器达到目标值
}
// 停止定时器
TIM7->CR1 &= ~TIM_CR1_CEN;
}
...@@ -39,6 +39,7 @@ void Delay(uint32_t time, char unit) { ...@@ -39,6 +39,7 @@ void Delay(uint32_t time, char unit) {
void Total_GPIO_Init(void) { void Total_GPIO_Init(void) {
//RCC->APB2ENR |= 1 << 0;
//电机配置01 //电机配置01
// 使能 GPIOC 和 GPIOF 的时钟 // 使能 GPIOC 和 GPIOF 的时钟
RCC->APB2ENR |= RCC_APB2ENR_IOPCEN; RCC->APB2ENR |= RCC_APB2ENR_IOPCEN;
...@@ -106,11 +107,11 @@ void Total_GPIO_Init(void) { ...@@ -106,11 +107,11 @@ void Total_GPIO_Init(void) {
GPIOG->CRL |= (0x3 << (4*1)); // 配置 PG1 为通用推挽输出 GPIOG->CRL |= (0x3 << (4*1)); // 配置 PG1 为通用推挽输出
// 配置 PE7, PE8 为复用推挽输出 (50 MHz) // 配置 PE7, PE8 为复用推挽输出 (50 MHz)
GPIOE->CRH &= ~(0xF << (4*1)); // 清空 PE7 配置 (位20-23) GPIOE->CRL &= ~(0xF << (4*7)); // 清空 PE7 配置 (位20-23)
GPIOE->CRH |= (0x3 << (4*1)); // 配置 PE7 为通用推挽输出 GPIOE->CRL |= (0x3 << (4*7)); // 配置 PE7 为通用推挽输出
GPIOE->CRH &= ~(0xF << (4*2)); // 清空 PE8 配置 (位24-27) GPIOE->CRH &= ~(0xF << (4*0)); // 清空 PE8 配置 (位24-27)
GPIOE->CRH |= (0x3 << (4*2)); // 配置 PE8 为通用推挽输出 GPIOE->CRH |= (0x3 << (4*0)); // 配置 PE8 为通用推挽输出
//倒车雷达 //倒车雷达
...@@ -120,8 +121,9 @@ void Total_GPIO_Init(void) { ...@@ -120,8 +121,9 @@ void Total_GPIO_Init(void) {
GPIOE->BRR = 0xFC00; // 默认低电平(PE10到PE15) GPIOE->BRR = 0xFC00; // 默认低电平(PE10到PE15)
// 配置 PD14 为上拉输入模式 // 配置 PD14 为上拉输入模式
GPIOD->CRH &= ~(0xF << 24); // 清空 PD14 的配置 GPIOD->CRH &= ~(0xF << 24); // 清空 PD14 的配置
GPIOD->CRH |= (0x4 << 24); // 设置为上拉/下拉输入模式 GPIOD->CRH |= (0x8 << 24); // 设置为输入模式,并且配置为下拉模式
GPIOD->ODR &= ~(1 << 14); // 配置 PD14 为下拉
//行走距离开关 distance_switch //行走距离开关 distance_switch
...@@ -153,7 +155,7 @@ void Total_GPIO_Init(void) { ...@@ -153,7 +155,7 @@ void Total_GPIO_Init(void) {
// 配置 PE2 为输入上拉 // 配置 PE2 为输入上拉
GPIOE->CRL &= ~(0xF << (2 * 4)); // 清除 PE2 配置位 GPIOE->CRL &= ~(0xF << (2 * 4)); // 清除 PE2 配置位
GPIOE->CRL |= (0x8 << (2 * 4)); // 配置 PE2 为上拉输入模式 GPIOE->CRL |= (0x8 << (2 * 4)); // 配置 PE2 为上拉输入模式
GPIOE->ODR |= (1 << 2); GPIOE->ODR |= (1 << 2);
//蜂鸣器 buzzer //蜂鸣器 buzzer
GPIOE->CRH &= ~(0xF << (4 * 1)); GPIOE->CRH &= ~(0xF << (4 * 1));
...@@ -167,16 +169,13 @@ void Total_EXTI_Init(void) { ...@@ -167,16 +169,13 @@ void Total_EXTI_Init(void) {
// 倒车雷达中断 // 倒车雷达中断
AFIO->EXTICR[3] &= ~AFIO_EXTICR4_EXTI14; // 清除EXTI14 AFIO->EXTICR[3] &= ~AFIO_EXTICR4_EXTI14; // 清除EXTI14
AFIO->EXTICR[3] |= AFIO_EXTICR4_EXTI14_PD; // 将PD14连接到EXTI14 AFIO->EXTICR[3] |= AFIO_EXTICR4_EXTI14_PD; // 将PD14连接到EXTI14
EXTI->IMR |= EXTI_IMR_MR14; // 使能中断
EXTI->FTSR &= ~EXTI_FTSR_TR14; // 先清除下降沿触发配置
EXTI->RTSR &= ~EXTI_RTSR_TR14; // 先清除上升沿触发配置
EXTI->RTSR |= EXTI_RTSR_TR14; // 上升沿触发 EXTI->RTSR |= EXTI_RTSR_TR14; // 上升沿触发
EXTI->FTSR |= EXTI_RTSR_TR14; // 下降沿触发 EXTI->FTSR |= EXTI_FTSR_TR14; // 下降沿触发
EXTI->IMR |= EXTI_IMR_MR14; // 使能中断
NVIC_EnableIRQ(EXTI15_10_IRQn);
NVIC_SetPriority(EXTI15_10_IRQn, 0x05); // 设置中断优先级 NVIC_EnableIRQ(EXTI15_10_IRQn); // 注意:EXTI10-15 共享一个中断向量
NVIC_SetPriority(EXTI15_10_IRQn, 0x06); // 设置中断优先级
// 行走距离开关中断 // 行走距离开关中断
AFIO->EXTICR[1] &= ~(AFIO_EXTICR2_EXTI6); // 清除EXTI6的配置 AFIO->EXTICR[1] &= ~(AFIO_EXTICR2_EXTI6); // 清除EXTI6的配置
...@@ -184,17 +183,18 @@ EXTI->RTSR &= ~EXTI_RTSR_TR14; // 先清除上升沿触发配置 ...@@ -184,17 +183,18 @@ EXTI->RTSR &= ~EXTI_RTSR_TR14; // 先清除上升沿触发配置
AFIO->EXTICR[3] &= ~(AFIO_EXTICR4_EXTI15); // 清除EXTI15的配置 AFIO->EXTICR[3] &= ~(AFIO_EXTICR4_EXTI15); // 清除EXTI15的配置
AFIO->EXTICR[3] |= AFIO_EXTICR4_EXTI15_PG; // 连接PG15到EXTI15 AFIO->EXTICR[3] |= AFIO_EXTICR4_EXTI15_PG; // 连接PG15到EXTI15
EXTI->IMR |= EXTI_IMR_MR6 | EXTI_IMR_MR15; // 使能中断线6和15
EXTI->RTSR |= EXTI_RTSR_TR6 | EXTI_RTSR_TR15; // 配置上升沿触发 EXTI->RTSR |= EXTI_RTSR_TR6 | EXTI_RTSR_TR15; // 配置上升沿触发
EXTI->FTSR |= EXTI_FTSR_TR6 | EXTI_FTSR_TR15; // 配置下降沿触发 EXTI->FTSR |= EXTI_FTSR_TR6 | EXTI_FTSR_TR15; // 配置下降沿触发
EXTI->IMR |= EXTI_IMR_MR6 | EXTI_IMR_MR15; // 使能中断线6和15
// 使能EXTI9_5_IRQn中断 // 使能EXTI9_5_IRQn中断
NVIC_EnableIRQ(EXTI9_5_IRQn); // PD6 属于 EXTI9_5_IRQn //NVIC_EnableIRQ(EXTI9_5_IRQn); // PD6 属于 EXTI9_5_IRQn
NVIC_SetPriority(EXTI9_5_IRQn, 0x0B); // 设置中断优先级 //NVIC_SetPriority(EXTI9_5_IRQn, 0x0B); // 设置中断优先级
// 使能EXTI15_10_IRQn中断 // 使能EXTI15_10_IRQn中断
NVIC_EnableIRQ(EXTI15_10_IRQn); // EXTI15 属于 EXTI15_10_IRQn //NVIC_EnableIRQ(EXTI15_10_IRQn); // EXTI15 属于 EXTI15_10_IRQn
NVIC_SetPriority(EXTI15_10_IRQn, 0x06); // 设置中断优先级 //NVIC_SetPriority(EXTI15_10_IRQn, 0x06); // 设置中断优先级
...@@ -203,9 +203,10 @@ EXTI->RTSR &= ~EXTI_RTSR_TR14; // 先清除上升沿触发配置 ...@@ -203,9 +203,10 @@ EXTI->RTSR &= ~EXTI_RTSR_TR14; // 先清除上升沿触发配置
AFIO->EXTICR[2] |= AFIO_EXTICR3_EXTI9_PB; // 连接PB9到EXTI9 AFIO->EXTICR[2] |= AFIO_EXTICR3_EXTI9_PB; // 连接PB9到EXTI9
AFIO->EXTICR[0] &= ~(AFIO_EXTICR1_EXTI0); // 清除EXTI0的配置 AFIO->EXTICR[0] &= ~(AFIO_EXTICR1_EXTI0); // 清除EXTI0的配置
AFIO->EXTICR[0] |= AFIO_EXTICR1_EXTI0_PE; // 连接PE0到EXTI0 AFIO->EXTICR[0] |= AFIO_EXTICR1_EXTI0_PE; // 连接PE0到EXTI0
EXTI->IMR |= EXTI_IMR_MR9 | EXTI_IMR_MR0; // 使能中断线9和0
EXTI->RTSR |= EXTI_RTSR_TR9 | EXTI_RTSR_TR0; // 配置上升沿触发 EXTI->RTSR |= EXTI_RTSR_TR9 | EXTI_RTSR_TR0; // 配置上升沿触发
EXTI->FTSR |= EXTI_FTSR_TR9 | EXTI_FTSR_TR0; // 配置下降沿触发 EXTI->FTSR |= EXTI_FTSR_TR9 | EXTI_FTSR_TR0; // 配置下降沿触发
EXTI->IMR |= EXTI_IMR_MR9 | EXTI_IMR_MR0; // 使能中断线9和0
// 使能EXTI9_5_IRQn中断 // 使能EXTI9_5_IRQn中断
NVIC_EnableIRQ(EXTI9_5_IRQn); // PB9 属于 EXTI9_5 中断 NVIC_EnableIRQ(EXTI9_5_IRQn); // PB9 属于 EXTI9_5 中断
...@@ -290,8 +291,8 @@ void EXTI0_IRQHandler(void) { ...@@ -290,8 +291,8 @@ void EXTI0_IRQHandler(void) {
void EXTI15_10_IRQHandler(void) { void EXTI15_10_IRQHandler(void) {
// 处理 PD14 中断 // 处理 PD14 中断
if (EXTI->PR & EXTI_PR_PR14) { // 检查是否是EXTI线14触发了中断 if (EXTI->PR & EXTI_PR_PR14) { // 检查是否是EXTI线14触发了中断
EXTI->PR = EXTI_PR_PR14; // 清除中断标志位
StateMachineHandler(STATE_PARKING_SENSOR_ACTIVE); StateMachineHandler(STATE_PARKING_SENSOR_ACTIVE);
EXTI->PR = EXTI_PR_PR14; // 清除中断标志位
} }
if (EXTI->PR & EXTI_PR_PR15) { // 检查是否是EXTI线15触发了中断 if (EXTI->PR & EXTI_PR_PR15) { // 检查是否是EXTI线15触发了中断
Serial_Print("EXTI15 triggered\n"); Serial_Print("EXTI15 triggered\n");
......
...@@ -12,7 +12,7 @@ void Distance_Switch_Interruption(void) { ...@@ -12,7 +12,7 @@ void Distance_Switch_Interruption(void) {
Serial_Print("PG15: 远离 (NPN传感器 - 低电平)\n"); Serial_Print("PG15: 远离 (NPN传感器 - 低电平)\n");
} }
// 清除中断标志位 // 清除中断标志位
EXTI->PR = EXTI_PR_PR15; //EXTI->PR = EXTI_PR_PR15;
} }
// 检查是否是PD6触发的中断 // 检查是否是PD6触发的中断
...@@ -23,6 +23,6 @@ void Distance_Switch_Interruption(void) { ...@@ -23,6 +23,6 @@ void Distance_Switch_Interruption(void) {
Serial_Print("PD6: 远离 (PNP传感器 - 低电平)\n"); Serial_Print("PD6: 远离 (PNP传感器 - 低电平)\n");
} }
// 清除中断标志位 // 清除中断标志位
EXTI->PR = EXTI_PR_PR6; //EXTI->PR = EXTI_PR_PR6;
} }
} }
#include "ds18b20.h" #include "ds18b20.h"
#include "common.h" #include "common.h"
/******************************************************************
* 函 数 名 称:bsp_ds18b20_Init
* 函 数 说 明:MLX90614的初始化
* 函 数 形 参:无 void DS18B20_IO_IN(void)
* 函 数 返 回:1未检测到器件 0检测到器件
* 作 者:LC
* 备 注:无
******************************************************************/
char DS18B20_Init(void)
{ {
int ret = DS18B20_Check();//检测器件是否存在 DQ_IN(); // 设置为上拉输入模式
return ret;
} }
void DS18B20_IO_OUT(void)
{
GPIOD->CRH &= ~(0xF << 16); // 清除配置位
GPIOD->CRH |= (0x3 << 16); // 设置为推挽输出模式
}
/****************************************************************** void DS18B20_Rst(void)
* 函 数 名 称:DS18B20_Read_Byte
* 函 数 说 明:从DS18B20读取一个字节
* 函 数 形 参:无
* 函 数 返 回:读取到的字节数据
* 作 者:LC
* 备 注:无
******************************************************************/
uint8_t DS18B20_Read_Byte(void)
{ {
uint8_t i=0,dat=0; DS18B20_IO_OUT();
DS18B20_DQ_OUT_LOW; // 拉低DQ
delay_us(750); // 延时750微秒
DS18B20_DQ_OUT_HIGH; // 释放DQ
delay_us(15); // 延时15微秒
}
for (i=0; i<8; i++) uint8_t DS18B20_Check(void)
{
uint8_t retry = 0;
DS18B20_IO_IN();
while (DS18B20_DQ_IN && retry < 200) // 等待DS18B20拉低电平
{ {
DQ_OUT();//设置为输入模式 retry++;
DQ(0); //拉低 delay_us(1);
}
Delay(2, 'u'); if (retry >= 200)
DQ(1); //释放总线 return 1;
DQ_IN();//设置为输入模式 else
Delay(12, 'u'); retry = 0;
dat>>=1; while (!DS18B20_DQ_IN && retry < 240)
if( DQ_GET() ) {
{ retry++;
dat=dat|0x80; delay_us(1);
}
Delay(50, 'u');
} }
return dat; if (retry >= 240)
return 1;
return 0;
} }
/****************************************************************** uint8_t DS18B20_Read_Bit(void)
* 函 数 名 称:DS18B20_Write_Byte
* 函 数 说 明:写一个字节到DS18B20
* 函 数 形 参:dat:要写入的字节
* 函 数 返 回:无
* 作 者:LC
* 备 注:无
******************************************************************/
void DS18B20_Write_Byte(uint8_t dat)
{ {
uint8_t i; uint8_t data;
DQ_OUT();//设置输出模式 DS18B20_IO_OUT();
for (i=0; i<8; i++) DS18B20_DQ_OUT_LOW;
{ delay_us(2);
if ( (dat&0x01) ) //写1
{
DQ(0);
Delay(2, 'u');
DQ(1);
Delay(60, 'u');
} DS18B20_DQ_OUT_HIGH;
else //写0 DS18B20_IO_IN();
{ delay_us(12);
DQ(0);//拉低60us
Delay(60, 'u');
DQ(1);//释放总线 if (DS18B20_DQ_IN)
Delay(2, 'u'); data = 1;
else
data = 0;
} delay_us(50);
dat=dat>>1;//传输下一位 return data;
}
} }
uint8_t DS18B20_Read_Byte(void)
/******************************************************************
* 函 数 名 称:DS18B20_Check
* 函 数 说 明:检测DS18B20是否存在
* 函 数 形 参:无
* 函 数 返 回:1:未检测到DS18B20的存在 0:存在
* 作 者:LC
* 备 注:无
******************************************************************/
uint8_t DS18B20_Check(void)
{ {
uint8_t timeout=0; uint8_t i, j, data;
//复位DS18B20 data = 0;
DQ_OUT(); //设置为输出模式 for (i = 1; i <= 8; i++)
DQ(0); //拉低DQ {
Delay(750, 'u'); j = DS18B20_Read_Bit();
data = (j << 7) | (data >> 1);
}
return data;
}
DQ(1); //拉高DQ
Delay(15, 'u');
//设置为输入模式 void DS18B20_Write_Byte(uint8_t data)
DQ_IN(); {
//等待拉低,拉低说明有应答 uint8_t j;
while ( DQ_GET() &&timeout<200) uint8_t testb;
DS18B20_IO_OUT(); // 输出模式
for (j = 1; j <= 8; j++)
{ {
timeout++;//超时判断 testb = data & 0x01;
Delay(1, 'u'); data = data >> 1;
if (testb)
{
DS18B20_DQ_OUT_LOW; // 拉低至少1微秒
delay_us(2);
}; DS18B20_DQ_OUT_HIGH;
//设备未应答 delay_us(60);
if(timeout>=200)
return 1;
else
timeout=0;
//等待18B20释放总线 }
while ( !DQ_GET() &&timeout<240) else
{ {
timeout++;//超时判断 DS18B20_DQ_OUT_LOW; // 写0 至少拉低60微秒
Delay(1, 'u'); delay_us(60);
}; DS18B20_DQ_OUT_HIGH; // 释放总线 至少1微秒
//释放总线失败 delay_us(2);
if(timeout>=240)
return 1;
return 0; }
}
} }
/******************************************************************
* 函 数 名 称:DS18B20_Start
* 函 数 说 明:DS18B20开始温度转换
* 函 数 形 参:无
* 函 数 返 回:无
* 作 者:LC
* 备 注:无
******************************************************************/
void DS18B20_Start(void) void DS18B20_Start(void)
{ {
DS18B20_Check(); //查询是否有设备应答 DS18B20_Rst();
DS18B20_Write_Byte(0xcc); //对总线上所有设备进行寻址 DS18B20_Check();
DS18B20_Write_Byte(0x44); //启动温度转换 DS18B20_Write_Byte(0xCC);
DS18B20_Write_Byte(0x44);
}
uint8_t DS18B20_Init(void)
{
DS18B20_Rst();
return DS18B20_Check();
} }
/******************************************************************
* 函 数 名 称:DS18B20_GetTemperture short DS18B20_Get_Temperature(void)
* 函 数 说 明:从ds18b20得到温度值
* 函 数 形 参:无
* 函 数 返 回:温度数据
* 作 者:LC
* 备 注:无
******************************************************************/
float DS18B20_GetTemperture(void)
{ {
uint16_t temp; uint8_t TL, TH;
uint8_t dataL=0,dataH=0; short temperature;
float value;
DS18B20_Start(); DS18B20_Start();
DS18B20_Rst();
DS18B20_Check(); DS18B20_Check();
DS18B20_Write_Byte(0xcc);//对总线上所有设备进行寻址 DS18B20_Write_Byte(0xCC);
DS18B20_Write_Byte(0xbe);// 读取数据命令 DS18B20_Write_Byte(0xBE);
dataL=DS18B20_Read_Byte(); //LSB TL = DS18B20_Read_Byte();
dataH=DS18B20_Read_Byte(); //MSB TH = DS18B20_Read_Byte();
temp=(dataH<<8)+dataL;//整合数据
if (TH > 7)
if(dataH&0X80)//高位为1,说明是负温度
{ {
temp=(~temp)+1; TH = ~TH;
value=temp*(-0.0625); TL = ~TL;
temperature = -1;
} }
else else
{ temperature = 1;
value=temp*0.0625;
} temperature = (TH << 8) | TL;
return value; temperature = (float)temperature * 0.625;
return temperature;
} }
#include "ds18b20.h" #include "ds18b20.h"
#include "common.h" #include "common.h"
/******************************************************************
* 函 数 名 称:bsp_ds18b20_Init
* 函 数 说 明:MLX90614的初始化
* 函 数 形 参:无 void DS18B20_IO_IN(void)
* 函 数 返 回:1未检测到器件 0检测到器件
* 作 者:LC
* 备 注:无
******************************************************************/
char DS18B20_Init(void)
{ {
int ret = DS18B20_Check();//检测器件是否存在 DQ_IN(); // 设置为上拉输入模式
return ret;
} }
void DS18B20_IO_OUT(void)
/****************************************************************** {
* 函 数 名 称:DS18B20_Read_Byte GPIOD->CRH &= ~(0xF << 16); // 清除配置位
* 函 数 说 明:从DS18B20读取一个字节 GPIOD->CRH |= (0x3 << 16); // 设置为推挽输出模式
* 函 数 形 参:无
* 函 数 返 回:读取到的字节数据
* 作 者:LC
* 备 注:无
******************************************************************/
uint8_t DS18B20_Read_Byte(void)
{
uint8_t i=0,dat=0;
for (i=0;i<8;i++)
{
DQ_OUT();//设置为输入模式
DQ(0); //拉低
Delay(2, 'u');
DQ(1); //释放总线
DQ_IN();//设置为输入模式
Delay(12, 'u');
dat>>=1;
if( DQ_GET() )
{
dat=dat|0x80;
}
Delay(50, 'u');
}
return dat;
} }
/******************************************************************
* 函 数 名 称:DS18B20_Write_Byte
* 函 数 说 明:写一个字节到DS18B20 void DS18B20_Rst(void)
* 函 数 形 参:dat:要写入的字节 {
* 函 数 返 回:无 DS18B20_IO_OUT();
* 作 者:LC DS18B20_DQ_OUT_LOW; // 拉低DQ
* 备 注:无 Delay(750, 'u'); // 延时750微秒
******************************************************************/ DS18B20_DQ_OUT_HIGH; // 释放DQ
void DS18B20_Write_Byte(uint8_t dat) Delay(15, 'u'); // 延时15微秒
{
uint8_t i;
DQ_OUT();//设置输出模式
for (i=0;i<8;i++)
{
if ( (dat&0x01) ) //写1
{
DQ(0);
Delay(2, 'u');
DQ(1);
Delay(60, 'u');
}
else //写0
{
DQ(0);//拉低60us
Delay(60, 'u');
DQ(1);//释放总线
Delay(2, 'u');
}
dat=dat>>1;//传输下一位
}
} }
uint8_t DS18B20_Check(void)
{
uint8_t retry = 0;
DS18B20_IO_IN();
while (DS18B20_DQ_IN && retry < 200) // 等待DS18B20拉低电平
{
retry++;
Delay(1,'u');
}
if (retry >= 200)
return 1;
else
retry = 0;
while (!DS18B20_DQ_IN && retry < 240)
/****************************************************************** {
* 函 数 名 称:DS18B20_Check retry++;
* 函 数 说 明:检测DS18B20是否存在 Delay(1,'u');
* 函 数 形 参:无 }
* 函 数 返 回:1:未检测到DS18B20的存在 0:存在 if (retry >= 240)
* 作 者:LC return 1;
* 备 注:无
******************************************************************/ return 0;
uint8_t DS18B20_Check(void)
{
uint8_t timeout=0;
//复位DS18B20
DQ_OUT(); //设置为输出模式
DQ(0); //拉低DQ
Delay(750, 'u');
DQ(1); //拉高DQ
Delay(15, 'u');
//设置为输入模式
DQ_IN();
//等待拉低,拉低说明有应答
while ( DQ_GET() &&timeout<200)
{
timeout++;//超时判断
Delay(1, 'u');
};
//设备未应答
if(timeout>=200)
return 1;
else
timeout=0;
//等待18B20释放总线
while ( !DQ_GET() &&timeout<240)
{
timeout++;//超时判断
Delay(1, 'u');
};
//释放总线失败
if(timeout>=240)
return 1;
return 0;
} }
/****************************************************************** uint8_t DS18B20_Read_Bit(void)
* 函 数 名 称:DS18B20_Start {
* 函 数 说 明:DS18B20开始温度转换 uint8_t data;
* 函 数 形 参:无 DS18B20_IO_OUT();
* 函 数 返 回:无 DS18B20_DQ_OUT_LOW;
* 作 者:LC Delay(2,'u');
* 备 注:无
******************************************************************/ DS18B20_DQ_OUT_HIGH;
void DS18B20_Start(void) DS18B20_IO_IN();
{ Delay(12,'u');
DS18B20_Check(); //查询是否有设备应答
DS18B20_Write_Byte(0xcc); //对总线上所有设备进行寻址 if (DS18B20_DQ_IN)
DS18B20_Write_Byte(0x44); //启动温度转换 data = 1;
} else
data = 0;
/******************************************************************
* 函 数 名 称:DS18B20_GetTemperture Delay(50,'u');
* 函 数 说 明:从ds18b20得到温度值 return data;
* 函 数 形 参:无 }
* 函 数 返 回:温度数据
* 作 者:LC
* 备 注:无 uint8_t DS18B20_Read_Byte(void)
******************************************************************/ {
float DS18B20_GetTemperture(void) uint8_t i, j, data;
data = 0;
for (i = 1; i <= 8; i++)
{
j = DS18B20_Read_Bit();
data = (j << 7) | (data >> 1);
}
return data;
}
void DS18B20_Write_Byte(uint8_t data)
{ {
uint16_t temp; uint8_t j;
uint8_t dataL=0,dataH=0; uint8_t testb;
float value; DS18B20_IO_OUT(); // 输出模式
for (j = 1; j <= 8; j++)
DS18B20_Start(); {
DS18B20_Check(); testb = data & 0x01;
DS18B20_Write_Byte(0xcc);//对总线上所有设备进行寻址 data = data >> 1;
DS18B20_Write_Byte(0xbe);// 读取数据命令 if (testb)
dataL=DS18B20_Read_Byte(); //LSB
dataH=DS18B20_Read_Byte(); //MSB
temp=(dataH<<8)+dataL;//整合数据
if(dataH&0X80)//高位为1,说明是负温度
{ {
temp=(~temp)+1; DS18B20_DQ_OUT_LOW; // 拉低至少1微秒
value=temp*(-0.0625); Delay(2,'u');
DS18B20_DQ_OUT_HIGH;
Delay(60,'u');
} }
else else
{ {
value=temp*0.0625; DS18B20_DQ_OUT_LOW; // 写0 至少拉低60微秒
Delay(60,'u');
DS18B20_DQ_OUT_HIGH; // 释放总线 至少1微秒
Delay(2,'u');
} }
return value; }
}
void DS18B20_Start(void)
{
DS18B20_Rst();
DS18B20_Check();
DS18B20_Write_Byte(0xCC);
DS18B20_Write_Byte(0x44);
}
uint8_t DS18B20_Init(void)
{
DS18B20_Rst();
return DS18B20_Check();
}
short DS18B20_Get_Temperature(void)
{
uint8_t TL, TH;
short temperature;
DS18B20_Start();
DS18B20_Rst();
DS18B20_Check();
DS18B20_Write_Byte(0xCC);
DS18B20_Write_Byte(0xBE);
TL = DS18B20_Read_Byte();
TH = DS18B20_Read_Byte();
if (TH > 7)
{
TH = ~TH;
TL = ~TL;
temperature = -1;
}
else
temperature = 1;
temperature = (TH << 8) | TL;
temperature = (float)temperature * 0.625;
return temperature;
} }
...@@ -12,7 +12,6 @@ void Emergency_Stop_Interrupt(void) { ...@@ -12,7 +12,6 @@ void Emergency_Stop_Interrupt(void) {
} else { // 检测PD14的下降沿 } else { // 检测PD14的下降沿
Serial_Print("PE2: 按下 (急停按钮 - 低电平)\n"); Serial_Print("PE2: 按下 (急停按钮 - 低电平)\n");
} }
// 清除中断标志位
EXTI->PR = EXTI_PR_PR2;
} }
} }
#include "onewire.h"
#include "common.h"
// 初始化 One-Wire 总线 (PD12)
void Onewire_Init(void) {
// 设置高电平
ONEWIRE_PORT->BSRR = ONEWIRE_PIN;
}
// 设置引脚为输出模式
void Onewire_Pin_Output(void) {
// 设置PD12为推挽输出模式
GPIOD->CRH &= ~(0xF << 16); // 清除PD12的配置
GPIOD->CRH |= (0x3 << 16); // 设置为推挽输出模式
}
// 设置引脚为输入模式
void Onewire_Pin_Input(void) {
// 设置PD12为浮空输入模式
GPIOD->CRH &= ~(0xF << 16); // 清除PD12的配置
GPIOD->CRH |= (0x4 << 16); // 设置为浮空输入模式
}
// 复位 One-Wire 总线并检测传感器是否存在
uint8_t Onewire_Reset(void) {
uint8_t response = 0;
// 拉低总线 480 微秒
Onewire_Pin_Output();
ONEWIRE_PORT->BRR = ONEWIRE_PIN; // 拉低
Delay(480, 'u');
// 释放总线,并等待响应
Onewire_Pin_Input();
Delay(60, 'u');
// 检测传感器响应
response = (ONEWIRE_PORT->IDR & ONEWIRE_PIN) ? 1 : 0;
// 等待 420 微秒
Delay(420, 'u');
return !response; // 返回响应信号,0 表示设备存在
}
// 向 One-Wire 设备发送一位数据
void Onewire_SendBit(unsigned char Bit) {
Onewire_Pin_Output(); // 设置为输出模式
if (Bit) {
ONEWIRE_PORT->BRR = ONEWIRE_PIN; // 拉低 1 微秒
Delay(1, 'u');
Onewire_Pin_Input(); // 释放总线
Delay(60, 'u'); // 保持高电平 60 微秒
} else {
ONEWIRE_PORT->BRR = ONEWIRE_PIN; // 拉低 60 微秒
Delay(60, 'u');
Onewire_Pin_Input(); // 释放总线
}
}
// 从 One-Wire 设备接收一位数据
unsigned char Onewire_ReceiveBit(void) {
unsigned char Bit = 0;
Onewire_Pin_Output(); // 设置为输出模式
ONEWIRE_PORT->BRR = ONEWIRE_PIN; // 拉低 1 微秒
Delay(1, 'u');
Onewire_Pin_Input(); // 释放总线
Delay(14, 'u');
// 读取数据
if (ONEWIRE_PORT->IDR & ONEWIRE_PIN) {
Bit = 1;
}
Delay(45, 'u'); // 等待剩余时间
return Bit;
}
// 向 One-Wire 设备发送一个字节数据
void Onewire_SendByte(unsigned char Byte) {
for (unsigned char i = 0; i < 8; i++) {
Onewire_SendBit(Byte & 0x01); // 发送每一位
Byte >>= 1;
}
}
// 从 One-Wire 设备接收一个字节数据
unsigned char Onewire_ReceiveByte(void) {
unsigned char Byte = 0;
for (unsigned char i = 0; i < 8; i++) {
Byte >>= 1;
if (Onewire_ReceiveBit()) {
Byte |= 0x80; // 设置最高位
}
}
return Byte;
}
#include "parking_sensor.h" #include "parking_sensor.h"
#include "common.h" #include "common.h"
#include "uart_log.h" #include "uart_log.h"
// 全局变量 // 全局变量
volatile uint32_t pulse_time = 0; // 脉宽时间 volatile uint32_t pulse_time = 0; // 脉宽时间
volatile double distance_cm = 0.0; // 距离 volatile float distance_cm = 0.0; // 距离
volatile uint8_t capture_state = 0; // 捕获状态标志 volatile uint8_t capture_state = 0; // 捕获状态标志
volatile uint8_t last_pd14_state = 0; // 上一次 PD14 的状态 volatile uint8_t last_pd14_state = 0; // 上一次 PD14 的状态
// 动态配置 PE0 - PE15 引脚 // 动态配置 PE0 - PE15 引脚
void Configure_PE_Pin(uint8_t pin, uint8_t mode) { void Configure_PE_Pin(uint8_t pin, uint8_t mode) {
// 根据引脚号选择配置寄存器 // 根据引脚号选择配置寄存器
...@@ -20,13 +23,16 @@ void Configure_PE_Pin(uint8_t pin, uint8_t mode) { ...@@ -20,13 +23,16 @@ void Configure_PE_Pin(uint8_t pin, uint8_t mode) {
GPIOE->CRH &= ~(0xF << ((pin - 8) * 4)); // 清除该引脚的配置 GPIOE->CRH &= ~(0xF << ((pin - 8) * 4)); // 清除该引脚的配置
GPIOE->CRH |= (mode << ((pin - 8) * 4)); // 设置该引脚的模式 GPIOE->CRH |= (mode << ((pin - 8) * 4)); // 设置该引脚的模式
} }
GPIOE->BRR = 0xFC00;
} }
// 发送触发信号 // 发送触发信号
void SendTriggerSignal(void) { void SendTriggerSignal(uint8_t pin) {
GPIOE->BSRR = (1 << 14); // 设置 PE14 为高电平
Delay(25, 'u'); // 延时 10 微秒 Delay(4, 'u');
GPIOE->BRR = (1 << 14); // 设置 PE14 为低电平 GPIOE->BSRR = (1 << pin); // 设置 PE14 为高电平
Delay(15, 'u'); // 延时 10 微秒
GPIOE->BRR = (1 << pin); // 设置 PE14 为低电平
} }
// 初始化 TIM2 捕获模式 // 初始化 TIM2 捕获模式
...@@ -39,49 +45,29 @@ void TIM2_Capture_Init(void) ...@@ -39,49 +45,29 @@ void TIM2_Capture_Init(void)
TIM2->PSC = 72 - 1; // 72MHz / 72 = 1MHz TIM2->PSC = 72 - 1; // 72MHz / 72 = 1MHz
// 设置自动重装载寄存器 // 设置自动重装载寄存器
TIM2->ARR = 0xFFFF; TIM2->ARR =29999;// 0xFFFF;
// 选择计数模式 // 选择计数模式
TIM2->CR1 &= ~TIM_CR1_DIR; TIM2->CR1 &= ~TIM_CR1_DIR;
// 使能TIM2
//TIM2->CR1 |= TIM_CR1_CEN;
} }
// 计算距离,不考虑温度校正
double CalculateDistance()
{
const double soundSpeed = 340.0; // 固定声速 = 340 m/s
const double timeToDistanceFactor = soundSpeed / 2 / 10000000.0; // 转换因子(米/us)
return pulse_time * timeToDistanceFactor * 100; // 返回距离(cm)
}
// TIM2 中断服务程序,捕获脉宽 // TIM2 中断服务程序,捕获脉宽
void Parking_Sensor_Interruption(void) { void Parking_Sensor_Interruption(void) {
uint32_t end_time;
uint8_t pd14_level = (GPIOD->IDR & GPIO_IDR_IDR14) ? 1 : 0; uint8_t pd14_level = (GPIOD->IDR & GPIO_IDR_IDR14) ? 1 : 0;
Serial_Printf("pd14_level: %u\n", pd14_level);
if (pd14_level != last_pd14_state) { // 检测到电平变化 if (pd14_level != last_pd14_state) { // 检测到电平变化
if (pd14_level == 1 && capture_state == 0) { // 上升沿 if (pd14_level == 1 && capture_state == 0) { // 上升沿
TIM2->CNT = 0; // 清零计数器 TIM2->CNT = 0; // 清零计数器
TIM2->CR1 |= TIM_CR1_CEN; // 启动计数器 TIM2->CR1 |= TIM_CR1_CEN; // 启动计数器
capture_state = 1; // 标记上升沿已捕获,等待下降沿 capture_state = 1; // 标记上升沿已捕获,等待下降沿
} else if (pd14_level == 0 && capture_state == 1) { // 下降沿且上升沿已捕获 } else if (pd14_level == 0 && capture_state == 1) { // 下降沿且上升沿已捕获
end_time = TIM2->CNT; // 读取当前计数器值作为脉宽时间 pulse_time = TIM2->CNT; // 读取当前计数器值作为脉宽时间
pulse_time = end_time; // 记录脉宽时间
TIM2->CR1 &= ~TIM_CR1_CEN; // 关闭计数器 TIM2->CR1 &= ~TIM_CR1_CEN; // 关闭计数器
TIM2->CNT = 0; // 清零计数器 TIM2->CNT = 0; // 清零计数器
capture_state = 0; // 重置捕获状态 capture_state = 0; // 重置捕获状态
// 计算距离 // 计算距离
distance_cm = CalculateDistance(); distance_cm = CALCULATE_DISTANCE(pulse_time);
// 打印距离信息
Serial_Printf("EXTI14_IRQHandler Pulse Time: %u us, Distance: %.5f cm\n", pulse_time, distance_cm);
} }
EXTI->PR |= EXTI_PR_PR14; // 清除中断标志位
last_pd14_state = pd14_level; last_pd14_state = pd14_level;
} }
} }
...@@ -8,11 +8,8 @@ volatile uint8_t capture_state = 0; // 捕获状态标志 ...@@ -8,11 +8,8 @@ volatile uint8_t capture_state = 0; // 捕获状态标志
volatile uint8_t last_pd14_state = 0; // 上一次 PD14 的状态 volatile uint8_t last_pd14_state = 0; // 上一次 PD14 的状态
int HH = 1000000;
// 动态配置 PE0 - PE15 引脚 // 动态配置 PE0 - PE15 引脚
void Configure_PE_Pin(uint8_t pin, uint8_t mode) { void Configure_PE_Pin(uint8_t pin, uint8_t mode) {
// 使能 GPIOE 时钟
RCC->APB2ENR |= RCC_APB2ENR_IOPEEN;
// 根据引脚号选择配置寄存器 // 根据引脚号选择配置寄存器
if (pin < 8) { if (pin < 8) {
// 配置低 8 位(PE0 - PE7) // 配置低 8 位(PE0 - PE7)
...@@ -28,7 +25,7 @@ void Configure_PE_Pin(uint8_t pin, uint8_t mode) { ...@@ -28,7 +25,7 @@ void Configure_PE_Pin(uint8_t pin, uint8_t mode) {
// 发送触发信号 // 发送触发信号
void SendTriggerSignal(void) { void SendTriggerSignal(void) {
GPIOE->BSRR = (1 << 14); // 设置 PE14 为高电平 GPIOE->BSRR = (1 << 14); // 设置 PE14 为高电平
Delay(15, 'u'); // 延时 10 微秒 Delay(25, 'u'); // 延时 10 微秒
GPIOE->BRR = (1 << 14); // 设置 PE14 为低电平 GPIOE->BRR = (1 << 14); // 设置 PE14 为低电平
} }
...@@ -45,54 +42,41 @@ void TIM2_Capture_Init(void) ...@@ -45,54 +42,41 @@ void TIM2_Capture_Init(void)
TIM2->ARR = 0xFFFF; TIM2->ARR = 0xFFFF;
// 选择计数模式 // 选择计数模式
TIM2->CR1 &= ~TIM_CR1_DIR; // 向上计数 TIM2->CR1 &= ~TIM_CR1_DIR;
// 使能TIM2 // 使能TIM2
TIM2->CR1 |= TIM_CR1_CEN; //TIM2->CR1 |= TIM_CR1_CEN;
} }
// 计算距离,不考虑温度校正
double CalculateDistance()
{
const double soundSpeed = 340.0; // 固定声速 = 340 m/s
const double timeToDistanceFactor = soundSpeed / 2 / 10000000.0; // 转换因子(米/us)
return pulse_time * timeToDistanceFactor * 100; // 返回距离(cm)
}
// TIM2 中断服务程序,捕获脉宽 // TIM2 中断服务程序,捕获脉宽
void Parking_Sensor_Interruption(void) void Parking_Sensor_Interruption(void) {
{
static uint32_t start_time = 0;
uint32_t end_time; uint32_t end_time;
volatile uint32_t idr_value = GPIOD->IDR; uint8_t pd14_level = (GPIOD->IDR & GPIO_IDR_IDR14) ? 1 : 0;
Serial_Printf("pd14_level: %u\n", pd14_level);
uint8_t pd14_state = ((idr_value & (1 << 14)) != 0) ? 1 : 0;
if (pd14_level != last_pd14_state) { // 检测到电平变化
Serial_Printf("PD14: %u\n", pd14_state); if (pd14_level == 1 && capture_state == 0) { // 上升沿
TIM2->CNT = 0; // 清零计数器
if (pd14_state != last_pd14_state) // 检测到电平变化 TIM2->CR1 |= TIM_CR1_CEN; // 启动计数器
{ capture_state = 1; // 标记上升沿已捕获,等待下降沿
if (pd14_state && capture_state == 0 ) // 上升沿 } else if (pd14_level == 0 && capture_state == 1) { // 下降沿且上升沿已捕获
{ end_time = TIM2->CNT; // 读取当前计数器值作为脉宽时间
start_time = TIM2->CNT; // 记录上升沿时间 pulse_time = end_time; // 记录脉宽时间
capture_state = 1; // 标记上升沿已捕获 TIM2->CR1 &= ~TIM_CR1_CEN; // 关闭计数器
} TIM2->CNT = 0; // 清零计数器
else { capture_state = 0; // 重置捕获状态
end_time = TIM2->CNT; // 记录下降沿时间
pulse_time = (end_time >= start_time) ? (end_time - start_time) : (0xFFFF - start_time + end_time + 1);
Serial_Printf("下降沿: %u \n", pulse_time);
capture_state = 2; // 标记捕获完成
// 计算距离 // 计算距离
distance_cm = CalculateDistance(); float distance_cm = CALCULATE_DISTANCE(pulse_time);
// 打印距离信息 // 打印距离信息
Serial_Printf("EXTI14_IRQHandler Pulse Time: %u, Distance: %.5f cm\n", pulse_time, distance_cm); Serial_Printf("EXTI14_IRQHandler Pulse Time: %u us,distance_cm: \n", pulse_time);
Serial_PrintFloat(distance_cm);
Serial_Print("\n");
} }
last_pd14_state = pd14_state ;
last_pd14_state = pd14_level;
} }
} }
\ No newline at end of file
...@@ -9,8 +9,6 @@ void Photoelectric_Switch_Interrupt(void) { ...@@ -9,8 +9,6 @@ void Photoelectric_Switch_Interrupt(void) {
} else { // 检测PB9的下降沿 } else { // 检测PB9的下降沿
Serial_Printf("PB9: 物体移开 (NPN 传感器 - 低电平)\n"); Serial_Printf("PB9: 物体移开 (NPN 传感器 - 低电平)\n");
} }
// 清除中断标志位
EXTI->PR = EXTI_PR_PR9;
} }
if (EXTI->PR & EXTI_PR_PR0) { // 检查是否是中断线0触发的中断(PE0) if (EXTI->PR & EXTI_PR_PR0) { // 检查是否是中断线0触发的中断(PE0)
...@@ -20,7 +18,6 @@ void Photoelectric_Switch_Interrupt(void) { ...@@ -20,7 +18,6 @@ void Photoelectric_Switch_Interrupt(void) {
} else { // 检测PE0的下降沿 } else { // 检测PE0的下降沿
Serial_Printf("PE0: 物体移开 (NPN 传感器 - 低电平)\n"); Serial_Printf("PE0: 物体移开 (NPN 传感器 - 低电平)\n");
} }
// 清除中断标志位
EXTI->PR = EXTI_PR_PR0;
} }
} }
#include "temperature_sensor.h"
#include "onewire.h"
#include "uart_log.h"
#include <stddef.h> // 引入 size_t 类型定义
#define CRC8_POLYNOMIAL 0x31
uint8_t crc8(const uint8_t *buf, size_t len) {
uint8_t crc = 0;
for (size_t pos = 0; pos < len; ++pos) {
crc ^= buf[pos];
for (uint8_t bit = 8; bit; --bit) {
if (crc & 0x80) {
crc = (crc << 1) ^ CRC8_POLYNOMIAL;
} else {
crc = (crc << 1);
}
}
}
return crc;
}
void TemperatureSensor_ConvertT(void) {
Onewire_Init(); // 初始化 One-Wire 总线
if (!Onewire_Reset()) { // 复位总线并检查是否有设备响应
Serial_Printf("No device detected.\n");
return;
}
// 跳过 ROM
Onewire_SendByte(0xCC);
// 启动温度转换
Onewire_SendByte(0x44); // 启动温度转换命令
}
float TemperatureSensor_ReadT(void) {
// uint8_t rom_address[8]; // 存储ROM地址 如果不需要,可以移除这一行
uint8_t scratchpad[9]; // 存储Scratchpad数据
uint8_t crc_result;
int16_t Temp;
float temperature;
Onewire_Init(); // 初始化 One-Wire 总线
if (!Onewire_Reset()) { // 复位总线并检查是否有设备响应
Serial_Printf("No device detected.\n");
return -1.0;
}
// 跳过 ROM
Onewire_SendByte(0xCC);
// 读取 Scratchpad
Onewire_SendByte(0xBE);
// 读取 Scratchpad 数据
for (int i = 0; i < 9; i++) {
scratchpad[i] = Onewire_ReceiveByte();
}
// 计算 CRC 并验证
crc_result = crc8(scratchpad, 8);
if (crc_result != scratchpad[8]) {
Serial_Printf("CRC error.\n");
return -1.0;
}
// 提取温度数据
uint8_t TLSB = scratchpad[0]; // 低字节
uint8_t TMSB = scratchpad[1]; // 高字节
Temp = (TMSB << 8) | TLSB; // 合并两个字节
temperature = Temp / 16.0; // 计算实际温度
Serial_Printf("TLSB: %02X, TMSB: %02X, Temp: %d, Temperature: %.2f C\n",
TLSB, TMSB, Temp, temperature);
return temperature;
}
//#include "uart_log.h"
//#include <stdarg.h>
//#include <string.h>
//#include <stdio.h> // 包含<stdio.h>头文件
//// 缓冲区大小
//#define SERIAL_BUFFER_SIZE 128
//// USART1 GPIO初始化
//void USART1_GPIO_Init(void) {
// // 使能GPIOA和USART1时钟
// RCC->APB2ENR |= RCC_APB2ENR_IOPAEN | RCC_APB2ENR_USART1EN;
// GPIOA->CRH &= ~(0xF << 4); // 清除PA9配置
// GPIOA->CRH |= (0xB << 4); // 配置PA9为复用功能推挽输出
// GPIOA->CRH &= ~(0xF << 8); // 清除PA10配置
// GPIOA->CRH |= (0x4 << 8); // 配置PA10为浮空输入(接收器)
//}
//// USART1初始化
//void USART1_Init(void) {
// // 设置波特率
// USART1->BRR =0x1D4C;
// // 配置USART1
// USART1->CR1 = USART_CR1_UE | USART_CR1_TE | USART_CR1_RE; // 使能USART1、发送器和接收器
// USART1->CR2 = 0; // 不使用流控制
// USART1->CR3 = 0; // 不使用额外功能
//}
//// 发送一个字符
//void USART1_SendChar(char ch) {
// while (!(USART1->SR & USART_SR_TXE)); // 等待发送缓冲区为空
// USART1->DR = (ch & 0xFF); // 发送字符
//}
//// 发送字符串
//void USART1_SendString(const char *str) {
// while (*str) {
// USART1_SendChar(*str++);
// }
//}
//// 格式化字符串并发送
//void USART1_SendFormatted(const char *format, ...) {
// char buffer[SERIAL_BUFFER_SIZE];
// va_list args;
// va_start(args, format);
// vsnprintf(buffer, sizeof(buffer), format, args);
// va_end(args);
// USART1_SendString(buffer);
//}
//// 初始化串口日志
//void Serial_Init(void) {
// USART1_GPIO_Init();
// USART1_Init();
//}
//// 打印字符串
//void Serial_Print(const char *str) {
// USART1_SendString(str);
//}
//// 打印字符
//void Serial_Write(char ch) {
// USART1_SendChar(ch);
//}
//// 打印格式化字符串
//void Serial_Printf(const char *format, ...) {
// va_list args;
// va_start(args, format);
// USART1_SendFormatted(format, args);
// va_end(args);
//}
#include "uart_log.h" #include "uart_log.h"
#include <stdarg.h> #include <stdarg.h>
#include <string.h> #include <string.h>
#include <stdio.h> // 包含<stdio.h>头文件 #include <stdio.h> // 包含<stdio.h>头文件
#define SERIAL_BUFFER_SIZE 128 #define SERIAL_BUFFER_SIZE 256
void USART1_GPIO_Init(void) { void USART1_GPIO_Init(void) {
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN | RCC_APB2ENR_USART1EN; RCC->APB2ENR |= RCC_APB2ENR_IOPAEN | RCC_APB2ENR_USART1EN;
GPIOA->CRH &= ~(0xF << 4); GPIOA->CRH &= ~(0xF << 4);
...@@ -90,7 +13,7 @@ void USART1_GPIO_Init(void) { ...@@ -90,7 +13,7 @@ void USART1_GPIO_Init(void) {
} }
void USART1_Init(void) { void USART1_Init(void) {
USART1->BRR = 0x1D4C; USART1->BRR = 0x271; // 设置波特率为 115200
USART1->CR1 = USART_CR1_UE | USART_CR1_TE | USART_CR1_RE; USART1->CR1 = USART_CR1_UE | USART_CR1_TE | USART_CR1_RE;
USART1->CR2 = 0; USART1->CR2 = 0;
USART1->CR3 = 0; USART1->CR3 = 0;
...@@ -125,10 +48,45 @@ void Serial_Printf(const char *format, ...) { ...@@ -125,10 +48,45 @@ void Serial_Printf(const char *format, ...) {
va_list args; va_list args;
va_start(args, format); va_start(args, format);
vsnprintf(buffer, sizeof(buffer), format, args); int result = vsnprintf(buffer, SERIAL_BUFFER_SIZE, format, args);
if (result >= 0) {
// 如果成功格式化字符串,则发送
USART1_SendString(buffer);
} else {
// 如果失败,则发送错误消息
USART1_SendString("Format error");
}
va_end(args); va_end(args);
USART1_SendString(buffer);
} }
void Serial_PrintFloat(float num) {
// 确定符号并取绝对值以处理负数
int isNegative = num < 0;
if (isNegative) {
num = -num;
}
// 分离整数部分
int integerPart = (int)num;
// 计算小数部分,但转换为整数来避免精度问题
int fractionalPart = (int)((num - integerPart) * 10000); // 保留四位小数
// 调整负数输出
char buffer[64];
if (isNegative) {
snprintf(buffer, sizeof(buffer), "-%d.%04d", integerPart, fractionalPart);
} else {
snprintf(buffer, sizeof(buffer), "%d.%04d", integerPart, fractionalPart);
}
// 去除末尾的零
char* endPtr = buffer + strlen(buffer) - 1;
while (*endPtr == '0' && *(endPtr - 1) != '.') {
*endPtr = '\0';
endPtr--;
}
Serial_Print(buffer);
}
...@@ -176,9 +176,9 @@ ...@@ -176,9 +176,9 @@
<Bp> <Bp>
<Number>0</Number> <Number>0</Number>
<Type>0</Type> <Type>0</Type>
<LineNumber>81</LineNumber> <LineNumber>57</LineNumber>
<EnabledFlag>1</EnabledFlag> <EnabledFlag>1</EnabledFlag>
<Address>134226530</Address> <Address>134225926</Address>
<ByteObject>0</ByteObject> <ByteObject>0</ByteObject>
<HtxType>0</HtxType> <HtxType>0</HtxType>
<ManyObjects>0</ManyObjects> <ManyObjects>0</ManyObjects>
...@@ -187,14 +187,14 @@ ...@@ -187,14 +187,14 @@
<BreakIfRCount>1</BreakIfRCount> <BreakIfRCount>1</BreakIfRCount>
<Filename>D:\宓屽叆寮?mcu\Motor_Control\Module\Src\parking_sensor.c</Filename> <Filename>D:\宓屽叆寮?mcu\Motor_Control\Module\Src\parking_sensor.c</Filename>
<ExecCommand></ExecCommand> <ExecCommand></ExecCommand>
<Expression>\\MotorControl\Module/Src/parking_sensor.c\81</Expression> <Expression></Expression>
</Bp> </Bp>
<Bp> <Bp>
<Number>1</Number> <Number>1</Number>
<Type>0</Type> <Type>0</Type>
<LineNumber>86</LineNumber> <LineNumber>56</LineNumber>
<EnabledFlag>1</EnabledFlag> <EnabledFlag>1</EnabledFlag>
<Address>134226552</Address> <Address>134225916</Address>
<ByteObject>0</ByteObject> <ByteObject>0</ByteObject>
<HtxType>0</HtxType> <HtxType>0</HtxType>
<ManyObjects>0</ManyObjects> <ManyObjects>0</ManyObjects>
...@@ -203,14 +203,14 @@ ...@@ -203,14 +203,14 @@
<BreakIfRCount>1</BreakIfRCount> <BreakIfRCount>1</BreakIfRCount>
<Filename>D:\宓屽叆寮?mcu\Motor_Control\Module\Src\parking_sensor.c</Filename> <Filename>D:\宓屽叆寮?mcu\Motor_Control\Module\Src\parking_sensor.c</Filename>
<ExecCommand></ExecCommand> <ExecCommand></ExecCommand>
<Expression>\\MotorControl\Module/Src/parking_sensor.c\86</Expression> <Expression></Expression>
</Bp> </Bp>
<Bp> <Bp>
<Number>2</Number> <Number>2</Number>
<Type>0</Type> <Type>0</Type>
<LineNumber>84</LineNumber> <LineNumber>58</LineNumber>
<EnabledFlag>1</EnabledFlag> <EnabledFlag>1</EnabledFlag>
<Address>134226544</Address> <Address>134225932</Address>
<ByteObject>0</ByteObject> <ByteObject>0</ByteObject>
<HtxType>0</HtxType> <HtxType>0</HtxType>
<ManyObjects>0</ManyObjects> <ManyObjects>0</ManyObjects>
...@@ -219,14 +219,14 @@ ...@@ -219,14 +219,14 @@
<BreakIfRCount>1</BreakIfRCount> <BreakIfRCount>1</BreakIfRCount>
<Filename>D:\宓屽叆寮?mcu\Motor_Control\Module\Src\parking_sensor.c</Filename> <Filename>D:\宓屽叆寮?mcu\Motor_Control\Module\Src\parking_sensor.c</Filename>
<ExecCommand></ExecCommand> <ExecCommand></ExecCommand>
<Expression>\\MotorControl\Module/Src/parking_sensor.c\84</Expression> <Expression></Expression>
</Bp> </Bp>
<Bp> <Bp>
<Number>3</Number> <Number>3</Number>
<Type>0</Type> <Type>0</Type>
<LineNumber>92</LineNumber> <LineNumber>60</LineNumber>
<EnabledFlag>1</EnabledFlag> <EnabledFlag>1</EnabledFlag>
<Address>134226578</Address> <Address>134225950</Address>
<ByteObject>0</ByteObject> <ByteObject>0</ByteObject>
<HtxType>0</HtxType> <HtxType>0</HtxType>
<ManyObjects>0</ManyObjects> <ManyObjects>0</ManyObjects>
...@@ -235,14 +235,14 @@ ...@@ -235,14 +235,14 @@
<BreakIfRCount>1</BreakIfRCount> <BreakIfRCount>1</BreakIfRCount>
<Filename>D:\宓屽叆寮?mcu\Motor_Control\Module\Src\parking_sensor.c</Filename> <Filename>D:\宓屽叆寮?mcu\Motor_Control\Module\Src\parking_sensor.c</Filename>
<ExecCommand></ExecCommand> <ExecCommand></ExecCommand>
<Expression>\\MotorControl\Module/Src/parking_sensor.c\92</Expression> <Expression></Expression>
</Bp> </Bp>
<Bp> <Bp>
<Number>4</Number> <Number>4</Number>
<Type>0</Type> <Type>0</Type>
<LineNumber>94</LineNumber> <LineNumber>65</LineNumber>
<EnabledFlag>1</EnabledFlag> <EnabledFlag>1</EnabledFlag>
<Address>134226618</Address> <Address>134225990</Address>
<ByteObject>0</ByteObject> <ByteObject>0</ByteObject>
<HtxType>0</HtxType> <HtxType>0</HtxType>
<ManyObjects>0</ManyObjects> <ManyObjects>0</ManyObjects>
...@@ -251,7 +251,23 @@ ...@@ -251,7 +251,23 @@
<BreakIfRCount>1</BreakIfRCount> <BreakIfRCount>1</BreakIfRCount>
<Filename>D:\宓屽叆寮?mcu\Motor_Control\Module\Src\parking_sensor.c</Filename> <Filename>D:\宓屽叆寮?mcu\Motor_Control\Module\Src\parking_sensor.c</Filename>
<ExecCommand></ExecCommand> <ExecCommand></ExecCommand>
<Expression>\\MotorControl\Module/Src/parking_sensor.c\94</Expression> <Expression></Expression>
</Bp>
<Bp>
<Number>5</Number>
<Type>0</Type>
<LineNumber>63</LineNumber>
<EnabledFlag>1</EnabledFlag>
<Address>134225970</Address>
<ByteObject>0</ByteObject>
<HtxType>0</HtxType>
<ManyObjects>0</ManyObjects>
<SizeOfObject>0</SizeOfObject>
<BreakByAccess>0</BreakByAccess>
<BreakIfRCount>1</BreakIfRCount>
<Filename>D:\宓屽叆寮?mcu\Motor_Control\Module\Src\parking_sensor.c</Filename>
<ExecCommand></ExecCommand>
<Expression></Expression>
</Bp> </Bp>
</Breakpoint> </Breakpoint>
<MemoryWindow1> <MemoryWindow1>
...@@ -532,58 +548,6 @@ ...@@ -532,58 +548,6 @@
<Focus>0</Focus> <Focus>0</Focus>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2> <bDave2>0</bDave2>
<PathWithFileName>.\Module\Inc\temperature_sensor.h</PathWithFileName>
<FilenameWithoutPath>temperature_sensor.h</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>2</GroupNumber>
<FileNumber>18</FileNumber>
<FileType>5</FileType>
<tvExp>0</tvExp>
<Focus>0</Focus>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>.\Module\Inc\onewire.h</PathWithFileName>
<FilenameWithoutPath>onewire.h</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>2</GroupNumber>
<FileNumber>19</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<Focus>0</Focus>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>.\Module\Src\onewire.c</PathWithFileName>
<FilenameWithoutPath>onewire.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>2</GroupNumber>
<FileNumber>20</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<Focus>0</Focus>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>.\Module\Src\temperature_sensor.c</PathWithFileName>
<FilenameWithoutPath>temperature_sensor.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>2</GroupNumber>
<FileNumber>21</FileNumber>
<FileType>5</FileType>
<tvExp>0</tvExp>
<Focus>0</Focus>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>.\Module\Inc\emergency_stop.h</PathWithFileName> <PathWithFileName>.\Module\Inc\emergency_stop.h</PathWithFileName>
<FilenameWithoutPath>emergency_stop.h</FilenameWithoutPath> <FilenameWithoutPath>emergency_stop.h</FilenameWithoutPath>
<RteFlg>0</RteFlg> <RteFlg>0</RteFlg>
...@@ -591,7 +555,7 @@ ...@@ -591,7 +555,7 @@
</File> </File>
<File> <File>
<GroupNumber>2</GroupNumber> <GroupNumber>2</GroupNumber>
<FileNumber>22</FileNumber> <FileNumber>18</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<Focus>0</Focus> <Focus>0</Focus>
...@@ -604,7 +568,7 @@ ...@@ -604,7 +568,7 @@
</File> </File>
<File> <File>
<GroupNumber>2</GroupNumber> <GroupNumber>2</GroupNumber>
<FileNumber>23</FileNumber> <FileNumber>19</FileNumber>
<FileType>5</FileType> <FileType>5</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<Focus>0</Focus> <Focus>0</Focus>
...@@ -617,7 +581,7 @@ ...@@ -617,7 +581,7 @@
</File> </File>
<File> <File>
<GroupNumber>2</GroupNumber> <GroupNumber>2</GroupNumber>
<FileNumber>24</FileNumber> <FileNumber>20</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<Focus>0</Focus> <Focus>0</Focus>
...@@ -630,7 +594,7 @@ ...@@ -630,7 +594,7 @@
</File> </File>
<File> <File>
<GroupNumber>2</GroupNumber> <GroupNumber>2</GroupNumber>
<FileNumber>25</FileNumber> <FileNumber>21</FileNumber>
<FileType>5</FileType> <FileType>5</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<Focus>0</Focus> <Focus>0</Focus>
...@@ -643,7 +607,7 @@ ...@@ -643,7 +607,7 @@
</File> </File>
<File> <File>
<GroupNumber>2</GroupNumber> <GroupNumber>2</GroupNumber>
<FileNumber>26</FileNumber> <FileNumber>22</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<Focus>0</Focus> <Focus>0</Focus>
...@@ -656,7 +620,7 @@ ...@@ -656,7 +620,7 @@
</File> </File>
<File> <File>
<GroupNumber>2</GroupNumber> <GroupNumber>2</GroupNumber>
<FileNumber>27</FileNumber> <FileNumber>23</FileNumber>
<FileType>5</FileType> <FileType>5</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<Focus>0</Focus> <Focus>0</Focus>
...@@ -669,7 +633,7 @@ ...@@ -669,7 +633,7 @@
</File> </File>
<File> <File>
<GroupNumber>2</GroupNumber> <GroupNumber>2</GroupNumber>
<FileNumber>28</FileNumber> <FileNumber>24</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<Focus>0</Focus> <Focus>0</Focus>
......
...@@ -494,26 +494,6 @@ ...@@ -494,26 +494,6 @@
<FilePath>.\Module\Src\photoelectric_switch.c</FilePath> <FilePath>.\Module\Src\photoelectric_switch.c</FilePath>
</File> </File>
<File> <File>
<FileName>temperature_sensor.h</FileName>
<FileType>5</FileType>
<FilePath>.\Module\Inc\temperature_sensor.h</FilePath>
</File>
<File>
<FileName>onewire.h</FileName>
<FileType>5</FileType>
<FilePath>.\Module\Inc\onewire.h</FilePath>
</File>
<File>
<FileName>onewire.c</FileName>
<FileType>1</FileType>
<FilePath>.\Module\Src\onewire.c</FilePath>
</File>
<File>
<FileName>temperature_sensor.c</FileName>
<FileType>1</FileType>
<FilePath>.\Module\Src\temperature_sensor.c</FilePath>
</File>
<File>
<FileName>emergency_stop.h</FileName> <FileName>emergency_stop.h</FileName>
<FileType>5</FileType> <FileType>5</FileType>
<FilePath>.\Module\Inc\emergency_stop.h</FilePath> <FilePath>.\Module\Inc\emergency_stop.h</FilePath>
......
No preview for this file type
...@@ -27,22 +27,17 @@ Project File Date: 10/28/2024 ...@@ -27,22 +27,17 @@ Project File Date: 10/28/2024
<h2>Output:</h2> <h2>Output:</h2>
Build target 'PWM' Build target 'PWM'
compiling main.c... compiling main.c...
.\Module\Inc\parking_sensor.h(25): warning: #1295-D: Deprecated declaration CalculateDistance - give arg types main.c(103): warning: #128-D: loop is not reachable
double CalculateDistance(); while (1) {
main.c: 1 warning, 0 errors main.c: 1 warning, 0 errors
compiling uart_log.c... compiling uart_log.c...
compiling rotate_motor.c... compiling rotate_motor.c...
compiling pneumatic_solenoid.c... compiling pneumatic_solenoid.c...
compiling parking_sensor.c... compiling parking_sensor.c...
.\Module\Inc\parking_sensor.h(25): warning: #1295-D: Deprecated declaration CalculateDistance - give arg types
double CalculateDistance();
Module\Src\parking_sensor.c: 1 warning, 0 errors
compiling common.c... compiling common.c...
.\Module\Inc\parking_sensor.h(25): warning: #1295-D: Deprecated declaration CalculateDistance - give arg types Module\Src\common.c(110): warning: #61-D: integer operation result is out of range
double CalculateDistance();
Module\Src\common.c(109): warning: #61-D: integer operation result is out of range
GPIOE->CRL &= ~(0xF << (4*7)); // 清空 PE7 配置 (?0-23) GPIOE->CRL &= ~(0xF << (4*7)); // 清空 PE7 配置 (?0-23)
Module\Src\common.c: 2 warnings, 0 errors Module\Src\common.c: 1 warning, 0 errors
compiling distance_switch.c... compiling distance_switch.c...
compiling photoelectric_switch.c... compiling photoelectric_switch.c...
compiling onewire.c... compiling onewire.c...
...@@ -54,9 +49,9 @@ compiling ds18b20.c... ...@@ -54,9 +49,9 @@ compiling ds18b20.c...
assembling startup_stm32f10x_hd.s... assembling startup_stm32f10x_hd.s...
compiling system_stm32f10x.c... compiling system_stm32f10x.c...
linking... linking...
Program Size: Code=12812 RO-data=916 RW-data=20 ZI-data=1636 Program Size: Code=14236 RO-data=920 RW-data=12 ZI-data=1636
FromELF: creating hex file... FromELF: creating hex file...
".\Objects\MotorControl.axf" - 0 Error(s), 4 Warning(s). ".\Objects\MotorControl.axf" - 0 Error(s), 2 Warning(s).
<h2>Software Packages used:</h2> <h2>Software Packages used:</h2>
......
This source diff could not be displayed because it is too large. You can view the blob instead.
No preview for this file type
No preview for this file type
No preview for this file type
No preview for this file type
No preview for this file type
No preview for this file type
No preview for this file type
No preview for this file type
No preview for this file type
No preview for this file type
No preview for this file type
No preview for this file type
No preview for this file type
No preview for this file type
...@@ -4,9 +4,7 @@ ...@@ -4,9 +4,7 @@
#include "walking_motor.h" #include "walking_motor.h"
#include "uart_log.h" #include "uart_log.h"
#include "common.h" #include "common.h"
#include "buzzer.h"
#include "pneumatic_solenoid.h" #include "pneumatic_solenoid.h"
#include "temperature_sensor.h"
#include "ds18b20.h" #include "ds18b20.h"
#include "parking_sensor.h" #include "parking_sensor.h"
...@@ -20,6 +18,8 @@ int main(void) { ...@@ -20,6 +18,8 @@ int main(void) {
Serial_Init(); Serial_Init();
TIM7_Init();
// 定义步进电机结构体 // 定义步进电机结构体
...@@ -64,31 +64,32 @@ int main(void) { ...@@ -64,31 +64,32 @@ int main(void) {
Buzzer_On(); Buzzer_On();
// 配置 PE14 为推挽输出 // 配置 PE14 为推挽输出
Configure_PE_Pin(14, 0x3); Configure_PE_Pin(14, 0x3);
// 初始化 TIM2 捕获模式 // 初始化 TIM2 捕获模式
TIM2_Capture_Init(); TIM2_Capture_Init();
SendTriggerSignal();
//
// DS18B20_Init(); // 初始化 DS18B20
// uint32_t data=0;
// while (data<=0) {
// Serial_Printf("temperature = %02d\r\n\n",DS18B20_GetTemperture());
// data = DS18B20_GetTemperture() * 100; SendTriggerSignal(14);
float temperature;;
while(DS18B20_Init())
{
Serial_Print("DS18B20 checked failed!!!\r\n");
}
float temperature=DS18B20_Get_Temperature();
if(temperature < 0)
Serial_Printf("temperature = -%.2f degree\r\n",temperature/10);
else
Serial_Printf("temperature = %.2f degree\r\n",temperature/10);
// Serial_Printf("temperature = %d.%02d\r\n\n", data/100, data % 100);
//
// Delay(1000, 'm'); // 延时 1 秒
// }
;
......
...@@ -4,9 +4,7 @@ ...@@ -4,9 +4,7 @@
#include "walking_motor.h" #include "walking_motor.h"
#include "uart_log.h" #include "uart_log.h"
#include "common.h" #include "common.h"
#include "buzzer.h"
#include "pneumatic_solenoid.h" #include "pneumatic_solenoid.h"
#include "temperature_sensor.h"
#include "ds18b20.h" #include "ds18b20.h"
#include "parking_sensor.h" #include "parking_sensor.h"
...@@ -20,6 +18,8 @@ int main(void) { ...@@ -20,6 +18,8 @@ int main(void) {
Serial_Init(); Serial_Init();
TIM7_Init();
// 定义步进电机结构体 // 定义步进电机结构体
...@@ -63,38 +63,33 @@ int main(void) { ...@@ -63,38 +63,33 @@ int main(void) {
Buzzer_On(); Buzzer_On();
Serial_Print("main: Before TIM2_Init\n");
TIM2_Init();
Serial_Print("main: Before Delay\n");
Delay(1000, 'm');
Serial_Print("main: Before Start_Measurement\n");
Start_Measurement(1 << 14);
Serial_Print("main: After Start_Measurement\n");
// 配置 PE14 为推挽输出
Serial_Print("main: DS18B20_Init\n"); Configure_PE_Pin(14, 0x3);
// 初始化 TIM2 捕获模式
TIM2_Capture_Init();
// 初始化DS18B20
if (DS18B20_Init() == 0)
{
// 检测到DS18B20的情况可以进行一些处理,例如点亮一个LED
// 或者在开发板上的屏幕显示“DS18B20 Detected!”之类的信息
}
else
{
// 没有检测到DS18B20,可能需要给出错误处理
Serial_Printf("没有检测到DS18B20,可能需要给出错误处理");
} SendTriggerSignal(14);
uint32_t data = DS18B20_GetTemperture() * 100; float temperature;;
Serial_Printf("temperature = %d.%02d\r\n\n", data/100, data % 100); while(DS18B20_Init())
{
Serial_Print("DS18B20 checked failed!!!\r\n");
}
float temperature=DS18B20_Get_Temperature();
if(temperature < 0)
Serial_Printf("temperature = -%.2f degree\r\n",temperature/10);
else
Serial_Printf("temperature = %.2f degree\r\n",temperature/10);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment