Compare commits

..

11 Commits

Author SHA1 Message Date
e518c278d7 feat: 公交车 2024-07-20 10:44:59 +08:00
EN
a76a286859 更新蜂鸣器模块 2024-07-19 12:33:18 +08:00
EN
e1c3c733f0 完善蓝牙协议 2024-07-19 12:32:54 +08:00
EN
e82a79f1c3 修正delay_us被优化的错误 2024-07-19 09:14:32 +08:00
EN
cf240a9d5c 舵机初始化时默认旋转90度 2024-07-19 09:14:01 +08:00
EN
000d9e9e4e 修改NVIC中断优先级 2024-07-19 08:35:20 +08:00
EN
89b22e459b 添加定时器模块 2024-07-18 11:38:07 +08:00
EN
76690e0a58 删除I2C配置 2024-07-18 11:36:04 +08:00
3a7c8d8e4b 语音模块 2024-07-18 10:30:01 +08:00
f97607d366 语言模块 2024-07-18 08:41:45 +08:00
EN
4ea2f46a10 修正Keil编译错误 2024-07-18 08:40:50 +08:00
51 changed files with 1523 additions and 11028 deletions

File diff suppressed because one or more lines are too long

8
App/Inc/app_bus.h Normal file
View File

@ -0,0 +1,8 @@
#ifndef __APP_BUS_H
#define __APP_BUS_H
void BlockDetect_Init();
void App_Bus(void);
#endif

View File

@ -3,8 +3,13 @@
#include "tim.h"
extern int beep_time;
void LineSeek_Init(void);
void LineSeek_Start(void);
void LineSeek_Stop(void);
void App_LineSeek(void);
void Hanlde_Crossroad(void);
#endif

98
App/Src/app_bus.c Normal file
View File

@ -0,0 +1,98 @@
#include "app_bus.h"
#include "app_line_seek.h"
#include "block_detect.h"
#include "buzzer.h"
#include "led.h"
#include "line_seek.h"
#include "motor.h"
#include "path_plan.h"
#include "syn6288.h"
typedef enum
{
RUNNING, // 按路线运营
READY_TO_PARK, // 准备进站停车(或者准备左转)
PARKING, // 进站停车
WAIT_PASSENGER, // 等候乘客
STOP // 停车
} BusState;
static BusState state;
static int current_station;
char* stations[] = {"太平园站", "西南交大站", "新业北街站", "终点站"};
void App_Bus(void)
{
// printf("bus_state:%d\n", state);
LineSeek_GetStatusStr();
switch (state)
{
case RUNNING: // 按路线运营
{
LineSeek_Start();
if (Has_Block(FRONT)) // 前方有障碍物,停车
{
state = STOP;
}
else if (Has_Block(RIGHT_FRONT)) // 右前方有障碍物,准备停车或者左转避障
{
state = READY_TO_PARK;
// state = WAIT_PASSENGER;
}
else if (Has_Block(LEFT_FRONT)) // 左前方有障碍物,右转避障
{
Direction nextDirs[] = {RIGHT, RIGHT};
ReplacePathStep(nextDirs, 2);
}
break;
}
case READY_TO_PARK: // 准备进站停车,或者准备左转避障
{
if (LineSeek_Equals("0xxx")) // 左方有路线,左转
{
Direction nextDirs[] = {LEFT, LEFT};
ReplacePathStep(nextDirs, 2);
state = RUNNING;
}
else if (LineSeek_Equals("xxx0")) // 右方有路线,右转进站
{
Direction nextDirs[] = {RIGHT, RIGHT};
ReplacePathStep(nextDirs, 2);
state = PARKING;
}
break;
}
case PARKING: // 进站停车
{
if (Has_Block(RIGHT_FRONT)) // 右前方有障碍物,停车
{
state = WAIT_PASSENGER;
}
break;
}
case WAIT_PASSENGER: // 等候乘客
{
// TODO: 添加乘客等待逻辑
LineSeek_Stop();
SYN_FrameInfo(0, stations[current_station]);
BUZZER_StartNTimes(3, 500, 500);
MOTOR_Stop();
HAL_Delay(5000);
current_station++;
state = RUNNING;
break;
}
case STOP: // 停车
{
LineSeek_Stop();
break;
}
default:
break;
}
App_LineSeek();
}

View File

