华工 嵌入式考点整理.docx
《华工 嵌入式考点整理.docx》由会员分享,可在线阅读,更多相关《华工 嵌入式考点整理.docx(19页珍藏版)》请在冰豆网上搜索。
华工嵌入式考点整理
复习内容:
1.嵌入式处理器的体系结构
2.F103外部中断线
3.大端小端格式
4.F103处理器启动配置
5.F103处理器内部结构
6.嵌入式系统的开发工具
7.串行通信
8.F103时钟系统、内部总线组成、各低功耗模式进入及退出、独立看门狗
9.F103内存构成、存储器映射、位带区、位带别名区及相关
10.F103内部的实时时钟RTC单元及相关计算
11.通用定时器寄存器设置与定时时间计算
知识点汇总:
Ppt11
IO系统分4层:
API、设备管理、驱动逻辑、硬件抽象层
冯诺依曼、哈佛两大处理器体系结构
1)Cortex-M3有16根中断线;
2)停止模式。
设备可以通过外部中断线从停止模式唤醒。
3)为了用RTC闹钟事件将系统从停止模式下唤醒,必须进行如下操作:
配置外部中断线17为上升沿触发;
配置RTC使其可产生RTC闹钟事件。
如果要从待机模式中唤醒,不必配置外部中断线17。
4)编号相同的I/O口使用的是同一中断线,因此实际应用中使用多路外部中断时需要使用编号不同的I/O端口。
5)每个中断线都有专用的状态位
6)STM32的每个IO口都可以作为中断输入,要把IO口作为外部中断输入,有以下几个步骤:
1)初始化IO口为输入。
IO口的状态,可以设置为上拉/下拉输入,也可以设置为浮空输入。
外部上拉/下拉电阻,可以一定程度防止外部干扰带来的影响。
2)开启IO口复用时钟,然后设置IO口与中断线的映射关系。
这样才能把外部中断与中断线连接起来。
3)开启与该IO口相对的线上中断/事件,设置触发条件。
4)配置中断分组(NVIC),并使能中断。
Ppt45-48
一道类似期中第7题的题
系统启动之后,CPU从位于0x00000000地址处的启动区开始执行代码。
对于STM32F10x系列处理器,可以通过配置BOOT[1:
0]引脚选择三种不同启动模式。
通过设置BOOT[1:
0]引脚,各种不同启动模式对应的存储器物理地址将被映像到第0块(启动区)。
系统复位后,在SYSCLK引脚的第4个上升沿,BOOT引脚的值将被锁存。
根据选定的启动模式,主闪存存储器、系统存储器或SRAM可以按照以下方式访问:
从主闪存存储器启动:
即正常的启动模式,主闪存存储器被映射到启动空间(0x00000000),但仍然能够在它原有的地址(0x08000000)访问。
从系统存储器启动:
系统存储器被映射到启动空间(0x00000000),但仍然能够在它原有的地址(互联型产品原有地址为0x1FFFB000,其他产品原有地址为0x1FFFF000)访问它。
从内置SRAM启动:
只能在0x20000000开始的地址区访问SRAM
ARM系统架构的微处理器一般是由32位ALU、数十个32位通用寄存器及状态寄存器、32位桶型移位寄存器、指令译码及控制逻辑、指令流水线和数据/地址寄存器组成。
题目期中8题
整章ppt(ppt80TIMxUSART)
1.数据通信的传输方式
常用于数据通信的传输方式有单工、半双工、全双工方式。
2.数据通信方式
并行数据通信、串行数据通信
3.异步串行通信和同步串行通信
异步串行通信
所传输的数据格式(也称为串行帧)由1个起始位、7个或8个数据位、1~2个停止位(含1.5个停止位)和1个校验位组成。
起始位约定为0,空闲位约定为1。
在异步通信方式中,接收器和发送器有各自的时钟,它们的工作是非同步的。
同步串行通信中
发送器和接收器由同一个时钟源控制。
8.F103时钟系统、
Ppt60-62
Ppt6的30+
内部总线组成、
就是计算机内部功能模板之间进行通信的总线,内部信息枢纽,但按功能分为数据总线DB,地址总线AB,控制总线CB,电源总线PB。
各低功耗模式进入及退出、
Ppt53-55
几个表
整理ppt
独立看门狗
ppt76-78
以上三个寄存器进行相应的设置,我们就可以启动STM32的独立看门狗,启动过程可以按如下步骤实现:
1)向IWDG_KR写入0X5555。
通过这步,我们取消IWDG_PR和IWDG_RLR的写保护,使后面可以操作这两个寄存器。
设置IWDG_PR和IWDG_RLR的值。
这两步设置看门狗的分频系数,和重装载的值。
由此,就可以知道看门狗的喂狗时间(也就是看门狗溢出时间),该时间的计算方式为:
Tout=((4×2^prer)×rlr)/40
其中Tout为看门狗溢出时间(单位为ms);prer为看门狗时钟预分频值(IWDG_PR值),范围为0~7;rlr为看门狗的重装载值(IWDG_RLR的值);比如我们设定prer值为4,rlr值为625,那么就可以得到:
Tout=64×625/40=1000ms,
这样,看门狗的溢出时间就是1s,只要你在一秒钟之内,有一次写入0XAAAA到IWDG_KR,就不会导致看门狗复位(当然写入多次也是可以的)。
这里需要提醒大家的是,看门狗的时钟不是准确的40Khz,所以在喂狗的时候,最好不要太晚了,否则,有可能发生看门狗复位。
2)向IWDG_KR写入0XAAAA。
通过这句,将使STM32重新加载IWDG_RLR的值到看门狗计数器里面。
也可以用该命令来喂狗。
3)向IWDG_KR写入0XCCCC。
通过这句,来启动STM32的看门狗。
注意IWDG在一旦启用,就不能再被关闭!
想要关闭,只能重启,并且重启之后不能打开IWDG,否则问题依旧,所以在这里提醒大家,如果不用IWDG的话,就不要去打开它,免得麻烦。
通过上面3个步骤,我们就可以启动STM32的看门狗了,使能了看门狗,在程序里面就必须间隔一定时间喂狗,否则将导致程序复位。
#include"led.h"
#include"delay.h"
#include"key.h"
#include"sys.h"
#include"usart.h"
#include"wdg.h"
//STM32开发板实验6
//独立看门狗实验
intmain(void)
{
delay_init(); //延时函数初始化
NVIC_Configuration();//设置NVIC中断分组2:
2位抢占优先级,2位响应优先级
//uart_init(9600);//串口初始化为9600
LED_Init(); //初始化与LED连接的硬件接口
KEY_Init(); //按键初始化
delay_ms(500); //让人看得到灭
IWDG_Init(4,625); //与分频数为64,重载值为625,溢出时间为1s
LED0=1;//点亮LED0
while
(1)
if(KEY_Scan(0)==KEY_UP)
IWDG_Feed();//如果WK_UP按下,则喂狗
}
delay_ms(10);
};
重点分析:
IWDG_Init(4,625);
voidIWDG_Init(u8prer,u16rlr)
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //使能对寄存器IWDG_PR和IWDG_RLR的写操作
IWDG_SetPrescaler(prer); //设置IWDG预分频值:
设置IWDG预分频值为64
IWDG_SetReload(rlr); //设置IWDG重装载值
IWDG_ReloadCounter(); //按照IWDG重装载寄存器的值重装载IWDG计数器
IWDG_Enable(); //使能IWDG
/********************************************************************
硬件连接:
指示灯连接PA9
功能描述:
main()函数中,喂狗程序屏蔽,指示灯闪烁,表明系统出现发生
喂狗程序不屏蔽,指示灯亮1秒左右再灭并维持灭的状态。
我们可以尝试改变IWDG_Configuration()中1000这个数值,看灯灭的
时间有没有改变。
这个时间是看门狗定时器溢出时间。
********************************************************************/
#include//STM32F10xLibraryDefinitions
/****************************************************************************
*名称:
Delay
*功能:
*入口参数:
*出口参数:
*说明:
****************************************************************************/
voidDelay(vu16cnt){
uint16i,j;
for(i=0;i{for(j=0;j<1000;j++){}}}/***********************************************************************名称:RCC_Configuration()*功能:配置时钟*入口参数:*出口参数:-----------------------------------------------------------------------*说明:使用库函数***********************************************************************/voidRCC_Configuration(void){ErrorStatusHSEStartUpStatus;//使能外部晶振RCC_HSEConfig(RCC_HSE_ON);//等待外部晶振稳定HSEStartUpStatus=RCC_WaitForHSEStartUp();//如果外部晶振启动成功,则进行下一步操作if(HSEStartUpStatus==SUCCESS){//设置HCLK(AHB时钟)=SYSCLKRCC_HCLKConfig(RCC_SYSCLK_Div1);//PCLK1(APB1)=HCLK/2RCC_PCLK1Config(RCC_HCLK_Div2);//PCLK2(APB2)=HCLKRCC_PCLK2Config(RCC_HCLK_Div1);RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_4);//启动PLLRCC_PLLCmd(ENABLE);//等待PLL稳定while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);//系统时钟SYSCLK来自PLL输出RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//切换时钟后等待系统时钟稳定while(RCC_GetSYSCLKSource()!=0x08);}/*RCCsystemreset(fordebugpurpose)*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//给GPIOA提供时钟} /***********************************************************************名称:GPIO_Configuration()*功能:配置输入输出*入口参数:*出口参数:-----------------------------------------------------------------------*说明:使用库函数,配置IO口***********************************************************************/voidGPIO_Configuration(void){GPIO_InitTypeDefGPIO_InitStructure;/*设置PA9为输出*/GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_Init(GPIOA,&GPIO_InitStructure);}/***********************************************************************名称:IWDG_Configuration()*功能:看门狗配置*入口参数:*出口参数:-----------------------------------------------------------------------*说明:使用库函数***********************************************************************/voidIWDG_Configuration(void){IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);//允许设置IWDG_SetPrescaler(IWDG_Prescaler_16);//内部低速时钟16分频IWDG_SetReload(4000);//写入值IWDG_ReloadCounter();IWDG_Enable();//使能}/***********************************************************************名称:main()*功能:主函数*入口参数:*出口参数:-----------------------------------------------------------------------*说明:***********************************************************************/intmain(void){RCC_Configuration();//配置时钟GPIO_Configuration();//配置IO口//GPIO_WriteBit(GPIOA,GPIO_Pin_9,(BitAction)1);IWDG_Configuration();//配置看门狗IWDG_ReloadCounter();Delay(5000);//系统初始化后灯亮并延时一段时间while(1){GPIO_WriteBit(GPIOA,GPIO_Pin_9,(BitAction)1);//Delay(2000);//系统初始化后灯亮并延时一段时间//GPIO_WriteBit(GPIOA,GPIO_Pin_9,(BitAction)0);IWDG_ReloadCounter();//喂狗程序}} 9.F103内存构成、Ppt36-43Cache、主存、辅存存储器映射---位带操作Ppt6的p49用途:通过准位操作命令操作IO端口存储器映射---STM32F103xC_D_E数据手册.pdf-p38处理器存储器映射包括两个bit-banding区域。它们分别为SRAM和外设存储区域中的最低的1MB。这些bit-band区域将存储器别名区的一个字映射为bit-band区的一个位。Cortex-M3存储器映射有2个32MB别名区,它们被映射为两个1MB的bit-band区。对32MBSRAM别名区的访问映射为对1MBSRAMbit-band区的访问。对32MB外设别名区的访问映射为对1MB外设bit-band区的访问。位带区、●Cortex-M3存储器空间中包括两个位段区:SRAM区的最低1MB空间和外设存储区的最低1MB空间。●这两个位段区分别与两个32M的位段别名区对应,位段区中的每一位映射到位段别名区中的一个字。●通过对别名区中某个字的读写操作可以实现对位段区中某一位的读写操作。位带别名区及相关位段别名区中的字与位段区的位映射公式●bit_word_addr=bit_band_base+(byte_offsetx32)+bit_number×4●例如:SRAM位段区中地址为0x20000300的字节中的位2被映射到别名区中的地址为:0x22006008(=0x22000000+(0x300*32)+(2*4))的字。●对别名区中某个字进行写操作,该字的第0位将影响位段区中对应的位。●对别名区中某个字进行读操作,若位段区中对应的位为0则读的结果为0x00,若位段区中对应的位为1则读的结果为0x01。●对别名区的读写可以实现对位段区中每一位的原子操作,而且仅只需要一条指令即可实现。10.F103内部的实时时钟RTC单元及相关计算Ppt98-10011.通用定时器寄存器设置与定时时间计算Ppt80-86Ppt85接下来我们以通用定时器TIM3为实例,来说明要经过哪些步骤,才能达到这个要求,并产生中断。1)TIM3时钟使能。这里我们通过APB1ENR的第1位来设置TIM3的时钟,因为Stm32_Clock_Init函数里面把APB1的分频设置为2了,所以我们的TIM3时钟就是APB1时钟的2被,等于系统时钟。2)设置TIM3_ARR和TIM3_PSC的值。通过这两个寄存器,我们来设置自动重装的值,以及分频系数。这两个参数加上时钟频率就决定了定时器的溢出时间。3)设置TIM3_DIER允许更新中断。因为我们要使用TIM3的更新中断,所以设置DIER的UIE位,并使能触发中断。4)允许TIM3工作。光配置好定时器还不行,没有开启定时器,照样不能用。我们在配置完后要开启定时器,通过TIM3_CR1的CEN位来设置。5)TIM3中断分组设置。在定时器配置完了之后,因为要产生中断,必不可少的要设置NVIC相关寄存器,以使能TIM3中断。6)编写中断服务函数。在最后,还是要编写定时器中断服务函数,通过该函数来处理定时器产生的相关中断。在中断产生后,通过状态寄存器的值来判断此次产生的中断属于什么类型。然后执行相关的操作,我们这里使用的是更新(溢出)中断,所以在状态寄存器SR的最低位。在处理完中断之后应该向TIM3_SR的最低位写0,来清除该中断标志。相关题目:1、从体系结构上来说,嵌入式系统可以分为哪些层?从上到下分为四层,分别为API、设备管理、驱动逻辑和硬件抽象。4、比较哈佛体系结构和冯.诺依曼体系结构这两种结构的特点;前者和后者相比,数据的吞吐量提高了约1倍?传统的微处理器采用的冯·诺依曼结构将指令和数据存放在同一存储空间中,统一编址,指令和数据通过同一总线访问。哈佛结构则是不同于冯·诺依曼结构的一种并行体系结构,其主要特点是程序和数据存储在不同的存储空间中,即程序存储器和数据存储器是两个相互独立的存储器,每个存储器独立编址、独立访问。与之相对应的是系统中设置的两条总线(程序总线和数据总线),从而使数据的吞吐率提高了一倍。F103外部中断线大端小端7、存储一个32位数0x12345678到0x00005000~0x00005003四个字节单元中,若以小端模式存储,则0x00005002存储单元的内容为什么?拆分成12345678,小端A+3、A+2、A+1、A顺序,故:78/56/34/1215、Cortex-M3 存储器映射有 2 个 32MB 别名区,它们被映射为两个 1MB 的 bit-band 区。对 32MB SRAM 别名区的访问映射为对 1MB SRAM bit-band 区的访问。对 32MB 外设别名区的访问映射为对 1MB 外设 bit-band 区的访问。试解释向别名区写入一个字与在 bit-band 区的目标位执行读-修改-写操作具有相同的作用。答:写入别名区的字的位0决定了写入bit-band 区的目标位的值。将位 0 为1的值写入别名区表示向 bit-band 位写入1, 将位0 为0 的值写入别名区表示向bit-band 位写入 0. 别名字的位[31:1]在 bit-band 位上不起作用。写入 0x01 与写入 0xFF 的效果相同, 写入0x00 与写入0x0E 的效果相同. 读别名区的一个字返回 0x01 或0x00, 0x01 表示 bit-band 区中的目标位置位, 0x00 表示目标位清零。位[31:1]将为 0。 注:采用大端格式时,对 bit-band 别名区的访问必须以字节方式。否则访问值不可预知。映射公式显示如何将别名区中的字与 bit-band 区中的对应位或目标位关联。映射公式如下:bit_word_offset=(byte_offset×32)+(bit_number×4)bit_word_addr=bit_band_base+bit_word_offsetbit_word_addr=bit_band_base+(byte_offset×32)+(bit_number×4)这里:Bit_word_offset 为 bit-band 存储区中的目标位的位置。Bit_word_addr 为别名存储区中映射为目标位的字的地址。Bit_band_base 是别名区的开始地址。Bit_offset 为 bit-band 区中包含目标位的字节的编号。Bit_number 为目标位的位位置(0-7)F103处理器启动配置
{for(j=0;j<1000;j++)
{}
/**********************************************************************
RCC_Configuration()
配置时钟
-----------------------------------------------------------------------
使用库函数
***********************************************************************/
voidRCC_Configuration(void)
ErrorStatusHSEStartUpStatus;
//使能外部晶振
RCC_HSEConfig(RCC_HSE_ON);
//等待外部晶振稳定
HSEStartUpStatus=RCC_WaitForHSEStartUp();
//如果外部晶振启动成功,则进行下一步操作
if(HSEStartUpStatus==SUCCESS)
//设置HCLK(AHB时钟)=SYSCLK
RCC_HCLKConfig(RCC_SYSCLK_Div1);
//PCLK1(APB1)=HCLK/2
RCC_PCLK1Config(RCC_HCLK_Div2);
//PCLK2(APB2)=HCLK
RCC_PCLK2Config(RCC_HCLK_Div1);
RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_4);
//启动PLL
RCC_PLLCmd(ENABLE);
//等待PLL稳定
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);
//系统时钟SYSCLK来自PLL输出
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
//切换时钟后等待系统时钟稳定
while(RCC_GetSYSCLKSource()!
=0x08);
/*RCCsystemreset(fordebugpurpose)*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//给GPIOA提供时钟
GPIO_Configuration()
配置输入输出
使用库函数,配置IO口
voidGPIO_Configuration(void)
GPIO_InitTypeDefGPIO_InitStructure;
/*设置PA9为输出*/
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(GPIOA,&GPIO_InitStructure);
IWDG_Configuration()
看门狗配置
voidIWDG_Configuration(void)
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);//允许设置
IWDG_SetPrescaler(IWDG_Prescaler_16);//内部低速时钟16分频
IWDG_SetReload(4000);//写入值
IWDG_ReloadCounter();
IWDG_Enable();//使能
main()
主函数
RCC_Configuration();//配置时钟
GPIO_Configuration();//配置IO口
//GPIO_WriteBit(GPIOA,GPIO_Pin_9,(BitAction)1);
IWDG_Configuration();//配置看门狗IWDG_ReloadCounter();
Delay(5000);//系统初始化后灯亮并延时一段时间
GPIO_WriteBit(GPIOA,GPIO_Pin_9,(BitAction)1);
//Delay(2000);//系统初始化后灯亮并延时一段时间
//GPIO_WriteBit(GPIOA,GPIO_Pin_9,(BitAction)0);
IWDG_ReloadCounter();//喂狗程序
9.F103内存构成、
Ppt36-43
Cache、主存、辅存
存储器映射---位带操作
Ppt6的p49
用途:
通过准位操作命令操作IO端口
存储器映射---STM32F103xC_D_E数据手册.pdf-p38
处理器存储器映射包括两个bit-banding区域。
它们分别为SRAM和外设存储区域中的最低的1MB。
这些bit-band区域将存储器别名区的一个字映射为bit-band区的一个位。
Cortex-M3存储器映射有2个32MB别名区,它们被映射为两个1MB的bit-band区。
对32MBSRAM别名区的访问映射为对1MBSRAMbit-band区的访问。
对32MB外设别名区的访问映射为对1MB外设bit-band区的访问。
位带区、
●Cortex-M3存储器空间中包括两个位段区:
SRAM区的最低1MB空间和外设存储区的最低1MB空间。
●这两个位段区分别与两个32M的位段别名区对应,位段区中的每一位映射到位段别名区中的一个字。
●通过对别名区中某个字的读写操作可以实现对位段区中某一位的读写操作。
位带别名区及相关
位段别名区中的字与位段区的位映射公式
●bit_word_addr=bit_band_base+(byte_offsetx32)+bit_number×4
●例如:
SRAM位段区中地址为0x20000300的字节中的位2被映射到别名区中的地址为:
0x22006008(=0x22000000+(0x300*32)+(2*4))的字。
●对别名区中某个字进行写操作,该字的第0位将影响位段区中对应的位。
●对别名区中某个字进行读操作,若位段区中对应的位为0则读的结果为0x00,若位段区中对应的位为1则读的结果为0x01。
●对别名区的读写可以实现对位段区中每一位的原子操作,而且仅只需要一条指令即可实现。
Ppt98-100
Ppt80-86
Ppt85
接下来我们以通用定时器TIM3为实例,来说明要经过哪些步骤,才能达到这个要求,并产生中断。
1)TIM3时钟使能。
这里我们通过APB1ENR的第1位来设置TIM3的时钟,因为Stm32_Clock_Init函数里面把APB1的分频设置为2了,所以我们的TIM3时钟就是APB1时钟的2被,等于系统时钟。
2)设置TIM3_ARR和TIM3_PSC的值。
通过这两个寄存器,我们来设置自动重装的值,以及分频系数。
这两个参数加上时钟频率就决定了定时器的溢出时间。
3)设置TIM3_DIER允许更新中断。
因为我们要使用TIM3的更新中断,所以设置DIER的UIE位,并使能触发中断。
4)允许TIM3工作。
光配置好定时器还不行,没有开启定时器,照样不能用。
我们在配置完后要开启定时器,通过TIM3_CR1的CEN位来设置。
5)TIM3中断分组设置。
在定时器配置完了之后,因为要产生中断,必不可少的要设置NVIC相关寄存器,以使能TIM3中断。
6)编写中断服务函数。
在最后,还是要编写定时器中断服务函数,通过该函数来处理定时器产生的相关中断。
在中断产生后,通过状态寄存器的值来判断此次产生的中断属于什么类型。
然后执行相关的操作,我们这里使用的是更新(溢出)中断,所以在状态寄存器SR的最低位。
在处理完中断之后应该向TIM3_SR的最低位写0,来清除该中断标志。
相关题目:
1、从体系结构上来说,嵌入式系统可以分为哪些层?
从上到下分为四层,分别为API、设备管理、驱动逻辑和硬件抽象。
4、比较哈佛体系结构和冯.诺依曼体系结构这两种结构的特点;前者和后者相比,数据的吞吐量提高了约1倍?
传统的微处理器采用的冯·诺依曼结构将指令和数据存放在同一存储空间中,统一编址,指令和数据通过同一总线访问。
哈佛结构则是不同于冯·诺依曼结构的一种并行体系结构,其主要特点是程序和数据存储在不同的存储空间中,即程序存储器和数据存储器是两个相互独立的存储器,每个存储器独立编址、独立访问。
与之相对应的是系统中设置的两条总线(程序总线和数据总线),从而使数据的吞吐率提高了一倍。
F103外部中断线
大端小端
7、存储一个32位数0x12345678到0x00005000~0x00005003四个字节单元中,若以小端模式存储,则0x00005002存储单元的内容为什么?
拆分成12345678,小端A+3、A+2、A+1、A顺序,故:
78/56/34/12
15、Cortex-M3 存储器映射有 2 个 32MB 别名区,它们被映射为两个 1MB 的 bit-band 区。
对 32MB SRAM 别名区的访问映射为对 1MB SRAM bit-band 区的访问。
对 32MB 外设别名区的访问映射为对 1MB 外设 bit-band 区的访问。
试解释向别名区写入一个字与在 bit-band 区的目标位执行读-修改-写操作具有相同的作用。
答:
写入别名区的字的位0决定了写入bit-band 区的目标位的值。
将位 0 为1的值写入别名区表示向 bit-band 位写入1, 将位0 为0 的值写入别名区表示向bit-band 位写入 0. 别名字的位[31:
1]在 bit-band 位上不起作用。
写入 0x01 与写入 0xFF 的效果相同, 写入0x00 与写入0x0E 的效果相同. 读别名区的一个字返回 0x01 或0x00, 0x01 表示 bit-band 区中的目标位置位, 0x00 表示目标位清零。
位[31:
1]将为 0。
注:
采用大端格式时,对 bit-band 别名区的访问必须以字节方式。
否则访问值不可预知。
映射公式显示如何将别名区中的字与 bit-band 区中的对应位或目标位关联。
映射公式如下:
bit_word_offset=(byte_offset×32)+(bit_number×4)
bit_word_addr=bit_band_base+bit_word_offset
bit_word_addr=bit_band_base+(byte_offset×32)+(bit_number×4)
这里:
Bit_word_offset 为 bit-band 存储区中的目标位的位置。
Bit_word_addr 为别名存储区中映射为目标位的字的地址。
Bit_band_base 是别名区的开始地址。
Bit_offset 为 bit-band 区中包含目标位的字节的编号。
Bit_number 为目标位的位位置(0-7)
F103处理器启动配置
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1