一、外设常具备的几类寄存器
控制寄存器xxx_CR (Control/Configuration Register): 用来配置、控制响应外设的工作方式,如GPIOx_CRL、AFIO_EXTICR1~AFIO_EXTICR4。
数据寄存器xxx_DR (Data Register) : 存储量外设进行输入输出的数据,如GPIOx_IDR、GPIOx_ODR、USART_DR等。
状态寄存器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接口进行发送数据。
五、状态检查与清除
状态位(标志位)
当外设完成了某些工作或出现某些状况的时候,就会在状态寄存器xxx_SR的相应位更新状态。事件
外设做完了一件事,或者出现了特殊状况,都可以称之为事件。
用户可以通过状态位获取外设当前工作的新状态,根据新状态就知道发生了什么事件。比如USART_SR的位6置1,就代表了发送完成。事件的处理
采用轮询法 不断的查询状态位,以实时的监控外设的事件。这种方法操作简单,但是太浪费CPU的运行时间。而且如果硬件故障迟迟得不到状态的更新,CPU也会因此卡死,所以要做好超时处理。
采用中断法 中断法可以利用外设实时监测外侧的事件,节约了CPU的运行时间。但是中断操作相对复杂,而且过多的中断对于系统的稳定性是不易把握的。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)的状态。
清除标志位
虽然xxx_ClearFlag()和xxx_ClearITPendingBit() 都是对xxx_SR的同一位进行清除的。但是在使用中,安全起见还是在中断服务程序中使用xxx_ClearITPendingBit()。而非中断的事件操作方法下,使用xxx_ClearFlag()。
六、外设函数分类
不同的外设,ST对它们的封装函数是类似的,分类表如下:
参考资料:《STM32库开发实战指南》
转载于:https://www.cnblogs.com/amanlikethis/p/3728080.html
上一篇:初学stm32-寄存器开发点灯、流水灯、蜂鸣器
下一篇:初学stm32-Systick滴答时钟定时
推荐阅读最新更新时间:2024-11-13 11:10
推荐帖子
- 时钟资料
- 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)
设计资源 培训 开发板 精华推荐
- SW3518S全协议快充适配器
- 耳放V0.3
- 使用 Richtek Technology Corporation 的 RT8296B 的参考设计
- LT3091EFE 基本可调线性稳压器的典型应用
- STC15W4K58S4核心板
- 【已验证】USBasp烧录器avr下载器
- KIT22XS4200EKEVB: 评估套件 - MC22XS4200,双高边开关
- 使用 Analog Devices 的 LT1317BIS8 的参考设计
- LTC3624IDD-23.3 3.3V 输出电压、2A 同步降压稳压器的典型应用,具有 800mA 突发钳位,fSW = 1MHz
- LTC4367CMS8-1 过压电源保护控制器的典型应用