@ -1,6 +1,9 @@
#include "app_line_seek.h"
#include "bluetooth.h"
#include "buzzer.h"
#include "led.h"
#include "line_seek.h"
#include "main.h"
#include "motor.h"
@ -8,16 +11,15 @@
#include "stm32f1xx_hal_tim.h"
#include "syscalls.h"
#include "tim.h"
#include "timer.h"
#define LOW_TUNE_SPEED -5
#define LOW_SPEED 35
#define MID_SPEED 40
#define HIGH_SPEED 45
#define MIN_TURN_TIME 300 // 最小转直角时间
#define MIN_CROSSING_TIME 200 // 最小走十字路口时间
#define MIN_CROSSING_STRAIGHT_TIME 50 // 最小走十字路口时间
#define MIN_TUNE_TIME 40 // 最小微调时间
#define MAX_TURN_TIME 4000 // 最大转弯时间
#define MIN_TURN_TIME 200 // 最小转直角时间
#define MIN_CROSSING_TIME 300 // 最小走十字路口时间
#define MIN_TUNE_TIME 30 // 最小微调时间
typedef enum
{
@ -27,41 +29,53 @@ typedef enum
TUNE_LEFT, // 左微调
TUNE_RIGHT, // 右微调
TURN_LEFT_BIG,
TURN_RIGHT_BIG
TURN_RIGHT_BIG,
MOVE_STOP
} MoveState;
MoveState state, preState; // 运动状态
static MoveState state, preState; // 运动状态
int turn_time; // 转弯时间
int beep_time; // 蜂鸣器鸣叫时间
int is_crossing; // 是否正在走十字路口
static timer_event_id = -1;
void LINESEEK_HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef* htim)
// 每1ms一次回调
void LINESEEK_TURN_TIME()
{
if (turn_time < INT16_MAX)
{
turn_time++; // 每1ms自增一
}
if (beep_time++ > 100)
{
HAL_GPIO_WritePin(FM_K2_POWERC_GPIO_Port, FM_K2_POWERC_Pin, GPIO_PIN_SET);
turn_time++;
}
}
// 巡线功能初始化
void LineSeek_Init(void)
{
// 注册定时器中断溢出回调
HAL_TIM_RegisterCallback(&htim4, HAL_TIM_PERIOD_ELAPSED_CB_ID, LINESEEK_HAL_TIM_PeriodElapsedCallback);
HAL_TIM_Base_Start_IT(&htim4);
// 注册定时器事件
timer_event_id = TIMER_AddInfiniteLoopEvent(timer_event_id, LINESEEK_TURN_TIME, 1);
}
void LineSeek_Start(void)
{
if (state == MOVE_STOP)
{
state = MOVE_STRAIGHT;
}
}
void LineSeek_Stop(void)
{
state = MOVE_STOP;
}
void App_LineSeek(void)
{
int LineL1 = 1, LineL2 = 1, LineR1 = 1, LineR2 = 1;
// LineSeek_GetStatusStr();
// LineSeek_GetStatus(&LineL1, &LineL2, &LineR1, &LineR2); // 获取黑线检测状态
LineSeek_GetStatusStr();
// if (state != MOVE_STOP)
// {
// BLUETOOTH_Send("line_seek state:%d, line_seek: %s\n", state, LineSeek_Status);
// // BLUETOOTH_Send("line_seek: %s \n", LineSeek_Status);
// }
// printf("%s %d \n", LineSeek_Status, turn_time);
// return;
@ -77,15 +91,19 @@ void App_LineSeek(void)
LineSeek_Status[3] = '1';
}
if (LineSeek_Equals("0000") && !is_crossing && state != MOVE_STOP) // 十字路口
{
Hanlde_Crossroad();
return;
}
switch (state)
{
case MOVE_STRAIGHT: // 直行
LED_Stop(LED_ALL);
LED_Start(LED_R);
MOTOR_SetDuty(HIGH_SPEED, HIGH_SPEED);
if (LineSeek_Equals("0000")) // 十字路口
{
Hanlde_Crossroad();
}
else if (LineSeek_Equals("1011")) // 左微调
if (LineSeek_Equals("1011")) // 左微调
{
state = TUNE_LEFT;
}
@ -117,18 +135,24 @@ void App_LineSeek(void)
}
break;
case TURN_LEFT: // 左直角
LED_Stop(LED_ALL);
LED_Start(LED_G);
MOTOR_SetDuty(-HIGH_SPEED, HIGH_SPEED);
if (LineSeek_Equals("0000")) // 十字路口
{
Hanlde_Crossroad();
}
else if (LineSeek_Equals("1001") &&
if (LineSeek_Equals("1001") &&
((preState != TUNE_LEFT && turn_time >= MIN_TURN_TIME - 1) ||
(preState == TUNE_LEFT && turn_time >= MIN_TUNE_TIME))) // 直行
{
state = MOVE_STRAIGHT;
preState = TURN_LEFT;
is_crossing = 0;
LED_Stop(LED_ALL);
LED_Start(LED_B);
}
else if (LineSeek_Equals("xxx0") && turn_time < MIN_TURN_TIME && !is_crossing) // 侧丁字路口
{
preState = TUNE_RIGHT;
Hanlde_Crossroad();
}
else if (LineSeek_Equals("xxx0") && !is_crossing) // 转过头了
{
@ -139,11 +163,7 @@ void App_LineSeek(void)
break;
case TURN_RIGHT: // 右直角
MOTOR_SetDuty(HIGH_SPEED, -HIGH_SPEED);
if (LineSeek_Equals("0000")) // 十字路口
{
Hanlde_Crossroad();
}
else if (LineSeek_Equals("1001") &&
if (LineSeek_Equals("1001") &&
((preState != TUNE_RIGHT && turn_time >= MIN_TURN_TIME - 1) ||
(preState == TUNE_RIGHT && turn_time >= MIN_TUNE_TIME))) // 直行
{
@ -151,6 +171,11 @@ void App_LineSeek(void)
preState = TURN_RIGHT;
is_crossing = 0;
}
else if (LineSeek_Equals("0xxx") && turn_time < MIN_TURN_TIME && !is_crossing) // 侧丁字路口
{
preState = TUNE_LEFT;
Hanlde_Crossroad();
}
else if (LineSeek_Equals("0xxx") && !is_crossing) // 转过头了
{
turn_time = MIN_TURN_TIME;
@ -160,11 +185,7 @@ void App_LineSeek(void)
break;
case TURN_LEFT_BIG: // 左锐角
MOTOR_SetDuty(-MID_SPEED, MID_SPEED);
if (LineSeek_Equals("0000")) // 十字路口
{
Hanlde_Crossroad();
}
else if (LineSeek_Equals("0001")) // 左直角
if (LineSeek_Equals("0001")) // 左直角
{
turn_time = 0;
state = TURN_LEFT;
@ -178,11 +199,7 @@ void App_LineSeek(void)
break;
case TURN_RIGHT_BIG: // 右锐角
MOTOR_SetDuty(MID_SPEED, -MID_SPEED);
if (LineSeek_Equals("0000")) // 十字路口
{
Hanlde_Crossroad();
}
else if (LineSeek_Equals("1000")) // 右直角
if (LineSeek_Equals("1000")) // 右直角
{
turn_time = 0;
state = TURN_RIGHT;
@ -200,13 +217,13 @@ void App_LineSeek(void)
{
state = MOVE_STRAIGHT;
}
else if (LineSeek_Equals("0xx1") && GetCurrentDirection() != STRAIGHT) // 左转
else if (LineSeek_Equals("0xx1")) // 左转
{
turn_time = 0;
state = TURN_LEFT;
preState = TUNE_LEFT;
}
else if (LineSeek_Equals("1xx0") && GetCurrentDirection() != STRAIGHT) // 右转
else if (LineSeek_Equals("1xx0")) // 右转
{
turn_time = 0;
state = TURN_RIGHT;
@ -219,47 +236,35 @@ void App_LineSeek(void)
{
state = MOVE_STRAIGHT;
}
else if (LineSeek_Equals("0xx1") && GetCurrentDirection() != STRAIGHT) // 左转
else if (LineSeek_Equals("0xx1")) // 左转
{
turn_time = 0;
state = TURN_LEFT;
preState = TUNE_RIGHT;
}
else if (LineSeek_Equals("1xx0") && GetCurrentDirection() != STRAIGHT) // 右转
else if (LineSeek_Equals("1xx0")) // 右转
{
turn_time = 0;
state = TURN_RIGHT;
preState = TUNE_RIGHT;
}
break;
case MOVE_STOP:
MOTOR_Stop();
break;
default:
state = MOVE_STRAIGHT;
MOTOR_SetDuty(MID_SPEED, MID_SPEED);
break;
}
// if (turn_time >= MAX_TURN_TIME)
// {
// // state = MOVE_STRAIGHT;
// MOTOR_SetDuty(0, 0);
// }
// printf("curr state: %d \n", state);
}
void Hanlde_Crossroad(void)
{
if (is_crossing)
{
return;
}
beep_time = 0;
HAL_GPIO_WritePin(FM_K2_POWERC_GPIO_Port, FM_K2_POWERC_Pin, GPIO_PIN_RESET);
// state = MOVE_STRAIGHT;
// buzzer(1);
// HAL_Delay(50);
// buzzer(0);
// 开启蜂鸣器
BUZZER_StartTimed(1);
// 根据规划的路径进行决断
is_crossing = 1;

View File

@ -1,88 +0,0 @@
#include "app_line_seek.h"
#include "line_seek.h"
#include "main.h"
#include "motor.h"
#include "path_plan.h"
#include "syscalls.h"
// #define LOW_SPEED 30
// #define MID_SPEED 35
// #define HIGH_SPEED 40
#define LOW_SPEED 25
#define MID_SPEED 30
#define HIGH_SPEED 35
void App_LineSeek(void)
{
int LineL1 = 1, LineL2 = 1, LineR1 = 1, LineR2 = 1;
LineSeek_GetStatus(&LineL1, &LineL2, &LineR1, &LineR2); // 获取黑线检测状态
LineSeek_GetStatusStr();
printf("%s\n", LineSeek_Status);
// return;
if (LineSeek_Equals("0000")) // 丁字(十字)路口
{
buzzer(1);
// 根据规划的路径进行决断
switch (GetNextDirection())
{
case STRAIGHT:
MOTOR_SetDuty(HIGH_SPEED, HIGH_SPEED); // 直走
break;
case LEFT:
MOTOR_SetDuty(HIGH_SPEED, -HIGH_SPEED); // 左转
break;
case RIGHT:
MOTOR_SetDuty(-HIGH_SPEED, HIGH_SPEED); // 右转
break;
default:
MOTOR_Stop();
break;
}
}
else
{
buzzer(0);
}
if (LineSeek_Equals("1000")) // 右直角
{
MOTOR_SetDuty(HIGH_SPEED, -HIGH_SPEED); // 右旋
// HAL_Delay(80);
}
else if (LineSeek_Equals("0001")) // 左直角
{
MOTOR_SetDuty(-HIGH_SPEED, HIGH_SPEED); // 左旋;
// HAL_Delay(80);
}
else if (LineSeek_Equals("0xx1")) // 左最外侧检测(锐角)
{
MOTOR_SetDuty(-HIGH_SPEED, MID_SPEED); // 左旋
// HAL_Delay(80);
}
else if (LineSeek_Equals("1xx0")) // 右最外侧检测(锐角)
{
MOTOR_SetDuty(MID_SPEED, -HIGH_SPEED); // 右旋
// HAL_Delay(80);
}
else if (LineSeek_Equals("x01x")) // 中间黑线上的传感器微调车左转
{
MOTOR_SetDuty(0, LOW_SPEED); // 左转
}
else if (LineSeek_Equals("x10x")) // 中间黑线上的传感器微调车右转
{
MOTOR_SetDuty(LOW_SPEED, 0); // 右转
}
else if (LineSeek_Equals("x00x")) // 都是黑色, 加速前进
{
MOTOR_SetDuty(MID_SPEED, MID_SPEED); // 直走
}
}

View File

@ -35,7 +35,8 @@ int APP_Find_Direction(void)
else if(left_block < BLOCK_DISTANCE && right_block < BLOCK_DISTANCE && straight_block < BLOCK_DISTANCE)// 前左右均有障碍物,停止并鸣笛
{
LED_SetDuty(255,0,0);
return STOP;
// return STOP;
return -1;
}
else if(straight_block < BLOCK_DISTANCE && left_block < BLOCK_DISTANCE)// 前左有障碍物,右转
{

116
CAR.ioc
View File

@ -3,7 +3,18 @@ CAD.formats=
CAD.pinconfig=
CAD.provider=
Dma.Request0=USART2_RX
Dma.RequestsNb=1
Dma.Request1=USART2_TX
Dma.Request2=USART1_TX
Dma.RequestsNb=3
Dma.USART1_TX.2.Direction=DMA_MEMORY_TO_PERIPH
Dma.USART1_TX.2.Instance=DMA1_Channel4
Dma.USART1_TX.2.MemDataAlignment=DMA_MDATAALIGN_BYTE
Dma.USART1_TX.2.MemInc=DMA_MINC_ENABLE
Dma.USART1_TX.2.Mode=DMA_NORMAL
Dma.USART1_TX.2.PeriphDataAlignment=DMA_PDATAALIGN_BYTE
Dma.USART1_TX.2.PeriphInc=DMA_PINC_DISABLE
Dma.USART1_TX.2.Priority=DMA_PRIORITY_LOW
Dma.USART1_TX.2.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority
Dma.USART2_RX.0.Direction=DMA_PERIPH_TO_MEMORY
Dma.USART2_RX.0.Instance=DMA1_Channel6
Dma.USART2_RX.0.MemDataAlignment=DMA_MDATAALIGN_BYTE
@ -13,23 +24,31 @@ Dma.USART2_RX.0.PeriphDataAlignment=DMA_PDATAALIGN_BYTE
Dma.USART2_RX.0.PeriphInc=DMA_PINC_DISABLE
Dma.USART2_RX.0.Priority=DMA_PRIORITY_HIGH
Dma.USART2_RX.0.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority
Dma.USART2_TX.1.Direction=DMA_MEMORY_TO_PERIPH
Dma.USART2_TX.1.Instance=DMA1_Channel7
Dma.USART2_TX.1.MemDataAlignment=DMA_MDATAALIGN_BYTE
Dma.USART2_TX.1.MemInc=DMA_MINC_ENABLE
Dma.USART2_TX.1.Mode=DMA_NORMAL
Dma.USART2_TX.1.PeriphDataAlignment=DMA_PDATAALIGN_BYTE
Dma.USART2_TX.1.PeriphInc=DMA_PINC_DISABLE
Dma.USART2_TX.1.Priority=DMA_PRIORITY_MEDIUM
Dma.USART2_TX.1.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority
File.Version=6
GPIO.groupedBy=Group By Peripherals
KeepUserPlacement=false
Mcu.CPN=STM32F103C8T6
Mcu.Family=STM32F1
Mcu.IP0=DMA
Mcu.IP1=I2C2
Mcu.IP10=USART2
Mcu.IP2=NVIC
Mcu.IP3=RCC
Mcu.IP4=SYS
Mcu.IP5=TIM1
Mcu.IP6=TIM2
Mcu.IP7=TIM3
Mcu.IP8=TIM4
Mcu.IP9=USART1
Mcu.IPNb=11
Mcu.IP1=NVIC
Mcu.IP2=RCC
Mcu.IP3=SYS
Mcu.IP4=TIM1
Mcu.IP5=TIM2
Mcu.IP6=TIM3
Mcu.IP7=TIM4
Mcu.IP8=USART1
Mcu.IP9=USART2
Mcu.IPNb=10
Mcu.Name=STM32F103C(8-B)Tx
Mcu.Package=LQFP48
Mcu.Pin0=PC13-TAMPER-RTC
@ -38,45 +57,43 @@ Mcu.Pin10=PA6
Mcu.Pin11=PA7
Mcu.Pin12=PB0
Mcu.Pin13=PB1
Mcu.Pin14=PB10
Mcu.Pin15=PB11
Mcu.Pin16=PB12
Mcu.Pin17=PA9
Mcu.Pin18=PA10
Mcu.Pin19=PA11
Mcu.Pin14=PB12
Mcu.Pin15=PA9
Mcu.Pin16=PA10
Mcu.Pin17=PA11
Mcu.Pin18=PA12
Mcu.Pin19=PA13
Mcu.Pin2=PC15-OSC32_OUT
Mcu.Pin20=PA12
Mcu.Pin21=PA13
Mcu.Pin22=PA14
Mcu.Pin23=PA15
Mcu.Pin24=PB4
Mcu.Pin25=PB5
Mcu.Pin26=PB6
Mcu.Pin27=PB7
Mcu.Pin28=PB8
Mcu.Pin29=PB9
Mcu.Pin20=PA14
Mcu.Pin21=PA15
Mcu.Pin22=PB4
Mcu.Pin23=PB5
Mcu.Pin24=PB6
Mcu.Pin25=PB7
Mcu.Pin26=PB8
Mcu.Pin27=PB9
Mcu.Pin28=VP_SYS_VS_Systick
Mcu.Pin29=VP_TIM1_VS_ClockSourceINT
Mcu.Pin3=PD0-OSC_IN
Mcu.Pin30=VP_SYS_VS_Systick
Mcu.Pin31=VP_TIM1_VS_ClockSourceINT
Mcu.Pin32=VP_TIM2_VS_ClockSourceINT
Mcu.Pin33=VP_TIM3_VS_ClockSourceINT
Mcu.Pin34=VP_TIM4_VS_ClockSourceINT
Mcu.Pin30=VP_TIM2_VS_ClockSourceINT
Mcu.Pin31=VP_TIM3_VS_ClockSourceINT
Mcu.Pin32=VP_TIM4_VS_ClockSourceINT
Mcu.Pin4=PD1-OSC_OUT
Mcu.Pin5=PA0-WKUP
Mcu.Pin6=PA1
Mcu.Pin7=PA2
Mcu.Pin8=PA3
Mcu.Pin9=PA4
Mcu.PinsNb=35
Mcu.PinsNb=33
Mcu.ThirdPartyNb=0
Mcu.UserConstants=
Mcu.UserName=STM32F103C8Tx
MxCube.Version=6.12.0
MxDb.Version=DB.6.0.120
NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
NVIC.DMA1_Channel6_IRQn=true\:0\:0\:true\:false\:true\:true\:true\:true
NVIC.DMA1_Channel6_IRQn=true\:3\:0\:true\:false\:true\:true\:true\:true
NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
NVIC.EXTI15_10_IRQn=true\:1\:0\:true\:false\:true\:true\:true\:true
NVIC.EXTI15_10_IRQn=true\:2\:0\:true\:false\:true\:true\:true\:true
NVIC.ForceEnableDMAVector=false
NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
NVIC.MemoryManagement_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
@ -84,10 +101,9 @@ NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
NVIC.PendSV_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
NVIC.PriorityGroup=NVIC_PRIORITYGROUP_2
NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
NVIC.SysTick_IRQn=true\:2\:0\:true\:false\:true\:false\:true\:false
NVIC.SysTick_IRQn=true\:3\:3\:true\:false\:true\:false\:true\:false
NVIC.TIM2_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true
NVIC.TIM3_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true
NVIC.TIM4_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true
NVIC.TIM4_IRQn=true\:1\:0\:true\:false\:true\:true\:true\:true
NVIC.USART1_IRQn=true\:3\:1\:true\:false\:true\:true\:true\:true
NVIC.USART2_IRQn=true\:3\:0\:true\:false\:true\:true\:true\:true
NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
@ -148,16 +164,6 @@ PB1.GPIOParameters=GPIO_Label
PB1.GPIO_Label=LED_R_TIM3CH4
PB1.Locked=true
PB1.Signal=S_TIM3_CH4
PB10.GPIOParameters=GPIO_Label
PB10.GPIO_Label=MPU6050_SCL
PB10.Locked=true
PB10.Mode=I2C
PB10.Signal=I2C2_SCL
PB11.GPIOParameters=GPIO_Label
PB11.GPIO_Label=MPU6050_SDA
PB11.Locked=true
PB11.Mode=I2C
PB11.Signal=I2C2_SDA
PB12.GPIOParameters=GPIO_PuPd,GPIO_Label
PB12.GPIO_Label=LineSeek_R2
PB12.GPIO_PuPd=GPIO_PULLUP
@ -231,12 +237,12 @@ ProjectManager.ProjectName=CAR
ProjectManager.ProjectStructure=
ProjectManager.RegisterCallBack=TIM
ProjectManager.StackSize=0x400
ProjectManager.TargetToolchain=MDK-ARM V5.32
ProjectManager.TargetToolchain=Makefile
ProjectManager.ToolChainLocation=
ProjectManager.UAScriptAfterPath=
ProjectManager.UAScriptBeforePath=
ProjectManager.UnderRoot=false
ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true,3-MX_DMA_Init-DMA-false-HAL-true,4-MX_I2C2_Init-I2C2-false-HAL-true,5-MX_TIM1_Init-TIM1-false-HAL-true,6-MX_TIM2_Init-TIM2-false-HAL-true,7-MX_TIM3_Init-TIM3-false-HAL-true,8-MX_TIM4_Init-TIM4-false-HAL-true,9-MX_USART1_UART_Init-USART1-false-HAL-true,10-MX_USART2_UART_Init-USART2-false-HAL-true
ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true,3-MX_DMA_Init-DMA-false-HAL-true,4-MX_TIM1_Init-TIM1-false-HAL-true,5-MX_TIM2_Init-TIM2-false-HAL-true,6-MX_TIM3_Init-TIM3-false-HAL-true,7-MX_TIM4_Init-TIM4-false-HAL-true,8-MX_USART1_UART_Init-USART1-false-HAL-true,9-MX_USART2_UART_Init-USART2-false-HAL-true
RCC.ADCFreqValue=36000000
RCC.AHBFreq_Value=72000000
RCC.APB1CLKDivider=RCC_HCLK_DIV2
@ -295,11 +301,11 @@ TIM4.AutoReloadPreload=TIM_AUTORELOAD_PRELOAD_ENABLE
TIM4.Channel-PWM\ Generation1\ CH1=TIM_CHANNEL_1
TIM4.Channel-PWM\ Generation2\ CH2=TIM_CHANNEL_2
TIM4.IPParameters=Channel-PWM Generation1 CH1,Channel-PWM Generation2 CH2,Prescaler,Period,Pulse-PWM Generation1 CH1,Pulse-PWM Generation2 CH2,AutoReloadPreload
TIM4.Period=100
TIM4.Period=100 - 1
TIM4.Prescaler=720 - 1
TIM4.Pulse-PWM\ Generation1\ CH1=100
TIM4.Pulse-PWM\ Generation2\ CH2=100
USART1.BaudRate=115200
TIM4.Pulse-PWM\ Generation1\ CH1=0
TIM4.Pulse-PWM\ Generation2\ CH2=0
USART1.BaudRate=9600
USART1.IPParameters=VirtualMode,BaudRate,Parity,WordLength
USART1.Parity=PARITY_NONE
USART1.VirtualMode=VM_ASYNC

10
Core/Inc/delay.h Normal file
View File

@ -0,0 +1,10 @@
#ifndef __DELAY_H
#define __DELAY_H
#include "main.h"
extern void delay_init(void);
extern void delay_us(uint32_t nus);
extern void delay_ms(uint32_t nms);
#endif

View File

@ -1,52 +0,0 @@
/* USER CODE BEGIN Header */
/**
******************************************************************************
* @file i2c.h
* @brief This file contains all the function prototypes for
* the i2c.c file
******************************************************************************
* @attention
*
* Copyright (c) 2024 STMicroelectronics.
* All rights reserved.
*
* This software is licensed under terms that can be found in the LICENSE file
* in the root directory of this software component.
* If no LICENSE file comes with this software, it is provided AS-IS.
*
******************************************************************************
*/
/* USER CODE END Header */
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __I2C_H__
#define __I2C_H__
#ifdef __cplusplus
extern "C" {
#endif
/* Includes ------------------------------------------------------------------*/
#include "main.h"
/* USER CODE BEGIN Includes */
/* USER CODE END Includes */
extern I2C_HandleTypeDef hi2c2;
/* USER CODE BEGIN Private defines */
/* USER CODE END Private defines */
void MX_I2C2_Init(void);
/* USER CODE BEGIN Prototypes */
/* USER CODE END Prototypes */
#ifdef __cplusplus
}
#endif
#endif /* __I2C_H__ */

View File

@ -77,10 +77,6 @@ void Error_Handler(void);
#define LED_G_TIM3CH3_GPIO_Port GPIOB
#define LED_R_TIM3CH4_Pin GPIO_PIN_1
#define LED_R_TIM3CH4_GPIO_Port GPIOB
#define MPU6050_SCL_Pin GPIO_PIN_10
#define MPU6050_SCL_GPIO_Port GPIOB
#define MPU6050_SDA_Pin GPIO_PIN_11
#define MPU6050_SDA_GPIO_Port GPIOB
#define LineSeek_R2_Pin GPIO_PIN_12
#define LineSeek_R2_GPIO_Port GPIOB
#define SERVO_Pin GPIO_PIN_11

View File

@ -46,7 +46,7 @@
/*#define HAL_ETH_MODULE_ENABLED */
/*#define HAL_FLASH_MODULE_ENABLED */
#define HAL_GPIO_MODULE_ENABLED
#define HAL_I2C_MODULE_ENABLED
/*#define HAL_I2C_MODULE_ENABLED */
/*#define HAL_I2S_MODULE_ENABLED */
/*#define HAL_IRDA_MODULE_ENABLED */
/*#define HAL_IWDG_MODULE_ENABLED */
@ -129,7 +129,7 @@
* @brief This is the HAL system configuration section
*/
#define VDD_VALUE 3300U /*!< Value of VDD in mv */
#define TICK_INT_PRIORITY 2U /*!< tick interrupt priority (lowest by default) */
#define TICK_INT_PRIORITY 3U /*!< tick interrupt priority (lowest by default) */
#define USE_RTOS 0U
#define PREFETCH_ENABLE 1U

View File

@ -56,8 +56,8 @@ void DebugMon_Handler(void);
void PendSV_Handler(void);
void SysTick_Handler(void);
void DMA1_Channel6_IRQHandler(void);
void DMA1_Channel7_IRQHandler(void);
void TIM2_IRQHandler(void);
void TIM3_IRQHandler(void);
void TIM4_IRQHandler(void);
void USART1_IRQHandler(void);
void USART2_IRQHandler(void);

View File

@ -8,11 +8,19 @@
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "usart.h"
#define DEFAULT_HUART 1
#define HUART1 (&huart1)
#define HUART2 (&huart2)
#if DEFAULT_HUART == 1
#define HUART HUART1
#else
#define HUART HUART2
#endif
// 条件编译,适配不同平台 (GNU, GCC)
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
@ -25,10 +33,7 @@
int _read(int file, char *ptr, int len);
int _write(int file, char *ptr, int len);
PUTCHAR_PROTOTYPE;
GETCHAR_PROTOTYPE;
void delay_us(uint16_t us);
int myprintf(const char *format, ...);
void my_printf(UART_HandleTypeDef *huart, const char *buf, ...);
#endif

127
Core/Src/delay.c Normal file
View File

@ -0,0 +1,127 @@
#include "main.h"
#define USE_HAL_LEGACY
#include "stm32_hal_legacy.h"
#define Timebase_Source_is_SysTick 1 //当Timebase Source为SysTick时改为1
//#define Timebase_Source_is_SysTick 0 //当使用FreeRTOSTimebase Source为其他定时器时改为0
#if (!Timebase_Source_is_SysTick)
extern TIM_HandleTypeDef htimx; //当使用FreeRTOSTimebase Source为其他定时器时修改为对应的定时器
#define Timebase_htim htimx
#define Delay_GetCounter() __HAL_TIM_GetCounter(&Timebase_htim)
#define Delay_GetAutoreload() __HAL_TIM_GetAutoreload(&Timebase_htim)
#else
#define Delay_GetCounter() (SysTick->VAL)
#define Delay_GetAutoreload() (SysTick->LOAD)
#endif
static uint16_t fac_us = 0;
static uint32_t fac_ms = 0;
/*初始化*/
void delay_init(void)
{
#if (!Timebase_Source_is_SysTick)
fac_ms = 1000000; //作为时基的计数器时钟频率在HAL_InitTick()中被设为了1MHz
fac_us = fac_ms / 1000;
#else
fac_ms = SystemCoreClock / 1000;
fac_us = fac_ms / 1000;
#endif
}
/*微秒级延时*/
void delay_us(uint32_t nus)
{
uint32_t ticks = 0;
uint32_t told = 0;
uint32_t tnow = 0;
uint32_t tcnt = 0;
uint32_t reload = 0;
reload = Delay_GetAutoreload();
ticks = nus * fac_us;
told = Delay_GetCounter();
while (1)
{
tnow = Delay_GetCounter();
if (tnow != told)
{
if (tnow < told)
{
tcnt += told - tnow;
}
else
{
tcnt += reload - tnow + told;
}
told = tnow;
if (tcnt >= ticks)
{
break;
}
}
}
}
/*毫秒级延时*/
void delay_ms(uint32_t nms)
{
uint32_t ticks = 0;
uint32_t told = 0;
uint32_t tnow = 0;
uint32_t tcnt = 0;
uint32_t reload = 0;
reload = Delay_GetAutoreload();
ticks = nms * fac_ms;
told = Delay_GetCounter();
while (1)
{
tnow = Delay_GetCounter();
if (tnow != told)
{
if (tnow < told)
{
tcnt += told - tnow;
}
else
{
tcnt += reload - tnow + told;
}
told = tnow;
if (tcnt >= ticks)
{
break;
}
}
}
}
/*重写HAL_Delay*/
void HAL_Delay(uint32_t Delay)
{
uint32_t tickstart = HAL_GetTick();
uint32_t wait = Delay;
/*不太明白官方源码为啥这么写会多延时1ms注释掉后更准*/
// /* Add a freq to guarantee minimum wait */
// if (wait < HAL_MAX_DELAY)
// {
// wait += (uint32_t)(uwTickFreq);
// }
while ((HAL_GetTick() - tickstart) < wait)
{
}
}

View File

@ -44,8 +44,11 @@ void MX_DMA_Init(void)
/* DMA interrupt init */
/* DMA1_Channel6_IRQn interrupt configuration */
HAL_NVIC_SetPriority(DMA1_Channel6_IRQn, 0, 0);
HAL_NVIC_SetPriority(DMA1_Channel6_IRQn, 3, 0);
HAL_NVIC_EnableIRQ(DMA1_Channel6_IRQn);
/* DMA1_Channel7_IRQn interrupt configuration */
HAL_NVIC_SetPriority(DMA1_Channel7_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(DMA1_Channel7_IRQn);
}

View File

@ -105,7 +105,7 @@ void MX_GPIO_Init(void)
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
/* EXTI interrupt init*/
HAL_NVIC_SetPriority(EXTI15_10_IRQn, 1, 0);
HAL_NVIC_SetPriority(EXTI15_10_IRQn, 2, 0);
HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);
}

View File

@ -1,114 +0,0 @@
/* USER CODE BEGIN Header */
/**
******************************************************************************
* @file i2c.c
* @brief This file provides code for the configuration
* of the I2C instances.
******************************************************************************
* @attention
*
* Copyright (c) 2024 STMicroelectronics.
* All rights reserved.
*
* This software is licensed under terms that can be found in the LICENSE file
* in the root directory of this software component.
* If no LICENSE file comes with this software, it is provided AS-IS.
*
******************************************************************************
*/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "i2c.h"
/* USER CODE BEGIN 0 */
/* USER CODE END 0 */
I2C_HandleTypeDef hi2c2;
/* I2C2 init function */
void MX_I2C2_Init(void)
{
/* USER CODE BEGIN I2C2_Init 0 */
/* USER CODE END I2C2_Init 0 */
/* USER CODE BEGIN I2C2_Init 1 */
/* USER CODE END I2C2_Init 1 */
hi2c2.Instance = I2C2;
hi2c2.Init.ClockSpeed = 100000;
hi2c2.Init.DutyCycle = I2C_DUTYCYCLE_2;
hi2c2.Init.OwnAddress1 = 0;
hi2c2.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
hi2c2.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
hi2c2.Init.OwnAddress2 = 0;
hi2c2.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
hi2c2.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
if (HAL_I2C_Init(&hi2c2) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN I2C2_Init 2 */
/* USER CODE END I2C2_Init 2 */
}
void HAL_I2C_MspInit(I2C_HandleTypeDef* i2cHandle)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
if(i2cHandle->Instance==I2C2)
{
/* USER CODE BEGIN I2C2_MspInit 0 */
/* USER CODE END I2C2_MspInit 0 */
__HAL_RCC_GPIOB_CLK_ENABLE();
/**I2C2 GPIO Configuration
PB10 ------> I2C2_SCL
PB11 ------> I2C2_SDA
*/
GPIO_InitStruct.Pin = MPU6050_SCL_Pin|MPU6050_SDA_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
/* I2C2 clock enable */
__HAL_RCC_I2C2_CLK_ENABLE();
/* USER CODE BEGIN I2C2_MspInit 1 */
/* USER CODE END I2C2_MspInit 1 */
}
}
void HAL_I2C_MspDeInit(I2C_HandleTypeDef* i2cHandle)
{
if(i2cHandle->Instance==I2C2)
{
/* USER CODE BEGIN I2C2_MspDeInit 0 */
/* USER CODE END I2C2_MspDeInit 0 */
/* Peripheral clock disable */
__HAL_RCC_I2C2_CLK_DISABLE();
/**I2C2 GPIO Configuration
PB10 ------> I2C2_SCL
PB11 ------> I2C2_SDA
*/
HAL_GPIO_DeInit(MPU6050_SCL_GPIO_Port, MPU6050_SCL_Pin);
HAL_GPIO_DeInit(MPU6050_SDA_GPIO_Port, MPU6050_SDA_Pin);
/* USER CODE BEGIN I2C2_MspDeInit 1 */
/* USER CODE END I2C2_MspDeInit 1 */
}
}
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */

View File

@ -21,19 +21,24 @@
#include "dma.h"
#include "gpio.h"
#include "i2c.h"
#include "tim.h"
#include "usart.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "app_bus.h"
#include "app_line_seek.h"
#include "block_detect.h"
#include "bluetooth.h"
#include "buzzer.h"
#include "delay.h"
#include "hcsr04.h"
#include "led.h"
#include "motor.h"
#include "path_plan.h"
#include "servo.h"
#include "syscalls.h"
#include "timer.h"
/* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/
@ -54,7 +59,11 @@
/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN PV */
int printf_event_id = -1;
void Print(uint16_t time)
{
printf("timed print: %d\n", time);
}
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
@ -78,8 +87,8 @@ void SystemClock_Config(void);
int main(void)
{
/* USER CODE BEGIN 1 */
uint8_t pData[10] = {1, 2, 3};
int i = 0;
char pData[] = "hello world";
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
@ -101,42 +110,63 @@ int main(void)
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_DMA_Init();
MX_I2C2_Init();
MX_TIM1_Init();
MX_TIM2_Init();
MX_TIM3_Init();
MX_TIM4_Init();
MX_USART1_UART_Init();
// MX_USART2_UART_Init();
// MX_USART1_UART_Init();
MX_USART2_UART_Init();
/* USER CODE BEGIN 2 */
HAL_Delay(500);
delay_init();
TIMER_Init();
HC_SR04_Init();
BLUETOOTH_Init();
MOTOR_Init();
PathPlanner_Init();
LineSeek_Init();
BlockDetect_Init();
SERVO_Init();
SERVO_Rotate(90);
HAL_Delay(2000);
// BUZZER_StartNTimes(20, 500, 500);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
// my_printf(HUART1, "%s\r\n", *pData);
// printf("printf: %s \r\n", pData);
// myprintf("myprintf: %s \r\n", pData);
// BUZZER_StartTimed(5);
// HAL_Delay(1000);
// my_printf(HUART1, "HUART1: %s \r\n", pData);
// my_printf(HUART2, "HUART2: %s \r\n", pData);
// if (HAL_OK == HAL_UART_Receive(&huart2, (uint8_t *)pData, 2, 1000))
// {
// HAL_UART_Transmit(&huart2, (uint8_t *)pData, sizeof(pData), 1000);
// HAL_UART_Transmit(&huart1, (uint8_t *)pData, sizeof(pData), 1000);
// HAL_Delay(500);
// }
// HAL_Delay(2000);
// printf("printf: %s \r\n", pData);
App_Bus();
App_LineSeek();
// BUZZER_StartTimed(1000);
// HAL_Delay(3000);
// printf("ruunning\n");
// BUZZER_StartNTimes(5, 500, 500);
// HAL_Delay(5000);
// App_LineSeek();
// MOTOR_SetDuty(-20,20);
// HAL_Delay(300); // 延时300毫秒
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */

View File

@ -56,9 +56,9 @@
/* External variables --------------------------------------------------------*/
extern TIM_HandleTypeDef htim2;
extern TIM_HandleTypeDef htim3;
extern TIM_HandleTypeDef htim4;
extern DMA_HandleTypeDef hdma_usart2_rx;
extern DMA_HandleTypeDef hdma_usart2_tx;
extern UART_HandleTypeDef huart1;
extern UART_HandleTypeDef huart2;
/* USER CODE BEGIN EV */
@ -217,6 +217,20 @@ void DMA1_Channel6_IRQHandler(void)
/* USER CODE END DMA1_Channel6_IRQn 1 */
}
/**
* @brief This function handles DMA1 channel7 global interrupt.
*/
void DMA1_Channel7_IRQHandler(void)
{
/* USER CODE BEGIN DMA1_Channel7_IRQn 0 */
/* USER CODE END DMA1_Channel7_IRQn 0 */
HAL_DMA_IRQHandler(&hdma_usart2_tx);
/* USER CODE BEGIN DMA1_Channel7_IRQn 1 */
/* USER CODE END DMA1_Channel7_IRQn 1 */
}
/**
* @brief This function handles TIM2 global interrupt.
*/
@ -231,20 +245,6 @@ void TIM2_IRQHandler(void)
/* USER CODE END TIM2_IRQn 1 */
}
/**
* @brief This function handles TIM3 global interrupt.
*/
void TIM3_IRQHandler(void)
{
/* USER CODE BEGIN TIM3_IRQn 0 */
/* USER CODE END TIM3_IRQn 0 */
HAL_TIM_IRQHandler(&htim3);
/* USER CODE BEGIN TIM3_IRQn 1 */
/* USER CODE END TIM3_IRQn 1 */
}
/**
* @brief This function handles TIM4 global interrupt.
*/

View File

@ -1,7 +1,7 @@
#include "syscalls.h"
extern UART_HandleTypeDef huart1;
volatile uint8_t usart_dma_tx_over = 1;
// 条件编译,适配不同平台 (GNU, GCC)
#ifdef __GNUC__
@ -42,7 +42,7 @@ __attribute__((weak)) int _write(int file, char *ptr, int len)
*/
PUTCHAR_PROTOTYPE
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, HAL_MAX_DELAY); // 阻塞式无限等待
HAL_UART_Transmit(HUART, (uint8_t *)&ch, 1, HAL_MAX_DELAY);
return ch;
}
@ -58,20 +58,47 @@ PUTCHAR_PROTOTYPE
GETCHAR_PROTOTYPE
{
uint8_t ch = 0;
HAL_UART_Receive(&huart1, (uint8_t *)&ch, 1, HAL_MAX_DELAY);
HAL_UART_Receive(HUART, (uint8_t *)&ch, 1, HAL_MAX_DELAY);
return ch;
}
void delay_us(uint16_t us)
// 串口发送完毕回调函数设置usart_dma_tx_over标志为1
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
uint32_t delay = (HAL_RCC_GetHCLKFreq() / 4000000 * us);
while (delay--);
#if DEFAULT_HUART == 1
if (huart->Instance == USART1)
#else
if (huart->Instance == USART2)
#endif
{
usart_dma_tx_over = 1;
}
}
/**
* @brief printf
* @param huart, buf
* @return void
* @brief printf使DEFAULT_HUARTDMA串口中断方式发送
*
* @usage my_printf(HUART1, "USART1_Target:\r\n");
*/
int myprintf(const char *format, ...)
{
va_list arg;
static char SendBuff[256] = {0};
int rv;
while (!usart_dma_tx_over); // 等待前一次DMA发送完成
va_start(arg, format);
rv = vsnprintf((char *)SendBuff, sizeof(SendBuff) + 1, (char *)format, arg);
va_end(arg);
HAL_UART_Transmit_DMA(HUART, (uint8_t *)SendBuff, rv);
usart_dma_tx_over = 0; // 清0全局标志发送完成后重新置1
return rv;
}
/**
* @brief printf,
*
* @usage my_printf(HUART1, "USART1_Target:\r\n");
*/

View File

@ -218,7 +218,7 @@ void MX_TIM4_Init(void)
htim4.Instance = TIM4;
htim4.Init.Prescaler = 720 - 1;
htim4.Init.CounterMode = TIM_COUNTERMODE_UP;
htim4.Init.Period = 100;
htim4.Init.Period = 100 - 1;
htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim4.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
if (HAL_TIM_Base_Init(&htim4) != HAL_OK)
@ -241,7 +241,7 @@ void MX_TIM4_Init(void)
Error_Handler();
}
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 100;
sConfigOC.Pulse = 0;
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
if (HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
@ -295,10 +295,6 @@ void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
/* USER CODE END TIM3_MspInit 0 */
/* TIM3 clock enable */
__HAL_RCC_TIM3_CLK_ENABLE();
/* TIM3 interrupt Init */
HAL_NVIC_SetPriority(TIM3_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(TIM3_IRQn);
/* USER CODE BEGIN TIM3_MspInit 1 */
/* USER CODE END TIM3_MspInit 1 */
@ -312,7 +308,7 @@ void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
__HAL_RCC_TIM4_CLK_ENABLE();
/* TIM4 interrupt Init */
HAL_NVIC_SetPriority(TIM4_IRQn, 0, 0);
HAL_NVIC_SetPriority(TIM4_IRQn, 1, 0);
HAL_NVIC_EnableIRQ(TIM4_IRQn);
/* USER CODE BEGIN TIM4_MspInit 1 */
@ -426,9 +422,6 @@ void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* tim_baseHandle)
/* USER CODE END TIM3_MspDeInit 0 */
/* Peripheral clock disable */
__HAL_RCC_TIM3_CLK_DISABLE();
/* TIM3 interrupt Deinit */
HAL_NVIC_DisableIRQ(TIM3_IRQn);
/* USER CODE BEGIN TIM3_MspDeInit 1 */
/* USER CODE END TIM3_MspDeInit 1 */

View File

@ -26,7 +26,9 @@
UART_HandleTypeDef huart1;
UART_HandleTypeDef huart2;
DMA_HandleTypeDef hdma_usart1_tx;
DMA_HandleTypeDef hdma_usart2_rx;
DMA_HandleTypeDef hdma_usart2_tx;
/* USART1 init function */
@ -41,7 +43,7 @@ void MX_USART1_UART_Init(void)
/* USER CODE END USART1_Init 1 */
huart1.Instance = USART1;
huart1.Init.BaudRate = 115200;
huart1.Init.BaudRate = 9600;
huart1.Init.WordLength = UART_WORDLENGTH_8B;
huart1.Init.StopBits = UART_STOPBITS_1;
huart1.Init.Parity = UART_PARITY_NONE;
@ -114,6 +116,23 @@ void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* USART1 DMA Init */
/* USART1_TX Init */
hdma_usart1_tx.Instance = DMA1_Channel4;
hdma_usart1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
hdma_usart1_tx.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_usart1_tx.Init.MemInc = DMA_MINC_ENABLE;
hdma_usart1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
hdma_usart1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
hdma_usart1_tx.Init.Mode = DMA_NORMAL;
hdma_usart1_tx.Init.Priority = DMA_PRIORITY_LOW;
if (HAL_DMA_Init(&hdma_usart1_tx) != HAL_OK)
{
Error_Handler();
}
__HAL_LINKDMA(uartHandle,hdmatx,hdma_usart1_tx);
/* USART1 interrupt Init */
HAL_NVIC_SetPriority(USART1_IRQn, 3, 1);
HAL_NVIC_EnableIRQ(USART1_IRQn);
@ -161,6 +180,22 @@ void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
__HAL_LINKDMA(uartHandle,hdmarx,hdma_usart2_rx);
/* USART2_TX Init */
hdma_usart2_tx.Instance = DMA1_Channel7;
hdma_usart2_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
hdma_usart2_tx.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_usart2_tx.Init.MemInc = DMA_MINC_ENABLE;
hdma_usart2_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
hdma_usart2_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
hdma_usart2_tx.Init.Mode = DMA_NORMAL;
hdma_usart2_tx.Init.Priority = DMA_PRIORITY_MEDIUM;
if (HAL_DMA_Init(&hdma_usart2_tx) != HAL_OK)
{
Error_Handler();
}
__HAL_LINKDMA(uartHandle,hdmatx,hdma_usart2_tx);
/* USART2 interrupt Init */
HAL_NVIC_SetPriority(USART2_IRQn, 3, 0);
HAL_NVIC_EnableIRQ(USART2_IRQn);
@ -187,6 +222,9 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef* uartHandle)
*/
HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9|GPIO_PIN_10);
/* USART1 DMA DeInit */
HAL_DMA_DeInit(uartHandle->hdmatx);
/* USART1 interrupt Deinit */
HAL_NVIC_DisableIRQ(USART1_IRQn);
/* USER CODE BEGIN USART1_MspDeInit 1 */
@ -209,6 +247,7 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef* uartHandle)
/* USART2 DMA DeInit */
HAL_DMA_DeInit(uartHandle->hdmarx);
HAL_DMA_DeInit(uartHandle->hdmatx);
/* USART2 interrupt Deinit */
HAL_NVIC_DisableIRQ(USART2_IRQn);

