从零开始一起学stm32(十六)---我自己的总结

总结

一、寄存器操作GPIO

  1. GPIO口的操作是位操作。

库函数不要手打,容易出错。最好是从.h文件里面找。

  1. 可以将时钟比喻成脉搏,配电等等,要想用某个功能,要先打开它的时钟。
  2. GPIO口需要配置成对应的模式才能实现相应的功能。GPIO口的输入输出是相对于CPU来说的。
  3. 复用--AF
  4. 寄存器:用来存放指令、地址等,可以理解为用来操作CPU。

二、寄存器操作GPIO

  1. GPIO口库函数的操作是基于位操作的封装函数。
  2. 呼吸灯原理:

如果灯亮--延时--灯灭--延时的话,灯会闪烁。若是延时的时间很短,超过了视觉暂留的频率,就不会看到闪烁,但是亮度会变暗。暗到什么程度则跟占空比有关。在一个周期里面,灯亮的延时比上灯灭的延时越大,灯的亮度越高。反之灯的亮度越小。

  1. 模块化编程:函数三步骤:定义、声明、调用;在模块.c中定义,在模块.h中声明,在main.c中调用。
  2. 外部变量extern的注意点!此变量必须是全局变量,否则加上extern也不能被别的函数调用。

三、串口通信

  1. 奇偶校验位:通过检测数据中1的个数是奇数还是偶数,来确定数据的准确性。
  2. 复用功能要打开复用功能对应的时钟。
  3. 波特率与比特率的区别:若调制是二进制,则波特率=比特率。若是调制八进制,则比特率是波特率的3倍。
  4. printf函数将会影响回显函数。
  5. 发送移位寄存器和接收移位寄存器都是按位接收的。

四、中断

  1. 记住优先级分组要在配置函数之前!
  2.    5~10ms延时可以实现键盘消抖。
  3. 中断服务函数不用声明不用调用。
  4. 16个内核中断,240个核外中断。其中核外中断分为了内部中断和外部中断。

    Stm32f103--HD共有60个中断通道。50个内部+10个外部。

内部中断(通道):stm32内部控制器引起的中断--串口接收数据

外部中断(通道):外部信号电平引起的中断--按键

五、滴答定时器

打开滴答定时器:

  1. 提供时间基准--设置重装载值,即每次倒计数到0后产生一次中断。
  2. 中断服务函数--让形参减1。
  3. While(形参); 这样当形参通过中断减1一直减到0,就会跳出。

关闭滴答定时器。

根据这个原理而实现了精准延时。

六、LCD

LCD屏操作的本质是--打点。

打点的难点:

  1. 在于找到想要位置的坐标。
  2. 那个坐标的颜色值。--颜色值是由16位数据组成,红绿蓝是三基色。

其中,最低5位代表蓝色,中间6位为绿色,最高5位为红色。

0xFFFF---白色 0x0000---黑色。

  1. 易混淆的地方:以show 8x8bmp这个函数举例,里面会涉及到两个数组,一个是要打印的字符数组,一个是picture数组。其中,字符数组里存的每个元素都是1个字节,表示在字符的这一行要打的点和不用打的点。 Picture数组里面存的每个元素也都是1个字节,2个元素组成一个颜色值。
  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)

十、触摸屏

需要记住的点:

  1. 为什么只需要12位的坐标,却要16个时钟周期?--因为ADC模块里面的DR数据寄存器是16位。所以我们设置了左对齐,接收了16位数据之后右移4位即可。
  2. 三点校准的原理:

LCD屏在一个确定的坐标处显示一个十字,等你去触摸,然后它知道在你看来它的这个点在这里。如此循环3次,它通过计算得出中点(120,160)在你眼中的位置。若你触摸的就是那里,OK,校准成功;否则重新校准。

  1. 这个程序有意思的地方就是用GPIO口的输出高低电平的功能去模拟spi通信。

十二、IIC通信

  1. 内部写周期:EEPROM在停止位发送之后开启内部写周期。在此期间任何输入无效。内部写周期完成后才能开始进行下一个操作。通常一个字节需要5ms,我们可以通过查询应答位来确定写周期是否结束,但是通常我们只是在停止位后加个延时了事。
  2. IIC和SPI、串口通信很相像,可以结合起来理解。
  3. EEPROM的字地址也是跳不出页的范围,到了页尾之后会回转到该页的首地址,所以要注意这点,写的字节多的时候要手动给它加地址。

