单片机系列——ST_LINK及中断

1.1  ST_LINK连接(知识拓展)

    1.1.1 参考网址:

      (1)各个调试接口的区别:https://blog.csdn.net/LEON1741/article/details/72846434

1.2 报错

      报错1:老师给了老版的st-link安装包(具体版本忘了),安装后,设备管理器一直无法识别,后改用新版本安装即能正常使用,但有意思的是,老版对有些人也是可以用的。具体原因不详,能用就行了。

 2.1 中断

2.1.1 中断的含义 :https://blog.csdn.net/xkf321/article/details/53088834

     看完上述资料,仍然一脸懵逼,不明白所谓的中断向量是什么,所谓下降沿触发的事件模式是什么,也很想知道,所谓的中断存在的意义是什么,所以,继续深挖。

    什么是中断向量

   (1) 中断向量是指中断发生以后,程序会按照中断类型执行不同的中断服务程序,这个中断向量就是这些中断处理函数的入口地址。
     具体为什么叫向量,我认为,中断是有优先级的,程序会按照优先级从高到低依次查询,突出一个方向性,所以叫向量。(来自百度问答)

扫描二维码关注公众号,回复: 3735038 查看本文章

(2)硬着头皮看完的百度百科:https://baike.baidu.com/item/%E4%B8%AD%E6%96%AD%E5%90%91%E9%87%8F?fr=aladdin

      顺便明白了向量表:CPU是根据中断号获取中断向量值,即对应中断服务程序的入口地址值。因此为了让CPU由中断号查找到对应的中断向量,就需要在内存中建立一张查询表,即中断向量表(在32位保护模式下该表称为中断描述符表)。

      突然联想到,当初莫名其妙加入的库中,有这样的介绍:

    大致知道他跟中断有关,查了一下,记住这句话就行了:这是一个中断处理文件,_it结尾,就是interrupt(中断)的意思。而且不能过于拘泥,因为发现有的论坛中提出:最近在写stm32的中断示例程序,发现main.c主文件没有#include“stm32f10x_it.h”文件,我写的中断函数也能正常运行,为什么会这样呢,求大神能解释一下。大神解释为:在startup_xxxxxxx.s这个文件里面声明过的,所以中断服务函数名称需要遵循一定的规范,一般都不改,直接用。找到一篇具体关于头文件的介绍:https://blog.csdn.net/wqx521/article/details/50925553。简单看了看,跟评论一个心情:写的挺详细的,虽然我还是看不太懂。。。不过也增长了不少知识。由于知识有限,这个坑不敢往下挖,所以中断向量就挖到这里。(其实不能说自己看完理解的有多深刻,但是比一点都不知道强得多)

下降沿触发的事件模式

     简单查了查,感觉这个时候百度文库最靠谱:

https://baike.baidu.com/item/%E4%B8%8A%E5%8D%87%E6%B2%BF%E8%A7%A6%E5%8F%91/3859505

   简单和前面文献中的知识联想,其实就是高低电平变化的事件。

中断存在的意义是什么

   (1) 找到一篇在我理解范围内,令我瞬间将所有散乱的思绪连起来的简短文章:

    https://blog.csdn.net/qq_20233867/article/details/72236576

    其中有两句话值得回味:

  • 中断是一种处理器外设进行通信的机制
  • 中断是“上层应用”与“底层代码”的“分割边界”。

(2)第二篇

https://blog.csdn.net/wlf_go/article/details/80319417

其开头段简直不要太....:

所有的事物都是依靠中断来解决问题的。计算机更是如此,依靠时钟发生器,人为的设置没几个时钟周期做一个任务,不管是否做完,一旦规定的时间到了,那么就要强制“中断”,以作下一个任务……就这样,直道所有的任务都作过了(但不一定都做完毕),再接着做第一个没有做完的任务,就这样走而复始循环工作。完成所谓的“多任务”。

要不然,一个cpu,如果即能一边打字,一边看到屏幕呢?这就是一个cpu核心,不断地一会检测键盘,一会检测屏幕……
还有就是软中断,具体详细的细节,可以参考微机原理。(本段来自 wlf_go 的CSDN 博客 )

3.1 实战

    因为了解上面那么多其实只是一个插曲,目的还是想简单了解一下综合知识和背景,现在以dht11温湿度传感器进行实战(其实就是根据源码自己理一遍思路)。

  还是采取树形的结构,从应用函数到底层库。

3.1.1 main.c

对于温湿度传感器,应用就是读取数据,其在主函数中的调用如图:

 进入定义:

理一下代码思路:

(1)buffer 传进来的是数组首地址

原因;

       DHT11data数据格式:

  一次传输40位数据=8bit湿度整数数据+8bit湿度小数数据+8bint温度整数数据+8bit温度小数数据+8bit校验位

(2)dht11_reset()

过程对应于:(dht11百度文库应用文档:

https://wenku.baidu.com/view/7b906a297275a417866fb84ae45c3b3567ecddfa.html

   (3)在继续时,突发好奇,想了解其中频繁见到的assert——param函数:

       https://blog.csdn.net/chuckfql/article/details/9107753

作用:在固件库中,它的作用就是检测传递给函数的参数是否是有效的参数

(4)dht11_scan:

由于直接看源码,可以看懂源码但不理解思路,所以找到了一篇关于GPIO的文章

https://www.cnblogs.com/zc110747/p/4660514.html

找到:GPIO_ReadInputDataBit(GPIOx,GPIO_Pin_y);//读取单个输入端口的数据

(5)唯一不明白的是,在很多函数中,都存在 while(*==reset),while(*==set),不过具体函数功能都看得出来,对于这个代码的理解不是很清楚。

(6)到此有个最大的疑惑让我莫名其妙:

看源码是因为觉得里面会存在终端的问题,因为在此之前我一直以为传感器和单片机通信是串口通信,因而会存在终端问题,然而现实是........他连串口头文件都不包括,只是将引脚模式修改过.......所以我看源码看半天,只是修改了误区,稍微了解了dht11这个传感器。

(7)PS:写博客是觉得有些东西记在电脑上查询不方便,所以如果真的有大佬默默无闻的看到这里,求放过。下午有时间去用串口通信,真正去领悟一下中断。另外:在修改源码的前提下使用OLED,简直不要太简单,不过就是对于其物理上的理解一点都没有。

猜你喜欢

转载自blog.csdn.net/qq_40240102/article/details/82949187