View File

@ -1,738 +0,0 @@
/**
******************************************************************************
* @file stm32f1xx_hal_i2c.h
* @author MCD Application Team
* @brief Header file of I2C HAL module.
******************************************************************************
* @attention
*
* Copyright (c) 2016 STMicroelectronics.
* All rights reserved.
*
* This software is licensed under terms that can be found in the LICENSE file
* in the root directory of this software component.
* If no LICENSE file comes with this software, it is provided AS-IS.
*
******************************************************************************
*/
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __STM32F1xx_HAL_I2C_H
#define __STM32F1xx_HAL_I2C_H
#ifdef __cplusplus
extern "C" {
#endif
/* Includes ------------------------------------------------------------------*/
#include "stm32f1xx_hal_def.h"
/** @addtogroup STM32F1xx_HAL_Driver
* @{
*/
/** @addtogroup I2C
* @{
*/
/* Exported types ------------------------------------------------------------*/
/** @defgroup I2C_Exported_Types I2C Exported Types
* @{
*/
/** @defgroup I2C_Configuration_Structure_definition I2C Configuration Structure definition
* @brief I2C Configuration Structure definition
* @{
*/
typedef struct
{
uint32_t ClockSpeed; /*!< Specifies the clock frequency.
This parameter must be set to a value lower than 400kHz */
uint32_t DutyCycle; /*!< Specifies the I2C fast mode duty cycle.
This parameter can be a value of @ref I2C_duty_cycle_in_fast_mode */
uint32_t OwnAddress1; /*!< Specifies the first device own address.
This parameter can be a 7-bit or 10-bit address. */
uint32_t AddressingMode; /*!< Specifies if 7-bit or 10-bit addressing mode is selected.
This parameter can be a value of @ref I2C_addressing_mode */
uint32_t DualAddressMode; /*!< Specifies if dual addressing mode is selected.
This parameter can be a value of @ref I2C_dual_addressing_mode */
uint32_t OwnAddress2; /*!< Specifies the second device own address if dual addressing mode is selected
This parameter can be a 7-bit address. */
uint32_t GeneralCallMode; /*!< Specifies if general call mode is selected.
This parameter can be a value of @ref I2C_general_call_addressing_mode */
uint32_t NoStretchMode; /*!< Specifies if nostretch mode is selected.
This parameter can be a value of @ref I2C_nostretch_mode */
} I2C_InitTypeDef;
/**
* @}
*/
/** @defgroup HAL_state_structure_definition HAL state structure definition
* @brief HAL State structure definition
* @note HAL I2C State value coding follow below described bitmap :
* b7-b6 Error information
* 00 : No Error
* 01 : Abort (Abort user request on going)
* 10 : Timeout
* 11 : Error
* b5 Peripheral initialization status
* 0 : Reset (Peripheral not initialized)
* 1 : Init done (Peripheral initialized and ready to use. HAL I2C Init function called)
* b4 (not used)
* x : Should be set to 0
* b3
* 0 : Ready or Busy (No Listen mode ongoing)
* 1 : Listen (Peripheral in Address Listen Mode)
* b2 Intrinsic process state
* 0 : Ready
* 1 : Busy (Peripheral busy with some configuration or internal operations)
* b1 Rx state
* 0 : Ready (no Rx operation ongoing)
* 1 : Busy (Rx operation ongoing)
* b0 Tx state
* 0 : Ready (no Tx operation ongoing)
* 1 : Busy (Tx operation ongoing)
* @{
*/
typedef enum
{
HAL_I2C_STATE_RESET = 0x00U, /*!< Peripheral is not yet Initialized */
HAL_I2C_STATE_READY = 0x20U, /*!< Peripheral Initialized and ready for use */
HAL_I2C_STATE_BUSY = 0x24U, /*!< An internal process is ongoing */
HAL_I2C_STATE_BUSY_TX = 0x21U, /*!< Data Transmission process is ongoing */
HAL_I2C_STATE_BUSY_RX = 0x22U, /*!< Data Reception process is ongoing */
HAL_I2C_STATE_LISTEN = 0x28U, /*!< Address Listen Mode is ongoing */
HAL_I2C_STATE_BUSY_TX_LISTEN = 0x29U, /*!< Address Listen Mode and Data Transmission
process is ongoing */
HAL_I2C_STATE_BUSY_RX_LISTEN = 0x2AU, /*!< Address Listen Mode and Data Reception
process is ongoing */
HAL_I2C_STATE_ABORT = 0x60U, /*!< Abort user request ongoing */
HAL_I2C_STATE_TIMEOUT = 0xA0U, /*!< Timeout state */
HAL_I2C_STATE_ERROR = 0xE0U /*!< Error */
} HAL_I2C_StateTypeDef;
/**
* @}
*/
/** @defgroup HAL_mode_structure_definition HAL mode structure definition
* @brief HAL Mode structure definition
* @note HAL I2C Mode value coding follow below described bitmap :\n
* b7 (not used)\n
* x : Should be set to 0\n
* b6\n
* 0 : None\n
* 1 : Memory (HAL I2C communication is in Memory Mode)\n
* b5\n
* 0 : None\n
* 1 : Slave (HAL I2C communication is in Slave Mode)\n
* b4\n
* 0 : None\n
* 1 : Master (HAL I2C communication is in Master Mode)\n
* b3-b2-b1-b0 (not used)\n
* xxxx : Should be set to 0000
* @{
*/
typedef enum
{
HAL_I2C_MODE_NONE = 0x00U, /*!< No I2C communication on going */
HAL_I2C_MODE_MASTER = 0x10U, /*!< I2C communication is in Master Mode */
HAL_I2C_MODE_SLAVE = 0x20U, /*!< I2C communication is in Slave Mode */
HAL_I2C_MODE_MEM = 0x40U /*!< I2C communication is in Memory Mode */
} HAL_I2C_ModeTypeDef;
/**
* @}
*/
/** @defgroup I2C_Error_Code_definition I2C Error Code definition
* @brief I2C Error Code definition
* @{
*/
#define HAL_I2C_ERROR_NONE 0x00000000U /*!< No error */
#define HAL_I2C_ERROR_BERR 0x00000001U /*!< BERR error */
#define HAL_I2C_ERROR_ARLO 0x00000002U /*!< ARLO error */
#define HAL_I2C_ERROR_AF 0x00000004U /*!< AF error */
#define HAL_I2C_ERROR_OVR 0x00000008U /*!< OVR error */
#define HAL_I2C_ERROR_DMA 0x00000010U /*!< DMA transfer error */
#define HAL_I2C_ERROR_TIMEOUT 0x00000020U /*!< Timeout Error */
#define HAL_I2C_ERROR_SIZE 0x00000040U /*!< Size Management error */
#define HAL_I2C_ERROR_DMA_PARAM 0x00000080U /*!< DMA Parameter Error */
#define HAL_I2C_WRONG_START 0x00000200U /*!< Wrong start Error */
#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
#define HAL_I2C_ERROR_INVALID_CALLBACK 0x00000100U /*!< Invalid Callback error */
#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */
/**
* @}
*/
/** @defgroup I2C_handle_Structure_definition I2C handle Structure definition
* @brief I2C handle Structure definition
* @{
*/
#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
typedef struct __I2C_HandleTypeDef
#else
typedef struct
#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */
{
I2C_TypeDef *Instance; /*!< I2C registers base address */
I2C_InitTypeDef Init; /*!< I2C communication parameters */
uint8_t *pBuffPtr; /*!< Pointer to I2C transfer buffer */
uint16_t XferSize; /*!< I2C transfer size */
__IO uint16_t XferCount; /*!< I2C transfer counter */
__IO uint32_t XferOptions; /*!< I2C transfer options */
__IO uint32_t PreviousState; /*!< I2C communication Previous state and mode
context for internal usage */
DMA_HandleTypeDef *hdmatx; /*!< I2C Tx DMA handle parameters */
DMA_HandleTypeDef *hdmarx; /*!< I2C Rx DMA handle parameters */
HAL_LockTypeDef Lock; /*!< I2C locking object */
__IO HAL_I2C_StateTypeDef State; /*!< I2C communication state */
__IO HAL_I2C_ModeTypeDef Mode; /*!< I2C communication mode */
__IO uint32_t ErrorCode; /*!< I2C Error code */
__IO uint32_t Devaddress; /*!< I2C Target device address */
__IO uint32_t Memaddress; /*!< I2C Target memory address */
__IO uint32_t MemaddSize; /*!< I2C Target memory address size */
__IO uint32_t EventCount; /*!< I2C Event counter */
#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
void (* MasterTxCpltCallback)(struct __I2C_HandleTypeDef *hi2c); /*!< I2C Master Tx Transfer completed callback */
void (* MasterRxCpltCallback)(struct __I2C_HandleTypeDef *hi2c); /*!< I2C Master Rx Transfer completed callback */
void (* SlaveTxCpltCallback)(struct __I2C_HandleTypeDef *hi2c); /*!< I2C Slave Tx Transfer completed callback */
void (* SlaveRxCpltCallback)(struct __I2C_HandleTypeDef *hi2c); /*!< I2C Slave Rx Transfer completed callback */
void (* ListenCpltCallback)(struct __I2C_HandleTypeDef *hi2c); /*!< I2C Listen Complete callback */
void (* MemTxCpltCallback)(struct __I2C_HandleTypeDef *hi2c); /*!< I2C Memory Tx Transfer completed callback */
void (* MemRxCpltCallback)(struct __I2C_HandleTypeDef *hi2c); /*!< I2C Memory Rx Transfer completed callback */
void (* ErrorCallback)(struct __I2C_HandleTypeDef *hi2c); /*!< I2C Error callback */
void (* AbortCpltCallback)(struct __I2C_HandleTypeDef *hi2c); /*!< I2C Abort callback */
void (* AddrCallback)(struct __I2C_HandleTypeDef *hi2c, uint8_t TransferDirection, uint16_t AddrMatchCode); /*!< I2C Slave Address Match callback */
void (* MspInitCallback)(struct __I2C_HandleTypeDef *hi2c); /*!< I2C Msp Init callback */
void (* MspDeInitCallback)(struct __I2C_HandleTypeDef *hi2c); /*!< I2C Msp DeInit callback */
#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */
} I2C_HandleTypeDef;
#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
/**
* @brief HAL I2C Callback ID enumeration definition
*/
typedef enum
{
HAL_I2C_MASTER_TX_COMPLETE_CB_ID = 0x00U, /*!< I2C Master Tx Transfer completed callback ID */
HAL_I2C_MASTER_RX_COMPLETE_CB_ID = 0x01U, /*!< I2C Master Rx Transfer completed callback ID */
HAL_I2C_SLAVE_TX_COMPLETE_CB_ID = 0x02U, /*!< I2C Slave Tx Transfer completed callback ID */
HAL_I2C_SLAVE_RX_COMPLETE_CB_ID = 0x03U, /*!< I2C Slave Rx Transfer completed callback ID */
HAL_I2C_LISTEN_COMPLETE_CB_ID = 0x04U, /*!< I2C Listen Complete callback ID */
HAL_I2C_MEM_TX_COMPLETE_CB_ID = 0x05U, /*!< I2C Memory Tx Transfer callback ID */
HAL_I2C_MEM_RX_COMPLETE_CB_ID = 0x06U, /*!< I2C Memory Rx Transfer completed callback ID */
HAL_I2C_ERROR_CB_ID = 0x07U, /*!< I2C Error callback ID */
HAL_I2C_ABORT_CB_ID = 0x08U, /*!< I2C Abort callback ID */
HAL_I2C_MSPINIT_CB_ID = 0x09U, /*!< I2C Msp Init callback ID */
HAL_I2C_MSPDEINIT_CB_ID = 0x0AU /*!< I2C Msp DeInit callback ID */
} HAL_I2C_CallbackIDTypeDef;
/**
* @brief HAL I2C Callback pointer definition
*/
typedef void (*pI2C_CallbackTypeDef)(I2C_HandleTypeDef *hi2c); /*!< pointer to an I2C callback function */
typedef void (*pI2C_AddrCallbackTypeDef)(I2C_HandleTypeDef *hi2c, uint8_t TransferDirection, uint16_t AddrMatchCode); /*!< pointer to an I2C Address Match callback function */
#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */
/**
* @}
*/
/**
* @}
*/
/* Exported constants --------------------------------------------------------*/
/** @defgroup I2C_Exported_Constants I2C Exported Constants
* @{
*/
/** @defgroup I2C_duty_cycle_in_fast_mode I2C duty cycle in fast mode
* @{
*/
#define I2C_DUTYCYCLE_2 0x00000000U
#define I2C_DUTYCYCLE_16_9 I2C_CCR_DUTY
/**
* @}
*/
/** @defgroup I2C_addressing_mode I2C addressing mode
* @{
*/
#define I2C_ADDRESSINGMODE_7BIT 0x00004000U
#define I2C_ADDRESSINGMODE_10BIT (I2C_OAR1_ADDMODE | 0x00004000U)
/**
* @}
*/
/** @defgroup I2C_dual_addressing_mode I2C dual addressing mode
* @{
*/
#define I2C_DUALADDRESS_DISABLE 0x00000000U
#define I2C_DUALADDRESS_ENABLE I2C_OAR2_ENDUAL
/**
* @}
*/
/** @defgroup I2C_general_call_addressing_mode I2C general call addressing mode
* @{
*/
#define I2C_GENERALCALL_DISABLE 0x00000000U
#define I2C_GENERALCALL_ENABLE I2C_CR1_ENGC
/**
* @}
*/
/** @defgroup I2C_nostretch_mode I2C nostretch mode
* @{
*/
#define I2C_NOSTRETCH_DISABLE 0x00000000U
#define I2C_NOSTRETCH_ENABLE I2C_CR1_NOSTRETCH
/**
* @}
*/
/** @defgroup I2C_Memory_Address_Size I2C Memory Address Size
* @{
*/
#define I2C_MEMADD_SIZE_8BIT 0x00000001U
#define I2C_MEMADD_SIZE_16BIT 0x00000010U
/**
* @}
*/
/** @defgroup I2C_XferDirection_definition I2C XferDirection definition
* @{
*/
#define I2C_DIRECTION_RECEIVE 0x00000000U
#define I2C_DIRECTION_TRANSMIT 0x00000001U
/**
* @}
*/
/** @defgroup I2C_XferOptions_definition I2C XferOptions definition
* @{
*/
#define I2C_FIRST_FRAME 0x00000001U
#define I2C_FIRST_AND_NEXT_FRAME 0x00000002U
#define I2C_NEXT_FRAME 0x00000004U
#define I2C_FIRST_AND_LAST_FRAME 0x00000008U
#define I2C_LAST_FRAME_NO_STOP 0x00000010U
#define I2C_LAST_FRAME 0x00000020U
/* List of XferOptions in usage of :
* 1- Restart condition in all use cases (direction change or not)
*/
#define I2C_OTHER_FRAME (0x00AA0000U)
#define I2C_OTHER_AND_LAST_FRAME (0xAA000000U)
/**
* @}
*/
/** @defgroup I2C_Interrupt_configuration_definition I2C Interrupt configuration definition
* @brief I2C Interrupt definition
* Elements values convention: 0xXXXXXXXX
* - XXXXXXXX : Interrupt control mask
* @{
*/
#define I2C_IT_BUF I2C_CR2_ITBUFEN
#define I2C_IT_EVT I2C_CR2_ITEVTEN
#define I2C_IT_ERR I2C_CR2_ITERREN
/**
* @}
*/
/** @defgroup I2C_Flag_definition I2C Flag definition
* @{
*/
#define I2C_FLAG_OVR 0x00010800U
#define I2C_FLAG_AF 0x00010400U
#define I2C_FLAG_ARLO 0x00010200U
#define I2C_FLAG_BERR 0x00010100U
#define I2C_FLAG_TXE 0x00010080U
#define I2C_FLAG_RXNE 0x00010040U
#define I2C_FLAG_STOPF 0x00010010U
#define I2C_FLAG_ADD10 0x00010008U
#define I2C_FLAG_BTF 0x00010004U
#define I2C_FLAG_ADDR 0x00010002U
#define I2C_FLAG_SB 0x00010001U
#define I2C_FLAG_DUALF 0x00100080U
#define I2C_FLAG_GENCALL 0x00100010U
#define I2C_FLAG_TRA 0x00100004U
#define I2C_FLAG_BUSY 0x00100002U
#define I2C_FLAG_MSL 0x00100001U
/**
* @}
*/
/**
* @}
*/
/* Exported macros -----------------------------------------------------------*/
/** @defgroup I2C_Exported_Macros I2C Exported Macros
* @{
*/
/** @brief Reset I2C handle state.
* @param __HANDLE__ specifies the I2C Handle.
* @retval None
*/
#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
#define __HAL_I2C_RESET_HANDLE_STATE(__HANDLE__) do{ \
(__HANDLE__)->State = HAL_I2C_STATE_RESET; \
(__HANDLE__)->MspInitCallback = NULL; \
(__HANDLE__)->MspDeInitCallback = NULL; \
} while(0)
#else
#define __HAL_I2C_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->State = HAL_I2C_STATE_RESET)
#endif
/** @brief Enable or disable the specified I2C interrupts.
* @param __HANDLE__ specifies the I2C Handle.
* @param __INTERRUPT__ specifies the interrupt source to enable or disable.
* This parameter can be one of the following values:
* @arg I2C_IT_BUF: Buffer interrupt enable
* @arg I2C_IT_EVT: Event interrupt enable
* @arg I2C_IT_ERR: Error interrupt enable
* @retval None
*/
#define __HAL_I2C_ENABLE_IT(__HANDLE__, __INTERRUPT__) SET_BIT((__HANDLE__)->Instance->CR2,(__INTERRUPT__))
#define __HAL_I2C_DISABLE_IT(__HANDLE__, __INTERRUPT__) CLEAR_BIT((__HANDLE__)->Instance->CR2, (__INTERRUPT__))
/** @brief Checks if the specified I2C interrupt source is enabled or disabled.
* @param __HANDLE__ specifies the I2C Handle.
* @param __INTERRUPT__ specifies the I2C interrupt source to check.
* This parameter can be one of the following values:
* @arg I2C_IT_BUF: Buffer interrupt enable
* @arg I2C_IT_EVT: Event interrupt enable
* @arg I2C_IT_ERR: Error interrupt enable
* @retval The new state of __INTERRUPT__ (TRUE or FALSE).
*/
#define __HAL_I2C_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) ((((__HANDLE__)->Instance->CR2 & (__INTERRUPT__)) == (__INTERRUPT__)) ? SET : RESET)
/** @brief Checks whether the specified I2C flag is set or not.
* @param __HANDLE__ specifies the I2C Handle.
* @param __FLAG__ specifies the flag to check.
* This parameter can be one of the following values:
* @arg I2C_FLAG_OVR: Overrun/Underrun flag
* @arg I2C_FLAG_AF: Acknowledge failure flag
* @arg I2C_FLAG_ARLO: Arbitration lost flag
* @arg I2C_FLAG_BERR: Bus error flag
* @arg I2C_FLAG_TXE: Data register empty flag
* @arg I2C_FLAG_RXNE: Data register not empty flag
* @arg I2C_FLAG_STOPF: Stop detection flag
* @arg I2C_FLAG_ADD10: 10-bit header sent flag
* @arg I2C_FLAG_BTF: Byte transfer finished flag
* @arg I2C_FLAG_ADDR: Address sent flag
* Address matched flag
* @arg I2C_FLAG_SB: Start bit flag
* @arg I2C_FLAG_DUALF: Dual flag
* @arg I2C_FLAG_GENCALL: General call header flag
* @arg I2C_FLAG_TRA: Transmitter/Receiver flag
* @arg I2C_FLAG_BUSY: Bus busy flag
* @arg I2C_FLAG_MSL: Master/Slave flag
* @retval The new state of __FLAG__ (TRUE or FALSE).
*/
#define __HAL_I2C_GET_FLAG(__HANDLE__, __FLAG__) ((((uint8_t)((__FLAG__) >> 16U)) == 0x01U) ? \
(((((__HANDLE__)->Instance->SR1) & ((__FLAG__) & I2C_FLAG_MASK)) == ((__FLAG__) & I2C_FLAG_MASK)) ? SET : RESET) : \
(((((__HANDLE__)->Instance->SR2) & ((__FLAG__) & I2C_FLAG_MASK)) == ((__FLAG__) & I2C_FLAG_MASK)) ? SET : RESET))
/** @brief Clears the I2C pending flags which are cleared by writing 0 in a specific bit.
* @param __HANDLE__ specifies the I2C Handle.
* @param __FLAG__ specifies the flag to clear.
* This parameter can be any combination of the following values:
* @arg I2C_FLAG_OVR: Overrun/Underrun flag (Slave mode)
* @arg I2C_FLAG_AF: Acknowledge failure flag
* @arg I2C_FLAG_ARLO: Arbitration lost flag (Master mode)
* @arg I2C_FLAG_BERR: Bus error flag
* @retval None
*/
#define __HAL_I2C_CLEAR_FLAG(__HANDLE__, __FLAG__) ((__HANDLE__)->Instance->SR1 = ~((__FLAG__) & I2C_FLAG_MASK))
/** @brief Clears the I2C ADDR pending flag.
* @param __HANDLE__ specifies the I2C Handle.
* This parameter can be I2C where x: 1, 2, or 3 to select the I2C peripheral.
* @retval None
*/
#define __HAL_I2C_CLEAR_ADDRFLAG(__HANDLE__) \
do{ \
__IO uint32_t tmpreg = 0x00U; \
tmpreg = (__HANDLE__)->Instance->SR1; \
tmpreg = (__HANDLE__)->Instance->SR2; \
UNUSED(tmpreg); \
} while(0)
/** @brief Clears the I2C STOPF pending flag.
* @param __HANDLE__ specifies the I2C Handle.
* @retval None
*/
#define __HAL_I2C_CLEAR_STOPFLAG(__HANDLE__) \
do{ \
__IO uint32_t tmpreg = 0x00U; \
tmpreg = (__HANDLE__)->Instance->SR1; \
SET_BIT((__HANDLE__)->Instance->CR1, I2C_CR1_PE); \
UNUSED(tmpreg); \
} while(0)
/** @brief Enable the specified I2C peripheral.
* @param __HANDLE__ specifies the I2C Handle.
* @retval None
*/
#define __HAL_I2C_ENABLE(__HANDLE__) SET_BIT((__HANDLE__)->Instance->CR1, I2C_CR1_PE)
/** @brief Disable the specified I2C peripheral.
* @param __HANDLE__ specifies the I2C Handle.
* @retval None
*/
#define __HAL_I2C_DISABLE(__HANDLE__) CLEAR_BIT((__HANDLE__)->Instance->CR1, I2C_CR1_PE)
/**
* @}
*/
/* Exported functions --------------------------------------------------------*/
/** @addtogroup I2C_Exported_Functions
* @{
*/
/** @addtogroup I2C_Exported_Functions_Group1 Initialization and de-initialization functions
* @{
*/
/* Initialization and de-initialization functions******************************/
HAL_StatusTypeDef HAL_I2C_Init(I2C_HandleTypeDef *hi2c);
HAL_StatusTypeDef HAL_I2C_DeInit(I2C_HandleTypeDef *hi2c);
void HAL_I2C_MspInit(I2C_HandleTypeDef *hi2c);
void HAL_I2C_MspDeInit(I2C_HandleTypeDef *hi2c);
/* Callbacks Register/UnRegister functions ***********************************/
#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
HAL_StatusTypeDef HAL_I2C_RegisterCallback(I2C_HandleTypeDef *hi2c, HAL_I2C_CallbackIDTypeDef CallbackID, pI2C_CallbackTypeDef pCallback);
HAL_StatusTypeDef HAL_I2C_UnRegisterCallback(I2C_HandleTypeDef *hi2c, HAL_I2C_CallbackIDTypeDef CallbackID);
HAL_StatusTypeDef HAL_I2C_RegisterAddrCallback(I2C_HandleTypeDef *hi2c, pI2C_AddrCallbackTypeDef pCallback);
HAL_StatusTypeDef HAL_I2C_UnRegisterAddrCallback(I2C_HandleTypeDef *hi2c);
#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */
/**
* @}
*/
/** @addtogroup I2C_Exported_Functions_Group2 Input and Output operation functions
* @{
*/
/* IO operation functions ****************************************************/
/******* Blocking mode: Polling */
HAL_StatusTypeDef HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout);
HAL_StatusTypeDef HAL_I2C_Master_Receive(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout);
HAL_StatusTypeDef HAL_I2C_Slave_Transmit(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t Timeout);
HAL_StatusTypeDef HAL_I2C_Slave_Receive(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t Timeout);
HAL_StatusTypeDef HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout);
HAL_StatusTypeDef HAL_I2C_Mem_Read(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout);
HAL_StatusTypeDef HAL_I2C_IsDeviceReady(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint32_t Trials, uint32_t Timeout);
/******* Non-Blocking mode: Interrupt */
HAL_StatusTypeDef HAL_I2C_Master_Transmit_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size);
HAL_StatusTypeDef HAL_I2C_Master_Receive_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size);
HAL_StatusTypeDef HAL_I2C_Slave_Transmit_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size);
HAL_StatusTypeDef HAL_I2C_Slave_Receive_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size);
HAL_StatusTypeDef HAL_I2C_Mem_Write_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size);
HAL_StatusTypeDef HAL_I2C_Mem_Read_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size);
HAL_StatusTypeDef HAL_I2C_Master_Seq_Transmit_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t XferOptions);
HAL_StatusTypeDef HAL_I2C_Master_Seq_Receive_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t XferOptions);
HAL_StatusTypeDef HAL_I2C_Slave_Seq_Transmit_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t XferOptions);
HAL_StatusTypeDef HAL_I2C_Slave_Seq_Receive_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t XferOptions);
HAL_StatusTypeDef HAL_I2C_EnableListen_IT(I2C_HandleTypeDef *hi2c);
HAL_StatusTypeDef HAL_I2C_DisableListen_IT(I2C_HandleTypeDef *hi2c);
HAL_StatusTypeDef HAL_I2C_Master_Abort_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress);
/******* Non-Blocking mode: DMA */
HAL_StatusTypeDef HAL_I2C_Master_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size);
HAL_StatusTypeDef HAL_I2C_Master_Receive_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size);
HAL_StatusTypeDef HAL_I2C_Slave_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size);
HAL_StatusTypeDef HAL_I2C_Slave_Receive_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size);
HAL_StatusTypeDef HAL_I2C_Mem_Write_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size);
HAL_StatusTypeDef HAL_I2C_Mem_Read_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size);
HAL_StatusTypeDef HAL_I2C_Master_Seq_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t XferOptions);
HAL_StatusTypeDef HAL_I2C_Master_Seq_Receive_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t XferOptions);
HAL_StatusTypeDef HAL_I2C_Slave_Seq_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t XferOptions);
HAL_StatusTypeDef HAL_I2C_Slave_Seq_Receive_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t XferOptions);
/**
* @}
*/
/** @addtogroup I2C_IRQ_Handler_and_Callbacks IRQ Handler and Callbacks
* @{
*/
/******* I2C IRQHandler and Callbacks used in non blocking modes (Interrupt and DMA) */
void HAL_I2C_EV_IRQHandler(I2C_HandleTypeDef *hi2c);
void HAL_I2C_ER_IRQHandler(I2C_HandleTypeDef *hi2c);
void HAL_I2C_MasterTxCpltCallback(I2C_HandleTypeDef *hi2c);
void HAL_I2C_MasterRxCpltCallback(I2C_HandleTypeDef *hi2c);
void HAL_I2C_SlaveTxCpltCallback(I2C_HandleTypeDef *hi2c);
void HAL_I2C_SlaveRxCpltCallback(I2C_HandleTypeDef *hi2c);
void HAL_I2C_AddrCallback(I2C_HandleTypeDef *hi2c, uint8_t TransferDirection, uint16_t AddrMatchCode);
void HAL_I2C_ListenCpltCallback(I2C_HandleTypeDef *hi2c);
void HAL_I2C_MemTxCpltCallback(I2C_HandleTypeDef *hi2c);
void HAL_I2C_MemRxCpltCallback(I2C_HandleTypeDef *hi2c);
void HAL_I2C_ErrorCallback(I2C_HandleTypeDef *hi2c);
void HAL_I2C_AbortCpltCallback(I2C_HandleTypeDef *hi2c);
/**
* @}
*/
/** @addtogroup I2C_Exported_Functions_Group3 Peripheral State, Mode and Error functions
* @{
*/
/* Peripheral State, Mode and Error functions *********************************/
HAL_I2C_StateTypeDef HAL_I2C_GetState(I2C_HandleTypeDef *hi2c);
HAL_I2C_ModeTypeDef HAL_I2C_GetMode(I2C_HandleTypeDef *hi2c);
uint32_t HAL_I2C_GetError(I2C_HandleTypeDef *hi2c);
/**
* @}
*/
/**
* @}
*/
/* Private types -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* Private constants ---------------------------------------------------------*/
/** @defgroup I2C_Private_Constants I2C Private Constants
* @{
*/
#define I2C_FLAG_MASK 0x0000FFFFU
#define I2C_MIN_PCLK_FREQ_STANDARD 2000000U /*!< 2 MHz */
#define I2C_MIN_PCLK_FREQ_FAST 4000000U /*!< 4 MHz */
/**
* @}
*/
/* Private macros ------------------------------------------------------------*/
/** @defgroup I2C_Private_Macros I2C Private Macros
* @{
*/
#define I2C_MIN_PCLK_FREQ(__PCLK__, __SPEED__) (((__SPEED__) <= 100000U) ? ((__PCLK__) < I2C_MIN_PCLK_FREQ_STANDARD) : ((__PCLK__) < I2C_MIN_PCLK_FREQ_FAST))
#define I2C_CCR_CALCULATION(__PCLK__, __SPEED__, __COEFF__) (((((__PCLK__) - 1U)/((__SPEED__) * (__COEFF__))) + 1U) & I2C_CCR_CCR)
#define I2C_FREQRANGE(__PCLK__) ((__PCLK__)/1000000U)
#define I2C_RISE_TIME(__FREQRANGE__, __SPEED__) (((__SPEED__) <= 100000U) ? ((__FREQRANGE__) + 1U) : ((((__FREQRANGE__) * 300U) / 1000U) + 1U))
#define I2C_SPEED_STANDARD(__PCLK__, __SPEED__) ((I2C_CCR_CALCULATION((__PCLK__), (__SPEED__), 2U) < 4U)? 4U:I2C_CCR_CALCULATION((__PCLK__), (__SPEED__), 2U))
#define I2C_SPEED_FAST(__PCLK__, __SPEED__, __DUTYCYCLE__) (((__DUTYCYCLE__) == I2C_DUTYCYCLE_2)? I2C_CCR_CALCULATION((__PCLK__), (__SPEED__), 3U) : (I2C_CCR_CALCULATION((__PCLK__), (__SPEED__), 25U) | I2C_DUTYCYCLE_16_9))
#define I2C_SPEED(__PCLK__, __SPEED__, __DUTYCYCLE__) (((__SPEED__) <= 100000U)? (I2C_SPEED_STANDARD((__PCLK__), (__SPEED__))) : \
((I2C_SPEED_FAST((__PCLK__), (__SPEED__), (__DUTYCYCLE__)) & I2C_CCR_CCR) == 0U)? 1U : \
((I2C_SPEED_FAST((__PCLK__), (__SPEED__), (__DUTYCYCLE__))) | I2C_CCR_FS))
#define I2C_7BIT_ADD_WRITE(__ADDRESS__) ((uint8_t)((__ADDRESS__) & (uint8_t)(~I2C_OAR1_ADD0)))
#define I2C_7BIT_ADD_READ(__ADDRESS__) ((uint8_t)((__ADDRESS__) | I2C_OAR1_ADD0))
#define I2C_10BIT_ADDRESS(__ADDRESS__) ((uint8_t)((uint16_t)((__ADDRESS__) & (uint16_t)0x00FF)))
#define I2C_10BIT_HEADER_WRITE(__ADDRESS__) ((uint8_t)((uint16_t)((uint16_t)(((uint16_t)((__ADDRESS__) & (uint16_t)0x0300)) >> 7) | (uint16_t)0x00F0)))
#define I2C_10BIT_HEADER_READ(__ADDRESS__) ((uint8_t)((uint16_t)((uint16_t)(((uint16_t)((__ADDRESS__) & (uint16_t)0x0300)) >> 7) | (uint16_t)(0x00F1))))
#define I2C_MEM_ADD_MSB(__ADDRESS__) ((uint8_t)((uint16_t)(((uint16_t)((__ADDRESS__) & (uint16_t)0xFF00)) >> 8)))
#define I2C_MEM_ADD_LSB(__ADDRESS__) ((uint8_t)((uint16_t)((__ADDRESS__) & (uint16_t)0x00FF)))
/** @defgroup I2C_IS_RTC_Definitions I2C Private macros to check input parameters
* @{
*/
#define IS_I2C_DUTY_CYCLE(CYCLE) (((CYCLE) == I2C_DUTYCYCLE_2) || \
((CYCLE) == I2C_DUTYCYCLE_16_9))
#define IS_I2C_ADDRESSING_MODE(ADDRESS) (((ADDRESS) == I2C_ADDRESSINGMODE_7BIT) || \
((ADDRESS) == I2C_ADDRESSINGMODE_10BIT))
#define IS_I2C_DUAL_ADDRESS(ADDRESS) (((ADDRESS) == I2C_DUALADDRESS_DISABLE) || \
((ADDRESS) == I2C_DUALADDRESS_ENABLE))
#define IS_I2C_GENERAL_CALL(CALL) (((CALL) == I2C_GENERALCALL_DISABLE) || \
((CALL) == I2C_GENERALCALL_ENABLE))
#define IS_I2C_NO_STRETCH(STRETCH) (((STRETCH) == I2C_NOSTRETCH_DISABLE) || \
((STRETCH) == I2C_NOSTRETCH_ENABLE))
#define IS_I2C_MEMADD_SIZE(SIZE) (((SIZE) == I2C_MEMADD_SIZE_8BIT) || \
((SIZE) == I2C_MEMADD_SIZE_16BIT))
#define IS_I2C_CLOCK_SPEED(SPEED) (((SPEED) > 0U) && ((SPEED) <= 400000U))
#define IS_I2C_OWN_ADDRESS1(ADDRESS1) (((ADDRESS1) & 0xFFFFFC00U) == 0U)
#define IS_I2C_OWN_ADDRESS2(ADDRESS2) (((ADDRESS2) & 0xFFFFFF01U) == 0U)
#define IS_I2C_TRANSFER_OPTIONS_REQUEST(REQUEST) (((REQUEST) == I2C_FIRST_FRAME) || \
((REQUEST) == I2C_FIRST_AND_NEXT_FRAME) || \
((REQUEST) == I2C_NEXT_FRAME) || \
((REQUEST) == I2C_FIRST_AND_LAST_FRAME) || \
((REQUEST) == I2C_LAST_FRAME) || \
((REQUEST) == I2C_LAST_FRAME_NO_STOP) || \
IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(REQUEST))
#define IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(REQUEST) (((REQUEST) == I2C_OTHER_FRAME) || \
((REQUEST) == I2C_OTHER_AND_LAST_FRAME))
#define I2C_CHECK_FLAG(__ISR__, __FLAG__) ((((__ISR__) & ((__FLAG__) & I2C_FLAG_MASK)) == ((__FLAG__) & I2C_FLAG_MASK)) ? SET : RESET)
#define I2C_CHECK_IT_SOURCE(__CR1__, __IT__) ((((__CR1__) & (__IT__)) == (__IT__)) ? SET : RESET)
/**
* @}
*/
/**
* @}
*/
/* Private functions ---------------------------------------------------------*/
/** @defgroup I2C_Private_Functions I2C Private Functions
* @{
*/
/**
* @}
*/
/**
* @}
*/
/**
* @}
*/
#ifdef __cplusplus
}
#endif
#endif /* __STM32F1xx_HAL_I2C_H */

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -12,7 +12,7 @@
<lExt>*.lib</lExt>
<tExt>*.txt; *.h; *.inc; *.md</tExt>
<pExt>*.plm</pExt>
<CppX>*.cpp</CppX>
<CppX>*.cpp; *.cc; *.cxx</CppX>
<nMigrate>0</nMigrate>
</Extensions>
@ -93,7 +93,7 @@
<tRbreak>1</tRbreak>
<tRwatch>1</tRwatch>
<tRmem>1</tRmem>
<tRfunc>1</tRfunc>
<tRfunc>0</tRfunc>
<tRbox>1</tRbox>
<tRtrace>1</tRtrace>
<sRSysVw>1</sRSysVw>
@ -135,7 +135,7 @@
<SetRegEntry>
<Number>0</Number>
<Key>CMSIS_AGDI</Key>
<Name>-X"CMSIS-DAP_LU" -ULU_2022_8888 -O206 -S8 -C0 -P00000000 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO65554 -TC10000000 -TT10000000 -TP20 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32F10x_128.FLM -FS08000000 -FL020000 -FP0($$Device:STM32F103C8$Flash\STM32F10x_128.FLM)</Name>
<Name>-X"CMSIS-DAP_LU" -ULU_2022_8888 -O206 -S8 -C0 -P00000000 -N00("ARM CoreSight SW-DP") -D00(1BA01477) -L00(0) -TO65554 -TC10000000 -TT10000000 -TP20 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32F10x_128.FLM -FS08000000 -FL020000 -FP0($$Device:STM32F103C8$Flash\STM32F10x_128.FLM)</Name>
</SetRegEntry>
<SetRegEntry>
<Number>0</Number>
@ -147,35 +147,14 @@
<Key>UL2CM3</Key>
<Name>UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32F10x_128 -FS08000000 -FL020000 -FP0($$Device:STM32F103C8$Flash\STM32F10x_128.FLM))</Name>
</SetRegEntry>
<SetRegEntry>
<Number>0</Number>
<Key>ST-LINKIII-KEIL_SWO</Key>
<Name>-U-O142 -O2254 -S0 -C0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC800 -FN1 -FF0STM32F10x_128 -FS08000000 -FL010000 -FP0($$Device:STM32F103C8$Flash\STM32F10x_128.FLM)</Name>
</SetRegEntry>
</TargetDriverDllRegistry>
<Breakpoint>
<Bp>
<Number>0</Number>
<Type>0</Type>
<LineNumber>34</LineNumber>
<EnabledFlag>1</EnabledFlag>
<Address>134226582</Address>
<ByteObject>0</ByteObject>
<HtxType>0</HtxType>
<ManyObjects>0</ManyObjects>
<SizeOfObject>0</SizeOfObject>
<BreakByAccess>0</BreakByAccess>
<BreakIfRCount>1</BreakIfRCount>
<Filename>..\Peripheral\Src\bluetooth.c</Filename>
<ExecCommand></ExecCommand>
<Expression>\\CAR\../Peripheral/Src/bluetooth.c\34</Expression>
</Bp>
<Bp>
<Number>1</Number>
<Type>0</Type>
<LineNumber>32</LineNumber>
<EnabledFlag>1</EnabledFlag>
<Address>134221102</Address>
<Address>134222756</Address>
<ByteObject>0</ByteObject>
<HtxType>0</HtxType>
<ManyObjects>0</ManyObjects>
@ -187,36 +166,52 @@
<Expression>\\CAR\../Peripheral/Src/control.c\32</Expression>
</Bp>
<Bp>
<Number>2</Number>
<Number>1</Number>
<Type>0</Type>
<LineNumber>24</LineNumber>
<LineNumber>15</LineNumber>
<EnabledFlag>1</EnabledFlag>
<Address>0</Address>
<Address>134222672</Address>
<ByteObject>0</ByteObject>
<HtxType>0</HtxType>
<ManyObjects>0</ManyObjects>
<SizeOfObject>0</SizeOfObject>
<BreakByAccess>0</BreakByAccess>
<BreakIfRCount>0</BreakIfRCount>
<Filename>..\Peripheral\Src\bluetooth.c</Filename>
<BreakIfRCount>1</BreakIfRCount>
<Filename>..\Peripheral\Src\buzzer.c</Filename>
<ExecCommand></ExecCommand>
<Expression></Expression>
<Expression>\\CAR\../Peripheral/Src/buzzer.c\15</Expression>
</Bp>
<Bp>
<Number>2</Number>
<Type>0</Type>
<LineNumber>135</LineNumber>
<EnabledFlag>1</EnabledFlag>
<Address>134239198</Address>
<ByteObject>0</ByteObject>
<HtxType>0</HtxType>
<ManyObjects>0</ManyObjects>
<SizeOfObject>0</SizeOfObject>
<BreakByAccess>0</BreakByAccess>
<BreakIfRCount>1</BreakIfRCount>
<Filename>..\Service\Src\timer.c</Filename>
<ExecCommand></ExecCommand>
<Expression>\\CAR\../Service/Src/timer.c\135</Expression>
</Bp>
<Bp>
<Number>3</Number>
<Type>0</Type>
<LineNumber>99</LineNumber>
<LineNumber>145</LineNumber>
<EnabledFlag>1</EnabledFlag>
<Address>0</Address>
<Address>134239330</Address>
<ByteObject>0</ByteObject>
<HtxType>0</HtxType>
<ManyObjects>0</ManyObjects>
<SizeOfObject>0</SizeOfObject>
<BreakByAccess>0</BreakByAccess>
<BreakIfRCount>0</BreakIfRCount>
<Filename>../Core/Src/main.c</Filename>
<BreakIfRCount>1</BreakIfRCount>
<Filename>..\Service\Src\timer.c</Filename>
<ExecCommand></ExecCommand>
<Expression></Expression>
<Expression>\\CAR\../Service/Src/timer.c\145</Expression>
</Bp>
<Bp>
<Number>4</Number>
@ -230,7 +225,23 @@
<SizeOfObject>0</SizeOfObject>
<BreakByAccess>0</BreakByAccess>
<BreakIfRCount>0</BreakIfRCount>
<Filename>../Core/Src/main.c</Filename>
<Filename>startup_stm32f103xb.s</Filename>
<ExecCommand></ExecCommand>
<Expression></Expression>
</Bp>
<Bp>
<Number>5</Number>
<Type>0</Type>
<LineNumber>99</LineNumber>
<EnabledFlag>1</EnabledFlag>
<Address>0</Address>
<ByteObject>0</ByteObject>
<HtxType>0</HtxType>
<ManyObjects>0</ManyObjects>
<SizeOfObject>0</SizeOfObject>
<BreakByAccess>0</BreakByAccess>
<BreakIfRCount>0</BreakIfRCount>
<Filename>startup_stm32f103xb.s</Filename>
<ExecCommand></ExecCommand>
<Expression></Expression>
</Bp>
@ -263,7 +274,7 @@
</Tracepoint>
<DebugFlag>
<trace>0</trace>
<periodic>1</periodic>
<periodic>0</periodic>
<aLwin>1</aLwin>
<aCover>0</aCover>
<aSer1>0</aSer1>
@ -282,7 +293,7 @@
<aPa1>0</aPa1>
<AscS4>0</AscS4>
<aSer4>0</aSer4>
<StkLoc>1</StkLoc>
<StkLoc>0</StkLoc>
<TrcWin>0</TrcWin>
<newCpu>0</newCpu>
<uProt>0</uProt>
@ -332,7 +343,7 @@
<Group>
<GroupName>Application/User/App</GroupName>
<tvExp>1</tvExp>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel>
<RteFlg>0</RteFlg>
@ -364,7 +375,7 @@
<Group>
<GroupName>Application/User/Core</GroupName>
<tvExp>1</tvExp>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel>
<RteFlg>0</RteFlg>
@ -384,7 +395,7 @@
<GroupNumber>3</GroupNumber>
<FileNumber>5</FileNumber>
<FileType>1</FileType>
<tvExp>1</tvExp>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>../Core/Src/main.c</PathWithFileName>
@ -423,18 +434,6 @@
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>../Core/Src/i2c.c</PathWithFileName>
<FilenameWithoutPath>i2c.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>9</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>../Core/Src/tim.c</PathWithFileName>
<FilenameWithoutPath>tim.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
@ -442,7 +441,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>10</FileNumber>
<FileNumber>9</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -454,7 +453,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>11</FileNumber>
<FileNumber>10</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -466,7 +465,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>12</FileNumber>
<FileNumber>11</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -476,6 +475,62 @@
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>12</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\Core\Src\delay.c</PathWithFileName>
<FilenameWithoutPath>delay.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
</Group>
<Group>
<GroupName>Application/User/Service</GroupName>
<tvExp>1</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel>
<RteFlg>0</RteFlg>
<File>
<GroupNumber>4</GroupNumber>
<FileNumber>13</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\Service\Src\path_plan.c</PathWithFileName>
<FilenameWithoutPath>path_plan.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>4</GroupNumber>
<FileNumber>14</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\Service\Src\timer.c</PathWithFileName>
<FilenameWithoutPath>timer.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>4</GroupNumber>
<FileNumber>15</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\Service\Src\block_detect.c</PathWithFileName>
<FilenameWithoutPath>block_detect.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
</Group>
<Group>
@ -485,8 +540,8 @@
<cbSel>0</cbSel>
<RteFlg>0</RteFlg>
<File>
<GroupNumber>4</GroupNumber>
<FileNumber>13</FileNumber>
<GroupNumber>5</GroupNumber>
<FileNumber>16</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -497,8 +552,20 @@
<bShared>0</bShared>
</File>
<File>
<GroupNumber>4</GroupNumber>
<FileNumber>14</FileNumber>
<GroupNumber>5</GroupNumber>
<FileNumber>17</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\Peripheral\Src\buzzer.c</PathWithFileName>
<FilenameWithoutPath>buzzer.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>18</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -509,8 +576,8 @@
<bShared>0</bShared>
</File>
<File>
<GroupNumber>4</GroupNumber>
<FileNumber>15</FileNumber>
<GroupNumber>5</GroupNumber>
<FileNumber>19</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -521,8 +588,8 @@
<bShared>0</bShared>
</File>
<File>
<GroupNumber>4</GroupNumber>
<FileNumber>16</FileNumber>
<GroupNumber>5</GroupNumber>
<FileNumber>20</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -533,8 +600,8 @@
<bShared>0</bShared>
</File>
<File>
<GroupNumber>4</GroupNumber>
<FileNumber>17</FileNumber>
<GroupNumber>5</GroupNumber>
<FileNumber>21</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -545,8 +612,8 @@
<bShared>0</bShared>
</File>
<File>
<GroupNumber>4</GroupNumber>
<FileNumber>18</FileNumber>
<GroupNumber>5</GroupNumber>
<FileNumber>22</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -557,8 +624,8 @@
<bShared>0</bShared>
</File>
<File>
<GroupNumber>4</GroupNumber>
<FileNumber>19</FileNumber>
<GroupNumber>5</GroupNumber>
<FileNumber>23</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -569,8 +636,8 @@
<bShared>0</bShared>
</File>
<File>
<GroupNumber>4</GroupNumber>
<FileNumber>20</FileNumber>
<GroupNumber>5</GroupNumber>
<FileNumber>24</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -580,6 +647,18 @@
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>25</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\Peripheral\Src\syn6288.c</PathWithFileName>
<FilenameWithoutPath>syn6288.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
</Group>
<Group>
@ -589,8 +668,8 @@
<cbSel>0</cbSel>
<RteFlg>0</RteFlg>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>21</FileNumber>
<GroupNumber>6</GroupNumber>
<FileNumber>26</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -601,152 +680,20 @@
<bShared>0</bShared>
</File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>22</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_i2c.c</PathWithFileName>
<FilenameWithoutPath>stm32f1xx_hal_i2c.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>23</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal.c</PathWithFileName>
<FilenameWithoutPath>stm32f1xx_hal.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>24</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc.c</PathWithFileName>
<FilenameWithoutPath>stm32f1xx_hal_rcc.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>25</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc_ex.c</PathWithFileName>
<FilenameWithoutPath>stm32f1xx_hal_rcc_ex.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>26</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio.c</PathWithFileName>
<FilenameWithoutPath>stm32f1xx_hal_gpio.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>5</GroupNumber>
<GroupNumber>6</GroupNumber>
<FileNumber>27</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_dma.c</PathWithFileName>
<FilenameWithoutPath>stm32f1xx_hal_dma.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>28</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_cortex.c</PathWithFileName>
<FilenameWithoutPath>stm32f1xx_hal_cortex.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>29</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_pwr.c</PathWithFileName>
<FilenameWithoutPath>stm32f1xx_hal_pwr.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>30</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash.c</PathWithFileName>
<FilenameWithoutPath>stm32f1xx_hal_flash.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>31</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash_ex.c</PathWithFileName>
<FilenameWithoutPath>stm32f1xx_hal_flash_ex.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>32</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_exti.c</PathWithFileName>
<FilenameWithoutPath>stm32f1xx_hal_exti.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>33</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim.c</PathWithFileName>
<FilenameWithoutPath>stm32f1xx_hal_tim.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>34</FileNumber>
<GroupNumber>6</GroupNumber>
<FileNumber>28</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -757,12 +704,132 @@
<bShared>0</bShared>
</File>
<File>
<GroupNumber>5</GroupNumber>
<GroupNumber>6</GroupNumber>
<FileNumber>29</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal.c</PathWithFileName>
<FilenameWithoutPath>stm32f1xx_hal.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>30</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc.c</PathWithFileName>
<FilenameWithoutPath>stm32f1xx_hal_rcc.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>31</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc_ex.c</PathWithFileName>
<FilenameWithoutPath>stm32f1xx_hal_rcc_ex.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>32</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio.c</PathWithFileName>
<FilenameWithoutPath>stm32f1xx_hal_gpio.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>33</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_dma.c</PathWithFileName>
<FilenameWithoutPath>stm32f1xx_hal_dma.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>34</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_cortex.c</PathWithFileName>
<FilenameWithoutPath>stm32f1xx_hal_cortex.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>35</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_pwr.c</PathWithFileName>
<FilenameWithoutPath>stm32f1xx_hal_pwr.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>36</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash.c</PathWithFileName>
<FilenameWithoutPath>stm32f1xx_hal_flash.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>37</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash_ex.c</PathWithFileName>
<FilenameWithoutPath>stm32f1xx_hal_flash_ex.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>38</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_exti.c</PathWithFileName>
<FilenameWithoutPath>stm32f1xx_hal_exti.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>39</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_uart.c</PathWithFileName>
<FilenameWithoutPath>stm32f1xx_hal_uart.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
@ -772,13 +839,13 @@
<Group>
<GroupName>Drivers/CMSIS</GroupName>
<tvExp>1</tvExp>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel>
<RteFlg>0</RteFlg>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>36</FileNumber>
<GroupNumber>7</GroupNumber>
<FileNumber>40</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>

