初学stm32-库函数开发步骤及总结

发布者:boyatang最新更新时间:2022-04-22 来源: eefocus关键字:stm32  库函数  开发步骤 手机看文章 扫描二维码
随时随地手机看文章

一、外设常具备的几类寄存器

  1. 控制寄存器xxx_CR (Control/Configuration Register): 用来配置、控制响应外设的工作方式,如GPIOx_CRL、AFIO_EXTICR1~AFIO_EXTICR4。

  2. 数据寄存器xxx_DR (Data Register) : 存储量外设进行输入输出的数据,如GPIOx_IDR、GPIOx_ODR、USART_DR等。

  3. 状态寄存器xxx_SR(Status Register): 实时的更新存储着外设的当前运行状态,主要是一些标志位,如USART_SR、ADC_SR等。
     

GPIO输入输出函数比如,GPIO_ReadOutputDataBit()、GPIO_ReadInputData()、GPIO_SetBits();

常见的USART的收发数据函数:USART_ReciveData()、USART_SendData()。

这些函数控制相应外设寄存器xxx_DR的内容,达到控制输入输出的目的。

使用数据传送库函数的步骤:

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

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

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

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

五、状态检查与清除

  1. 状态位(标志位)
    当外设完成了某些工作或出现某些状况的时候,就会在状态寄存器xxx_SR的相应位更新状态。

  2. 事件
    外设做完了一件事,或者出现了特殊状况,都可以称之为事件。
    用户可以通过状态位获取外设当前工作的新状态,根据新状态就知道发生了什么事件。比如USART_SR的位6置1,就代表了发送完成。

  3. 事件的处理
    采用轮询法  不断的查询状态位,以实时的监控外设的事件。这种方法操作简单,但是太浪费CPU的运行时间。而且如果硬件故障迟迟得不到状态的更新,CPU也会因此卡死,所以要做好超时处理。
    采用中断法  中断法可以利用外设实时监测外侧的事件,节约了CPU的运行时间。但是中断操作相对复杂,而且过多的中断对于系统的稳定性是不易把握的。

  4. STM32状态位的检查与清除

  • 状态位在软件设计中的常见用法:

    轮询法  不用多说
    中断法 通关过检测外设中断状态标志位,可以确定外设是否真的发生了中断。而且对于外设不同事件对应一个外设中断源的情况,用于区分到底是哪种事件触发了中断。

  • STM32的事件标志位和中断标志位
    STM32的事件标志位和中断标志位在xxx_SR中是同一位,也就是公用的。这和S3C2440处理 器的不同,S3C2440处理器的事件标志位和中断标志位分别位于不同的寄存器中。

  • 标志位检查
    对事件标志检查的函数是xxx_GetFlagStatus(),而对中断标志位检查的函数是xxx_GetITStatus()。它们检查的都是xxx_SR寄存器的同一个标志位,那又有什么区别呢?
    xxx_GetFlagStatus() 直接返回要检查xxx_SR中対应位的状态
    xxx_GetITStatus(),不仅会检查xxx_SR対应位的值,而且还要判断要检查的中断是否屏蔽了。只有当xxx_SR的対应位的值是SET(1),而且中断没有被屏蔽都满足的情况下,才会返回SET(1)的状态。

  1. 清除标志位
    虽然xxx_ClearFlag()和xxx_ClearITPendingBit() 都是对xxx_SR的同一位进行清除的。但是在使用中,安全起见还是在中断服务程序中使用xxx_ClearITPendingBit()。而非中断的事件操作方法下,使用xxx_ClearFlag()。

六、外设函数分类

不同的外设,ST对它们的封装函数是类似的,分类表如下:

在这里插入图片描述

参考资料:《STM32库开发实战指南》
转载于:https://www.cnblogs.com/amanlikethis/p/3728080.html


关键字:stm32  库函数  开发步骤 引用地址:初学stm32-库函数开发步骤及总结

上一篇:初学stm32-寄存器开发点灯、流水灯、蜂鸣器
下一篇:初学stm32-Systick滴答时钟定时

推荐阅读最新更新时间:2024-11-13 11:10

