对位操作由别名转换到位的方法

发布者:beta12最新更新时间:2021-06-02 来源: eefocus关键字:位操作  STM32F103RBT6 手机看文章 扫描二维码
随时随地手机看文章

简介:对位操作,由别名转换到位的方法以及一些stm32硬件知识。
Stm32相对于51复杂了太多,之前自己学习方法不对,所以导致花了时间也没什么效果,现在工作了自己也知道该怎么来更好学习了,准备花两周左右看一下stm32中文手册及固件库手册,然后再按照正点原子的不完全手册结合这开发板来学习,也记下学习笔记总结学习、加深记忆。

此次的学习是以STM32F103RBT6作为核心MCU的,其有128k flash、20k sram、2个spi、3个串口、1个usb、1个can、2个12位的adc、rtc以及51个可用的IO口。


笔记一存储器及总线架构


1.Stm32主系统由以下部分构成:


●四个驱动单元:─Cortex??-M3内核DCode总线(D-bus),和系统总线(S-bus)─通用DMA1和通用DMA2


●四个被动单元─内部SRAM


─内部闪存存储器


─FSMC


─AHB到APB的桥(AHB2APBx),它连接所有的APB设备。


2.在每一次复位以后,所有除SRAM和FLITF以外的外设都被关闭,在使用一个外设之前,必须设置寄存器RCC_AHBENR来打开该外设的时钟。所以以后编程的时候要记住设置RCC_AHBENR来使能外设。


3.memory map是很重要的,以前一直没有引起足够的重视,程序存储器、数据存储器、寄存器和输入输出端口被组织在同一个4GB的线性地址空间内。


4.两个位段(bit-band)区,下面的映射公式给出了别名区中的每个字是如何对应位带区的相应位的(相当于51单片机中的P0口操作转换到P0^1的操作):


bit_word_addr = bit_band_base + (byte_offset×32) + (bit_number×4)


其中:bit_word_addr是别名存储器区中字的地址,它映射到某个目标位。


bit_band_base是别名区的起始地址。


byte_offset是包含目标位的字节在位段里的序号


bit_number是目标位所在位置(0-31)


例子:下面的例子说明如何映射别名区中SRAM地址为0x20000300的字节中的位2:0x22006008 = 0x22000000 + (0x300×32) + (2×4).对0x22006008地址的写操作与对SRAM中地址0x20000300字节的位2执行读-改-写操作有着相同的效果。


5.boot0和boot1可以设置stm32启动模式




启动模式选择引脚启动模式说明


(BOOT1 BOOT0)


X0主闪存存储器主闪存存储器被选为启动区域


01系统存储器系统存储器被选为启动区域


11内置SRAM内置SRAM被选为启动区域


当使用ISP下载的时候,选择第三种启动方式。




笔记二CRC计算单元


对于本章,不知道要用到什么地方,不过等以后遇到再说。


CRC用两个数据寄存器和一个控制寄存器,一个数据寄存器用来做计算寄存器,对其写操作作为输入寄存器,输入计算数据;对其读操作作为输出寄存器,输出计算结果。另一个数据寄存器只有低8位有效,可以用来寄存数据;控制寄存器只有0位有效,作为reset位,只能写1,硬件自动清零。




笔记三电源控制及管理


之前学51什么的,电源啊时钟呀都只有一个不需要设置选择,后来工作接触了增强型8051后了解了多个时钟电源后再来学32已经不像之前那样对这么多的时钟电源感到畏惧了,呵呵。。Stm32的工作电压(vdd)在2-3.6v,可以通过内置的电压调节器提供所需的1.8v电源。当主电源(vdd)掉电后,可以通过VBAT引脚为实时时钟(RTC)和备份寄存器提供电源,当主电路中没有设计使用外部电源时,则必须将VBAT连接到VDD引脚上面。还有一点需注意,VDD与VBAT在某些情况下会存在注入电流,所以在外部VBA和电源之间要接一个低压降二极管。


为了提高转换精度,stm32为adc提供了一个独立的电源供电,过滤和屏蔽来自印刷电路板上面的毛刺干扰。


