15、库函数开发小结

news2024/11/24 14:09:17

目录

0x01、初始化

0x02、数据输入输出

0x03、状态位、标志位

0x0001、事件

0x0002、标志位的检查与清除

0x04、外设函数分类


本节我们来总结一下ST库开发的步骤和共同点,在总结之前,我们来看一下基本所有外设都有的以下几类寄存器:

1、控制寄存器xxx_CR:这类寄存器是用来配置、控制相应外设的工作方式的,入GPIOx_CRL、GPIOx_CRH、AFIO_EXTICR1 ~  AFIO_EXTICR4,串口的USART_CR1 ~ USART_CR3等。

2、数据寄存器xxx_DR:这类寄存器主要是存储了外设进行输出输入的数据。如GPIOx_IDR、GPIOx_ODR、USART_DR等。

3、状态寄存器xxx_SR:这类寄存器主要存储了当前外设的运行状态,主要为一些标志位。如USART_SR、ADC_SR等。

0x01、初始化

使用ST库对外设进行初始化,一般有以下步骤:

1、定义一个xxx_InitTypeDef类型的初始化结构体。

2、根据使用需求,向这些初始化结构体的成员写入特定的控制参数。

3、填充好结构体之后,把这个结构体作为输入参数调用相应的外设库函数xxx_Init(),从而实现向寄存器写入控制参数,并配置好外设。

在以后的其他外设开发中,我们还会遇到各种类型的初始化结构体及初始化函数。如ADC_InitTypeDef,ADC_Init();I2C_InitTypeDef,I2C_Init()等。它们的应用方法是相同的,区别在于不通的外设,其结构体成员不一样,可输入参数相应也不同。只要理解了这些结构体成员所控制参数的意义,我们就能轻松的使用一个全新的外设。

0x02、数据输入输出

对外设的使用,一般涉及其输入和输出数据,ST官方库中有一类函数专门为此应用而生,如GPIO的输入输出函数:GPIO_ReadOutputDataBit();GPIO_ReadInputData()、GPIO_SetBit()还有USART的收发数据函数:USART_ReceiveData()、USART_SendData(),这类函数都是用于控制输入输出数据的。

这些函数控制相应外设数据寄存器DR的内容,达到控制输入输出的目的。使用这些函数的方法也是类似的。

1、通过输入参数,向函数指定要使用的是什么外设,如用(GPIOA、GPIO_Pin_5)选定PA5进行控制,用(USART1)来指定使用串口1外设。

2、若向外输出数据,则调用Output或Send函数,把要输出的数据变量作为函数的输入参数。

3、若为接收外部数据,则调用Read或Receive函数,读取函数的返回值来得到外部输入数据。

对于其他外设,也有类似的控制数据输入输出函数。如用ADC_GetConversionValue()函数来获取ADC转换所得到的数值;用I2C_SendData()函数来使用I2C接口进行发送数据。

0x03、状态位、标志位

当我们需要知道外设的工作状态时,就涉及一系列标志检查的ST官方库函数。

0x0001、事件

当外设完成了某些工作或出现某些状态的时候,会触发一些事件,这些事件会在状态寄存器SR中,以不同的寄存器位来记录。这些寄存器位称为相应的事件标志位。

如串口发送完成后,会在USART_SR寄存器中的位6置1,作为发送完成的时间标志。若发送寄存器为空,则会相应的在位7置1,作为发送寄存器已空的事件标志,如果我们不停的查询这个标志位,就可以得知串口的发送状态。

不停的查询标志位,会耗费内核宝贵的资源,ST以中断的方式解决这个问题,大部分事件都可以被配置成中断。例如,若把串口发送完成事件配置为可触发中断后,当串口发送完成时,外设不仅在USART_SR寄存器中记录事件,还会触发串口中断,从而可以进入相应的中断服务函数,针对不同的事件进行具体得处理,而内核也省去了不停查询标志位的工作。 

0x0002、标志位的检查与清除

假如我们把串口的发送完成事件、接收寄存器非空事件(串口接收到数据)都配置为可触发中断,因为它们触发的都是串口中断,所以中断时都是进入到同一个串口中断服务函数中处理的。那么我们再串口的中断服务函数中,就要区分这个中断究竟是由发送完成事件触发的,还是由接收到数据事件触发的。

