无人机项目总结
问题一:当调用Freertos时,要给单片机初始化的堆和栈内存起始分配小一些
该报错是 STM32F103C8T6 仅 20KB 片内 RAM 资源不足,因启动文件系统栈堆配置偏大、FreeRTOS 多静态任务栈与全局缓冲区叠加占用超内存上限,导致链接器 L6406E 空间不足,通过缩减启动栈堆、裁剪 FreeRTOS 内存、精简全局静态内存即可解决
电源芯片![]()
![]()
电机控制任务
左上:TIM1 CH1 左下:TIM1 CH4 右上:TIM4 CH1 右下:TIM4 CH2
LED控制任务
1.BSRR(Bit Set/Reset Register) - 端口位设置/清除寄存器
通俗理解:这是专门用来输出高电平(3.3V)的开关。
它的脾气:它只对你写入
1的位感兴趣。如果你往它的某一位写1,对应的引脚就会立刻输出高电平;如果你往它写0,它会直接忽略,什么都不做。代码解析:
GPIOB->BSRR = GPIO_PIN_8;这句话的意思是:强行把 PB8 引脚拉高到 3.3V。结合我们之前说的“水往低处流”原理,两边都是 3.3V,水流不动,所以灯就灭了。
2.BRR(Bit Reset Register) - 端口位清除寄存器
通俗理解:这是专门用来输出低电平(0V/GND)的开关。
它的脾气:和
BSRR类似,它也只对写入1感兴趣。不同的是,你往BRR某一位写1,对应的引脚会被瞬间“清零”,也就是拉低到 0V。写0依然是无视。代码解析:
GPIOB->BRR = GPIO_PIN_8;这句话的意思是:强行把 PB8 引脚拉低到 0V。此时 3.3V 的电流哗啦啦流进 PB8,灯就亮了。
3.IDR(Input Data Register) - 端口输入数据寄存器
通俗理解:这是单片机的“电压探测器”。
它的脾气:它是一个只读的寄存器,里面实时保存着当前每一个引脚上的真实电压状态。如果是 3.3V,这一位就是
1;如果是 0V,这一位就是0。代码解析:
GPIOB->IDR & GPIO_PIN_8由于GPIO_PIN_8的本质是第 8 位为 1 的数字(0x0100),这句按位与(&)操作,就是精准地把 PB8 当前的状态给“抠”出来看看是 1 还是 0。