电压调节器总是使能的在复位后,有运转模式、停止模式、待机模式三种工作模式。


Stm32中有一个完整的上电复位(POR)和掉电复位电路(PDR),只要供电电压达到2v则能正常工作。当VDD/VDDA低于VPOR和VPDR时则保持为复位状态。对于可编程电压检测器(PVD)可以利用PVD对VDD电压与电源控制寄存器(PWR_CR)中的PLS[2:0]位进行比较来监控电源,这几位选择监控电压的阀值。


因为之前研究过silab公司出的低功耗无线芯片si100x(增强型8051内核的),所以对stm32的低功耗模式就比较容易理解了,32有睡眠模式、停止模式和待机模式三种低功耗模式,可以通过不同的寄存器操作去实现,这个就不详细说了,了解了大概,以后需要用的时候再详细研究吧。32还提供了一个低功耗模式下的自动唤醒模式,主要依靠rtc(和si100x差不多的,不过si100x还要强大的多)。


对寄存器什么的就等以后用到的时候再查阅相关资料吧,相信那样记忆也会更深刻。




笔记四复位和时钟电路


该32芯片支持三种复位形式,系统复位、上电复位和备份区域复位。


除了时钟控制器的RCC_CSR寄存器中的复位标志位和备份区域中的寄存器以外,系统复位将复位所有寄存器至它们的复位状态。


当发生以下任一事件时,产生一个系统复位:


1. NRST引脚上的低电平(外部复位)


2.窗口看门狗计数终止(WWDG复位)


3.独立看门狗计数终止(IWDG复位)


4.软件复位(SW复位)


5.低功耗管理复位


可通过查看RCC_CSR控制状态寄存器中的复位状态标志位识别复位事件来源。还存在软件复位和低功耗复位,详细参考中文手册吧。




当以下事件中之一发生时,产生电源复位:


1.上电/掉电复位(POR/PDR复位)


2.从待机模式中返回


电源复位将复位除了备份区域外的所有寄存器。




备份区域拥有两个专门的复位,它们只影响备份区域。


当以下事件中之一发生时,产生备份区域复位。


1.软件复位,备份区域复位可由设置备份域控制寄存器(RCC_BDCR)中的BDRST位产生。


2.在VDD和VBAT两者掉电的前提下,VDD或VBAT上电将引发备份区域复位。




时钟有三种不同的时钟源可以被用来驱动系统时钟(SYSCLK)


●HSI振荡器时钟●HSE振荡器时钟●PLL时钟


这些设备有以下2种二级时钟源:


●40kHz低速内部RC,可以用于驱动独立看门狗和通过程序选择驱动RTC。RTC用于从停机/待机模式下自动唤醒系统。


●32.768kHz低速外部晶体也可用来通过程序选择驱动RTC(RTCCLK)。当不被使用时,任一个时钟源都可被独立地启动或关闭,由此优化系统功耗。


高速外部时钟由(HSE)以下两种时钟源组成:


●HSE外部晶体/陶瓷谐振器●HSE用户外部时钟


为了减少时钟输出的失真和缩短启动稳定时间,晶体/陶瓷谐振器和负载电容器必须尽可能地靠近振荡器引脚。负载电容值必须根据所选择的振荡器来调整。外部时钟信号(50%占空比的方波、正弦波或三角波)必须连到SOC_IN引脚,同时保证OSC_OUT引脚悬空。


还有HSI时钟、PLL时钟、LSE时钟、LSI时钟、时钟安全选择、RTC时钟、看门狗时钟等等也应该理解的这里就不一一做笔记了,反正以后遇到了后再来查阅。


关于系统时钟的选择,当系统复位的时候HIS被默认选为系统时钟,当其他时钟源被选为系统时钟之前,不能被停止。只有当目标时钟源准备就绪了(经过启动稳定阶段的延迟或PLL稳定),从一个时钟源到另一个时钟源的切换才会发生。在被选择时钟源没有就绪时,系统时钟的切换不会发生。直至目标时钟源就绪,才发生切换。在时钟控制寄存器(RCC_CR)里的状态位指示哪个时钟已经准备好了,哪个时钟目前被用作系统时钟。