View File

@ -10,14 +10,14 @@
<TargetName>CAR</TargetName>
<ToolsetNumber>0x4</ToolsetNumber>
<ToolsetName>ARM-ADS</ToolsetName>
<pCCUsed>5060960::V5.06 update 7 (build 960)::.\ARMCC</pCCUsed>
<uAC6>0</uAC6>
<pCCUsed>6160000::V6.16::ARMCLANG</pCCUsed>
<uAC6>1</uAC6>
<TargetOption>
<TargetCommonOption>
<Device>STM32F103C8</Device>
<Vendor>STMicroelectronics</Vendor>
<PackID>Keil.STM32F1xx_DFP.2.4.1</PackID>
<PackURL>https://www.keil.com/pack/</PackURL>
<PackID>Keil.STM32F1xx_DFP.2.2.0</PackID>
<PackURL>http://www.keil.com/pack/</PackURL>
<Cpu>IRAM(0x20000000-0x20004FFF) IROM(0x8000000-0x800FFFF) CLOCK(8000000) CPUTYPE("Cortex-M3") TZ</Cpu>
<FlashUtilSpec></FlashUtilSpec>
<StartupFile></StartupFile>
@ -81,7 +81,7 @@
</BeforeMake>
<AfterMake>
<RunUserProg1>0</RunUserProg1>
<RunUserProg2>0</RunUserProg2>
<RunUserProg2>1</RunUserProg2>
<UserProg1Name></UserProg1Name>
<UserProg2Name></UserProg2Name>
<UserProg1Dos16Mode>0</UserProg1Dos16Mode>
@ -137,7 +137,7 @@
<DriverSelection>4101</DriverSelection>
</Flash1>
<bUseTDR>1</bUseTDR>
<Flash2>BIN\UL2V8M.DLL</Flash2>
<Flash2>BIN\UL2CM3.DLL</Flash2>
<Flash3>"" ()</Flash3>
<Flash4></Flash4>
<pFcarmOut></pFcarmOut>
@ -313,7 +313,7 @@
</ArmAdsMisc>
<Cads>
<interw>1</interw>
<Optim>4</Optim>
<Optim>1</Optim>
<oTime>0</oTime>
<SplitLS>0</SplitLS>
<OneElfS>1</OneElfS>
@ -322,13 +322,13 @@
<PlainCh>0</PlainCh>
<Ropi>0</Ropi>
<Rwpi>0</Rwpi>
<wLevel>2</wLevel>
<wLevel>3</wLevel>
<uThumb>0</uThumb>
<uSurpInc>0</uSurpInc>
<uC99>1</uC99>
<uGnu>0</uGnu>
<useXO>0</useXO>
<v6Lang>5</v6Lang>
<v6Lang>3</v6Lang>
<v6LangP>3</v6LangP>
<vShortEn>1</vShortEn>
<vShortWch>1</vShortWch>
@ -339,7 +339,7 @@
<MiscControls></MiscControls>
<Define>USE_HAL_DRIVER,STM32F103xB</Define>
<Undefine></Undefine>
<IncludePath>../App/Inc;../Core/Inc;../Peripheral/Inc;../Drivers/STM32F1xx_HAL_Driver/Inc;../Drivers/STM32F1xx_HAL_Driver/Inc/Legacy;../Drivers/CMSIS/Device/ST/STM32F1xx/Include;../Drivers/CMSIS/Include</IncludePath>
<IncludePath>../App/Inc;../Core/Inc;../Service/Inc;../Peripheral/Inc;../Drivers/STM32F1xx_HAL_Driver/Inc;../Drivers/STM32F1xx_HAL_Driver/Inc/Legacy;../Drivers/CMSIS/Device/ST/STM32F1xx/Include;../Drivers/CMSIS/Include</IncludePath>
</VariousControls>
</Cads>
<Aads>
@ -428,11 +428,6 @@
<FileType>1</FileType>
<FilePath>../Core/Src/dma.c</FilePath>
</File>
<File>
<FileName>i2c.c</FileName>
<FileType>1</FileType>
<FilePath>../Core/Src/i2c.c</FilePath>
</File>
<File>
<FileName>tim.c</FileName>
<FileType>1</FileType>
@ -453,6 +448,31 @@
<FileType>1</FileType>
<FilePath>../Core/Src/stm32f1xx_hal_msp.c</FilePath>
</File>
<File>
<FileName>delay.c</FileName>
<FileType>1</FileType>
<FilePath>..\Core\Src\delay.c</FilePath>
</File>
</Files>
</Group>
<Group>
<GroupName>Application/User/Service</GroupName>
<Files>
<File>
<FileName>path_plan.c</FileName>
<FileType>1</FileType>
<FilePath>..\Service\Src\path_plan.c</FilePath>
</File>
<File>
<FileName>timer.c</FileName>
<FileType>1</FileType>
<FilePath>..\Service\Src\timer.c</FilePath>
</File>
<File>
<FileName>block_detect.c</FileName>
<FileType>1</FileType>
<FilePath>..\Service\Src\block_detect.c</FilePath>
</File>
</Files>
</Group>
<Group>
@ -463,6 +483,11 @@
<FileType>1</FileType>
<FilePath>..\Peripheral\Src\bluetooth.c</FilePath>
</File>
<File>
<FileName>buzzer.c</FileName>
<FileType>1</FileType>
<FilePath>..\Peripheral\Src\buzzer.c</FilePath>
</File>
<File>
<FileName>control.c</FileName>
<FileType>1</FileType>
@ -498,6 +523,11 @@
<FileType>1</FileType>
<FilePath>..\Peripheral\Src\servo.c</FilePath>
</File>
<File>
<FileName>syn6288.c</FileName>
<FileType>1</FileType>
<FilePath>..\Peripheral\Src\syn6288.c</FilePath>
</File>
</Files>
</Group>
<Group>
@ -509,9 +539,14 @@
<FilePath>../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio_ex.c</FilePath>
</File>
<File>
<FileName>stm32f1xx_hal_i2c.c</FileName>
<FileName>stm32f1xx_hal_tim.c</FileName>
<FileType>1</FileType>
<FilePath>../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_i2c.c</FilePath>
<FilePath>../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim.c</FilePath>
</File>
<File>
<FileName>stm32f1xx_hal_tim_ex.c</FileName>
<FileType>1</FileType>
<FilePath>../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim_ex.c</FilePath>
</File>
<File>
<FileName>stm32f1xx_hal.c</FileName>
@ -563,16 +598,6 @@
<FileType>1</FileType>
<FilePath>../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_exti.c</FilePath>
</File>
<File>
<FileName>stm32f1xx_hal_tim.c</FileName>
<FileType>1</FileType>
<FilePath>../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim.c</FilePath>
</File>
<File>
<FileName>stm32f1xx_hal_tim_ex.c</FileName>
<FileType>1</FileType>
<FilePath>../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim_ex.c</FilePath>
</File>
<File>
<FileName>stm32f1xx_hal_uart.c</FileName>
<FileType>1</FileType>