在这个时候,我们就必须进行一次标志位检查了,对标志位进行检查的库函数,一般命名为xxx_GetFlagStatus()或xxx_Get ITStatus() ,功能分别为获取事件标志位状态和中断标志位状态。如前面使用过的读取串口标志位的函数USART_GetFlagStatus();EXTI的获取EXTI线状态的函数EXTI_GetFlagStatus()。

既然有标志位检查,自然也有清除标志位功能的函数。对标志位进行清除的ST库函数,一般命名为xxx_ClearFlag()或xxx_ClearTPendingBit()函数,功能分别为清除事件标志位和清除挂起的中断标志位。如串口的USART_ClearFlag(),EXTI的USART_ClearIPendingBit()。

这四类函数都是对应到外设的xxx_SR寄存器的。

清除标志位时,xxx_ClearFlag()和xxx_ClearITPendingBit()结果都是对xxx_SR寄存器进行清除的,但是在使用的时候,还是尽量在中断时使用xxx_ClearITPendingBit(),在非中断时采用xxx_ClearFlag()要严谨一点。

这些对标志位进行操作的函数都有统一的方法。

输入参数就是要检查的标志,如串口的发送完成标志USART_FLAG_TC、接收寄存器非空标志USART_FLAG_RXNE。检查函数具有返回值,返回值是SET或RESET,表示这个标志位被置位或者没有置位。而标志位清除函数就没有返回值了,调用函数后就直接把相应的标志位进行清除。

0x04、外设函数分类

其实ST官方库的库函数还有很多共同点,如外设都有xxx_Cmd()函数,用来使能外设;如 xxx_ITConfig()函数用来配置外设的事件触发中断。在此,对这些外设主要的共有函数进行了简单的分类,一般外设都具有以下的函数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/622424.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

chatgpt赋能python:Python就业指南:市场现状、薪资情况及就业前景

Python就业指南:市场现状、薪资情况及就业前景 Python作为一门既新颖又多用的编程语言,已经引起了越来越多的关注。据统计,在2019年,全球Python使用者数已经达到了960万人。而在中国,Python的应用也越来越普及&#x…

PolyFormer:将图像分割称为顺序多边形生成

文章目录 PolyFormer: Referring Image Segmentation as Sequential Polygon Generation\摘要本文方法Multi-modal Transformer EncoderRegression-based Transformer Decoder 实验结果 PolyFormer: Referring Image Segmentation as Sequential Polygon Generation\ 摘要 在…

为什么会有分布式锁?分布式锁实现方案

分布式锁是控制分布式系统之间同步访问共享资源的一种方式。分布式环境下会出现资源竞争的地方都需要分布式锁的协调。 分布式锁的作用:在整个系统提供一个全局、唯一的锁,在分布式系统中每个系统在进行相关操作的时候需要获取到该锁,才能执…

Calibre 6.18.1 正式发布,功能强大的开源电子书工具

导读Calibre 开源项目是 Calibre 官方出的电子书管理工具。它可以查看,转换,编辑和分类所有主流格式的电子书。Calibre 是个跨平台软件,可以在 Linux、Windows 和 macOS 上运行。 Calibre 6.18.1 正式发布,此次更新内容如下&#…

数据挖掘(6.1)--神经网络

目录 神经网络简介 BP算法 Delta学习规则的基本原理 BP神经网络的结构 BP神经网络的算法描述 神经网络训练一般步骤 后向传播算法的主要步骤 优缺点 BP算法简单举例 神经网络简介 神经网络是一种计算模型,它受到人脑处理信息的生物神经网络过程的启发。人…

围绕工业 APT 攻击的主要问题

高级持续威胁 (APT) 行动在受害者网络内取得成功的关键因素包括人为因素、安全措施不足、网络安全解决方案更新和配置方面的挑战以及其他因素。 虽然其中一些原因可能看起来微不足道,但卡巴斯基专家在事件响应活动中经常遇到这些问题。 为帮助公司减轻相关威胁并确…

win系统将脚手架的软链接指向本地脚手架