微控制器允许输出时钟信号到外部MCO引脚。相应的GPIO端口寄存器必须被配置为相应功能。


以下四个时钟信号可被选作MCO时钟:


●SYSCLK●HSI●HSE●除2的PLL时钟


时钟的选择由时钟配置寄存器(RCC_CFGR)中的MCO[2:0]位控制。




笔记五GPIO和AFIO(复用功能I/O)


相当于51单片机I/O口来说,stm32的I/O就要复杂得多了,不仅有多种输入输出方式,还需要配置不同的寄存器来达到相应的功能。




(一)每个GPIO端口有两个32位配置寄存器(GPIOx_CRL,GPIOx_CRH),两个32位数据寄存器)(GPIOx_IDR,GPIOx_ODR),一个32为置位/复位寄存器(GPIOx_BSRR),一个16位复位寄存器(GPIOx_BRR)及一个32为锁定寄存器(GPIOx_LCKR)。可以将其配置如下模式:


─输入浮空、输入上拉、输入下拉、模拟输入


开漏输出、推挽式输出、推挽式复用功能、开漏复用功能


可以按照下面的表格对其配置:


表一 端口位配置表


表二输出模式位


复位期间和刚复位后,复用功能未开启,I/O口被配置为浮空输入模式(CNFx[1:0]=01b,MODEx[1:0]=00b)。复位后JTAG相关的引脚被置位上拉或者下拉模式。


所有的端口都可以配置为外部中断模式,不过首先必须配置为输入模式。对于复用功能现在不怎么了解怎么用,可能今天头脑不清晰的原因,不过先不管吧,等以后碰到再说。对gpio还可以进行重新映射以及锁定(即使端口位的配置在下一次复位之前不能改变),关于对输入输出等等功能的配置等以及寄存器以后用的时候一点点的积累吧,现在记住也没用。

关键字:位操作  STM32F103RBT6 引用地址:对位操作由别名转换到位的方法

上一篇:STM32应用-简单的串口接收与发送程序
下一篇:STM32其他问题集锦

推荐阅读最新更新时间:2024-11-03 12:44

STM32操作24AD转换器AD7799芯片
  AD7799是早些前ADI公司推出的一款高精度低速24位ADC器件,主要应用于低功耗精密测量场合。最近开发与气压检测相关的产品,选择了这个芯片,经过PCB的合理布线,感觉这颗芯片的效果还不错。   AD7799内部数字部分和模拟部分的供电是分开的,数字部分由DVCC供电,模拟部分由AVCC供电,经过实验,在只有DVCC而不加AVCC的时候芯片的数字接口部分是可以工作的,这样就可以把AIN3+和AIN3-作为数字信号来启动模拟电源输出AVCC,不知道这样描述是否清楚,主要是为低功耗和省电考虑。   AD7799内部有三个差分通道,可以分别配置成为差分模式和单端模式,在单端模式下需要保证AINx(+)电压高于AIN(-)电压,否则
[单片机]
STM32<font color='red'>操作</font>24<font color='red'>位</font>AD<font color='red'>转换</font>器AD7799芯片
STM32 8IO的操作
归根结底就是对8个IO口的读写问题。你可以自己编写两个函数WriteData()和ReadData();还是分别调用GPIO位操作的函数。 void WriteData(u8 data) { //分别操作与液晶连接的IO口,顺序是由高位到低位 GPIO_WriteBit(GPIO号, Pin号,(data & 0x80) 7 ); GPIO_WriteBit(GPIO号, Pin号,(data & 0x40) 6 ); GPIO_WriteBit(GPIO号, Pin号,(data & 0x20) 5 ); GPIO_WriteBit(GPIO号, Pin号,(data & 0x10) 4 ); GP
[单片机]
STM32F103固件库编程(2)—操作
与51单片机对比 STM32F103的位带操作相当于51单片机的sbit。因为STM32F103每次操作都是4个字节(32位),所以我们要把一个位变成32位,其中膨胀后的最后一位就是原来的位。 这样之后,通过赋值0或1,就能控制最后一位(即原来的位)。 STM32F103的位带区 位带区和位带别名区地址转换 一个位膨胀成四个字节,这样便于STM32以4个字节的方式操作。 1.外设位带别名区地址 所在字节的地址为 A,位序号为 n(0 =n =7) AliasAddr= =0x42000000+ ((A-0x40000000)x8+n)*4 其中 (A-0x40000000)代表着地址偏移,(A-0x40000000
[单片机]
STM32F103固件库编程(2)—<font color='red'>位</font>带<font color='red'>操作</font>
vs1003播放MP3卡的问题
第二次制作MP3了,把第一次搞得源码搬出来,按上边的说明接好线,结果发现,不能工作了,第一次的确调出来了啊,我还清楚地记得,虽然调处来了但是效果并不好啊,还是卡卡的,然而这次竟然连声音都没有,我崩溃了,苦恼自己上次没有做好笔录。 这次用到的模块和上一次一样,也是STM32F103RBT6最小系统板,VS1003模块,SD卡模块,还有一个按键模块就这些。SD卡模块和stm32通信采用的是SPI接口,这里使用的是SPI1,vs1003和stm32通信也是SPI,这里使用是SPI2,sd卡模块的引脚加上电源和地也就6根,vs1003的引脚相对较多,电源地2根+SPI的4根+ XDCS和XCS+DREQ共9根。在这里我们使用了15根杜邦线将
[单片机]
vs1003播放MP3卡的问题
ICCAVR操作的宏定义
C语言位操作的功能是其比较出色的地方,现在许多微处理器都支持C编译器也可看出。汇编语言的位操作也很直观,但在某些C编译器对位操作却不能象汇编中对单个的位进行直接处理,而要转化为对一个字节的操作,在ICCAVR中这种限制充分体现出来。如要对PORTA的PORTA0置1,则应写成PORTA|=0X01;这样的位处在字节的两端还比较直观,但若是要置PORTA的第3位,第6位置1,则写出的程序可读性不强了。于是便有了一些宏操作定义#define BIT(x) (1 (x))(需要包含头文件macros.h)才可直接使用。下面给出两种置1和清0的宏定义: 置1: 1,#define set(x) (1 (x)) 2,#d
[单片机]
stm32:带区操作
/*位带区在片上外设的地址范围:0x4000 0000-0x400F FFFF(片上外设区中的最低1MB), 位带识别区在片上外设的地址范围:0x4200 0000~0x42FF FFFF; 对应关系:位带区的每个bit位的值 对应 位带识别区1个 32位的地址的内容; 所以位带操作是:当你通过位带别名区访问这些32位的地址的内容时,就可以达到访 问位带区对应的比特位。 */ //-----位带操作宏定义 //功能:将位带区地址addr 的 bitnum 位 转换为对应 位带识别区的地址 #define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((add
[单片机]
跑马灯-操作
1、参考资料 《STM32F1开发指南-库函数版本》-5.2.1小节IO口的位带操作实现 STM32F1xx官方资料: 《STM32中文参考手册V10》-第8章通用和复用功能IO(GPIO和AFIO) 《Cortex-M3权威指南(中文)》第5章 位带操作 2、位操作的本质目的就是操作寄存器 1)位操作比较方便操作IO口 2)位操作原理 把每个比特膨胀为一个32位的字,当访问这些字的时候就达到了访问 比特的目的,比如说BSRR寄存器有32个位,那么可以映射到32个地址 上,我们去访问(读-改-写)这32个地址就达到访问
[单片机]
跑马灯-<font color='red'>位</font>带<font color='red'>操作</font>
AVR操作记录
说实话,偶是头一次遇到这么用的,Mark。 #define BIT(x) (1 (x)) #define GET_PORT(x, bit) (PORT ## x) #define GET_PIN( x, bit) (PIN ## x) #define GET_BIT(x,bit) (bit) #define PORT_OUT0(portx_bit) ( GET_PORT(portx_bit) &= ~BIT(GET_BIT(portx_bit)) ) #define PORT_OUT1(portx_bit) ( GET_PORT(portx_bit) |= BIT(GET_BIT(portx_bit)) )
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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