View File

@ -1,5 +1,5 @@
##########################################################################################################################
# File automatically-generated by tool: [projectgenerator] version: [4.4.0-B60] date: [Wed Jul 17 21:44:09 CST 2024]
# File automatically-generated by tool: [projectgenerator] version: [4.4.0-B60] date: [Fri Jul 19 12:38:57 CST 2024]
##########################################################################################################################
# ------------------------------------------------
@ -38,15 +38,14 @@ BUILD_DIR = build
C_SOURCES = \
Core/Src/main.c \
Core/Src/gpio.c \
Core/Src/i2c.c \
Core/Src/syscalls.c \
Core/Src/tim.c \
Core/Src/dma.c \
Core/Src/usart.c \
Core/Src/stm32f1xx_it.c \
Core/Src/stm32f1xx_hal_msp.c \
Core/Src/delay.c \
Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio_ex.c \
Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_i2c.c \
Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal.c \
Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc.c \
Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc_ex.c \
@ -68,11 +67,16 @@ Peripheral/Src/led.c \
Peripheral/Src/bluetooth.c \
Peripheral/Src/control.c \
Peripheral/Src/line_seek.c \
Peripheral/Src/path_plan.c \
Peripheral/Src/servo.c \
Peripheral/Src/infrared.c \
Peripheral/Src/syn6288.c \
Peripheral/Src/buzzer.c \
App/Src/app_line_seek.c \
App/Src/app_ultrasonic.c
App/Src/app_ultrasonic.c \
App/Src/app_bus.c \
Service/Src/path_plan.c \
Service/Src/timer.c \
Service/Src/block_detect.c
# ASM sources
@ -134,6 +138,7 @@ AS_INCLUDES =
# C includes
C_INCLUDES = \
-ICore/Inc \
-IService/Inc \
-IPeripheral/Inc \
-IApp/Inc \
-IDrivers/STM32F1xx_HAL_Driver/Inc \

