网站建设合同要注意什么,做网站设计的电脑需要什么配置,百度引流推广费用多少,做网站容易还是做小程序容易一、基础知识点 1、课程体系介绍 单片机概述arm体系结构STM32开发环境搭建 STM32-GPIO编程-点亮世界的那盏灯 STM32-USART串口应用SPI液晶屏 STM32-中断系统 STM32-时钟系统 STM32-ADC DMA 温湿度传感器-DHT11 2.如何学习单片机课程 多听理论、多理解、有问题及时提问 自己多…一、基础知识点 1、课程体系介绍 单片机概述arm体系结构STM32开发环境搭建 STM32-GPIO编程-点亮世界的那盏灯 STM32-USART串口应用SPI液晶屏 STM32-中断系统 STM32-时钟系统 STM32-ADC DMA 温湿度传感器-DHT11 2.如何学习单片机课程 多听理论、多理解、有问题及时提问 自己多扩展、多动手操作 开发环境搭建 Keil 单片机集成开发环境 - 代码编写、编译、调试、下载 STM32CubeMX ST公司提供的一款快速开发STM32的一款工程搭建软件 STlinkDriver 我们使用的下载器是STlink_V2同样需要STlink的驱动从ST官网上也是可以找到的 安装注意事项 1安装路径一定不要出现中文你电脑的用户如果是中文也是可能出现问题的 2关闭防火墙和所有杀毒软件注册机 3安装时候使用右键以管理员身份安装 4keil使用注册机的时候一定要选择ARMSTM32内核架构就是ARM。 5如果你使用的是最新版本安装手册上CubeMX安装之后需要的固件包可以联网在线下载 6安装StLink的驱动时先插上STlink再运行安装程序。 3.课程回顾——嵌入式相关职业 嵌入式软件工程师、嵌入式硬件工程师、QT/C、单片机开发工程师、Linux应用层开发、 Linux底层开发ARM\驱动开发 C语言基础、C及Linux高级、数据结构 IO进程、网络编程、网络高级 QT/C STM32课程 Linux底层开发 4.硬件基础 学到什么程度 具有基本的电子电路知识基本的电子标号认识、会看原理图、知道PCB图、欧姆定律Iu/r 电压 电压voltage也被称作电势差或电位差是衡量单位电荷在静电场中由于电势不同所产生的能量差的物理量。电压在某点至另一点的大小等于单位正电荷因受电场力作用从某点移动到另一点所做的功电压的方向规定为从高电位指向低电位的方向。电压的国际单位制为伏特V简称伏常用的单位还有毫伏mV、微伏μV、千伏kV等。此概念与水位高低所造成的水压相似。需要指出“电压”一词一般只用于电路当中“电势差”和“电位差”则普遍应用于一切电现象当中。 电流 电流的强弱用电流强度来描述电流强度是单位时间内通过导体某一横截面的电荷量简称电流用I表示。 电阻 电阻器Resistor在日常生活中一般直接称为电阻。是一个限流元件将电阻接在电路中后电阻器的阻值是固定的一般是两个引脚它可限制通过它所连支路的电流大小。阻值不能改变的称为固定电阻器。阻值可变的称为电位器或可变电阻器。理想的电阻器是线性的即通过电阻器的瞬时电流与外加瞬时电压成正比。用于分压的可变电阻器。在裸露的电阻体上紧压着一至两个可移金属触点。触点位置确定电阻体任一端与触点间的阻值。 电容 两个相互靠近的导体中间夹一层不导电的绝缘介质这就构成了电容器。当电容器的两个极板之间加上电压时电容器就会储存电荷。电容器的电容量在数值上等于一个导电极板上的电荷量与两个极板之间的电压之比。电容器的电容量的基本单位是法拉(F)。在电路图中通常用字母C表示电容元件。 5、什么是单片机 5.1 单片机简介 单片机是单片微型计算机的简称Mcu是Microcontroller的简称也就是嵌入式微控制器。采用集成电路技术将具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、定时器/计时器、多种I/O口和中断系统等功能集成到一块硅片上。可以说单片机就是一个小而完善的微型计算机系统。 5.2 单片机型号 51单片机STC89C51 宏晶科技 STC AT89C51 32单片机STM32 意法半导体 ST 32位处理器- 处理数据宽度是32位的 处理器位数CPU单次运算的最大处理数据的位数 6.STM32介绍 6.1 简介 STM32是意法半导体公司生成一款32位的微控制器。 6.2 STM32的优势 产品型号丰富可选择性强 运算速度快功耗低 处理器外设接口丰富 库函数开发体系学习资料多可以抛开寄存器应用广泛。 6.3 STM32的应用 可穿戴、物联网、无人机、工业控制、医疗电子、汽车电子、电力系统、石油系统、燃气系统 6.4 命名规范 6.5 开发套件介绍 设备 核心板 - 处理器 无线通信模块NB-IOT、Wifi、Zigbee 底板 - 承载各种外设接口 如传感器扩展口、按键、LED灯、通信接口MiniUSB、五向按键等。 配套模块 传感器 执行器 蜂鸣器、风扇、电灯、继电器 7、ARM体系结构 STM32G030采用ARM Cortex-M0内核架构 面试题谈谈你对ARM的认识 答 1-ARM是一家公司ARM公司是一家芯片知识产权IP供应商它与一般的半导体公司最大的不同就是不制造芯片且不向终端用户出售芯片而是通过转让设计方案由合作伙伴生产出各具特色的芯片。 2 - ARM处理器ARM处理器是英国Acorn有限公司设计的低功耗低成本的第一款RISC微处理器。 经典处理器 ARM7\ARM9\ARM11,后续处理器开始以cortex命名 Cortex-A 高性能 Cortex-R 汽车电子 Cortex-M 低成本、低功耗 3 - ARM代表一种技术。具有性能高、成本低和能耗省的特点。在智能机、平板电脑、嵌入控制、多媒体数字等处理器领域拥有主导地位。 Tips目前主流处理器架构 ARM架构、Intel X86/X64架构、MIPS架构、RISC-V开源 Tips精简指令集RISC和复杂指令集CISC的区别 注程序是指令的有序集合 int a,b,c; a10; b20; cab; 案例 早期的CPU全部是CISC架构它的设计目的是要用最少的机器语言指令来完成所需的计算任务。 比如对于乘法运算在CISC架构的CPU上您可能需要这样一条指令 MUL ADDRA, ADDRB 就可以将ADDRA和ADDRB中的数相乘并将结果储存在ADDRA中。 将ADDRA,ADDRB中的数据读入寄存器相乘和将结果写回内存的操作全部依赖于CPU中设计的逻辑来实现。 这种架构会增加CPU结构的复杂性和对CPU工艺的要求但对于编译器的开发十分有利。 比如上面的例子C程序中的a*b就可以直接编译为一条乘法指令。 今天只有Intel及其兼容CPU还在使用CISC架构。 RISC架构要求软件来指定各个操作步骤。上面的例子如果要在RISC架构上实现 将ADDRA, ADDRB中的数据读入寄存器相乘和将结果写回内存的操作都必须由软件来实现 比如 MOV A, ADDRA; MOV B, ADDRB; MUL A, B; STR ADDRA,A。 这种架构可以降低CPU的复杂性以及允许在同样的工艺水平下生产出功能更强大的CPU 但对于编译器的设计有更高的要求。 2.处理器架构 STM32G030 ● 主模块 : Cortex-M0内核及先进高性能总线 (AHB bus) 通用 DMA ( GP-DMA -- general-purpose DMA) ● 从模块 : – 内部FLASH – 内部SRAM – APB桥连接AHB和APB所有的外设都挂在APB总线上 - G0 GPIOx直接挂在IOPORT总线上。 Tipsflash和SRAM的区别 Flash存储器是一种非易失性存储器可以在掉电之后保存数据通常用于存储程序代码。Flash存储器的可写入次数有限且需要执行擦除操作才能写入新的数据因此在使用过程中需要注意擦写周期和数据备份问题。 SRAM存储器则是一种易失性存储器具有相对较快的读写速度和无限的读写次数但掉电时将会丢失所有内容。SRAM存储器主要用于暂存数据和临时变量读写操作由CPU直接完成访问速度较快。 单片机的Flash存储器和SRAM存储器通常都嵌入在单片机芯片内部能够方便地实现对程序和数据的读写操作。通常编译器会将程序代码烧录到Flash存储器中并使用SRAM存储器来存储变量、函数堆栈和其他临时数据。 Tips什么是外设如何理解片上外设 与传统的外设不同片上外设通常具有以下优点 高效性片上外设能够与主处理器实现高速的数据传输响应时间短执行效率高。 集成度高片上外设多个模块都嵌入到处理器芯片内部极大地降低了PCB面积和电路复杂度。 低功耗处理器和片上外设采用相同的工艺能够满足高密度和低功耗的需求。 可靠性高提高了整体系统的可靠性和稳定性也降低了电磁干扰的可能。 TipsAHB和APB的区别 AHB是高速总线是一种系统总线它主要负责连接处理器、DMA等一些内部接口。 AHB系统由主模块、从模块和基础结构3部分组成整个AHB总线上的传输都由主模块发出由从模块负责回应。 APB是低速总线它主要负责连接外围设备它又分为APB1和APB2 它的总线架构不像 AHB支持多个主模块在APB里面唯一的主模块就是APB桥。 cortext-M0内核架构 Cortex-M 系列产品线 Cortex-M 系列产品主要包括 Cortex-M0、Cortex-M1、Cortex-M3、Cortex-M4、Cortex-M7 等其中 Cortex-M0 主打低功耗和混合信号的处理M3 主要用来替代 ARM7,重点侧重能耗与性能的平衡而 M7 则重点放在高性能控制运算领域。 Cortex-M0结构框图 Cortex-M0 微处理器主要包括处理器内核、嵌套向量中断控制器NVIC、调试子系统、内部总线系统构成。 Cortex-M0 微处理器通过精简的高性能总线AHB-LITE与外部进行通信。 Cortext-M0特性 采用Thumb指令集 ARM指令是32位的而Thumb指令时16位的如果存储空间中可以放32条ARM指令就可以放64条Thumb指令因此在存放Thunb指令时代码密度高高性能使用ARMv6-M的体系架构中断数量可配置1-32个4级中断优先级门电路少低功耗 中断唤醒控制器(WIC),支持极低功耗休眠模式兼容性好 与Cortex-M1 处理器兼容向上兼容 Cortex-M3 和 Cortex-M4 处理器 可以很容易地升级、移植支持多种嵌入式操作系统也被多种开发组件支持 Cortex-M0工作模式 线程模式Thread Mode- 芯片复位后执行用户程序 处理模式Handler Mode- 当处理器发生了异常或者中断处理完成后返回线程模式。 Cortex-M0工作状态 Thumb状态正常运行时处理器的状态 调试状态调试程序时处理器的状态 Cortex-M0的寄存器 通用寄存器 R0-R1213个通用寄存器。其中 R0-R7为低端寄存器可作为16位或32 位指令操作数R8-R12为高端寄存器只能用作32位操作数 R13栈指针寄存器 SP(the stark pointer)Cortex-M0 在不同物理位置上存在两个栈指针主栈指针 MSP进程栈指针 PSP。 在处理模式下只能使用主堆栈在线程模式下可以使用主堆栈也可以使用进程堆栈。 系统上电的默认栈指针是MSP。这样设计的目的是为了在进行模式转换的时候减少堆栈的保存工作。同时也可以为不同权限的工作模式设置不同的堆栈。 R14链接寄存器LR(the link register)用于存储子程序或者函数调用的返回地址 R15程序计数器PC(the program counter register)存储下一条将要执行的指令的地址。 特殊寄存器 xPSR组合程序状态寄存器该寄存器由三个程序状态寄存器组成 应用PSRAPSR保存程序计算结果的状态标志 N负数标志 Z零标志 C进位借位标志 V溢出标志 中断PSRIPSR包含当前ISR的异常编号 执行PSREPSR包含Thumb状态位 CONTROL控制寄存器 控制处理器处于线程模式时使用哪个堆栈 0使用MSP 处理器模式时固定使用MSP 1使用PSP Cortex-M0的中断和异常 Cortex-M0 处理器最多支持32个外部中断通常称为 IRQ和一个不可屏蔽中断NMI另外Cortex-M0还支持许多系统异常Reset、HardFault、SVCall、PendSV、SysTick它们主要用于操作系统和错误处理 二、GPIO 通用输入输出端口 1.基本概念 在嵌入式系统中经常需要控制许多结构简单的外部设备或者电路这些设备有的需要通过CPU控制有的需要CPU读取其输入信号因此在嵌入式微处理器上提供了一种“通用可编程I/O端口”也就是GPIOGeneral-purpose input/output 。 GPIO编程: 通用输入输出接口GPIO是嵌入式系统、单片机开发过程中最常用的接口用户可以通过编程灵活的对接口进行控制实现对电路板上LED、数码管、按键等常用设备控制驱动也可以作为串口的数据收发管脚或AD的接口等复用功能使用。因此其作用和功能是非常重要的。 电源标识: VCC-通常表示的是高电平3.3V VDD-通常表示内部参考电源3.3V GND-通常表示电源的参考平面地 VSS-内部参考平面内部的地 2.实际应用 Input 输入 - 数据采集 Output 输出 - 设备控制 3. 功能描述 查看技术手册 G030 - 173页 F051 - 117页 功能描述 3.1 IO结构框图 3.2 知识铺垫 问模拟信号和数字信号的区别 问VDD、VSS、VCC分别表示什么意思 VCC 接入电路的电压 VDD : 元器件内部的工作电压 VSS : 公共接地端电压 问施密特触发器的作用 由于外部输入的信号可能会出现脉冲等噪声的影响为了让信号更加清晰所以就设置了TTL施密特触发器来进行整形。 3.3 功能详述 ● 浮空输入 通俗讲就是让管脚什么都不接悬空着。 此时VDD和VSS所在路径的两个开关同时断开。因为没有上拉和下拉所以当IO口没有接输入的时候此时的电平状态会是一个不确定的值完全由外部输入决定。 一般实际运用时引脚不建议悬空易受干扰。 优势 这一种输入模式的电平会完全取决于外部电路而与内部电路无关。 缺点 在没有外部电路接入的时候IO脚浮空会使得电平不确定 应用 该模式是STM32复位之后的默认模式一般用作对开关按键的读取或用于标准的通讯协议比如IIC、USART的等。 ● 上拉输入 IO端口 - 上拉电阻 - 施密特触发器 - 输入数据寄存器 - 读 输入的电平不会因上下浮动而导致输入信号不稳定当外部没有信号输入时上拉电阻会将输入信号钳在高电平此时引脚始终读到高电平信号。 ● 下拉输入 IO端口 - 下拉电阻 - 施密特触发器 - 输入数据寄存器 - 读 输入的电平不会因上下浮动而导致输入信号不稳定当外部没有信号输入时下拉电阻会将输入信号钳在低电平此时引脚始终读到低电平信号。 ● 模拟输入 信号进入后不经过上拉电阻或者下拉电阻关闭施密特触发器经由另一线路把电压信号传送到片上外设模块。 所以可以理解为模拟输入的信号是未经处理的信号是原汁原味的信号。 应用当 GPIO 引脚用于 ADC 采集电压的输入通道时则需要选择“模拟输入”功能因为经过施密特触发器后信号只有 0、1 两种状态所以 ADC 外设要采集到原始的模拟信号信号源输入必须在施密特触发器之前。 推挽和开漏.docx ● 开漏输出 输出寄存器上的’0’激活 N-MOS而输出寄存器上的’1’将端口置于高阻状态 (P-MOS 从不被激活 )。 无法真正输出高电平即高电平时没有驱动能力需要借助外部上拉电阻完成对外驱动。 可以利用改变上拉电源的电压来适应所需进而提高外部电路的驱动能力。 ● 推挽输出 输出寄存器上的’0’激活 N-MOS而输出寄存器上的’1’将激活 P-MOS 具备输出高低电平的能力。 4. GPIO相关寄存器 4 个 32 位 配 置 寄 存 器 GPIOx_MODER 模式寄存器 GPIOx_OTYPER 输出模式寄存器 GPIOx_ OSPEEDR 输出速度寄存器 GPIOx_PUPDR 上拉下拉寄存器 2 个 32 位数据寄存器 GPIOx_IDR 输入数据寄存器 GPIOx_ODR 输出数据寄存器 1个 32 位置位 / 复位寄存器 GPIOx_BSRR 置位 / 复位寄存器 2 个 32 位复用功能寄存器 GPIOx_AFRH GPIOx_AFRL 5. 点亮一盏LED灯 STM32单片机课程-LED灯实验.pdf 5.1 实验步骤 1.查看开发板实物找到LED灯 2.查看底板原理图 以D7为例 //只要LED2为低电平LED灯D7则被点亮 3.查看核心板原理图 //只要将单片机的PB2引脚配置输出模式并输出低电平信号即可点亮D7 5.2 编程实现 5.2.1 寄存器分析 版本1 寄存器版本 //先使能GPIOB端口的时钟 RCC-IOPENR | 11 ; //配置GPIO为输出模式 GPIOB-MODER ~(0x34) //先清零 GPIOB-MODER | 14; //后置位 //选择推挽输出模式 GPIOB-OTYPER ~(12); //控制引脚输出低电平 GPIOB-ODR ~(12); 5.2.2 代码编写 RCC-IOPENR | 11 ; GPIOB-MODER ~(0x34) GPIOB-MODER | 14; GPIOB-OTYPER ~(12); GPIOB-ODR ~(12); 5.2.3编译下载 版本2使用STM32CubeMX工具 第一件事先把烧录模式配置上 void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct {0}; /* 使能GPIOB组的时钟*/ __HAL_RCC_GPIOB_CLK_ENABLE(); /*配置PB1 输出低电平*/ HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET); /*PB1引脚的初始化配置 */ GPIO_InitStruct.Pin GPIO_PIN_1; GPIO_InitStruct.Mode GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull GPIO_NOPULL; GPIO_InitStruct.Speed GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOB, GPIO_InitStruct); } 6. HAL库函数分析 void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState) 功能 设置或清除指定的端口位 参数GPIO_TypeDef *GPIOx 端口号 uint16_t GPIO_Pin 引脚号 GPIO_PinState PinState 电平状态 GPIO_PIN_SET 1 GPIO_PIN_RESET 0 返回值无 void HAL_GPIO_TogglePin (GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin) 功能 切换指定的引脚电平状态 参数GPIO_TypeDef * GPIOx 端口号 uint16_t GPIO_Pin 引脚号 返回值无 GPIO_PinState HAL_GPIO_ReadPin (GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin) 功能 读取指定的引脚电平状态 参数GPIO_TypeDef * GPIOx 端口号 uint16_t GPIO_Pin 引脚号 返回值GPIO_PinState 电平状态 GPIO_PIN_RESET 0 GPIO_PIN_SET 1 利用HAL库函数实现LED灯闪烁 练习实现流水灯效果 7. 实验按键控制LED灯亮灭 1.查看实物找到按键和控制的LED灯 五向按键 - S1 LED灯 - D7 D9 D10 2.查看原理图 S1 - //五向按键任意方向键按下PA8一定读到高电平信号 写法一 if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_8)1){HAL_Delay(100);if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_8)1){HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_0);}}写法二 if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_8)1){HAL_Delay(100);if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_8)0){HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_0);}}三. 串口通信 1. 通信的基本概念 两个通信对象一个发送方一个接收方。 2.通信的属性划分 1有无时钟源 同步通信通信双发根据同步信号进行通信IIC\SPI 异步通信双方都有各自的独立的时钟约定好通信速度进行通信。UART 通信速度单位时间内发送或接收的数据位数 波特率一秒发送多少个bit位 bit/s bps 常用波特率115200bps 2通信方式 串行通信指的是同一时刻只能收或发一个bit位信息。因此只用1根信号线即可。 优点占用引脚资源少 缺点通信效率低 并行通信指的是同一时刻可以收或发多个bit位的信息因此需要多根信号线才行。 优点通信效率高 缺点占用引脚资源多 3传输方向 单工只能作为发送设备或接收设备发送方发送数据接收方只能接收数据。收音机 半双工可以作为发送设备也可以作为发送设备但是同一时刻只能接收或者发送不能同时收发。对讲机 全双工在同一时间既可以接收也可以发送。打电话 3. USART (通用同步异步收发器) Universal Synchonous Asynchronous receiver transmitter 中文参考手册 564页 USART: 支持同步\异步通信、全双工、串行 UART 没有信号线只支持异步通信、全双工、串行 4. UART (通用异步收发器) 中文参考手册568页 图226 数据发生过程由CPU或者DMA将要发送的数据写入到数据发送寄存器TDR,发送寄存器将数据给到发送移位寄存器再由发送移位寄存器将数据按照顺序发送出去最终由Tx输出。 数据接收过程由RX接收到数据之后写入接收数据移位寄存器再由移位寄存器按顺序搬移到数据接收寄存器由CPU或DMA从数据接收寄存器读取即可。 5. 串口通信协议 一个数据帧的格式异步通信 空闲状态是高电平 起始位1位 低电平表示数据包的起始 数据位8-9位 校验位1位 奇偶校验 检验数据是否发送正确 奇校验数据位中1的个数 校验位上1的个数 奇数 偶校验数据位中1的个数 校验位上1的个数 偶数 停止位1-2位 将电平信号拉高代表一个数据包发送结束回到空闲状态 6. 相关寄存器 串口控制寄存器 设备功能初始化、通信帧格 式配置 USART_CR1 USART_CR2 USART_CR3 波特率寄存器 USART_BRR 中断和状态寄存器 USART_ISR 数据发送寄存器 USART_TDR 数据接收寄存器 USART_RDR 7. USART功能框图 Tx数据发送端 Rx数据接收端 流控概念简单了解就行了 在两个设备正常通信时由于处理速度不同就存在这样一个问题有的快有的慢在某些情况下就可能导致丢失数据的情况。如台式机与单片机之间的通讯接收端数据缓冲区已满则此时继续发送来的数据就会丢失。流控制能解决这个问题 nRTS请求以发送(Request To Send)n表示低电平有效。当本设备准备好接收新数据时就会将nRTS变成低电平当接收寄存器已满时nRTS将被设置为高电平。 nCTS清除以发送(Clear To Send) 为输入信号低电平有效。用于判断是否可以向对方发送数据低电平说明本设备可以向对方发送数据。 该引脚只适用于硬件流控制 SCLK发送器时钟输出引脚。这个引脚仅适用于同步模式。 发送过程由CPU和DMA向数据发送寄存器TDR中写入要发送的数据由发送移位寄存器将数据按位移到发送端口输出。 接收过程由CPU和DMA读取接收数据寄存器RDR中的数据。 8. 串口发送实验 实验要求 通过单片机向电脑串口助手发送数据 1.观察实物 找到通信接口 丝印“P4” 2.分析原理图 CH340 电平转换芯片可以转换TTL电平-USB电平。 数据选择器/多路复用器 3.STM32CubeMX配置 4、寄存器方式编写发送接受一个字节的函数 //写一个单字节发送的函数
void put(uint8_t ch)
{//while((USART1-ISR 0x40)0){}while(!(USART1-ISR 17)){}//判断发送数据寄存器是不是空了USART1-TDRch;//将数据写入到TDR寄存器中
}
int get()
{uint8_t ch;while(!(USART1-ISR 15)){}//判断接受数据寄存器是不是空了chUSART1-RDR;//将数据从RDR寄存器中读出来return ch;
}5、寄存器方式编写发送接受一个字节的函数 HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout) 功能串口发送数据 参数 huart -》串口选择USART1pData -需要发送的数据 Size-》发送多少个数据 Timeout-》超时时间 返回值成功返回HAL_OK 失败返回HAL_TIMEOUT HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout) 功能串口接受数据函数 参数 huart -》串口选择USART1pData -接收数据的地址 Size-》发送多少个数据 Timeout-》超时时间 返回值成功返回HAL_OK 失败返回HAL_TIMEOUT 6、串口发送接收函数验证 HAL_UART_Receive(huart1,buf,2,100);
HAL_UART_Transmit(huart1,buf,strlen(buf),100);
memset(buf,0,sizeof(buf));7、不定长接受 声明
uint8_t buf[128]{0 };//数据缓存区
uint8_t byte;//单个字节缓存区
uint8_t len0;//接收到的数据长度
写在while内
if(HAL_UART_Receive(huart1,byte,1,100)HAL_OK)
//判断接收一个字节是否成功{if(byte\n)//判断是否结束{//如果结束处理数据HAL_UART_Transmit(huart1,buf,len,100);//原封不动回回去memset(buf,0,len);//清空缓存区len0; //长度清0}else//如果没有接收完成{buf[len]byte;//继续接收把接收到的数据存储到buf}
}8、重定向 //printf的重定向
int fputc(int ch,FILE *f)
{while(!(USART1-ISR 17)){}//判断发送数据寄存器是不是空了USART1-TDRch;//将数据写入到TDR寄存器中
}
//scanf的重定向
int fgetc(FILE *f)
{uint8_t ch;while(!(USART1-ISR 15)){}//判断接受数据寄存器是不是空了chUSART1-RDR;//将数据从RDR寄存器中读出来return ch;
}scanf(%s,buf);
printf(%s,buf);
HAL_Delay(500);四、SPI 1.SPI通信 SPI接口是Motorola 首先提出的全双工三线/四线同步串行外设接口Serial Peripheral Interface采用主从模式Master Slave架构。 时钟由Master控制在时钟移位脉冲下数据按位传输高位在前低位在后MSB firstSPI接口有2根单向数据线为全双工通信。 SPI总线被广泛地使用在FLASH、ADC、LCD等设备与MCU间要求通讯速率较高的场合。 四线制 1MOSI数据线主器件数据输出从器件数据输入 2MISO数据线主器件数据输入从器件数据输出 3SCLK 时钟线主器件产生时钟信号 4/SS片选线从器件使能信号由主器件控制 2.SPI通信协议 起始信号: NSS信号线由高变低是SPI通讯的起始信号 结束信号NSS信号由低变高是SPI通讯的停止信号 数据传输SPI使用MOSI及MISO信号线来传输数据使用SCK信号线进行数据同步。MOSI及MISO数据线在SCK的每个时钟周期传输一位数据高位在前低位在后且数据输入输出是同时进行的。SPI每次数据传输可以 8 位或 16 位为单位每次传输的单位数不受限制。 极性(Clock Polarity ,CPOL) : 决定着时钟起始电平 相位(Clock Phase ,CPHA) 决定采样边沿 在SPI操作中最重要的两项设置就是时钟极性CPOL和时钟相位CPHA这两项即是主从设备间数据采样的约定方式。 SPI通信模式图 SPI有四种通信模式 当CPHA为0是sck时钟线为奇数边沿采样 CPOL0空闲状态是时钟为低电平CPOL1空闲状态是时钟为高电平 当CPHA为1是SCK时钟线为偶数边沿采样 1CPHA0奇数边沿采样 2CPHA1偶数边沿采样 数据线被采样都是等待数据线变化稳定半个时钟周期进行采样。 3. LCD液晶显示屏 液晶的形成 某些物质在熔融状态或被溶剂溶解之后尽管失去固态物质的刚性却获得了液体的易流动性并保留着部分晶态物质分子的各向异性有序排列形成一种兼有晶体和液体的部分性质的中间态这种由固态向液态转化过程中存在的取向有序流体称为液晶。 物理特点当通电时导通排列变得有秩序使光线容易通过不通电时排列混乱阻止光线通过。 液晶显示屏内部构造 颜色深度 ① R,G,B三基色组合形成各种颜色。 ②能显示的颜色数由RGB的数字信号的位数来决定 例如以3位数字信号来表示颜色深度 RGB24表示的意思是24位真彩色 R8 G8 B8 所以他能显示的颜色深度就是2^8*2^8*2^8 STM32G030开发板板载的显示屏是RGB16也称为RGB565 颜色深度 2^5 * 2^6 *2^5 由一个16位的数据控制一个像素点的颜色显示 让一个像素点显示正红色 1111 1000 0000 0000 4. 点亮LCD显示屏 1.查看原理图 底板原理图 打开STM32CubeMX新建工程配置对应引脚 将驱动文件放到工程目录下 颜色填充 图片显示及英文显示 使用画图工具修改图片为像素128*128 另存为BMP格式 取模工具打开配置16位真彩色大小128*128 保存并复制生成的数组放到程序中 使用函数显示图片 效果展示 汉字显示 定义一个char类型的二维数组并初始化为汉字字模数据 调用汉字显示函数按要求传递参数即可。 五、STM32中断系统 中断的基本概念 嵌套向量控制器NVIC 中断及异常向量表 中断优先级 1. 中断 1.1 处理器中的中断 在处理器中中断是一个过程即CPU在正常执行程序的过程中遇到外部/内部的紧急事件需要处理暂时中止当前程序的执行转而去为处理紧急的事件待处理完毕后再返回被打断的程序处继续往下执行。 中断在计算机多任务处理尤其是即时系统中尤为重要。比如uCOSFreeRTOS等。 1.2 意义 中断能提高CPU的效率同时能对突发事件做出实时处理 实现程序的并行化实现嵌入式系统进程之间的切换 1.3 中断处理过程 进入中断 处理器自动保存现场到堆栈里 {PC, xPSR, R0-R3, R12, LR} 一旦入栈结束ISR(中断服务程序)便可开始执行 退出中断 中断前的现场被自动从堆栈中恢复 一旦出栈完成继续执行被中断打断的指令 出栈的过程也可被打断使得随时可以响应新的中断而不再进行 现场保存 1.4 中断的体系结构 2. NVIC NVIC--Nested Vectored Interrupt Controller--嵌套中断控制器 NVIC的主要功能 中断管理 支持异常及中断向量化处理 支持嵌套中断 2.1 中断管理 Cortex-M0 处理器中每一个外部中断都可以被使能或者禁止并且可以被设置为挂起状态或者清除状态。处理器的中断可以电平的形式的也可以是脉冲形式的这样中断控制器就可以处理任何中断源。 2.2 中断和异常向量表 STM32G030中断和异常向量 Cortex-M0内核 可以处理15个内部异常和32个外部中断 STM32G030 只使用了6个内部异常和28个外部中断 异常向量表 当异常或中断发生时处理器会把PC设置为一个特定地址这一地址就称为异常向量 每一类异常源都对应一个特定的入口地址这些地址按照优先级排列以后组成异常向量表 向量化处理中断的好处 传统的处理方式需要软件去完成。采用向量表处理异常M0处理器会从存储器的向量表中自动定位异常的程序入口。从发生异常到异常的处理中间的时间被缩减。 注中断和异常的区别 中断是微处理器外部发送的通过中断通道送入处理器内部一般是硬件引起的比如串口接收中断而异常通常是微处理器内部发生的大多是软件引起的比如除法出错异常特权调用异常等待。不管是中断还是异常微处理器通常都有相应的中断/异常服务程序。 2.3 中断优先级 3个固定的优先级都是负值不能改变 四个可编程优先级用两个bit位表示00011011 优先级越小优先级越高 注意 不同优先级的中断同时发生优先处理优先级编号较小的那个 同样优先级的中断同时发生中断向量号较小的那个优先响应 3. 外部中断控制器EXTI 在 STM32G030 中共有最多 28 中断 / 事件线可用 GPIO 口连接到 16 个外部中断 / 事件线 3.1 系统配置控制器 (SYSCFG) 该器件具有一组配置寄存器 系统配置控制器的主要用途如下 在部分 IO 口上启用或禁用 I2C 超快模式 (Fast Mode Plus) 重映射部分从 TIM16 和 TIM17USART1 和 ADC 的 DMA 触发源到其它不同的 DMA 通道上 重映射存储器到代码起始区域 管理连接到 GPIO 口的外部中断 管理系统的可靠性特性 3.2 外部中断 / 事件框图 4. 按键中断实例 按键中断——LED亮灭 4.1 按键原理图分析 核心板图 4.2 编程步骤分析 使能相应的时钟配置GPIO管脚为中断功能设置中断优先级使能相应的中断实现中断服务程序 4.3 配置流程 4.4 编码流程 gpio.c代码 /* USER CODE BEGIN 2 */
void HAL_GPIO_EXTI_Rising_Callback(uint16_t GPIO_Pin)
{if (GPIO_Pin GPIO_PIN_8)HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
}
/* USER CODE END 2 */main.c代码 while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);HAL_Delay(3000);}/* USER CODE END 3 */4.5 拓展练习 实现按键中断LED灯亮灭并向串口发送数据 思想Cube MX 中多配置一个USART1 5. 串口发送中断实例 5.1 串口原理图分析 核心板图 5.2 编程步骤分析 使能相应的时钟配置GPIO管脚为串口功能设置中断优先级使能相应的中断实现中断服务程序 5.3 配置流程 5.4 编码流程 实现发送中断 1、启动发送中断 HAL_UART_Transmit_IT(huart1,HELLO,sizeof(HELLO));找发送完成回调函数不断跳转 3、重新编写回调函数 uint8_t i0;
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{if(huart-Instance USART1){i;}
}实现接收中断函数 接收中断使能 HAL_UART_Receive_IT(huart1,buf,2);2、找接收完成回调函数 3、到这里发现只有一个变量所以我们需要寻找这个变量在哪里被赋值了 4、跳转这个接收使能函数 编写回调函数 extern uint8_t buf[128];
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{/* Prevent unused argument(s) compilation warning */if(huart-InstanceUSART1){HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,0);HAL_UART_Receive_IT(huart1,buf,2);}
}六、ADC 模数转换器 Analog-to-Digital Converter模数转换器将模拟信号转换为数字信号的转换器 1. ADC作用 ADC是一个逐次逼近型的模数转换器可以将连续的模拟信号(电压、温度、光照、压力....)转换成离散的数字信号 传感器与之不同将非电学量转换成电学量 最直观的体现模拟信号是连续变化的曲线而数字量是不连续的一个个离散的点 2. STM32的ADC简介 12 位 ADC 是一种逐次逼近型模拟数字转换器 它有多达 19 个通道可测量 16 个外部通道从外部 GPIO 口连接的16 通道模拟输入 3 个内部信号源 分别为内部温度传感 (VSENSE) 输入内部参考电压 (VREFINT) 输入外部电池 VBAT 供电引脚输入 各通道的 A/D 转换可以单次、连续、扫描或间断模式执行 ADC的结果可以左对齐或右对齐方式存储在 16 位数据寄存器中 3. ADC特性 量程 能测量的电压范围 0 ~ 3.6V 分辨率 ADC的分辨率通常以输出二进制数的位数表示位数越多分辨率越高一般来说分辨率越高转化时间越长 可配置的转换精度 6位8位10位12位 转化时间 模拟输入电压在允许的最大变化范围内从转换开始到获得稳定的数字量输出所需要的时间 转换得到一个12位精度的数据需要1us转换速度可以达到1MHZ 4. ADC的时钟 APB时钟的 2 或 4 分频最高14MHz 优点 不会有时钟域之间的同步带来的抖动触发事件和转换的起始时刻之间的延迟是确定的从 而保证转换之间的时间间隔是固定的 缺点 ADC的转换时间和系统时钟频率相关受系统频率的影响较大 片上14MHZ HSI RC振荡器 优点 无论MCU的运行频率都可以保证最高的ADC工作频率可以使用自动节电模式自动开启或关闭14MHz的内部振荡器 缺点 触发信号的同步会带来抖动触发事件和转换的起始时刻之间的延迟不确定 5. 五种工作模式 单通道单次转换 单通道连续转换 多通道单次转换 多通道连续转换 间隔转换 6. 程序设计 6.1 单通道单次采集实验 光敏模块控制LED亮灭 6.1.1 原理图分析 光敏模块 - OUT - D1 - 高低电 - IN - A1 - 模拟量
底板原理图 - A1 - 核心板底座
核心板原理图 - 核心板插针 - A1 - PA46.1.2 Cube MX 环境配置 光敏模块 - A1 - PA4 - ADC_IN4
LED - LED2/3/4 - PB2/1/0 - GPIO_Output6.1.3 代码编写 main.c /* USER CODE BEGIN Includes */
uint16_t buf;
/* USER CODE END Includes */while (1)
{
/* USER CODE END WHILE *//* USER CODE BEGIN 3 */// 1.startHAL_ADC_Start(hadc1);// 2.waitHAL_ADC_PollForConversion(hadc1, 100);// 3.getvaluebuf HAL_ADC_GetValue(hadc1);// 4.stopHAL_ADC_Stop(hadc1); if (buf 0x0DDD)HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2, (GPIO_PinState)0); else if (buf 0xDDD)HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2, (GPIO_PinState)1);
}6.2 多通道扫描 按键控制五个方向来发送五句话上下左右中 不同的方向灯亮的不同 采集光敏的数据发送到串口 6.2.1 原理图分析 光敏模块ADC 光敏模块 - OUT - D1 - 高低电 - 模拟量 - A1
光敏模块实物 - A1 - P1从上往下第4个
底板传感器拓展模块接口 - P1从上往下第4个 - A1 - 开发板上核心板底座 - CON2的3号接口
核心板原理图 - 核心板底座插针 - A1 - PA4五向按键ADC 五向按键 - OUT
底板原理图
核心板原理图五向按键外部中断 五向按键 - 高低电 - 高电平导通 - OUT
底板原理图 - D3KEY - CON2
核心板原理图 - CON2 - 核心板插针 - D3KEY - PA86.2.2 Cube MX 环境配置 光敏模块 - A1 - PA4 - ADC_IN4
LED - LED2/3/4 - PB2/1/0 - GPIO_Output
按键 - ADC_KEY - PA1 - ADC_IN1光敏模块 A1对应PA4设置成 模数转换ADC1_IN4 五项按键控制串口和灯 按键PA8配置外部中断使能、下降沿 三个灯PB0、PB1、PB2串口USART1配置波特率9600 按键ADC ADC KEY对应PA1设置成 模数转换ADC1_IN1 加上第一步配置的ADC1_IN4此时有两个ADC——多通道 时钟RCC 48MHz——时钟影响cpu存取速度——速度越快ADC采集速度越快 6.2.3 代码编写 main.c /* USER CODE BEGIN Includes */
uint16_t buf[2];
/* USER CODE END Includes */gpio.c /* USER CODE BEGIN 0 */
#include adc.h
#include usart.h
#include
/* USER CODE END 0 *//* USER CODE BEGIN 2 */
extern uint16_t buf[2]; // 数组能将两条通道的 GetValue 都存储下来int fputc(int ch, FILE* f)
{while((USART1-ISR 17) 0){}USART1-TDR ch;return ch;
}// 外部中断 下降沿 回调函数
void HAL_GPIO_EXTI_Falling_Callback(uint16_t GPIO_Pin)
{if (GPIO_Pin GPIO_PIN_8){// 1.startHAL_ADC_Start(hadc1);// 2.wait 可以不用了ADC_ISR中断寄存器// 位3EOC序列转换结束标志// 位2EOS转换结束标志单个结束是此位// HAL_ADC_PollForConversion(hadc1, 100);while((ADC1-ISR 12) 0){} // 如果没结束一直wait// 3.1 Get ADC1 Valuebuf[0] HAL_ADC_GetValue(hadc1); // 第一个通道获取// 结束了可以用位3序列转换结束标志EOC进行判断// 也可以使用位2的转换结束标志EOS来判断 while((ADC1-ISR 13) 0){}// 3.2 Get ADC4 Valuebuf[1] HAL_ADC_GetValue(hadc1); // 第二个通道获取// 4.stopHAL_ADC_Stop(hadc1);printf(按键数据 %d\r\n, buf[0]); printf(光照数据 %d\r\n, buf[1]);if((buf[0])2990 (buf[0]3000)) // 中2990-3000{printf(中);HAL_GPIO_WritePin(GPIOB,
GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2, GPIO_Pin_RESET);}if ((buf[0])2975 (buf[0]2985)) // 上2975-2985{printf(上);HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_Pin_SET);}if ((buf[0])2920 (buf[0]2940)) // 下2920-2940{printf(下);HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_Pin_SET); }if ((buf[0])2950 (buf[0]2970)) // 左2950-2970{printf(左);HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_Pin_SET);}else if (buf[0] 3000) // 右3000-3020{printf(右);HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_Pin_RESET);HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_Pin_RESET);}}
}
/* USER CODE END 2 */6.2.4 实现效果 七、DMA - 数据的搬运工 1. DMA作用 DMA的传输方式无需CPU参与可以直接控制传输 DMA给外部设备和内存开辟了一条直接数据传输的通道 2. 目的 给CPU节省资源使CPU的工作效率提高 3. DMA特性 1同一个DMA模块可以有多个优先级请求很高 高 中等 低 2每个通道有3个事件标志 DMA半传输 DMA传输完成 DMA传输出错 3数据源 目标源 数据传输宽度对齐 4传输数据 字节8位 半字16位 全字32位 5存储器-存储器 外设-存储器 外设-外设 6闪存(flash) SRAM APB AHB 外设均可以作为源或者目标 7搬移数据的最大长度为65535字节 4. DMA寄存器 DMA_CPARx 设置外设地址的寄存器 DMA_CMARx 设置存储器地址的寄存器 DMA_CCRx 设置数据传输方向 DMA_CNDTRx设置传输的数据量 5. DMA的增量或者循环模式 增量 外设搬移到存储器的时候不希望覆盖上一个会将内存设置为增量模式 循环 DMA不停循环的搬移数据一组的数据传输完成时计数寄存器将会自动地被恢复成配置该通道时设置的初值. 6. DMA-ADC串口发送程序设计 6.1 Cube MX 环境配置 USART串口配置省略 6.2 代码编写 main.c uint16_t buf;while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */HAL_ADC_Start_DMA(hadc1, (uint32_t *)buf, 1);HAL_Delay(500);}adc.c /* USER CODE BEGIN 0 */
#include
#include usart.h
/* USER CODE END 0 */extern uint16_t buf; // 光照强度缓冲区int fputc(int ch, FILE* f)
{while ((USART1-ISR 17) 0){}USART1-TDR ch;return ch;
}void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc)
{if (hadc-Instance ADC1) printf(光照强度为 %d, buf);HAL_ADC_Stop(hadc1);
}6.3 运行结果 7. DMA-ADC串口发送--按键中断程序设计 7.1 流程图 7.2 Cube MX 环境配置 RCC - 48M速度更快 USART1 - 波特率 - 115200 PA8 - GPIO_EXTI8 - NVIC勾选按键4-15中断 PA1 - ADC1_IN1 DMA打开 DMA设置 1 ADC里DMA请求要使能 2 点击 ADD - ADC CHANNEL 1 方向外设-内存 模式 普通(不选择循环) 增量模式 在内存一侧要打钩 数据传输宽度 选择半字(16bit - ADC也是16bit的) 7.3 代码编写 main.c /* USER CODE BEGIN Includes */
注释掉上次项目 遗留的参数声明
//uint32_t buf;
/* USER CODE END Includes */gpio.c /* USER CODE BEGIN 0 */
#include adc.h// CubeMX配置中Data Width为Half World所以必须为16单通道使用32无伤大雅但双通道会出现错误保持好习惯使用和配置的数据宽度一致的ADC缓存区大小。
uint16_t buf;
/* USER CODE END 0 *//* USER CODE BEGIN 2 */
void HAL_GPIO_EXTI_Rising_Callback(uint16_t GPIO_Pin)
{if (GPIO_Pin GPIO_PIN_8) // 按下按键开始DMA-ADC{ HAL_ADC_Start_DMA(hadc1, (uint32_t *)buf, 1); }
}
/* USER CODE END 2 */adc.c /* USER CODE BEGIN 0 */
#include
#include usart.h
#include
/* USER CODE END 0 *//* USER CODE BEGIN 1 */
// CubeMX配置中Data Width为Half World所以必须为16单通道使用32无伤大雅但双通道会出现错误保持好习惯使用和配置的数据宽度一致的ADC缓存区大小。
extern uint16_t buf;
int fputc(int ch, FILE* f)
{while ((USART1-ISR 17) 0){}USART1-TDR ch;return ch;
}void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{//进入这个函数说明DMA搬移完成所以只需要打印搬移的数据即可printf(光照强度为 %d, buf);HAL_ADC_Stop_DMA(hadc);memset(buf, 0, sizeof(buf)); // 清空
}
/* USER CODE END 1 */7.4 运行结果 8. DMA-ADC多通道采集实验DMA不定长接收 实验思路 在按键中断服务程序中启动ADC进行采集ADC采集结束之后 自动发起一个DMA搬运请求DMA请求控制总线搬移数据搬移完成之后触发一个搬移完成中断。 在DMA搬移完成中断回调函数中打印数据数组中ADC采集的光敏 8.1 Cube MX 环境配置 8.2 可能使用到的函数 找函数去HAL英文手册 HAL_UART_Generic Driver 587页
1HAL_UART_Receive_DMA(UART_HandleTypeDef * huart,
uint8_t * pData, uint16_t Size) //开启DMA通道并设定通道长度
2__HAL_UART_ENABLE_IT(__HANDLE__,__INTERRUPT__)//开启串口空闲中断
3__HAL_UART_GET_FLAG(__HANDLE__,__FLAG__)//获得串口空闲中断标志
4__HAL_UART_CLEAR_FLAG(__HANDLE__,__FLAG__) //清除串口空闲中断
5HAL_UART_DMAStop(UART_HandleTypeDef * huart) //关闭串口DMA通道
6设定的传输长度-剩余传输数量DMA_CNDTRx实际长度
7HAL_UART_Transmit_DMA(UART_HandleTypeDef * huart, uint8_t * pData, uint16_t Size) //使用DMA通道发送指定长度的字符到串口中
8HAL_UART_Receive_DMA(UART_HandleTypeDef * huart, uint8_t * pData, uint16_t Size) //再次开启DMA通道并设定通道长度8.3 代码编写 main.c HAL_UART_Receive_DMA(huart1,buf,128);__HAL_UART_ENABLE_IT(huart1,UART_IT_IDLE);中断处理函数 extern uint8_t buf[128];
uint16_t len0;
void USART1_IRQHandler(void)
{/* USER CODE BEGIN USART1_IRQn 0 *//* USER CODE END USART1_IRQn 0 */HAL_UART_IRQHandler(huart1);/* USER CODE BEGIN USART1_IRQn 1 */if(__HAL_UART_GET_FLAG(huart1,UART_FLAG_IDLE)){__HAL_UART_CLEAR_FLAG(huart1,UART_FLAG_IDLE);HAL_UART_DMAStop(huart1);len128-hdma_usart1_rx.Instance-CNDTR; HAL_UART_Transmit_DMA(huart1,buf,len);HAL_UART_Receive_DMA(huart1,buf,128);}/* USER CODE END USART1_IRQn 1 */
}八. 时钟系统 1. 什么是时钟系统 1.1概念 时钟系统是由振荡器(信号源)、定时唤醒器、分频器、倍频器等组成的电路 常用的信号源有晶体振荡器和RC振荡器 意义 时钟是嵌入式系统的脉搏处理器内核在时钟驱动下完成指令执行状态变换等动作外设部件在时钟的驱动下完成各种工作比如串口数据的发送、A/D转换、定时器计数等等 因此时钟对于计算机系统是至关重要的通常时钟系统出现问题也是致命的比如振荡器不起振、振荡不稳、停振等 1.2 常见振荡器简介 概念 振荡器是用来产生重复电子讯号的电子元件 其构成的电路叫振荡电路能将直流电转换为具有一定频率交流信号输出的电子电路或装置 分类 振荡器主要分为RC、LC、晶体 RC振荡器是采用RC网络作为选频移相网络的振荡器 LC振荡器是采用LC振荡回路作为移相和选频网络的正反馈振荡器 晶体振荡器的振荡频率受石英晶体控制 RC振荡器 晶体振荡器 构成 电阻电容 石英晶体 优点 成本低 稳定、精度高 缺点 震荡频率会有误差、受温湿度影响 价格高、需接起振电容 1.3 四个时钟源 HSI高速内部时钟RC振荡器频率为 8MHz HSE高速外部时钟可接石英/陶瓷谐振器或者接外部时钟源频率范围为4MHz~16MHz LSI低速内部时钟RC振荡器频率为 40KHz 独立看门狗时钟源只能是这个还可做RTC时钟源 LSE低速外部时钟接 32.768KHz 的石英晶体。 主要是RTC的时钟源 1.4 时钟树 1.5 Cube MX 配置时钟 2. SysTick定时器 2.1 概念 能够定时、计数的器件称为定时器 SysTick 称作系统滴答定时器简称滴答定时器 SysTick 是一个定时设备位于 Cortex-M0 内核中可以对输入的时钟进行计数 如果时钟信号是周期性的计数也就是计时 系统定时器一般用于操作系统用于产生时基维持操作系统的心跳 根据这个中断系统就可以实现时间片的计算从而切换进程 2.2 工作原理 滴答定时器是一个24位定时器也就是最多能计数2^24 使用 我们一般给计数器送一个初始的计数值计数器向下计数每来一个时钟信号计数初值就减 1计数值减到 0 的时候就会发出一次中断然后重新从计数初值再减一计数循环不断 原理图 2.3 SysTick 寄存器 3. HAL_Delay实现 void delay_us(uint32_t t)
{SysTick-LOAD 48*t; // 48对应HzSysTick-VAL 0; // 记住设置为0while((SysTick-CTRL 116) 0){}
}void delay_ms(uint32_t t)
{while(t--)delay_us(1000);
}九. STM32TIM定时器 1. TIM简介 定时器本质上是一个计数器可对输入的时钟进行计数并在计数值达到设定值时触发中断 当这个计数器的输入是一个准确可靠的基准时钟时对基准时钟计数的过程就是计时的过程 计数器执行计数定时的寄存器每来一个时钟计数器加 1 预分频器可对计数器的时钟进行分频让计数更加灵活 自动重装寄存器计数的目标值——计多少个时钟申请中断(了解) CNT计数器与CCR自动重载寄存器的值相等时会产生一次定时中断可选择接收或不接受PWM波中就忽略了定时中断如果是万年历、电子时钟就需要接收定时中断 这些 16 位寄存器构成了定时器最核心的部分这一块电路称为时基单元 不仅具备基本的定时中断还包含内外时钟源选择、输入捕获、输出比较、编码器接口、主从触发模式 定时器的基本结构是通用的很多模块电路都能用到所以STM32定时上扩展了非常多的功能 根据复杂度和应用场景分为了高级定时器、通用定时器、基本定时器三种类型 种类 位数 计数器模式 产生DMA请求 捕获/比较通道 互补输出 特殊应用场景 高级 16 向上向下向上/下 可以 4 有 带死区控制盒紧急刹车可应用于PWM电机控制 通用 16 向上向下向上/下 可以 4 通用。定时计数PWM输出输入捕获输出比较 基本 16 向上向下向上/下 可以 0 无 主要应用于驱动DAC 2. 时基单元 2.1 预分频器 2.2 计数器 2.3 自动重载寄存器 3. 通用定时器 主要看Internal Clock CK_INT 对理解有帮助 4. 程序设计 定时 1s 发送 “打小就聪明” 4.1 Cube MX 环境配置 4.2 代码 main.c /* USER CODE BEGIN 2 */HAL_TIM_Base_Start_IT(htim3);/* USER CODE END 2 */tim.c htim3.Instance TIM3;htim3.Init.Prescaler 48000-1;htim3.Init.CounterMode TIM_COUNTERMODE_UP;htim3.Init.Period 1000-1;/* USER CODE BEGIN 1 */int fputc(int ch, FILE* f)
{while ((USART1-ISR 17) 0);USART1-TDR ch;return ch;
}void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{if (htim-Instance TIM3){printf(晓超打小就聪明\r\n);HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_7);}
}
/* USER CODE END 1 */4.3 运行结果 十. PWM 1. 定时器中断实验相关寄存器 1.1 计数器当前值寄存器CNT 1.2 预分频寄存器TIMx_PSC 1.3 自动重装载寄存器TIMx_ARR) 1.4 控制寄存器1TIMx_CR1 2. 程序设计 蜂鸣器 有源蜂鸣器内部有振荡器 直接导通就能发声 无源蜂鸣器没有振荡器 2.1 蜂鸣器概述 2.1.1 工作发声原理 蜂鸣器的发声原理由振动装置和谐振装置组成而蜂鸣器又分为无源他激型与有源自激型 蜂鸣器的发声原理 无源他激型蜂鸣器的工作发声原理方波信号输入谐振装置转换为声音信号输出有源自激型蜂鸣器的工作发声原理直流电源输入经过振荡系统的放大取样电路在谐振装置作用下产生声音信号 2.1.2 差别 有源蜂鸣器和无源蜂鸣器的主要差别是二者对输入信号的要求不一样有源蜂鸣器工作的理想信号是直流电一般标示为VDD、VDC等。因为蜂鸣器内部有一个简单的振荡电路可以把恒定的直流电转变成一定频率的脉冲信号从而产生磁场交变带动钼片振动发出声音 2.1.3 分类 按其驱动方式的原理可分为 有源蜂鸣器内含驱动线路也叫自激式蜂鸣器无源蜂鸣器外部驱动也叫他激式蜂鸣器 按构造方式的不同可分为 电磁式蜂鸣器压电式蜂鸣器 按封装的不同可分为 DIP BUZZER插针蜂鸣器SMD BUZZER贴片式蜂鸣器 按电流的不同可分为 直流蜂鸣器 交流蜂鸣器 其中以直流最为常见压电式蜂鸣器用的是压电材料即当受到外力导致压电材料发生形变时压电材料会产生电荷。同样当通电时压电材料会发生形变。 2.2 Cube MX 环境配置 2.3 代码 main.c /* USER CODE BEGIN 2 */HAL_TIMEx_PWMN_Start(htim17, TIM_CHANNEL_1);/* USER CODE END 2 */tim.c // 定时器选择htim17.Instance TIM17;// 预分频器初始化htim17.Init.Prescaler 48-1;// 计数模式初始化htim17.Init.CounterMode TIM_COUNTERMODE_UP;// 自动重装载寄存器初始化重载目标值htim17.Init.Period 5000-1;// 时钟分频初始化1分频htim17.Init.ClockDivision TIM_CLOCKDIVISION_DIV1;htim17.Init.RepetitionCounter 0;htim17.Init.AutoReloadPreload TIM_AUTORELOAD_PRELOAD_DISABLE;if (HAL_TIM_Base_Init(htim17) ! HAL_OK){Error_Handler();}if (HAL_TIM_PWM_Init(htim17) ! HAL_OK){Error_Handler();}sConfigOC.OCMode TIM_OCMODE_PWM1;// 脉冲sConfigOC.Pulse 2500;· ·