STM32-各类总线接口
STM32-各类总线接口(协议)
STM32-IIC接口类设备OLED
STM32-IIC接口类设备OLED简介显示屏的驱动程序其实就是驱动OLED显示屏的控制器。一般来说,显示屏的驱动程序厂商出厂时就已经提供好了作为驱动开发工程师,就是要移植驱动程序。可以大大提高开发的效率,缩短开发周期。
嵌入式领域,关于显示类的设备有很多比如:LCD、OLED、数码管、段码屏、光立方 …
显示类设备的接口也有很多:gpio、usart、iic、spi …
设备上显示的信息有字符、字符串、数字、汉字和一些不在ASCII表种的特殊字符(℃),以及图形、图像 …
显示的原理
OLED或者LCD屏都是通过一个一个像素点显示的
实现OLED显示屏的驱动程序
OLED显示屏的驱动程序,不需要自己实现,驱动工程师只需要移植到自己的开发平台即可。
位带
位带在说到位带和位操作前,先要复习一下指针的概念。指针就是地址,地址就是编号!
看这一条语句:*((int *) 0x10000000) = 0x100;,在stm32单片机中,完全裸写的寄存器去访问地址我们可以通过*((int *) 0x10000000)我们就可以将编号转换成地址。
1234567891011121314/* Memory mapping of Cortex-M3 Hardware */#define SCS_BASE (0xE000E000) /*!< System Control Space Base Address */#define ITM_BASE (0xE0000000) /*!< ITM Base Address */#define CoreDebug_BASE (0xE000EDF0) ...
STM32-看门狗
STM32-看门狗用途在工业现场环境非常的复杂,人为检测非常不便,可以使用看门狗进行检测超高温、超低温、强烈的电磁干扰,这些环境都会影响设备的正常工作,会造成死机或者程序跑飞。
将来一旦死机可以利用看门狗对系统进行重启
简介看门狗属于定时器资源,学习系统定时器(systick)时我们知道,决定定时长短或超时时间,由时钟频率和计数值决定。看门狗的定时长短也是这两个因素,当看门狗的定时时间到达后会直接重启系统。相对于系统定时器看门狗就多了一个复位重启的功能
如果开启看门狗,但是程序正常,也没有发生死机。在系统定时器(systick)到定时时间重装载值寄存器把重装载的值重装载到当前值寄存器中。在看门狗中我们需要做同样的事,我们称为feed dog(喂狗)
喂狗feed dog(喂狗)本质上就是让看门狗的计数值永远减不到0。
使用看门狗资源检测系统,当程序正常且设备没有发生死机,是不需要重启的,就需要每隔一段时间喂狗。
看门狗外设资源看门狗外设分为独立看门狗(IWDG)和窗口看门狗(WWDG),在A53或者其他的高端soc芯片中只有一种看门狗,类似于独立看门狗。
IWDG和WWDG的区别相同点 ...
STM32-系统定时器
STM32-系统定时器前言白板导图delayhttps://boardmix.cn/app/editor/CSKY0IRwkkdE7C2t1DbJ0A
在STM32中我们可以使用循环来实现延时(delay)功能,这种延时被称为粗略的延时。而要想实现精确的延时就要使用系统定时器(timer)systick、sysclock
常用的定时器资源有:系统定时器(timer)、RTC(给系统时钟供电)、WDG(看门狗)。普通的定时器只提供了最基础的计时功能,而看门狗除了提供计时功能,还可以复位系统(到达定时时间,重启系统)。
无论对于普通定时器,还是系统定时器,定时时长都由时钟频率和计数值决定。
定时时长 = 时钟周期(1/时钟频率) * 计数值
STM32中的系统定时器不是由st公司提供的,而是由ARM核心提供的。了解系统定时器要从时钟频率和计数值进行分析。
时钟频率系统时钟源
一共有5种系统时钟源
HSE 系统外部的高速时钟
HSI 系统内部的高速时钟
PLL 倍频器 (乘法器) 但是本身不产生基础时钟
LSI 系统内部的低速时钟
LSE 系统外部的低速时钟
其中选择HS ...
操作GPIO类接口的输入输出功能
操作GPIO类接口的输入输出功能手上的板子上的外设,纯GPIO类的设备有led、beep和按键(key),在框架图上可以看到,这些外设和cpu连接,通过cpu要去控制这些外设的状态。就要从cpu输出一些命令来控制,所以输出功能相当于是控制,而输入功能就相当于检测。
实现LED灯的驱动程序分析具体的外设的工作原理
实现步骤
通过分析开发板的电路原理图可以得知外设具体对应的管脚,LED0~1分别对应CPUPC1~3管脚,并且管脚上输出高电平可以控制灯亮,反之灯灭。
led0 —-> pc1 输出高 亮
led1 —-> pc2 输出低 灭
led2 —-> pc3
通过APB2 外设总线将GPIOC组的时钟使能
初始化GPIO
设置为推挽输出模式
选择 1 2 3 号管脚
设置输出的频率
代码实现 led.hled.c12345678910111213#ifndef __LED_H__#define __LED_H__#include "stm32f10x_conf.h"//Led灯的初始化extern ...
stm32-中断
stm32-中断中断在arm这个架构下分了三层。所谓中断,就是cpu感知外部事件变化的一种方式。除了中断,还有轮询,还有DMA,但是中断是我们用的最多的一种方式。
中断和轮询相比,不需要cpu不断的去检测或者探测外设的状态。所谓中断就是指的是当外设或者系统定时器,产生了一个中断信号将来要上报给Cpu,但是cpu不会去直接接收中断信号,cpu让中断控制器去接收。
之前在玩STM32的过程中发现不是说所有的这些外设都是直接的连接到中断控制器上的,有一部分是通过外部中断连接到了中断控制器上,比如说我们的gpio的管脚是连接到了外部中断上,将来外部中断是不是再连接到中断控制器上。也就是说将来我的串口、i2C的那些设备可以直接给中断控制器发送中断信号,但是我gpio类的接口我得通过外部中断去上报这终端信号。再有我中断控制器可以进行中断屏蔽。我可以屏蔽你的这些外部中断,也可以不屏蔽,如果不屏蔽中断,中断信号就可以往上报了,往上报就报给中断控制器。
中断控制器完成两个事,第一:为所有连接到这上面的中断源分配一个中断号,而且这个中断号跟异常向量表里边的顺序是息息相关的,不能轻易更改,要想改的话,也得在 ...
stm32-基础day02
stm32-基础day02MCU单片机(单核)
SOC system on chip(多核 多线程)
无论是MCU还是SOC都可以组成一个完整的计算机系统。
STM32F103 = cpu + 内存 + 硬盘 + 外设
总线CPU和各个外设是通过总线(bus)进行连接的。
什么是总线?说到总线就要提到计算机的体系结构,我们编写编译好的代码都是放在硬盘中的,代码中包括一堆的指令和数据,cpu就是执行这些指令的部件。但是cpu不能直接从硬盘中读取指令和数据,因为cpu和硬盘(flash)的主频频率相差太大,如果直接进行传输只能按照最低的频率,这样的效率就会大大下降。
冯诺依曼体系结构
内存(memory)就可以解决这个问题,我们将硬盘中的指令和数据都放到内存中的一块区域。cpu也要从相同的区域读写指令,cpu就要区分哪些是指令,哪些是数据。cpu本身就是一个寄存器堆。虽然cpu不仅要去写数据,而且要区分内存中的指令和数据,但是由于内存的访问频率很高,总体的访问速率有很大的提升。这种体系结构就是冯诺依曼体系结构,其中数据交互的先就是总线,而冯诺依曼体系结构取数据和取指令都是同一条总线 ...
stm32-基础day01
stm32-基础day01STM32是mcu单片机,是嵌入式的开发板。
嵌入式简介什么是嵌入式?
嵌入式系统是以应用为中心,以计算机技术为基础,软硬件可剪裁,适应应用系统对功能、体积、成本、功耗等严格要求的专用计算机系统。
我们之前学的C\C++、uc、qt等,它们是用在应用开发的。uc解决的就是计算机体系结构和操作系统原理(内存管理、进程管理、进程间通信、网络……)
嵌入式系统的构成硬件最小系统:
硬件
介绍
处理器
ARM、mips、PowerPC———>RSIC 精简指令集x86(lintel)———>CSIC 复杂指令集
内存
掉电丢失的———>ram、SRAM、DRAM掉电不丢失的———>rom 只读存储器prom 可编程的 一次写入EPROM 可擦除的,可以多次写入EEPROM 电信号可擦除
Falsh
闪存———>程序存在闪存中NOR-flash和Nand-flash的区别Emmc(A53)
电源
\
复位电路
\
时钟电路
\
…
…
软件的构成主要是应用程序,使用C语言、UC、C++、QT ...
文件IO
文件IO前言IO操作是一切实现的基础,我们之前写的程序里面的数据都是在内存中进行操作,数据随着程序的结束在内存中就被销毁了。
如果程序中产出的数据有保留的价值或者我们希望之后还能够使用,我们可以把这些数据保存到文件中。这些数据我们可以从保存的文件中读取出来进行使用或者二次加工 。
所以文件IO输入输出的操作是一切实现的基础,没有IO操作我们程序的结果是没有的。
标准IO和系统调用IOIO分为stdio标准IO和sysio系统调用IO(文件IO)
两种IO都可以使用的情况下,我们优先选择标准IO
标准IO 是依赖于系统调用IO实现的,因为我们在不同编译环境下,机器的内核可能是不一样的,所以不同的stdio依赖的系统调用IO是不一样的。以fopen函数为例,在Linux环境下依赖的函数时open,而在Windows环境下依赖openfile,所以open和openfile就是内核提供的系统调用IO。
这种情况下,我们程序的移植性就很成问题,为了避免这样问题的产生,提高我们程序的移植性,我们会优先选择标准IO
标准IO我们先用man打开fopen();函数
1234567NAME ...









