stm32f103C8T6名字含义
f:基础版本
C:引脚 有48或者49
8: 64kb的flash
T:贴片类型
6: 温度在-40-85度
stm32时钟
stm32内置有RC振荡器,
电阻: resistance
电容: capacity
比较器: comparator : 比较两个电压的大小,然后输出高低电平,,比某个值高的就是高电平
施密特触发器 : 有一个上阈值VH和 一个下阈值VL ,,中间区域保持原状态,,只有比较超过阈值,,电平才会变化,,,用来过滤抖动,,但是有迟滞
RC振荡器: resistor capacity dscillator :电阻R,电容C的充放电规律,来产生周期性信号的振荡电路,,,通过利用电容的充放电的时间延迟,,形成周期性变化的电压信号,,,
内部充放电的切换是通过施密特触发器比较之后,自动切换,,,,,,
比较 + 反向 + 阈值触发电路
RC振荡器是 纯硬件自激振荡系统,,,内部必须使用施密特触发器,,因为电容电压接近阈值的时候,上下抖动,,输出会疯狂翻转,,,依赖电阻电容充放电,温度一边,频率就漂,,电压变化也会影响
TIM计数 :
- 内部时钟计数 : 每来一个时钟周期,,+1,,
将振荡电路的信号送进时钟树,,,芯片内部有一个时钟选择器+门控电路,,选择是 HSI,HSE,LSI,LSE的其中一个 - 外部捕获输入计数
stm32时钟来源 :
- HSI
- HSE
- LSI
- LSE
是并行存在的信号源,,通过多路选择系统 ,,选择谁作为系统的时钟源
HSE是外部的一个8MHz的晶振:
- 晶振不是主动输出信号的器件,,
- 晶振是被动谐振器,,不能自己产生持续信号,,需要外部电路,,激励它振动
所以stm32有一个 OSC_IN:接收晶体反馈信号,输入到内部的放大器,,,, 有一个OSC_OUT:输出一个驱动信号,推动晶体振动
晶振电路是模拟电路
时钟的产生:
- 模拟电路里面振荡
- 进入数字整形电路,,通过放大器,施密特触发器,,,进行波形整理,,整理成
干净的数字方波 - 进入时钟开关(MUX),,进入RCC(reset and clock control) 通过
时钟选择器,,选择时钟源 - 时钟门控+分发: 控制PLL倍频,,分发到总线 AHB,,,APB1,APB2
LSE是32.768KHz,用于RTC,real time clock
32768恰好是 2的15次方,,1就能表示 1Hz,很准确
HSI:high speed internal : stm32内部时钟,用的高速内部RC振荡器,,精度差
- 时钟受温度,电压,工艺影响很大,,USART波特率可能会偏,,USB通信很容易错,定时器不精准
HSE: high speed external
烧录接口SWD
SWD : serial wire debug :串行调试接口
- SWDDA
- SWCLK
用两根线远程接管stm32大脑的接口,,,不是通信,,是直接控制CPU运行,暂停,读写内存,烧程序
stm32中boot0引脚
boot0为0,,表示从flash中读取代码
为1: 进入系统的bootLoader
boot0: 启动模式选择引脚,决定stm32上电之后,从哪里开始执行程序,,
boot1决定是使用 ST官方的刷机程序,,还是 从SRAM中执行自己的代码
知识点
放大器: amplifier : 让信号放大的电路,,,,晶振HSE,PLL内部,ADC前端,,都用到了放大器
方向器 :inverter : 输入高 --》输出低
主控电源滤波: 让供给stm32的电源更干净,把噪声和波动压下去
电容: 稳定电源电压,防止瞬间掉电或噪声
连接器: 让两块电路板,线缆可以插上就通电或者通信的接口零件,方便拆装,不焊死
直针: straight pin header : 直插排针
SWD接口下载就是连接器+直针
freeRtos
创建任务分为 动态创建任务xTaskCreate ,和静态创建任务xTaskCreateStatic,
动态创建任务: 内存自动分配在堆中
静态创建任务 : 内存需要手动分配
xCreateTask(函数名字,任务名字,栈深度,参数指针,任务优先级,句柄)
任务优先级: 调度器总是选择最高优先级的方法执行,,,配置文件中有一个配置优先级参数configMAX_PRIORITIES 一共有几个优先级。。默认配置是5个,,也就是 0~4,0是最低优先级,,,IDLE任务的优先级为0
任务句柄类型为: TaskHandle_t ,操作任务都要通过任务句柄,,,比如 vTaskSuspend(句柄),,vTaskResume(句柄),vTaskDelete(句柄)
任务状态:
- 运行状态 running state
- 就绪状态 ready state
- 阻塞状态 blocked state :因为等待先决条件,,主动放弃执行权,,不进入就绪状态进行排队,,比如超时,事件
- 暂停状态 : suspend state :暂停状态的任务永远不会被调度器选中
抢占式调度 : preemptire schedule
选择最高优先级的任务执行,一旦高优先级的任务就绪了,,,当前任务就会立刻被抢占
协作式调度: cooperation scheduling
高优先级任务就绪之后,,不会立马抢占,,,只有当前任务让出控制权的时候,这种切换才会发生
一般不用这个,,用这个代码管理会很复杂,,还需要在每个任务中写退出的时机
通过配置configUSE_Preemption 表示是抢占式调度还是协作式调度