先了解一下脚手架研发、发布、安装、调试发大致流程: 本地研发,具体研发过程略当前目录下登录npm npm login发布脚手架 npm publish安装脚手架 npm i -g xxxx(win系统会在系统盘的nodejs文件夹下自动添加脚手架执行命令和执行文件&#xff0…

94.构建样品餐部分第二节

上节课完成的页面是这样的 ● 之后我们设置一下图标 .meal-attribute {font-size: 1.8rem;font-weight: 500;display: flex;align-items: center;gap: 1.6rem; }.meal-img {width: 100%; }.meal-icon {height: 2.4rem;width: 2.4rem;color: #e67e22; }● 为了突出这些参数的…

Go1.21 速览:新内置函数 clear、min、max 和新标准库包 cmp!

大家好,我是煎鱼。 前面给大家分享了 Go1.21 正式不支持 macOS 10.13 和 10.14 的支持。吓得我赶紧把我的 2017 款的老爷机从 10.14 升成 13.4。感觉 mbp 已经变成了暖宝宝。😅 今天给大家分享的是 Go 1.21 中的两个双新增项,分别是新的 3 个…

QTYX量化系统实战案例分享|涨停股池中寻找反弹机会-202306

前言 “实战案例分享系列”是和大家分享一些股票量化分析工具QTYX在实战中的应用案例(包括失败的案例),这样能够帮助大家更好地去理解QTYX中的功能设计,也能更好地帮助大家搭建出属于自己的量化交易系统。 关于QTYX的使用攻略可以…

Clion开发STM32之链接文件进行模块的一个解耦(编程方式)

问题的引入 在单片机的开发过程中,往往涉及到驱动的移植,但是移植的过程中又会去添加和修改主逻辑的驱动引脚初始化或时钟初始化,这里面就会存在一个问题就是:改动的地方太多了,容易影响到其它功能模块。所以能不能做…

200SMART CPU输入/输出接线的几个关键点

总结来看,S7-200系列PLC提供4个不同的基本型号的8种CPU,其接线方式也可大致分为6种: 1.CPU SR20接线 2.CPU SR40接线 3.CPU CR40接线 4.CPU ST40接线 5. CPU SR60接线 6. CPU ST60接线 除了CPU外,我们还需要了解200smart PLC的数…

Rocketmq面试(二)Rocketmq如何保证消息不丢失

如果想要保证消息不丢失就要知道,消息可能出现丢失得地方。 1.producer发送消息 2.Broker存储消息 3.Consumer消费消息 4.Broker主从切换 下面一共有9个维度可以保证消息不丢失。 目录 维度一:同步发送 维度二.异步发送 维度三.刷盘策略 维度四…

后端——平台登录功能实战

这里写目录标题 一、登录接口设计示意图二、后端设计三、创建用户表四、后端鉴权逻辑五、登录接口实现六、使用 JWT 生成 token七、路由鉴权八、登录与测试用例服务结合九、跨域一、登录接口设计示意图 二、后端设计 三、创建用户表 db=SQLAlchemy(app

华尔街新风向:多基金失英伟达机会

在过去一年多的美联储暴力加息周期中,科技成长股一直不怎么受到主流投资者待见,但面对今年美股“人工智能涨个不停”的局面后,过去两周里大量的知名基金都在撒开脚丫子狂追高速狂飙的“英伟达列车”。 根据监管文件显示,包括道富…

视频与AI,与进程交互(一)

目的 正在写一个视频与AI的工具,从接入,算法处理,转发,存储, 到调用AI进程,并且与AI进程进行交互,插件化,脚本化,做得比较辛苦,期间的进程和线程交互以及结果…

基于奥比中光深度相机进行虹膜识别处理

MATLAB仿真实现效果展示 图1 奥比中光红外深度相机拍摄效果 MATLAB仿真红外效果的图片,使用奥比中光的Astra_Pro深度相机和Astra进行拍摄,效果很好。 声明:本文的虹膜识别系统模型参考了西澳大利亚大学,计算机科学与软件工程学…

Spark 优化

1.RDD分区数 Task是作用在每个分区上的,每个分区至少需要一个Task去处理 改变分区数可间接改变任务的并行度,类似手动指定Reduce数量 第一个RDD的分区数由切片的数量决定 默认情况下子RDD的分区数等于父RDD的分区数 Shuflle类算子可手动指定RDD分区数 设…

chatgpt赋能python:Python屏幕截图并保存:简单易用的库

Python屏幕截图并保存:简单易用的库 屏幕截图是程序员们在软件开发中常用到的一个小技巧,对于调试、记录Bug、编写文档等方面有极大的帮助。而其中,Python成为了众多程序员的利器之一。 在Python中,大量的库提供了屏幕截图的方法…

PX4-机架选取(基于QG地面站)

因为我的无人机是F450,所以我选用F450的机架 点击应用后,要稍等一会 应用完成后在概述会标识