十三、DHT11

关键是模拟。

  1. 注意计算高低电平转变时,延时不好把控。用while();可以精准的等到变化的时刻。
  2. 前面学过的有些模块中断的配置会影响你的函数,所以最好屏蔽掉无用的中断。

十四、通用定时器

  1. 容易搞混的两个地方:

基本定时器的重装载值(假如是1000),和比较器的比较值(假如是500)。那么这500的作用是来产生PWM波,假如选择了模式1(PWM1),即500以前高电平,500以后低电平。占空比1/2的PWM波。

呼吸灯和调亮度的原理是改变500这个值,来改变PWM波的占空比。从而调节亮度。改变500的值不会影响1000,所以也不会影响基本定时器更新中断产生的时间。1000的值决定了1ms进一次中断,跟500的值改变没关系(千万不要认为是500比较一次就进一次中断!)。用到显示上面,这个1000的值是用来保证超过视觉暂留屏幕或灯不闪,保持稳定亮度。这个1000的值也决定了PWM波的一个完整周期。

十五、485协议

  1. 一个使能位来控制是发送模式还是接收模式。因为是半双工。
  2. RS232是单端输入。单端输入是一根线传输,另一根线接地。通过线与地线的电压差来区别1和0,当有外界影响的时候,传输线随之变化,而地线永远为零;而485是差分输入,两根线传输,双绞线。通过两根线的电压差来区分1和0,当有外界影响的时候,两根传输线同时变化,所以电压差基本稳定。

十六、UCOS-II系统

  1. 堆栈的操作都是在栈顶。
  2. 所有程序要么是无限循环程序,要么是一次性程序。如果不加无限循环,那么用过一次后(哪怕是挂起和恢复也一样)就不能再用,再用会卡死。
  3. 滴答定时器:给systick定一个重装载值来确定多久进一次中断--中断服务函数里面的OSTimeTick()让每一个控制块有延时的OSTCBDly全部减1------同时OSTimeTick()会将延时到0的任务恢复就绪
  4. OSTimeDly()函数会把延时的值赋给当前控制块OSTCBDly变量----同时将此任务进入等待态----然后进行任务调度。
  5. 其实系统节拍就是配置滴答定时器多久进一次中断。
  6. 挂起之后恢复也是从断点处继续。
  7. 中断级任务切换函数在OSIntExit()函数中就已经有了。
  8. UCOS系统近似每时每刻都让优先级最高的先执行。

十七、共享资源

  1. 等待状态和就绪状态-----CPU占用和共享资源占用冲突么?

解答:任务即使没占用CPU,也可以占用共享资源,但是执行发送信号量的函数需要占用CPU。

把CPU理解为公司--共享资源理解为换衣间----任务理解为员工-----就绪态就是上班-----等待态就是等待穿衣服。----进试衣间是自动按优先级进的,但是出来需要占用CPU来操作。

 公司规定员工必须穿工作服上班--员工必须进换衣间穿工作服--换衣间只有一间----大家排队(按优先级排,并且实时更新)---有人觉得必须穿好衣服才能进公司,就一直等;有人觉得等一会儿,看着人太多就不等了,不穿工作服就去上班了---上班后就是到了就绪态----任务调度---如果你正在占用cpu,这个时候有优先级高的员工穿好衣服进来了---让出cpu;如果优先级低的穿好衣服进来了,不理他。

 试衣间标志是绿色---可以进去-----进去后调红色-----出来调绿色(OSSemPost()函数,这个需要占用CPU来执行这个函数)-----如果出来后不调绿色,则所有人都进不了----或者可以再多建几个试衣间(OSSemPend()函数)

  1. 创建信号量---设置初值(1)---请求并占用(0)---释放(1)-----等待列表中优先级最高的请求并占用----依次循环
  2. 请求信号量或邮箱便将此任务从就绪态转换到了等待态。
  3. 邮箱里面只能放一个数据---后来者覆盖---按优先级排队----并且优先级最高的任务读完数据后自动清除。
  4. 消息邮箱和信号量都是发送完之后就会被排队等候的请求方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.

猜你喜欢

转载自blog.csdn.net/qq_38639426/article/details/88674300