嵌入式复习

题型
  1. 填空
  2. 选择
  3. 问答:定时器计数(),流程图,数字与编码,程序填空
  4. 综合
知识点
RTC(实时时钟)
  1. 时钟源,分频系数
  2. 寄存器位数(RTC,
diyizhang?
  1. 时钟系统时钟源:hse、hsi、lse、lsi、pll(时钟源的选择) (系统为STM32F103)
    H:高速 L:低速
    I:内部 E:外部
    PLL: 锁相环倍频输出

    • 系统时钟最大 72M,由时钟源分频或倍频得来
    • HSI:高速内部时钟,RC振荡器,精度不高, 8M
    • HSE:高速外部时钟,可接石英/陶瓷谐振器,或接外部时钟源,4M ~ 16M
    • LSI:低速内部时钟,RC振荡器,提供低功耗时钟, 40K WDG(看门狗)
    • LSE:低速外部时钟,接频率为 32.768KHz(215)的石英晶体, RTC
    • PLL:锁相环倍频输出,其时钟输入源可选择为 HSI/2HSEHSE/2,倍频可选择 2~16倍 ,但是输出频率 最大为72MHz
    • 系统时钟 SYSCLK 可来源于三个时钟源
      HSI、HSE、PLL
    • 任何外设使用前必须先使能时钟
  2. 系统时钟的最大值,定时器的时钟 两个总线的时钟

    • APB1 最大:36M
    • APB2 最大:72M
  3. 寻址空间

  4. 位操作 (选择填空) Static 换键,是否支持连续

  5. GPIO:(APB2总线)

    • 相关名词:
      IDR:输入数据寄存器(input data re。。。)
      ODR:

    • 引脚个数
      7组 一组16个引脚 一共112个

    • GPIO类型模式,用什么引脚时要用什么模式

      • 输入模式:斯密特触发器:滤波

        • 输入浮空,
        • 输入上拉,内部加入一个上拉电阻,没有输入时,寄存器读到 1
        • 输入下拉,内部加入一个下拉电阻,没有输入时,寄存器会读到 0
        • 模拟输入,不接入斯密特触发器等设备,利用ADC等处理
        • 选择方法:有效高电平,无效不输出为开路,则选输入下拉模式,直观的感受到状态的装换;
      • 输出模式:通过输出控制电路产生高低电平

        • 开漏输出,只接入 N-MOS 管,当输出为1时,截止,外部电压有外部电阻决定的;输出为0时,导通,外部为低电平
        • 推挽输出,N-MOS + P-MOS, 可以输出高电平和低电平。高,P-MOS管;低,N-MOS管
        • 复用开漏输出,输出数据由偏上其它外设决定的
        • 复用退推挽输出,
        • 选择:开漏输出:输出强低电平,高电平需要一个上拉电阻配合使用
      • 输出速度
        2M 10M 50M

    • GPIO寄存器作用(每组GPIO端口的寄存器介绍)

      • 32位*2 配置寄存器(GPIOx_CRL, GPIOx_CRH)16个引脚,每个引脚四位

        • GPIOx_CRL,低八个引脚 GPIOx_CRH,高八个引脚
        • 每四位的低两位:MODE位,
          00:输入模式,复位后的状态(0100)
          01:输出,10M
          10:输出,2M
          11:输出,50M
        • 每四位的高两位:CNF位
          输入模式下:
          00:模拟
          01:浮空,复位后的状态(0100)
          10:上拉/下拉,根据 ODR相对应的位 0:下拉; 1: 上拉
          11:保留
          输出模式下:
          00:通用推挽输出
          01:通用开漏输出
          10:复用推挽输出
          11:复用开漏输出
      • 32位*2 数据寄存器(GPIOx_IDR, GPIOx_ODR)

        • IDR:高16位保留,始终读位0,低16位只读且只能以字(16位)的形式读出
        • ODR:高16位保留,始终读位0,低16位可读可写,只能以字的形式操作
      • 32位*1 置位复位寄存器(GPIOx_BSRR)对ODR中数据位的设置,置位或复位

        • Bit Set Reset Register
        • 低16位,Bit Set,只能以 字 的形式 写入;0,不影响;1,设置对应位为 1
        • 高16位,Bit Reset,只能以 字 的形式 写入;0,不影响;1,清零对应位
      • 16位*1 复位寄存器(GPIOx_BRR)ODR中数据位的复位

        • 只能字操作;0:对应位不产生影响;1:对应位清零
      • 32位*1 锁定寄存器(GPIOx_LCKR)引脚功能的锁定(课程中没有说明


      • 每个I/O端口可以自由编程,然而寄存器必须按32位字被访问

    • 所有外设的初始化(其中

    • 位绑定(映射)

      • 原理:将每一个比特膨胀位一个32位字,当访问这些字的时候就达到了访问比特的目的,
      • 基地址 + 偏移量,GPIOx 的每个寄存器地址组成了一个结构体
      • 理解:将每1位映射到一个32位字
      • 支持位带操作区域 0x20000000 - 0x200FFFFF(SRAM区) 和 0x40000000 - 0x400FFFFF(片上外设区)
      • 优点:简化操作,提高指令执行速度,执行过程原子性
      • 位带区,别名区
      • 映射关系,
    • 别名地址计算

      • 外设位带区计算公式:
        AlidsAddr = 0x4200 0000 + (A - 0x4000 0000) * 32 + n * 4
        寄存器地址A,位数为 n 的变量的别名地址(GPIOx),片上外设别名区起始地址为 0x4200 0000
  6. GPIO相关

    • LED

    • 数码管,编码

    • 按键键配置,看懂相关库函数,连续与不连续(?????)

      • 对于独立按键查询而言,如果有外部上拉电阻,引脚可配置为浮空输入模式;如果没有,可以配置为上拉输入模式(此时有内部上拉效果)
    • 矩阵键盘 (程序填空)
      *

    • ()??
      在这里插入图片描述
      在这里插入图片描述

  7. 串口

    1. 单工双工

      • 单工:单向传输
      • 全双工:同时双向
      • 半双工:分时双向
    2. RS232 和 TTL

      • RS232 0 ~ 5(3.3)V
      • TTL -15 ~ 15
    3. 同步异步

      • 异步通信:不带时钟同步信号(UART 1-wire单总线)
      • 比较:
        在同步通讯中,数据信号所传输的内容绝大部分就是有效数据,而异步通讯中会包含有帧的各种标识符,所以同步通讯的效率更高,但是同步通讯双方的时钟允许误差较小,而异步通讯双方的时钟允许误差较大。
    4. RXD,TXD交叉相连

    5. 异步通信协议

      • 9600-8-N-1-N
        9600bps, 8位数据位,无校验位,1位停止位,无流控制,
        按要求发送数据 “A”: 0100 0001B
        8位数据 先低后高、起始位1位、停止位1位
        结果: 0 10000010 1
    6. 波特率的计算(important

      1. STM32F103共5个串口:
        串口1时钟来自PLCK2 (APB2外设的时钟)
        串口2-5时钟来自PLCK1(APB1外设的时钟)
      2. USART_BRR 波特率寄存器
        • 只使用 16 位,其中高12位是USART分频器整数部分,其他为小数部分
    7. 串口结构

    8. USART * 3 和 UART * 2

      • USART:同步、异步;URAT:异步
      • USART1连接APB2高速总线,其他位于APB1
  8. 中断(important)

    1. 分组方式(抢占、优先级、排序)
      • 抢占优先级高(属性编号小)的可以打断优先级低的中断
      • 响应优先级在抢占优先级相同的情况下,两个中断同时到达,响应优先级高的先处理
      • 4位,16 种中断向量优先级,可以分为抢占优先级相应优先级
      • 组合方式,0-4,1-3,2-2,3-1,4-0(抢占-响应)
      • NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2) 即2*2
    2. NVIC寄存器(x)
      1. 使用前工程中添加 misc.c 提供NVIC配置函数
      2. NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct)
        结构成员:
        NVIC_IRQChannel:定义初始化的是哪个中断,可以在 stm32f10x.h 中找到每个中断对应的名字。例如 USART1_IRQn 。
        NVIC_IRQChannelPreemptionPriority :定义这个中断的抢占优先级别。
        NVIC_IRQChannelSubPriority:定义这个中断的子优先级别。
        NVIC_IRQChannelCmd:该中断是否使能。
      3. 举例:
        NVIC_InitTypeDef NVIC_InitStru;
        NVIC_InitStru.NVIC_IRQChannel = USRT1_IRQn;
        //抢占优先级 1
        NVIC_InitStru.NVIC_IRQChannelPreemptionPriority = 1;
        //响应优先级 2
        NVIC_InitStru.NVIC_IRQChannelSubPriority = 2
        NVIC_InitStru.NVIC_IRQChannelCmd = ENABLE;
        
        NVIC_Init(&NVIC_InitStru);
        
    3. 中断的配置过程
      1. 先设置中断分组。确定组号,也就是确定抢占优先级和子优先级的分配位数。调用函数为 NVIC_PriorityGroupConfig
      2. 再设置所用到的中断的中断优先级别。 对每个中断调用函数 NVIC_Init()
    4. 中断和IO口对应
      1. PAx ~ PGx引脚连接到 EXTIx (例:PA1,PB1, PC1…都连接到 EXTI1)
      2. EXTI9 ~ EXTI5 共用一个中断向量,称为 EXTI9_5
      3. EXTI15 ~ EXTI10 共用一个中断向量,称为 EXTI15_10
      4. 共用中断向量的中断通道不能嵌套
      5. 在库函数中,配置G P I O引脚与中断线的映射关系靠函数GPIO_EXTILineConfig() 来实现:
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource2); GPIOE.2 与 EXTI2 中短线连接起来
    5. 中断服务函数
      • 中断服务函数名需要和启动文件中的相同(EXTI0_IRQHandler())
      • 常用的两个函数:
        • EXTI_GetITStatus(uint32_t EXTI_Line); 检测中断是否发生
        • EXTI_ClearITPendingBit(uint32_t EXTI_Line); 清除某个中断线上的中断标志位
      • 常见写法
      void EXTI3_IRQHandler(void){
          if(EXTI_GetITStatus(EXTI_Line3) != RESET){ //判断是否发生中断
              //中断逻辑
              EXTI_ClearITPendingBit(EXTI_Line3);   //清除
          }
      }   
      
    6. 外部中断配置
      1. EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct)
      2. EXTI_InitTypeDef 成员变量
        • EXTI_Line: 中断线标号,EXTI_Line0 ~ EXTI_Line15
        • EXTI_Mode: 中断模式,EXTI_Mode_Interrupt (中断) 和 EXTI_Mode_Event (事件)
        • EXTI_Trigger: 触发方式,下降沿触发 EXTI_Trigger_Falling/上升沿触发 EXTI_Trigger_Rising /任意电平 (上升沿和下降沿 触发EXTI_Trigger_Rising_Falling)
        • EXTI_LineCmd: 允许或禁止 (ENABLE)
      3. 例子:
        EXTI_IintTypeDef EXTI_InitStru;
        
        EXTI_InitStru.EXTI_Line = EXTI_Line4;
        EXTI_InitStru.EXTI_Mode = EXTI_Mode_Interrupt;
        EXTI_InitStru.EXTI_Trigger = EXTI_Trigger_Falling;
        EXTI_InitStru.EXTI_LineCmd = ENABLE;
        
        EXTI_Init(&EXTI_InitStru);
        
    7. GPIO中断设置步骤
    /*
      1)初始化 IO 口为输入。
      2)开启 AFIO 时钟
      3)设置 IO 口与中断线的映射关系。
      4)初始化线上中断,设置触发条件等。
      5)配置NVIC中断组,并使能中断。
      6)编写中断服务函数。()
    */
    
    /*
    初始化
    
    */
    
    #include "stm32f10x.h"
    
    
    //中断向量设置,其中
    void My_NVIC_Config(){
        NVIC_InitTypeDef NVIC_InitStru;
        
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
        
        //配置中断源
        NVIC_InitStru.NVIC_IRQChannel = EXTI0_IRQn;
        NVIC_InitStru.NVIC_IRQChannelPreemptionPriority = 0;
        NVIC_InitStru.NVIC_IRQChannelSubPriority = 0;
        NVIC_InitStru.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStru);
        
        NVIC_InitStru.NVIC_IRQChannel = EXTI1_IRQn;
        NVIC_InitStru.NVIC_IRQChannelPreemptionPriority = 0;
        NVIC_InitStru.NVIC_IRQChannelSubPriority = 1;
        NVIC_InitStru.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStru);
    }
    
    //配置PB6为中断口
    //上拉输入和下降沿中断配合使用
    void EXTI_PB_Config(void){
        GPIO_InitTypeDef GPIO_InitStru;
        EXTI_InitTypeDef EXTI_InitStru;
    
        //初始化时钟
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
    
        GPIO_InitStru.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
        GPIO_InitStru.GPIO_Mode = GPIO_Mode_IPU;	//上拉输入
        GPIO_Init(GPIOB, &GPIO_InitStru);
        
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource0);
        EXTI_InitStru.EXTI_Line = EXTI_Line0;
        EXTI_InitStru.EXTI_Mode = EXTI_Mode_Interrupt;
        EXTI_InitStru.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿中断
        EXTI_InitStru.EXTI_LineCmd = ENABLE;
        EXTI_Init(&EXTI_InitStru);
        
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource1);
        EXTI_InitStru.EXTI_Line = EXTI_Line1;
        EXTI_Init(&EXTI_InitStru);
        
        My_NVIC_Config();
    }
    
    //中断服务程序的编写
    //必须在stm32f10x_it.c中编写,且中断服务函数名必须和启动代码中定义的相同
    //如 PE5 口中断
    void EXTI9_5_IRQHandler(void){
        if(EXTI_GetITStatus(EXTI_Line5) != RESET){
            //.....
            EXTI_ClearITPendingBit(EXTI_Line5);
        }
    }
    
  9. SysTick 原理,执行过程

    • tim计数模式位数,4个通道,
    • PWM模式
  10. ADC

    • 规则组,注入组
    • 连续转换,扫描转换,
    • ADC RTCx (综合题)
Others
  1. 高低电平:2V 0.8V
例子
  1. 初始化外设时钟

    • RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  2. GPIO库函数

    • GPIO_Init(),根据 GPIO_InitStruct中指定的参数初始化 GPIOx 寄存器

      • GPIO_Init(GPIOx, &GPIO_InitStruct)
      • GPIO_InitStruct结构体
        • 三个元素,GPIO_Pin(u16),GPIO_Speed,GPIO_Mode;
        • GPIO_Pin:GPIO_Pin_0(None,0~15,All)
        • GPIO_Speed:GPIO_Speed_10MHz(2MHz、50MHz)
        • GPIO_Mode:GPIO_Mode_xxx
          • AIN:模拟输入
          • IN_FLOATING:浮空输入
          • IPD:下拉
          • IPU:上拉
          • Out_OD:开漏
          • Out_PP:推挽输出
          • AF_OD:复用开漏
          • AF_PP:复用推挽输出
    • GPIO_ReadInputDataBit(),读取指定端口管脚的输入

      • u8 GPIO_ReadInputDataBit(GPIOx, GPIO_Pin)
    • GPIO_ReadInputData(),读取指定的GPIO端口输入

      • u16 GPIO_ReadInputData(GPIOx)
    • GPIO_ReadOutputDataBit(),读取指定的端口管脚的输出

      • u8 GPIO_ReadOutputDataBit(GPIOx, GPIO_Pin)
    • GPIO_ReadOutputData(),读取指定的GPIO端口输出

      • u16 GPIO_ReadOutputData(GPIOx)
    • GPIO_SetBits(),设置指定

      • GPIO_SetBits(GPIOx, GPIO_Pin)
    • GPIO_ResetBits(),清除指定

      • GPIO_ResetBits(GPIOx, GPIO_Pin)
    • GPIO_WriteBit(),设置或者清除指定的数据端口位

      • GPIO_WriteBit(GPIOx, GPIO_Pin, BitVal)
      • BitVal: Bit_RESET, Bit_SET
    • GPIO_Write(),向指定GPIO端口写数据

      • GPIO_Write(GPIOx, PortVal)
  3. GPIO寄存器操作

    • 可以使用库函数,也可以直接对对应寄存器进行写操作
    • 直接写操作:
#include "stm32f10x.h" 

int main(){

/*GPIO 相关操作*/

//初始化时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

/*****GPIO 寄存器操作*********/
//初始化PA0,PA1为推挽式输出
GPIOA->CRL &= 0xFFFFFF00;
GPIOA->CRL |= 0x00000023;           //PA0: 0011,推挽式50M; PA1: 0010,推挽式2M

//PA0输出低电平,PA1输出高电平
GPIOA->ODR &= 0xFFFC;
GPIOA->ODR |= 0x0002;

//PA0输出低电平,PA1输出高电平
GPIOA->BRR |= 0x00000001;
GPIOA->BSRR |= 0x00000002;

//PA0输出低电平,PA1输出高电平
GPIO_ResetBits(GPIOA, GPIO_Pin_0);
GPIO_SetBits(GPIOA, GPIO_Pin_1);


/**********库函数操作*************/
//初始化结构体
GPIO_InitTypeDef GPIO_InitStru;
}
//适用于共阳数码管的字形表(有小数点)
u8 seg_tab[10] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90};
//适用于共阴数码管的字形表
u8 seg_tab1[17] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71, 0x00};
/**八段数码管的扫描显示**/
/*PA0-PA7控制字形
 *PE0-PE7 字位
*/
#include "stm32f10x.h"