View File

@ -4,5 +4,6 @@
#include "main.h"
void BLUETOOTH_Init(void);
void BLUETOOTH_Send(const char *str, ...);
#endif

15
Peripheral/Inc/buzzer.h Normal file
View File

@ -0,0 +1,15 @@
#ifndef __BUZZER_H
#define __BUZZER_H
#include "main.h"
extern int timed_beep_event_id;
extern int times_beep_event_id;
void BUZZER_Start();
void BUZZER_Stop();
void BUZZER_StartTimed(uint16_t time);
void BUZZER_StartNTimes(uint8_t n, uint16_t on_time, uint16_t off_time);
#endif

View File

@ -15,6 +15,7 @@
extern uint8_t mode;
void CONTROL_CommonCmd(uint8_t type, uint8_t state);
void CONTROL_Servo(uint8_t degree);
void CONTROL_RGB(uint8_t r, uint8_t g, uint8_t b);
void CONTROL_Mode(uint8_t new_mode, uint8_t state);

View File

@ -11,6 +11,10 @@
void LED_Start(uint8_t led);
void LED_Stop(uint8_t led);
void LED_StartTimed(uint8_t led, uint16_t time);
void LED_StartNTimes(uint8_t led, uint16_t on_time, uint16_t off_time);
// duty in [0, 255]
void LED_SetDuty(uint8_t r, uint8_t g, uint8_t b);