IIC (STM32)
IIC(Inter-Integrated Circuit) 总线是一种由 PHILIPS 公司开发的 两线式串行总线 高速 IIC 总线一般可达 400kbps 以上。 IIC信号时序图 IIC 总线在传送数据过程中共有三种类型信号,开始信号、结束信号和应答信号。 开始信号: SCL 为高电平时,SDA 由高电平向低电平跳变,开始传送数据。 SCL = 1 SDA = 1 SDA = 0 结束信号: SCL 为高电平时,SDA 由低电平向高电平跳变,结束传送数据。 SCL = 1 SDA = 0 SDA = 1 应答信号: 每发送一个字节(8个bit),一个字节传输的8个时钟后的第九个时钟期间 接收
[单片机]
IIC (<font color='red'>STM32</font>)
STM32 位域与联合体结合优化操作
1、位域 详细介绍参考文章:位域 位域可以实现在信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。 例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可。 为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。 所谓“位域”是把一个字节中的二进位划分为几 个不同的区域, 并说明每个区域的位数。 每个域有一个域名,允许在程序中按域名进行操作。 这样就可以把几个不同的对象用一个字节的二进制位域来表示。 2、联合体 在进行某些算法的C语言编程的时候,需要使几种不同类型的变量存放到同一段内存单元中。 也就是使用覆盖技术,几个变量互相覆盖
[单片机]
STM32 上使用 printf 输出函数
如果要实现在串口 或者 LCD 上显示,必须重定义标准库函数里调用的与输出设备相关的函数。 如果使用 printf 输出到串口,需要将 fputc 里面的输出指向串口,这一过程就叫重定向。 那么如何让 STM32 使用 printf 函数呢?只需要将 fputc 里面的输 出指向 STM32 串口即可。 int fputc(int ch,FILE *p) //函数默认的,在使用 printf 函数时自动调用 { USART_SendData(USART1,(u8)ch); while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET); return ch;
[单片机]
<font color='red'>STM32</font> 上使用 printf 输出函数
开漏输出和推挽输出
概述 在STM32或者GD32中,普通的输出GPIO输出方式主要是开漏输出和推挽输出,下面我们开始讲解这2种模式的区别。 下图是GPIO内部的结构示意图。 在上图中,P-MOS带了一个⚪,说明是低电平导通。 上图是GPIO的示意图,有输入和输出,如果简化为输出,则如下所示。 模拟文件下载 https://download.csdn.net/download/qq_24312945/85250172 推挽输出 推挽输出的内部电路大概是下图这个样子,由一个P-MOS和一个N-MOS组合而成,同一时间只有一个管子能够进行导通。 当输出高电平时候,P-MOS导通,N-MOS截至,此时电源电流入R5。 当输出低电平时
[单片机]
开漏输出和推挽输出
STM32启动代码分析问题
能否讲解一下startup_stm32f10x_cl.s启动代码含义,谢谢! 我现在看反汇编如下 0x08000000 0678 LSLS r0,r7,#25 (查看Memory窗口0x08000000 : 78 06 00 20 ---STM32小端缘故) 0x08000002 2000 MOVS r0,#0x00 0x08000004 1105 ASRS r5,r0,#408 0x08000006 0800 LSRS r0,r0,#00A 。。。。。。。。。。。。。。。。。。。。。。 上面应该对应 __Vectors DCD __initial_sp ; To
[单片机]
STM32单片机学习---PWM输出
实现功能:采用定时器2的通道2,使PA1输出频率1K,占空比40的PWM波形,用PA8随意延时取反led灯,指示程序运行。 首先熟悉一下定时器的PWM相关部分。 其实PWM就是定时器的一个比较功能而已。 CNT里的值不断++,一旦加到与CCRX寄存器值相等,那么就产生相应的动作。这点和AVR单片机很类似。既然这样,我们要产生需要的PWM信号,就需要设定PWM的频率和PWM的占空比。 首先说频率的确定。由于通用定时器的时钟来源是PCLK1,而我又喜欢用固件库的默认设置,那么定时器的时钟频率就这样来确定了,如下: AHB(72MHz)→APB1分频器(默认2)→APB1时钟信号(36MHz)→倍频器(*2倍)→通用定时
[单片机]
STM32 Cubemax(十四) ——基于Cubemax的FreeRTOS移植与LED点灯测试
前言 之前的代码其实一直都是裸机在跑,即本质上就是在一个while(1)中在跑,这对于任务量较小的程序来说,没有什么问题。但最近遇到一些工程性的代码,其参考代码均采用了FreeRTOS操作系统,以此来记录一下自己的学习过程。 一、CubeMax移植FreeRTOS 废话不多说,想把FreeRTOS配置起来,再说一些其他东西。 时钟配置 时钟树配置 这个地方主要根据自己的开发板配置下面两个部分 嘀嗒时钟配置 如果使用FreeRTOS,嘀嗒时钟源要使用定时器产生的,这里不说原因,先配置就好。 FreeRTOS配置 这里下面的配置功能,等有特殊功能需要,再介绍,这里不需要动(其实也就是打开或者关闭一些功能) Fr
[单片机]
<font color='red'>STM32</font> Cubemax(十四) ——基于Cubemax的FreeRTOS移植与LED点灯测试
Stm32使用Usart代码例子(轮询、中断、DMA)
stm32使用库函数编写USART还是很方便的,现在转几个例子: /*************************************** 转载请注明出处:tedeum.iteye.com ****************************************/ 首先是不使用中断的方法使用usart1,管脚pa9,pa10,此方法已在f3discovery上验证通过,来源:https://my.st.com/public/STe2ecommunities/mcu/Lists/cortex_mx_stm32/Flat.aspx?RootFolder=%2Fpublic%2FSTe2ecommunitie
[单片机]