#define  PA0out *((volatile unsigned long *)(0x4200 0000 + (GPIOA_BASE + 0x0C - 0x4000 0000) * 32 + 0 * 4))
#define DX0 PAout(0)
#define DX1 PAout(1)
#define DX2 PAout(2)
#define DX3 PAout(3)
#define DX4 PAout(4)
#define DX5 PAout(5)
#define DX6 PAout(6)
#define DX7 PAout(7)

u8 seg_tab[10] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90};

void Display(u8 index){
    DX0 = seg_tab[index] & 0x01
}
  1. 八段数码管扫描显示关键代码展示

在这里插入图片描述在这里插入图片描述

其他

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

去年试题
  1. 通用定时器器TIM的通道有几个?

  2. 各种寄存器的位数(RTC,Systick等)

  3. ADC通道的位数

  4. 中断向量(中断服务函数)写在哪个文件里?(后缀名应该是it.c)
    stm32f10x_it.c

  5. 烧制软件用的是什么?

    • ISP下载(另外还有JLINK、STLINK)使用串口下载(USB/串口)
    • STM32的串口1下载程序,下载时,BOOT0 和 BOOT1 接地(GND)
    • USB串口驱动:CH341SER.EXE
    • 烧制软件:FlyMcu
  6. 烧制的文件是什么?(.hex文件)

  7. stm32位带别名区的映射地址计算

    • 外设位带区计算公式:
      AlidsAddr = 0x4200 0000 + (A - 0x4000 0000) * 32 + n * 4
      寄存器地址A,位数为 n 的变量的别名地址(GPIOx),片上外设别名区起始地址为 0x4200 0000
  8. pwm的占空比和极性

    1. 有效电平所占的比例,称为占空比
  9. 输入输出方式以及代码的写法(比如output_pp推挽输出,还有上拉输入,下拉输入等等,怎么表示的,对应不同的电路,应该用哪种方式)

  10. 串口需要的配置(波特率等等,会描述,会计算波特率)

  11. 两种中断优先级的写法和区别

  12. 常用信号源的时钟频率(如lsi)

  13. 端口复用是什么意思,stm32里的端口复用技术

  14. 位操作(如何对其中某一位置位复位)

  15. 矩阵键盘的配置(行列反转实现等)

  16. APB1和APB2时钟频率(这一块比较杂,最好百度下)

  17. 相关库函数(什么setbits,resetbits,程序填空)

  18. GPIO基本的引脚配置

AlidsAddr = 0x4200 0000 + (A - 0x4000 0000) * 32 + n * 4**
寄存器地址A,位数为 n 的变量的别名地址(GPIOx),片上外设别名区起始地址为 0x4200 0000

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值