范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

寄存器与指针,以STM32为例说明什么是寄存器及如何使用指针

  我们平时所常用的STM32芯片主要由内核和片上外设组成,内核通过各种总线与外设连接,芯片最重要的作用有两个,一个是根据输入在一定条件下进行运算,而另一个重要的作用就是操作这些外设对外部硬件进行控制。
  而这些可以控制外部硬件的操作就分别存储在一个个内存空间中,这些内存空间可以形象的理解为一个个"小房子",
  内核想利用"房子"中的指令就要通过地址去访问,这个地址就如同我们生活中的门牌号,你要通过门牌号找对地方,才能找到要找的人。
  但是这个门牌号不是很好记忆,很容易搞错,位数越多的芯片越不方便,于是我们给这些地址重新起了别名,这就是我们常说的寄存器。
  STM32外设资源丰富,一个GPIO端口下有很多控制寄存器,比如配置输入输出模式与速度的GPIO_CRL和GPIO_CRH,控制输入输出数据的GPIO_IDR和GPIO_ODR,进行端口位设置清除的GPIO_BSRR和GPIO_BRR。
  寄存器可以用指针来操作,它将寄存器和指向的地址关联起来,然后对寄存器直接进行赋值操作就可以控制输入输出满足我们的开发需求。
  那指针是什么?我们先简要说明下。
  指针的应用最主要就是"*"号和"&"的符号,"&"的符号表示取地址,"&a"就表示变量a的存储地址;
  而"*"号要注意区分,定义时星号表示指针变量,所以定义时直接赋值需要取地址,而不是取具体值;
  而在计算时,星号表示取值,"*p"就表示p指向地址中的值,所以图中第二段代码最后计算出来b就与a的数值相等了。
  当内存空间较小,单片机资源有限时,比如8位51单片机,我们一般可以直接对寄存器进行赋值操作,
  这就相当于我直接把房子挑出来,然后将一个数值丢进去存起来,但当单片机资源庞大,寄存器众多,操作位数变为32位或者64位,这种方式就不合适了,
  一个是每次都要去查寄存器详细定义,效率低下还容易出错,再一个是程序可读性差后期维护困难,除了编写原作者其他人很难看懂。
  所以现在很多芯片厂商都推出了固件库,工程师在应用时也会根据公司产品的特点开发私有库,但无论形式如何这些都是为了减轻我们开发负担的手段。
  以STM32为例,ST公司将几乎所有常用寄存器进行封装,这样绝大部分应用场合我们就只需要关心功能的开发,而不必去知道底层硬件资源都是怎么被调用的。
  而这些寄存器操作函数封装中大量使用指针和结构体指针,比如单片机GPIO作输入输出时都要使用的IO口初始化函数GPIO_Init中就定义了结构体指针变量GPIO_InitStruct。 void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)
  GPIO_InitStruct有三个变量成员,分别是PIN脚定义、IO口通信速率、输入输出模式: typedef struct {   uint16_t GPIO_Pin;             /*!< Specifies the GPIO pins to be configured. This parameter can be any value of @ref GPIO_pins_define */    GPIOSpeed_TypeDef GPIO_Speed;  /*!< Specifies the speed for the selected pins. This parameter can be a value of @ref GPIOSpeed_TypeDef */    GPIOMode_TypeDef GPIO_Mode;    /*!< Specifies the operating mode for the selected pins. This parameter can be a value of @ref GPIOMode_TypeDef */    }GPIO_InitTypeDef;
  而这些变量成员可以选择的值都在特定的头文件中用宏定义或枚举的方式,将大串数字替换成了清晰易懂的英文单词,这样在用户后续进行赋值操作的时候就不用去查芯片手册再敲上一长串数字了,直接使用替代名称,直观又不容易出错: #define GPIO_Pin_0                 ((uint16_t)0x0001)  /*!< Pin 0 selected */ #define GPIO_Pin_1                 ((uint16_t)0x0002)  /*!< Pin 1 selected */ #define GPIO_Pin_2                 ((uint16_t)0x0004)  /*!< Pin 2 selected */ #define GPIO_Pin_3                 ((uint16_t)0x0008)  /*!< Pin 3 selected */ #define GPIO_Pin_4                 ((uint16_t)0x0010)  /*!< Pin 4 selected */
  用户调用:(是不是很简单,不用去理会复杂的固件函数,对萌新极其友好)  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;				                         //配置端口号  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		         //推挽输出模式  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		         //IO口输出速率为50MHz
  说到这里,这篇文章也就结束了,可能有的同学会奇怪,为什么一定要用指针,直接赋值不是也能实现同样的效果?确实是这样的,但是直接赋值,一旦程序要进行改动或者部署到新的硬件上,就要把相关的参数全部修改一遍,因为直接赋值你的操作对象是房子中的东西(存储数据),而使用指针你的操作对象是房子(寄存器地址),什么样的东西是不确定的,而房子是有限且确定的,所以使用指针能极大提高程序的复用性和简洁程度,是让C语言变得华丽优美的关键所在。

张培祥寒门才女,24岁病逝后,葬于八宝山,撒贝宁致悼词她,出身寒门。从小就没有体会过幸福的滋味。十年寒窗苦读,数次被迫辍学,却仍然以优异的成绩考上了北大。她,才华洋溢。年纪轻轻就有佳作出版,文集风靡了全国和网络,翻译的国外作品也是畅销崇祯皇帝的最后24小时明朝毁灭前夜,他做了什么?天子守国门,君王死社稷这或许是对于中国封建历史中,最后一个汉族王朝明朝最高的评价了。其中,这个死于社稷的就是大明16个皇帝的最后一个皇帝明思宗朱由检,就是常说的崇祯帝。崇祯帝面对狼广东省上个世纪被撤销的十几个县,看看有你家乡吗朋友们大家好,今天咱们来聊一聊广东省曾经撤销的县。这些被撤销的县都是十分有故事的。今天咱们来了解一下。梅茂县在今天吴川市境内曾经有一个梅茂县,在1947年设立梅茂县,梅茂县大部分区雄关漫道真如铁,而今迈步从头越根据国家建设三线的大方针,1965年,一批技术骨干和有志献身国防的青年放弃了城市的舒适生活,来到大别山区霍山县落儿岭,开始了艰苦的第一次创业。开拓者们自己动手,肩挑背扛,修筑道路,1943年的河北灵寿县大寨山惨案无独有偶,在河北省灵寿县北庄乡北部,也有一个大寨山。山高1039米,东南西三面都是悬崖绝壁。1943年10月22日,侵占灵寿县的日军出动人马前去扫荡,当时有100多个日本鬼子在大寨175年来中国人容颜的转变,都记录在这里了自从摄影发明以来,它便担负起了记录历史,记录人像的责任。近一百七十多年来,每个年代都外国摄影师进入中国。旁观者清,这里把这些照片整理出来,就是想看看我们中国人,这一百多年来容颜的变为什么一百年来西方使尽办法遏制中国,从舆论妖魔化到修改历史?为什么一百年来西方使尽办法遏制中国,从舆论妖魔化中国到修改中西方历史?因为西方国家觉得中国人太团结了,中国是他们的潜在威胁。英教授马丁曾说中国人不可怕,可怕的是他们将团结刻在了骨子13岁前的秦始皇在干什么?单亲留守儿童秦始皇的成长之路有多难?秦始皇嬴政秦始皇作为中国历史上第一位皇帝,一直备受关注。近年来,有关秦始皇的电影电视剧也是热播不断,甚至出现了很多离奇情节。那么,这些情节是历史上真实存在的吗?秦始皇的生父到底异人联想自己的RTX4070Ti来了!不单卖作为一家OEM整机厂商,联想也经常做显卡,但只用于自家系统内,不单卖。此前,联想拯救者刃9000K7000K2023高端台式机都已经加入了RTX4090RTX4080显卡的选项,均只有价格高端?从实际体验出发,看看国产折叠屏究竟如何?2022年是国产折叠屏手机爆发的一年,各大厂商纷纷推出了自家的折叠屏产品,折叠屏手机愈发成熟,价格也更加合理。但还是有不少网友表示,折叠屏手机只是有着高端旗舰手机的价格,却没有相应资讯4K文懂车帝原创魏微懂车帝原创行业1月10日,成像雷达初创公司赛恩领动正式发布首款自研车规级高性能成像雷达产品S系列SIR4K。SIR4K成像雷达(正面)SIR4K成像雷达(背面)S系
张本智和排名上升!超越国乒世界冠军冲到世界第三有望反超马龙北京时间10月29日,WTT新乡世界杯决赛来到半决赛阶段,而日乒华裔选手张本智和,在确定打进半决赛的情况下,个人世界排名将会进一步提升。根据赛事规则,打进半决赛的张本起码拿下525新乡WTT世界杯总决赛女单半决赛孙颖莎战胜王艺迪,率先晋级决赛北京时间2022年10月29日晚上1900,WTT世界杯总决赛女单半决赛在河南新乡拉开帷幕,率先上场的是世界排名第一的中国奥运女团冠军成员孙颖莎对阵世界排名第四的中国名将王艺迪,上CBA高清直播回放北控战上海北京时间10月29日1935,CBA赛事北京控股对战上海久事,北京控股取胜止颓,今仗迎战能否延续胜利势头,而上海久事境况恰好相同,此番将如何应付对手。此役双方将会上演怎么样的比赛?意甲那不勒斯vs萨索洛,ampampquotKKampampquot科瓦拉茨赫利亚首发,又是场大胜?北京时间今晚黄金时间2100,那不勒斯将在主场迎战萨索洛。这可能是本轮意甲最好看的一场对攻大战。那不勒斯的状态极其火热,赛季保持不败的同时,已经取得了各项赛事的12连胜,含金量极高新乡WTT世界杯决赛樊振东男单出局国乒女将包揽女单四强原标题新乡WTT世界杯决赛樊振东男单出局(引题)国乒女将包揽女单四强(主题)今晚报讯(海河传媒中心记者张璐璐)2022年世界乒乓球职业大联盟(WTT)世界杯决赛昨天在河南新乡继续进三镇的牛皮破了赛前,武汉三镇的宣传海报是势如破竹,好像击败成都蓉城是一件多么容易的事情。结果,打脸来了!本场比赛武汉三镇毫无保留,四大外援悉数先发,配以刘殿座邓涵文高准翼任航张晓彬谢鹏飞等一干国(体育)男排超级联赛综合保定险胜南京天津力克山东新华社南京10月29日电(记者王恒志)20222023中国男子排球超级联赛29日在江西婺源县体育中心开幕,在率先进行的B组比赛中,天津男排和保定男排分别艰难取胜,拥有多名国手和三名林高远一轮游事出有因?侯英超说了句公道话,亚洲杯重头再来10月28日,新乡WTT世界杯决赛正在进行,刚刚结束的男单首轮比赛,国乒选手林高远与波尔苦战5局,最终23比分失败出局,遭遇一轮游!WTT世界杯决赛男单签位表出炉后,林高远与波尔的英超莱斯特城vs曼城曼城顺利登顶?今天率先开始的一场比赛,由最近状态火热的莱斯特城迎战有望登顶的曼城。莱斯特城赛季开始表现非常糟糕,前7轮1平6负只拿到1分排名垫底,但6场对阵联赛前6的队伍,加上休赛季主力门将和中乌镇戏剧节,为什么有那么多年轻人愿意买账?往届乌镇戏剧节古镇嘉年华现场乌镇景区提供中新网杭州10月29日电题乌镇戏剧节,为什么有那么多年轻人愿意买账?记者童笑雨年轻人对乌镇戏剧节的热衷,九年如一日。前几天,第九届乌镇戏剧节女王的胞妹16岁开始每天抽60根烟,年轻比姐姐漂亮,晚年大变样1953年6月2日,在英国女王伊丽莎白二世的加冕仪式上,有两件事吸引了众人的目光。第一件事就是身为王夫的菲利普亲王,是第一个向女王下跪的人,并且还当众宣誓,要永远效忠女王。这样,菲