推荐帖子

时钟资料
TI公司的时钟资料时钟资料没钱下。。。
xjc603 单片机
CCM buck 电路的讨论
拜读了RaymondB.Ridley的论文,基于Simplis仿真工具设计了一个10V-5V的电路。但是还有很多东西不是很清楚发现衡量这种CCM的衡量基础的主要是ErrorAmp的传输函数以及control-out的传输函数,最后还有电压环路的传输函数。根据经验,找到最优化的零极点频率。采用Ridley的文献,通过计算发现与TI文献的基本无差别,但是在仿真的时候PWM没有工作,导致输出一直为零。这是为什么?另外对于大于10:1的这种比例converter电路,是不是用基本的buck电路
海南的苹果 电源技术
烧bootloader出现“Get ID Register ... ID CODE ERROR (0xFFFFFFFF) Should Be 0x1F0F0F0
我在烧44b0的bootloader的时候,出现下面的错误:C:\\fluted(done)allowio0x378FluteDa-fu-boot.bin-v-s0BeyondLogicAllowIOAddress0x378(IOPMOffset0x6F)hasbeengrantedaccess.ExecutingFluteDa-fu-boot.bin-v-s0withaProcessIDof3736PortTalkDevi
DHCJOHN 嵌入式系统
板子启动不了
我有两块板子,一块正常启动,一块就是启动不了。现在的情况是这样的,cpu是动了(可以看到部分信号输出),我测试flash部分,从上电开始,就没有信号过来。我测不到sdram部分的信号,所以也就没法确定是sdram的问题还是cpu读flash的问题。我认为cpu应该会建立flash到sdram的dma连接,会不会这样?板子启动不了对了,现在时钟信号、复位、电压都是正常的。系统应该是从flash启动看看硬件有没有错误.然后再看软件.cpu到sdram的信号是有的引用2楼fp
乘风 嵌入式系统
下期团购
不知道下期团购什么时候开始,希望是ez-430chrome下期团购不知,这你怎得问管理员
568760310 微控制器 MCU
线性光耦ACPL-C790-500E如何使用
这个线性光耦用在逆变器输出侧交流电流的检测隔离,原边使用电源供电VDD和GND,但是交流信号在电阻上降落的信号是正负双极性的,而这个线性光耦的两个正负输入端能否输入超出电源电压的信号?假设电源电压是15V和gnd,待检测电流在电阻上降落的电压假设是100mV,针对的是同一个地,这种超过供电电源电压的使用这个芯片上能否使用?线性光耦ACPL-C790-500E如何使用ACPL-C790-500E称作隔离放大器更为合适,你的问题可以参考下面的单端输入电流检测电路:
乱世煮酒论天下 电机驱动控制(Motor Control)
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved