总结
一、寄存器操作GPIO口
- GPIO口的操作是位操作。
库函数不要手打,容易出错。最好是从.h文件里面找。
- 可以将时钟比喻成脉搏,配电等等,要想用某个功能,要先打开它的时钟。
- GPIO口需要配置成对应的模式才能实现相应的功能。GPIO口的输入输出是相对于CPU来说的。
- 复用--AF
- 寄存器:用来存放指令、地址等,可以理解为用来操作CPU。
二、寄存器操作GPIO口
- GPIO口库函数的操作是基于位操作的封装函数。
- 呼吸灯原理:
如果灯亮--延时--灯灭--延时的话,灯会闪烁。若是延时的时间很短,超过了视觉暂留的频率,就不会看到闪烁,但是亮度会变暗。暗到什么程度则跟占空比有关。在一个周期里面,灯亮的延时比上灯灭的延时越大,灯的亮度越高。反之灯的亮度越小。
- 模块化编程:函数三步骤:定义、声明、调用;在模块.c中定义,在模块.h中声明,在main.c中调用。
- 外部变量extern的注意点!此变量必须是全局变量,否则加上extern也不能被别的函数调用。
三、串口通信
- 奇偶校验位:通过检测数据中1的个数是奇数还是偶数,来确定数据的准确性。
- 复用功能要打开复用功能对应的时钟。
- 波特率与比特率的区别:若调制是二进制,则波特率=比特率。若是调制八进制,则比特率是波特率的3倍。
- printf函数将会影响回显函数。
- 发送移位寄存器和接收移位寄存器都是按位接收的。
四、中断
- 记住优先级分组要在配置函数之前!
- 5~10ms延时可以实现键盘消抖。
- 中断服务函数不用声明不用调用。
- 16个内核中断,240个核外中断。其中核外中断分为了内部中断和外部中断。
Stm32f103--HD共有60个中断通道。50个内部+10个外部。
内部中断(通道):stm32内部控制器引起的中断--串口接收数据
外部中断(通道):外部信号电平引起的中断--按键
五、滴答定时器
打开滴答定时器:
- 提供时间基准--设置重装载值,即每次倒计数到0后产生一次中断。
- 中断服务函数--让形参减1。
- While(形参); 这样当形参通过中断减1一直减到0,就会跳出。
关闭滴答定时器。
根据这个原理而实现了精准延时。
六、LCD屏
LCD屏操作的本质是--打点。
打点的难点:
- 在于找到想要位置的坐标。
- 那个坐标的颜色值。--颜色值是由16位数据组成,红绿蓝是三基色。
其中,最低5位代表蓝色,中间6位为绿色,最高5位为红色。
0xFFFF---白色 0x0000---黑色。
- 易混淆的地方:以show 8x8bmp这个函数举例,里面会涉及到两个数组,一个是要打印的字符数组,一个是picture数组。其中,字符数组里存的每个元素都是1个字节,表示在字符的这一行要打的点和不用打的点。 Picture数组里面存的每个元素也都是1个字节,2个元素组成一个颜色值。
- LCD屏上的管脚:RS: -- 数据/命令选择端(1 -- 数据 0 -- 指令)
这个管脚很有意思,为1认为是发数据,为0则认为是发指令。
STM32操作LCD屏:通过FSMC给不同的地址发送数据,使A10变高变低,进而操作LCD屏的发送指令和数据。
七、RTC时钟
1.打开时钟 第六章PWREN ,BKPEN
2.取消写保护 第四章4.4
3.选择LSE时钟 6.3.9 位0,1,8,9,15.
4.读操作 配置RSF位(实现同步)--笔记上有关于同步的解释。
5.配置RTC一个或多个寄存器.
6.配置中断--秒中断
7.中断服务函数:判断秒中断标志--得到计数器的值--
1)串口打印 2)LCD屏
8.后备区作用:在系统复位或从待机模式唤醒后,RTC的设置和时间维持不变。
9.在利用rtc去写指针时钟的时候,因为需要用到时针的清屏函数,所以发现了在while(1)里面的顺序也很重要。在while(1)里面先打清屏函数再打时针,时针就不会被影响。
八、spi--flash
1.flash--W25Q64是8M字节,有128个块,每个块(64k)有16个扇区,每个扇区(4k)有16个页,每页有256个字节。
2.spi与flash之间的通信--spi要想接收数据必须要先给flash发相应长度的数据。一般会给flash发0xFF,没意义的乱码。
3.busy位--通过判断busy位来确定写操作是否完成。
4.写操作之前必须先进行擦除。
九、字库
自己对字库的理解:
就像你想让计算机输出字符a,实际上计算机只识别它的ASC码值97一样。你想让计算机输出汉字,但是计算机实际上只识别机内码。而机内码是由区位码+A0A0H组成。所以当你给计算机输入汉字,计算机得到它的机内码(x,y),则找字库时(x-0xA1)*94+(y-0xA1)
(因为字库是从1开始计数的,所以需要多减个1)
十、触摸屏
需要记住的点:
- 为什么只需要12位的坐标,却要16个时钟周期?--因为ADC模块里面的DR数据寄存器是16位。所以我们设置了左对齐,接收了16位数据之后右移4位即可。
- 三点校准的原理:
LCD屏在一个确定的坐标处显示一个十字,等你去触摸,然后它知道在你看来它的这个点在这里。如此循环3次,它通过计算得出中点(120,160)在你眼中的位置。若你触摸的就是那里,OK,校准成功;否则重新校准。
- 这个程序有意思的地方就是用GPIO口的输出高低电平的功能去模拟spi通信。
十二、IIC通信
- 内部写周期:EEPROM在停止位发送之后开启内部写周期。在此期间任何输入无效。内部写周期完成后才能开始进行下一个操作。通常一个字节需要5ms,我们可以通过查询应答位来确定写周期是否结束,但是通常我们只是在停止位后加个延时了事。
- IIC和SPI、串口通信很相像,可以结合起来理解。
- EEPROM的字地址也是跳不出页的范围,到了页尾之后会回转到该页的首地址,所以要注意这点,写的字节多的时候要手动给它加地址。
十三、DHT11
关键是模拟。
- 注意计算高低电平转变时,延时不好把控。用while();可以精准的等到变化的时刻。
- 前面学过的有些模块中断的配置会影响你的函数,所以最好屏蔽掉无用的中断。
十四、通用定时器
- 容易搞混的两个地方:
基本定时器的重装载值(假如是1000),和比较器的比较值(假如是500)。那么这500的作用是来产生PWM波,假如选择了模式1(PWM1),即500以前高电平,500以后低电平。占空比1/2的PWM波。
呼吸灯和调亮度的原理是改变500这个值,来改变PWM波的占空比。从而调节亮度。改变500的值不会影响1000,所以也不会影响基本定时器更新中断产生的时间。1000的值决定了1ms进一次中断,跟500的值改变没关系(千万不要认为是500比较一次就进一次中断!)。用到显示上面,这个1000的值是用来保证超过视觉暂留屏幕或灯不闪,保持稳定亮度。这个1000的值也决定了PWM波的一个完整周期。
十五、485协议
- 一个使能位来控制是发送模式还是接收模式。因为是半双工。
- RS232是单端输入。单端输入是一根线传输,另一根线接地。通过线与地线的电压差来区别1和0,当有外界影响的时候,传输线随之变化,而地线永远为零;而485是差分输入,两根线传输,双绞线。通过两根线的电压差来区分1和0,当有外界影响的时候,两根传输线同时变化,所以电压差基本稳定。
十六、UCOS-II系统
- 堆栈的操作都是在栈顶。
- 所有程序要么是无限循环程序,要么是一次性程序。如果不加无限循环,那么用过一次后(哪怕是挂起和恢复也一样)就不能再用,再用会卡死。
- 滴答定时器:给systick定一个重装载值来确定多久进一次中断--中断服务函数里面的OSTimeTick()让每一个控制块有延时的OSTCBDly全部减1------同时OSTimeTick()会将延时到0的任务恢复就绪
- OSTimeDly()函数会把延时的值赋给当前控制块OSTCBDly变量----同时将此任务进入等待态----然后进行任务调度。
- 其实系统节拍就是配置滴答定时器多久进一次中断。
- 挂起之后恢复也是从断点处继续。
- 中断级任务切换函数在OSIntExit()函数中就已经有了。
- UCOS系统近似每时每刻都让优先级最高的先执行。
十七、共享资源
- 等待状态和就绪状态-----CPU占用和共享资源占用冲突么?
解答:任务即使没占用CPU,也可以占用共享资源,但是执行发送信号量的函数需要占用CPU。
把CPU理解为公司--共享资源理解为换衣间----任务理解为员工-----就绪态就是上班-----等待态就是等待穿衣服。----进试衣间是自动按优先级进的,但是出来需要占用CPU来操作。
公司规定员工必须穿工作服上班--员工必须进换衣间穿工作服--换衣间只有一间----大家排队(按优先级排,并且实时更新)---有人觉得必须穿好衣服才能进公司,就一直等;有人觉得等一会儿,看着人太多就不等了,不穿工作服就去上班了---上班后就是到了就绪态----任务调度---如果你正在占用cpu,这个时候有优先级高的员工穿好衣服进来了---让出cpu;如果优先级低的穿好衣服进来了,不理他。
试衣间标志是绿色---可以进去-----进去后调红色-----出来调绿色(OSSemPost()函数,这个需要占用CPU来执行这个函数)-----如果出来后不调绿色,则所有人都进不了----或者可以再多建几个试衣间(OSSemPend()函数)
- 创建信号量---设置初值(1)---请求并占用(0)---释放(1)-----等待列表中优先级最高的请求并占用----依次循环
- 请求信号量或邮箱便将此任务从就绪态转换到了等待态。
- 邮箱里面只能放一个数据---后来者覆盖---按优先级排队----并且优先级最高的任务读完数据后自动清除。
- 消息邮箱和信号量都是发送完之后就会被排队等候的请求方get到,无需占用CPU。但是释放需要占用CPU来操作函数。
ps:
统一编址:CPU寻址范围:0~2^32-1;
独立编址:独立于CPU,0~存储器大小-1.
Volatile 防止编译器优化,每次取数据都是从其物理地址取。
Flash等存储设备不是外设。
外设:具有某些特定功能的外围硬件设备;
特点:1.硬件设备2.通信接口3.具有特定功能。
通信协议:物理连接层,数据连接层。
触摸屏工作过程:当手指按下触摸屏,Y轴由高电平变为低电平,产生笔中断信号,通知CPU读取触摸点坐标,CPU通过MOSI发送测量X/Y指令(0xD0/0x90)给XPT2046;XPT2046经过一定的转换周期,把触摸点坐标值通过DO输出给STM32.