STM32 内核知识点

多级流水线结构

类似并行运算,取指、解码、运算在同一时刻进行,加快程序运行速度。

Cortex-M3 内核

三个特殊的寄存器R13、R14、R15
R13:堆栈;
R14 :LR寄存器,链接寄存器。保存调用子程序的地址。
R15:程序计数器。
另外还有一个特殊的寄存器 状态寄存器,通常用在操作系统中。

时钟

时钟是同步电路的心脏,要让时钟先振动起来,然后才能工作。所以分析电路,不论是板级电路,还是某个外设,都要先看时钟。
比较重要的几个时钟寄存器,
CR、CFGR、APB1、APB2、AHB几个时钟寄存器。

堆栈???

分为堆和栈。

  • 堆(heap):是常用的动态内存申请和释放管理;
  • 栈(stack)是精髓。局部变量、函数调用现场保护和返回地址。
    采用的是向下生长的满栈模型,即从高地址到低地址生长。意义是保证数据能够顺序执行,新来的往后排,旧的先出。堆和栈在内存上是挨着的。
    先入后出FILO

堆和栈的设置在启动文件中。,观察的话可以看map文件。

双堆栈

简述:本质是寄存器R13,分成两个堆栈,MSP和PSP。MSP:中断中使用的。PSP:任务中使用。
意义:两个堆栈,一个处理任务,一个处理中断,更安全。

全局变量和局部变量

  • 全局变量,在内存方面,始终占用存储单元;在使用时在注意不要定义过多,会影响程序的存储空间、以及影响程序的可读性。一般使用情况,在需要对外输出的数据作为全局变量,同时加结构体封装。
  • 变量的存储方式,从变量值存在的时间来看分为静态存储方式,动态存储方式。静态是指程序从开始就分配固定的存储空间,动态指程序运行期间根据需要动态分配(申请和释放)。全局变量在静态存储区,局部变量、函数调用的现场保护和返回地址在动态存储区,

gpio

  • FT,5V容忍。原理是GPIO处有稳压管。
    在这里插入图片描述

  • 开漏输出和推挽输出;开漏输出只是打开了下拉的MOS管,所以只能输出强低电平,高电平需要外部上拉。推挽输出上、下拉MOS管都可以打开,所以可以输出强高低电平

    • 开漏的应用场景:匹配电平;5V/3.3V; 利用外部电路的驱动能力,减少IC的驱动。
    • PP 常用于:不需要外部电路可以直接驱动外部资源传感器之类。
  • 模拟输入,ADC采集。

  • 输入上拉下拉,可以直接应用于电路之中做数字数据读入。

  • BSRR和ODR寄存器,BSRR寄存器支持位操作,置位或者复位,ODR需要16位操作。BSRR寄存器的支持位操作的原因是每个位有独立的32位地址。

  • 置位:GPIO->ODR |= 1 << 6; 清零,GPIO->ODR &= ~(1<< 6);

  • BSRR 寄存器,写入1生效,写入0不生效,所以支持位操作。

NVIC 中断优先级管理

  • STM32G4系列,92个中断,10个内核,82个可屏蔽中断。共16级中断优先级。
  • 中断优先级分组,目的是为了划分抢占优先级和响应优先级。共4位,分抢占优先级和响应优先级两部分。顾名思义,抢占就是打断正在执行中断的意思,响应就是多个中断来了,谁响应中断优先级高,就先响应谁。优先级数越小,等级越高。
    在这里插入图片描述
    图片来自正点原子
  • 外部中断共有22个,可配置的16个,对应了7个中断向量,也就是使用7个中断服务函数。

定时器

  • 预分频计数器,只是对计数器进行分频。时钟分频是对定时器的输入时钟进行分频。
  • 预分频系数是1,那么实际的分频倍数是1+1;见下图,当预分频系数是0时不分频,等于1时是2分频。
    在这里插入图片描述

重复计数器:更新时间重复多次的计数器。可以灵活调整更新事件的时间。如重复计数器 = 5,那么需要5个更新时间才能触发。

外部输入滤波:外部输入滤波就是分频的意思。

互补输出和死区:两路互补的信号,死区是两个信号之间的延时。


pendsv

简述:保存任务现场,实现任务切换管理。


SVC 软中断

简述:操作系统会用到。实现任务调用。

中断的过程

进入中断

  1. 首先是现场保护,将当前的PC、LR、PSR状态寄存器的内容等入栈;
  2. 中断向量表,根据中断源取中断服务程序入口地址,放入PC。
  3. 执行中断服务程序。

退出中断

  1. 执行返回命令。
  2. 恢复现场,之前在栈里面保存的PC、LR等寄存器的值出栈。
  3. 从原位置执行程序。

复位的过程

  1. 复位之后,存储与异常向量表中的SP、PC的地址会给到这两个寄存器,然后从这两个地址开始运行程序。

常用的C语言关键字

  • static:

    • 修饰全局变量或者函数:文件内可见,做保护。中间过程函数。
    • 修饰局部变量:转化为全局变量,值不会释放。
  • volatile

    • 禁止编译器优化而省略中间步骤。例如连续复复制。a = b; c = b;
    • 每一次都会读取最新的值,而不是直接用缓存的值。常用在对于状态寄存器的数值读取,或者对实时性要求很高的变量。
    • 可以和const 一起使用。只读存储器。const volatile a = 0;
  • const

    • 常量关键词,不能修改。

STM32编程方式

ICP:in circuit program 在电路中编程。SW JTAG 编程。
ISP:in system program,在系统中编程,从系统区域中开始编程。通过串行接口来编程,一般用上位机来操作。系统区域有一段Bootloader 程序,可以引导程序下载。
IAP:in applacation program ,应用中编程,程序在跑的过程中接收程序,将程序存下来然后作为应用程序。远程升级。

ADC 数据左对齐

1、当ADC需要的精度不高时,可以使用左对齐,直接拿高8位数据。
2、可以起到滤除噪声干扰的作用。低位的数据不准确直接舍弃。

const常量,宏定义

宏能够定义的范围宽一些,常量,函数;const 只能定义只读的参数。
宏的坏处就是编译的时候要不断替换,编译时间久。

位操作

先与清零,后或赋值。

单独位操作

端口复用和重映射

端口复用是引脚有多种功能,任选一个使用。从引脚角度来说的。
重映射是将外设资源引脚调整到其他引脚。从外设资源来说的。最后一列。
在这里插入图片描述

字符串判断

独立看门狗和窗口看门狗

作用:程序跑飞后自动复位,防止长时间处于未知状态。
时钟源不同,独立看门狗是LSI,窗口看门狗是APB1分频而来。
应用场景

  • 独立看门狗应用在独立、低时间精度的场合。
  • 窗口看门狗用在精确计时的场合。软件不按照预期效果执行,如跳过了一段程序,提前喂狗了,也会触发复位。
  • 独立看门狗只能保证喂了,对于程序部分跑飞的不会检测到,但是窗口看门狗可以保证喂的精准,更可靠。
  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值