1.蜂鸣器实验

1.硬件连接

  1. 提示:不能通过IO口直接驱动大功率器件<br /> 不用 STM32 IO 直接驱动蜂鸣器,而是通过三极管扩流后再驱动蜂鸣器 <br /> 蜂鸣器的驱动信号连接在 STM32 PB8 <br /> R60 主要用于防止蜂鸣器的误发声。当 PB.8 输出高电平的时候,蜂鸣器将发声, PB.8 出低电平的时候,蜂鸣器停止发声 。<br /> ![]`_260%L760@]5WUKLX}SK3.png](https://cdn.nlark.com/yuque/0/2021/png/22507599/1629965148473-8fc21c00-c6ad-405c-9fbe-2ea93cd16147.png#clientId=u6c2d0226-82ca-4&from=paste&height=197&id=u55379997&margin=%5Bobject%20Object%5D&name=%5D%60_260%25L760%40%5D5WUKLX%7DSK3.png&originHeight=264&originWidth=536&originalType=binary&ratio=1&size=32124&status=done&style=none&taskId=ua0093559-c4e2-427d-862a-91b0d385545&width=400)

2.软件设计

  1. 实验步骤:使能IO口时钟,同时初始化IO模式,使其为推挽输出,最后操作IO口,输出高低电平,最后的现象是DS0亮的时候蜂鸣器不叫,而DS0灭的时候,蜂鸣器叫。<br /> 1. HARDWARE 文件夹下新建一个 BEEP 文件夹 ,将beep.c 保存在BEEP里面<br /> 作用就是使能 PORTB 的时钟,同时配置 PB8 为推挽输出 <br /> 2.beep.h保存在BEEP里面 :通过位带操作来实现某个 IO 口的输出控制 <br /> 3.BEEP 文件夹加入头文件包含路径 <br /> beep.c beep.h USER里的main.c代码可参考文件:STM32F1开发指南

2.按键输入实验(库函数)

1.硬件设计

  1. ![H@MH$5~0_0NNH3180}IZV]3.png](https://cdn.nlark.com/yuque/0/2021/png/22507599/1629966437425-fff895a8-30c8-46a2-8d28-f3064718212a.png#clientId=u6c2d0226-82ca-4&from=paste&height=115&id=u30b52c64&margin=%5Bobject%20Object%5D&name=H%40MH%245~0_0NNH3180%7DIZV%5D3.png&originHeight=181&originWidth=628&originalType=binary&ratio=1&size=49638&status=done&style=none&taskId=u2d516986-8758-4887-b387-04f15250ee3&width=400)
  1. 需要注意的是: KEY0 KEY1 KEY2 是低电平有效的,而 WK_UP 是高电平有效的,<br />并且外部都没有上下拉电阻,所以,需要在 STM32 内部设置上下拉。

2.GPIO输入操作说明

  1. 1.调用库函数读取IO口输入电平<br /> 2.操作寄存器读取IO口输入电平:GPIOx_IDR:端口输入寄存器<br /> 3.使用位带操作读取IO口输入电平<br /> PEin(4) 读取GPIOE.4口电平


PEin(n) : 读取GPIOE.n口电平

3.软件设计

  1. 实验步骤:使能按键对应IO口时钟,同时初始化IO口模式为上拉或下拉输入,最后扫描IO口电平(库函数/寄存器/位操作)<br /> 按键扫描的思路:<br /> ![YJP)71QPEIVI7)D)F`Q}}QC.png](https://cdn.nlark.com/yuque/0/2021/png/22507599/1629967360261-801b253f-c04f-4062-9d24-51f937d4824a.png#clientId=u6c2d0226-82ca-4&from=paste&height=325&id=u7f1331e9&margin=%5Bobject%20Object%5D&name=YJP%2971QPEIVI7%29D%29F%60Q%7D%7DQC.png&originHeight=463&originWidth=713&originalType=binary&ratio=1&size=80742&status=done&style=none&taskId=ubc1b263a-88a1-4474-8dfa-f936a056903&width=500)

3.NVIC中断优先级管理

1.NVIC中断优先级分组

1.STM32中断

  1. CM3 内核支持 256 个中断,其中包含了 16 个内核中断和 240 个外部中断,并且具有 256级的可编程中断设置。<br /> STM32 并没有使用 CM3 内核的全部东西,而是只用了它的一部分。<br /> STM32 84 个中断,包括 16 个内核中断和 68 个可屏蔽中断,具有 16 级可编程的中断优先级。<br /> STM32F103 系列上面,又只有 60 个(在 107 系列才有 68 个) <br />

2.中断管理方法

  1. STM32 的中断分组: STM32 将中断分为 5 个组,组 0~4,每个中断设置一个抢占优先级和一个响应优先级。<br /> 分组的设置是由 SCB->AIRCR 寄存器的 bit10~8 来定义的。 <br /> ![JQV98N6E30P(B_D9F0J]H0H.png](https://cdn.nlark.com/yuque/0/2021/png/22507599/1629967974882-f9ed4fdd-ceb0-4915-8341-636e28fd39ec.png#clientId=u6c2d0226-82ca-4&from=paste&height=128&id=u318d9a58&margin=%5Bobject%20Object%5D&name=JQV98N6E30P%28B_D9F0J%5DH0H.png&originHeight=190&originWidth=741&originalType=binary&ratio=1&size=43327&status=done&style=none&taskId=uf77cdafe-96a5-4a67-9c9b-ff1c6a4f090&width=500)<br /> <br /> 注意:第一:抢占优先级的级别高于响应优先级。而数值越小所代表的优先级就越高<br /> 第二,如果两个中断的抢占优先级和响应优先级都是一样的话,则看哪个中断先发生就先执行 <br /> 第三,高优先级的抢占优先级是可以打断正在进行的低抢占优先级中断的。而抢占优先级相同的中断,高优先级的响应优先级不可以打断低响应优先级的中断。 <br /> <br /> 特别说明:一般情况下,系统代码执行过程中,只设置一次中断优先级分组, 随意改变分组会导致中断管理混乱,程序出现意想不到的执行结果。

2.NVIC中断优先级设置

1. 中断优先级分组函数

  1. void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)
  1. void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)<br /> {<br /> assert_param(IS_NVIC_PRIORITY_GROUP(NVIC_PriorityGroup));<br /> SCB->AIRCR = AIRCR_VECTKEY_MASK | NVIC_PriorityGroup;<br /> }