9
Peripheral/Inc/syn6288.h Normal file
View File

@ -0,0 +1,9 @@
#ifndef __SYN6288_H
#define __SYN6288_H
#include "main.h"
void SYN_FrameInfo(uint8_t Music, uint8_t *HZdata);
void YS_SYN_Set(uint8_t *Info_data);
#endif

View File

@ -1,33 +1,52 @@
#include "bluetooth.h"
#include "usart.h"
#include "control.h"
#include <math.h>
#include <stdarg.h>
#include <stdio.h>
#include <string.h>
#include "syscalls.h"
#define BUFFER_SIZE 100
#include "control.h"
#include "hcsr04.h"
#include "infrared.h"
#include "line_seek.h"
#include "timer.h"
#include "usart.h"
#define BUFFER_SIZE 255
#define MESSAGE_SIZE 19
#define CMD_NUM 9
static int8_t rxBuffer[BUFFER_SIZE], txBuffer[10000];
static int8_t rxBuffer[BUFFER_SIZE], txBuffer[BUFFER_SIZE];
static uint16_t txLen;
static uint8_t cmdIndex;
static uint8_t timer_event_id = -1;
void sendSensor(void)
{
// static uint8_t line_seek[5];
// strcpy(line_seek, LineSeek_GetStatusStr());
// for (uint8_t i = 0; i < 5; ++i)
// line_seek[i] ^= 1;
// BLUETOOTH_Send("$4WD,CSB%u,PV-,GS-,LF%s,HW%hhu%hhu,GM-#",
// (uint32_t)round((double)sonor_distance / 10),
// line_seek,
// !INFRARED_GetL(),
// !INFRARED_GetR());
}
void BLUETOOTH_Init(void)
{
HAL_UARTEx_ReceiveToIdle_IT(&huart2, rxBuffer, 100);
// HAL_UART_Receive_IT(&huart2, txBuffer + txLen, 1);
timer_event_id = TIMER_AddInfiniteLoopEvent(timer_event_id, sendSensor, 1);
}
// void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
// {
// if (huart == &huart2)
// {
// ++txLen;
// if (txLen == 10000)
// txLen = 0;
// }
// }
void BLUETOOTH_Send(const char *str, ...)
{
va_list args;
va_start(args, str);
vsprintf(txBuffer, str, args);
va_end(args);
HAL_UART_Transmit_DMA(&huart2, txBuffer, strlen(txBuffer));
}
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
@ -65,6 +84,8 @@ void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
break;
// 舵机云台
case 'P':
sscanf(rxBuffer + 5, "%*3s%hu", num);
CONTROL_Servo(180 - num[0]);
break;
// 七彩灯
case 'C':
@ -73,15 +94,6 @@ void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
break;
}
}
// my_printf(&huart2, rxBuffer);
// strcpy(txBuffer + txLen, rxBuffer);
// if (txLen + Size >= 9999)
// txLen = 0;
// else
// txLen += Size;
// txBuffer[txLen] = '\0';
// if (strcmp(rxBuffer, "$send#") == 0)
// my_printf(&huart2, txBuffer);
BLUETOOTH_Init();
}
}

32
Peripheral/Src/buzzer.c Normal file
View File

@ -0,0 +1,32 @@
#include "buzzer.h"
#include "timer.h"
int timed_beep_event_id = -1;
int times_beep_event_id = -1;
inline void BUZZER_Start()
{
HAL_GPIO_WritePin(FM_K2_POWERC_GPIO_Port, FM_K2_POWERC_Pin, GPIO_PIN_RESET);
}
inline void BUZZER_Stop()
{
HAL_GPIO_WritePin(FM_K2_POWERC_GPIO_Port, FM_K2_POWERC_Pin, GPIO_PIN_SET);
}
/// @brief 启动蜂鸣器鸣叫
/// @param time 鸣叫时间单位1毫秒
void BUZZER_StartTimed(uint16_t time)
{
BUZZER_Start();
timed_beep_event_id = TIMER_AddDelayEvent(timed_beep_event_id, BUZZER_Stop, time);
}
/// @brief 启动蜂鸣器鸣叫n次每次叫on_time毫秒停off_time毫秒
/// @param on_time 鸣叫时间单位1毫秒
/// @param off_time 停止鸣叫时间单位1毫秒
void BUZZER_StartNTimes(uint8_t n, uint16_t on_time, uint16_t off_time)
{
times_beep_event_id = TIMER_AddFiniteLoopEventWithParam(times_beep_event_id, BUZZER_StartTimed, on_time + off_time, n, on_time);
}

View File

@ -2,16 +2,18 @@
#include "hcsr04.h"
#include "led.h"
#include "motor.h"
#include "buzzer.h"
#include "servo.h"
#define CMD_MOVE 0
#define CMD_ROTATE 1
#define CMD_BUZZER 2
#define CMD_SPEED 3
// #define CMD_SHAKE 4
#define CMD_SERVO 4
// #define CMD_SING 5
#define CMD_LED 6
// #define CMD_FIRE 7
// #define CMD_SERVO 8
#define CMD_SERVO_RESET 8
// 小车默认速度
static int8_t speed = 20;
@ -21,11 +23,10 @@ void carMove(uint8_t state);
void carSpin(uint8_t state);
void callBuzzer(uint8_t state);
void setSpeed(uint8_t state);
// void shake(uint8_t state);
void setServo(uint8_t state);
// void sing(uint8_t state);
void setLed(uint8_t state);
// void fire(uint8_t state);
// void servo(uint8_t state);
void CONTROL_CommonCmd(uint8_t type, uint8_t state)
{
@ -43,8 +44,9 @@ void CONTROL_CommonCmd(uint8_t type, uint8_t state)
case CMD_SPEED:
setSpeed(state);
break;
// case CMD_SHAKE:
// break;
case CMD_SERVO:
setServo(state);
break;
// case CMD_SING:
// break;
case CMD_LED:
@ -52,12 +54,18 @@ void CONTROL_CommonCmd(uint8_t type, uint8_t state)
break;
// case CMD_FIRE:
// break;
// case CMD_SERVO:
// break;
case CMD_SERVO_RESET:
SERVO_Init();
break;
}
}
void CONTROL_RGB(uint8_t r, uint8_t g, uint8_t b)
inline void CONTROL_Servo(uint8_t degree)
{
SERVO_Rotate(degree);
}
inline void CONTROL_RGB(uint8_t r, uint8_t g, uint8_t b)
{
LED_Start(LED_ALL);
LED_SetDuty(r, g, b);
@ -121,7 +129,7 @@ void carMove(uint8_t state)
}
}
void carSpin(uint8_t state)
inline void carSpin(uint8_t state)
{
if (state == 1)
MOTOR_SetDuty(speed, -speed);
@ -129,11 +137,9 @@ void carSpin(uint8_t state)
MOTOR_SetDuty(-speed, speed);
}
void callBuzzer(uint8_t state)
inline void callBuzzer(uint8_t state)
{
HAL_GPIO_WritePin(FM_K2_POWERC_GPIO_Port, FM_K2_POWERC_Pin, GPIO_PIN_RESET);
HAL_Delay(200);
HAL_GPIO_WritePin(FM_K2_POWERC_GPIO_Port, FM_K2_POWERC_Pin, GPIO_PIN_SET);
BUZZER_StartTimed(5);
}
void setSpeed(uint8_t state)
@ -148,6 +154,14 @@ void setSpeed(uint8_t state)
speed = 20;
}
void setServo(uint8_t state)
{
if (state == 1)
SERVO_Rotate(180);
else if (state == 2)
SERVO_Rotate(0);
}
void setLed(uint8_t state)
{
LED_Start(LED_ALL);

View File

@ -1,11 +1,13 @@
#include "hcsr04.h"
#include "tim.h"
#include "syscalls.h"
#include "delay.h"
#include "tim.h"
static uint64_t time_start; // 声明变量,用来计时
static uint64_t time_end; // 声明变量,存储回波信号时间
uint8_t sonor_state; // 测距状态变量0未测量1正在测量2已测量
uint32_t sonor_distance; // 测量出的距离单位mm
uint32_t sonor_distance = INT32_MAX; // 测量出的距离单位mm
void HCSR04_HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim);
@ -18,6 +20,8 @@ void HC_SR04_Init(void)
// 注册定时器中断溢出回调
HAL_TIM_RegisterCallback(&htim2, HAL_TIM_PERIOD_ELAPSED_CB_ID, HCSR04_HAL_TIM_PeriodElapsedCallback);
sonor_distance = INT32_MAX;
}
// 启动测距单位mm
@ -27,11 +31,7 @@ uint32_t sonar_mm(void)
HAL_GPIO_WritePin(TRIG_GPIO_Port, TRIG_Pin, GPIO_PIN_SET); // 输出高电平
delay_us(15); // 延时15微秒
HAL_GPIO_WritePin(TRIG_GPIO_Port, TRIG_Pin, GPIO_PIN_RESET); // 输出低电平
if (time_end / 100 < 38)
{ // 判断是否小于38毫秒大于38毫秒的就是超时直接调到下面返回0
sonor_distance = (time_end * 346) / 2; // 计算距离25°C空气中的音速为346m/s
sonor_distance = sonor_distance / 100; // 因为上面的time_end的单位是10微秒所以要得出单位为毫米的距离结果还得除以100
}
return sonor_distance;
}
@ -58,14 +58,15 @@ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
time_end = time_start;
HAL_TIM_Base_Stop_IT(&htim2);
sonor_state = 2;
sonor_distance = (time_end / 100 < 38) ? (time_end * 346) / 200 : INT32_MAX;
Sonar_CP_Callback();
sonor_state = 0;
}
}
}
// 测距完毕回调,执行完自定义任务后将sonor_state置0
// 测距完毕回调,执行完自定义任务后将sonor_state置0
__attribute__((weak)) void Sonar_CP_Callback()
{
my_printf(HUART2, "distance = %d (mm)\n", sonor_distance);
sonor_state = 0;
}

View File

@ -1,11 +1,16 @@
#include "led.h"
#include "tim.h"
#include "timer.h"
#define LED_TIM (&htim3)
#define LED_R_CHAN TIM_CHANNEL_4
#define LED_G_CHAN TIM_CHANNEL_3
#define LED_B_CHAN TIM_CHANNEL_2
static led_timed_id = -1;
static led_times_id = -1;
void LED_Start(uint8_t led)
{
if (led & LED_R)
@ -26,6 +31,16 @@ void LED_Stop(uint8_t led)
HAL_TIM_PWM_Stop(LED_TIM, LED_B_CHAN);
}
void LED_StartTimed(uint8_t led, uint16_t time)
{
led_timed_id = TIMER_AddDelayEvent(led_timed_id, LED_Stop, time);
}
void LED_StartNTimes(uint8_t led, uint16_t on_time, uint16_t off_time)
{
// led_times_id = TIMER_AddFiniteLoopEvent(led_times_id, LED_Stop, time);
}
void LED_SetDuty(uint8_t r, uint8_t g, uint8_t b)
{
__HAL_TIM_SetCompare(LED_TIM, LED_R_CHAN, r);

View File

@ -1,6 +1,7 @@
#include "line_seek.h"
#include "main.h"
#include <stdio.h>
char LineSeek_Status[5];

View File

@ -1,51 +0,0 @@
#include "path_plan.h"
#include "stdio.h"
// 全局路径规划器
PathPlanner pathPlanner;
// 初始化路径规划器
void PathPlanner_Init()
{
pathPlanner.currentStep = -1;
pathPlanner.path = NULL;
pathPlanner.pathLength = 0;
SetPath();
}
// 设置自定义路径
void SetPath()
{
int i;
for (i = 0; i < 100; i++)
{
AddPathStep(LEFT);
AddPathStep(RIGHT);
AddPathStep(STRAIGHT);
}
}
// 获取当前方向
Direction GetCurrentDirection()
{
return pathPlanner.path[pathPlanner.currentStep];
}
// 获取下一步方向
Direction GetNextDirection()
{
if (pathPlanner.currentStep >= pathPlanner.pathLength)
{
pathPlanner.currentStep = -1;
}
return pathPlanner.path[++pathPlanner.currentStep];
}
// 添加路径
void AddPathStep(Direction step)
{
pathPlanner.path = realloc(pathPlanner.path, ++pathPlanner.pathLength * sizeof(Direction));
pathPlanner.path[pathPlanner.pathLength - 1] = step;
}

View File

@ -3,6 +3,7 @@
void SERVO_Init()
{
__HAL_TIM_SetCompare(&htim1, TIM_CHANNEL_4, 150);
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_4);
}

58
Peripheral/Src/syn6288.c Normal file
View File

@ -0,0 +1,58 @@
#include "syn6288.h"
#include "usart.h"
#include "string.h"
uint8_t SYN_StopCom[] = {0xFD, 0X00, 0X02, 0X02, 0XFD}; //停止合成
uint8_t SYN_SuspendCom[] = {0XFD, 0X00, 0X02, 0X03, 0XFC}; //暂停合成
uint8_t SYN_RecoverCom[] = {0XFD, 0X00, 0X02, 0X04, 0XFB}; //恢复合成
uint8_t SYN_ChackCom[] = {0XFD, 0X00, 0X02, 0X21, 0XDE}; //状态查询
uint8_t SYN_PowerDownCom[] = {0XFD, 0X00, 0X02, 0X88, 0X77}; //进入POWER DOWN状态命令
//Music:选择背景音乐。0:无背景音乐1~15选择背景音乐
void SYN_FrameInfo(uint8_t Music, uint8_t *HZdata)
{
/****************需要发送的文本**********************************/
unsigned char Frame_Info[50];
unsigned char HZ_Length;
unsigned char ecc = 0; //定义校验字节
unsigned int i = 0;
HZ_Length = strlen((char*)HZdata); //需要发送文本的长度
/*****************帧固定配置信息**************************************/
Frame_Info[0] = 0xFD ; //构造帧头FD
Frame_Info[1] = 0x00 ; //构造数据区长度的高字节
Frame_Info[2] = HZ_Length + 3; //构造数据区长度的低字节
Frame_Info[3] = 0x01 ; //构造命令字:合成播放命令
Frame_Info[4] = 0x01 | Music << 4 ; //构造命令参数:背景音乐设定
/*******************校验码计算***************************************/
for(i = 0; i < 5; i++) //依次发送构造好的5个帧头字节
{
ecc = ecc ^ (Frame_Info[i]); //对发送的字节进行异或校验
}
for(i = 0; i < HZ_Length; i++) //依次发送待合成的文本数据
{
ecc = ecc ^ (HZdata[i]); //对发送的字节进行异或校验
}
/*******************发送帧信息***************************************/
memcpy(&Frame_Info[5], HZdata, HZ_Length);
Frame_Info[5 + HZ_Length] = ecc;
HAL_UART_Transmit(&huart2,Frame_Info,5 + HZ_Length + 1,10000);
}
/***********************************************************
* YS_SYN_Set(u8 *Info_data)
*
* *Info_data:
*
* 9600bps
*
**********************************************************/
void YS_SYN_Set(uint8_t *Info_data)
{
uint8_t Com_Len;
Com_Len = strlen((char*)Info_data);
HAL_UART_Transmit(&huart2,Info_data,Com_Len,10000);
}

View File

@ -36,10 +36,12 @@ BUILD_DIR = build
######################################
# C sources
C_SOURCES = \
App/Src/app_bus.c \
App/Src/app_line_seek.c \
App/Src/app_ultrasonic.c \
Core/Src/delay.c \
Core/Src/dma.c \
Core/Src/gpio.c \
Core/Src/i2c.c \
Core/Src/main.c \
Core/Src/stm32f1xx_hal_msp.c \
Core/Src/stm32f1xx_it.c \
@ -56,20 +58,25 @@ Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash.c \
Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash_ex.c \
Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio.c \
Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio_ex.c \
Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_i2c.c \
Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_pwr.c \
Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc.c \
Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc_ex.c \
Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim.c \
Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim_ex.c \
Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_uart.c \
User/Src/bluetooth.c \
User/Src/control.c \
User/Src/hcsr04.c \
User/Src/led.c \
User/Src/line_seek.c \
User/Src/motor.c \
User/Src/path_plan.c
Peripheral/Src/bluetooth.c \
Peripheral/Src/buzzer.c \
Peripheral/Src/control.c \
Peripheral/Src/hcsr04.c \
Peripheral/Src/infrared.c \
Peripheral/Src/led.c \
Peripheral/Src/line_seek.c \
Peripheral/Src/motor.c \
Peripheral/Src/servo.c \
Peripheral/Src/syn6288.c \
Service/Src/block_detect.c \
Service/Src/path_plan.c \
Service/Src/timer.c
CPP_SOURCES = \
@ -147,7 +154,8 @@ C_INCLUDES = \
-IDrivers/CMSIS/Include \
-IDrivers/STM32F1xx_HAL_Driver/Inc \
-IDrivers/STM32F1xx_HAL_Driver/Inc/Legacy \
-IUser/Inc
-IPeripheral/Inc \
-IService/Inc

View File

@ -0,0 +1,15 @@
#ifndef __BLOCK_DETECT_H
#define __BLOCK_DETECT_H
// 定义障碍方向枚举
typedef enum
{
FRONT,
LEFT_FRONT,
RIGHT_FRONT
} BlockDirection;
void BlockDetect_Init();
int Has_Block(BlockDirection direction);
#endif

View File

@ -6,24 +6,13 @@ typedef enum
{
STRAIGHT,
LEFT,
RIGHT,
STOP
RIGHT
} Direction;
// 定义路径规划器结构
typedef struct
{
int currentStep;
Direction* path;
int pathLength;
} PathPlanner;
// 全局路径规划器
extern PathPlanner pathPlanner;
void PathPlanner_Init();
Direction GetCurrentDirection();
Direction GetNextDirection();
void AddPathStep(Direction step);
void ReplacePathStep(Direction* step, int n);
#endif

15
Service/Inc/timer.h Normal file
View File

@ -0,0 +1,15 @@
#ifndef __TIMER_H
#define __TIMER_H
#include "main.h"
#define EVENT_MAX 20
void TIMER_Init(void);
int8_t TIMER_AddInfiniteLoopEvent(int8_t id, void (*func)(void), uint16_t loop_time);
int8_t TIMER_AddFiniteLoopEvent(int8_t id, void (*func)(void), uint16_t loop_time, uint16_t loop_cnt);
int8_t TIMER_AddFiniteLoopEventWithParam(int8_t event_id, void (*func)(uint16_t param), uint16_t loop_time, uint16_t loop_cnt, uint16_t param);
int8_t TIMER_AddDelayEvent(int8_t id, void (*func)(void), uint16_t delay_time);
void TIMER_DelLoopEvent(int8_t id);
#endif

View File

@ -0,0 +1,64 @@
#include "block_detect.h"
#include "bluetooth.h"
#include "buzzer.h"
#include "hcsr04.h"
#include "infrared.h"
#include "syscalls.h"
#include "timer.h"
int has_block_front;
int has_block_left;
int has_block_right;
static uint8_t timer_event_id = -1;
static uint8_t timer_event_id2 = -1;
void INFRARED_Detect();
void Sonar_Detect();
// 避障检测初始化
void BlockDetect_Init()
{
timer_event_id = TIMER_AddInfiniteLoopEvent(timer_event_id, INFRARED_Detect, 20);
timer_event_id2 = TIMER_AddInfiniteLoopEvent(timer_event_id2, Sonar_Detect, 150);
}
// 每20ms红外检测一次障碍物
void INFRARED_Detect()
{
has_block_left = INFRARED_GetL() == INFRARED_MEET;
has_block_right = INFRARED_GetR() == INFRARED_MEET;
}
// 每100ms超声波检测一次障碍物
void Sonar_Detect()
{
if (sonor_state == 0) sonar_mm();
}
// 超声波测距完毕回调
void Sonar_CP_Callback()
{
// BLUETOOTH_Send("f: %d, l: %d, r: %d\n sonar distance = %d (mm)\n", has_block_front, has_block_left, has_block_right, sonor_distance);
has_block_front = sonor_distance < 200;
}
int Has_Block(BlockDirection direction)
{
switch (direction)
{
case FRONT:
BUZZER_StartTimed(10);
return has_block_front;
break;
case LEFT_FRONT:
BUZZER_StartTimed(2);
return has_block_left;
break;
case RIGHT_FRONT:
BUZZER_StartTimed(2);
return has_block_right;
break;
}
return 0;
}

101
Service/Src/path_plan.c Normal file
View File

@ -0,0 +1,101 @@
#include "path_plan.h"
#include "stdio.h"
#include "stdlib.h"
// 定义路径规划器结构
typedef struct
{
int currentStep;
Direction* path;
int pathLength;
} PathPlanner;
// 路径规划器
static PathPlanner pathPlanner;
void SetPath();
// 初始化路径规划器
void PathPlanner_Init()
{
pathPlanner.currentStep = -1;
pathPlanner.path = NULL;
pathPlanner.pathLength = 0;
SetPath();
}
// 设置自定义路径
void SetPath()
{
int i;
for (i = 0; i < 100; i++)
{
AddPathStep(STRAIGHT);
AddPathStep(STRAIGHT);
AddPathStep(STRAIGHT);
AddPathStep(RIGHT);
AddPathStep(LEFT);
AddPathStep(STRAIGHT);
AddPathStep(STRAIGHT);
AddPathStep(LEFT);
AddPathStep(STRAIGHT);
AddPathStep(STRAIGHT);
AddPathStep(STRAIGHT);
AddPathStep(LEFT);
AddPathStep(LEFT);
AddPathStep(LEFT);
// AddPathStep(STRAIGHT);
// AddPathStep(STRAIGHT);
// AddPathStep(STRAIGHT);
// AddPathStep(LEFT);
// AddPathStep(LEFT);
// AddPathStep(STRAIGHT);
// AddPathStep(STRAIGHT);
// AddPathStep(STRAIGHT);
// AddPathStep(RIGHT);
// AddPathStep(STRAIGHT);
// AddPathStep(STRAIGHT);
// AddPathStep(STRAIGHT);
// AddPathStep(STRAIGHT);
// AddPathStep(LEFT);
// AddPathStep(LEFT);
// AddPathStep(STRAIGHT);
// AddPathStep(STRAIGHT);
}
}
// 获取当前方向
Direction GetCurrentDirection()
{
return pathPlanner.path[pathPlanner.currentStep];
}
// 获取下一步方向
Direction GetNextDirection()
{
if (pathPlanner.currentStep >= pathPlanner.pathLength)
{
pathPlanner.currentStep = -1;
}
return pathPlanner.path[++pathPlanner.currentStep];
}
// 添加路径
void AddPathStep(Direction step)
{
pathPlanner.path = realloc(pathPlanner.path, ++pathPlanner.pathLength * sizeof(Direction));
pathPlanner.path[pathPlanner.pathLength - 1] = step;
}
// 替换接下来的n个路径方向
void ReplacePathStep(Direction* step, int n)
{
int i;
for (i = 0; i < n; i++)
{
pathPlanner.path[(pathPlanner.currentStep + 1 + i) % pathPlanner.pathLength] = step[i];
}
}

160
Service/Src/timer.c Normal file
View File

@ -0,0 +1,160 @@
#include "timer.h"
#include <math.h>
#include "tim.h"
typedef enum
{
INFINITE_LOOP_EVENT, // 无限循环事件
FINITE_LOOP_EVENT, // 有限循环事件
FINITE_LOOP_EVENT_WITH_PARAM,
DELAY_EVENT // 延迟事件
} EventType;
typedef struct Event
{
uint8_t id;
void (*func)(void);
void (*param_func)(uint16_t);
uint16_t time;
EventType type;
uint8_t enabled;
uint16_t loop_cnt;
uint32_t begin_time;
uint16_t param;
} Event;
static Event event[EVENT_MAX];
static int event_cnt;
static uint32_t current_time;
void TIMER_Count(TIM_HandleTypeDef *htim);
void TIMER_Init(void)
{
HAL_TIM_RegisterCallback(&htim4, HAL_TIM_PERIOD_ELAPSED_CB_ID, TIMER_Count);
HAL_TIM_Base_Start_IT(&htim4);
}
/// @brief 注册无限循环定时回调事件
/// @param func 回调函数 void func(void)
/// @param loop_time 定时时间,单位毫秒
int8_t TIMER_AddInfiniteLoopEvent(int8_t event_id, void (*func)(void), uint16_t loop_time)
{
if (event_id == -1) event_id = event_cnt++;
event[event_id].type = INFINITE_LOOP_EVENT;
event[event_id].id = event_id;
event[event_id].func = func;
event[event_id].time = loop_time;
event[event_id].begin_time = current_time;
event[event_id].enabled = 1;
return event_id;
}
/// @brief 注册有限循环定时回调事件
/// @param func 回调函数 void func(void)
/// @param loop_time 定时时间,单位毫秒
/// @param loop_cnt 循环次数
int8_t TIMER_AddFiniteLoopEventWithParam(int8_t event_id, void (*func)(uint16_t param), uint16_t loop_time, uint16_t loop_cnt, uint16_t param)
{
if (event_id == -1) event_id = event_cnt++;
event[event_id].type = FINITE_LOOP_EVENT_WITH_PARAM;
event[event_id].id = event_id;
event[event_id].param_func = func;
event[event_id].time = loop_time;
event[event_id].begin_time = current_time;
event[event_id].enabled = 1;
event[event_id].param = param;
event[event_id].loop_cnt = loop_cnt;
return event_id;
}
int8_t TIMER_AddFiniteLoopEvent(int8_t event_id, void (*func)(void), uint16_t loop_time, uint16_t loop_cnt)
{
if (event_id == -1) event_id = event_cnt++;
event[event_id].type = FINITE_LOOP_EVENT;
event[event_id].id = event_id;
event[event_id].func = func;
event[event_id].time = loop_time;
event[event_id].begin_time = current_time;
event[event_id].enabled = 1;
event[event_id].loop_cnt = loop_cnt;
return event_id;
}
/// @brief 注册延迟定时回调事件(单次)
/// @param func 回调函数 void func(void)
/// @param loop_time 定时时间,单位毫秒
int8_t TIMER_AddDelayEvent(int8_t event_id, void (*func)(void), uint16_t delay_time)
{
if (event_id == -1) event_id = event_cnt++;
event[event_id].type = DELAY_EVENT;
event[event_id].id = event_id;
event[event_id].func = func;
event[event_id].time = delay_time;
event[event_id].begin_time = current_time;
event[event_id].enabled = 1;
return event_id;
}
void TIMER_DelLoopEvent(int8_t id)
{
event[id].enabled = 0;
}
void TIMER_Count(TIM_HandleTypeDef *htim)
{
++current_time;
for (uint8_t i = 0; i < event_cnt; ++i)
{
if (event[i].enabled == 0)
continue;
switch (event[i].type)
{
case INFINITE_LOOP_EVENT: // 无限循环事件
if ((current_time - event[i].begin_time) % event[i].time == 0)
{
event[i].func();
}
break;
case FINITE_LOOP_EVENT: // 有限循环事件
if ((current_time - event[i].begin_time) % event[i].time == 0)
{
event[i].func();
if (event[i].loop_cnt-- <= 0)
{
TIMER_DelLoopEvent(event[i].id);
}
}
break;
case FINITE_LOOP_EVENT_WITH_PARAM:
if ((current_time - event[i].begin_time) % event[i].time == 0)
{
printf("FINITE_LOOP_EVENT_WITH_PARAM %d, %d, %d\n",
current_time, event[i].begin_time, event[i].time);
event[i].param_func(event[i].param);
if (--event[i].loop_cnt <= 0)
{
printf("remove FINITE_LOOP_EVENT_WITH_PARAM %d, %d, %d\n",
current_time, event[i].begin_time, event[i].time);
TIMER_DelLoopEvent(event[i].id);
}
}
break;
case DELAY_EVENT: // 延迟事件
if (current_time > event[i].begin_time &&
(current_time - event[i].begin_time) % event[i].time == 0)
{
event[i].func();
printf("DELAY_EVENT %d, %d, %d\n",
current_time, event[i].begin_time, event[i].time);
TIMER_DelLoopEvent(event[i].id);
}
break;
default:
break;
}
}
}