2. 中断设置相关寄存器

  1. ISER[8]: ISER 全称是: Interrupt Set-Enable Registers,这是一个中断使能寄存器组。 8 32 位寄存器来控制,每个位控制一个中断。 两个(ISER[0]和 ISER[1])总共可以表示 64 个中断。而 STM32F103 只用了其中的前 60 位。 ISER[0]的 bit0~bit31 分别对应中断 0~31 ISER[1]的 bit0~27 对应中断 32~59 你要使能某个中断,必须设置相应的 ISER 位为 1,使该中断被使能
  2. ICER[8]:全称是: Interrupt Clear-Enable Registers,是一个中断除能寄存器组。该寄存器组<br />与 ISER 的作用恰好相反,是用来清除某个中断的使能的。
  3. ISPR[8]:全称是: Interrupt Set-Pending Registers,是一个中断挂起控制寄存器组。每个位<br />对应的中断和 ISER 是一样的。通过置 1,可以将正在进行的中断挂起,而执行同级或更高级别<br />的中断。写 0 是无效的。
  4. ICPR[8]:全称是: Interrupt Clear-Pending Registers,是一个中断解挂控制寄存器组。其作<br />用与 ISPR 相反,对应位也和 ISER 是一样的。通过设置 1,可以将挂起的中断接挂。写 0 无效。
  5. IABR[8]:全称是: Interrupt Active Bit Registers,是一个中断激活标志位寄存器组。对应位<br />所代表的中断和 ISER 一样,如果为 1,则表示该位所对应的中断正在被执行。这是一个只读寄<br />存器,通过它可以知道当前在执行的中断是哪一个。在中断执行完了由硬件自动清零。
  6. IP[240]:全称是: Interrupt Priority Registers,是一个中断优先级控制的寄存器组。这个寄<br />存器组相当重要! STM32 的中断分组与这个寄存器组密切相关。 IP 寄存器组由 240 8bit 的寄<br />存器组成,每个可屏蔽中断占用 8bit,这样总共可以表示 240 个可屏蔽中断。 STM32 只用到<br />了其中的前 60 个。 IP[59]~IP[0]分别对应中断 59~0 而每个可屏蔽中断占用的 8bit 并没有全部<br />使用,而是 只用了高 4 位。这 4 位,又分为抢占优先级和子优先级。抢占优先级在前,子优先<br />级在后。而这两个优先级各占几个位又要根据 SCB->AIRCR 中的中断分组设置来决定。

4. 中断优先级设置步骤

  1. 1. 系统运行开始的时候设置中断分组。 确定组号,也就是确定抢占优先级和子优先级的<br /> 分配位数。 调用函数为 NVIC_PriorityGroupConfig();<br /> 2. 设置所用到的中断的中断优先级别。 对每个中断调用函数为 NVIC_Init();