当前位置: 首页 > news >正文

网站和搜索引擎中国建设银行官网的网站首页

网站和搜索引擎,中国建设银行官网的网站首页,server 2008 iis部署网站,网站站内结构优化文章目录 一、寄存器1、存储器映射2、存储器映射表3、寄存器4、寄存器映射5、寄存器重映射6、总线基地址、外设基地址、外设寄存器地址7、操作寄存器#xff08;以操作一个GPIO口为例#xff09;1. 寄存器地址定义部分2. GPIOD_Configuration 函数部分3. main 函数部分 二、库… 文章目录 一、寄存器1、存储器映射2、存储器映射表3、寄存器4、寄存器映射5、寄存器重映射6、总线基地址、外设基地址、外设寄存器地址7、操作寄存器以操作一个GPIO口为例1. 寄存器地址定义部分2. GPIOD_Configuration 函数部分3. main 函数部分 二、库函数1、为什么要使用库函数2、什么是库函数3、库函数的详解以GPIO为例4、如何操作库函数以点亮LED连接到PD7为例 三、寄存器和库函数的区别1、寄存器与库函数的区别2、寄存器操作的优势和劣势3、库函数的优势和劣势 四、GD32F4xx 系列器件的存储器映射表 一、寄存器 GD32F450ZG 单片机的寄存器是用于控制和配置芯片内部各种硬件资源的存储单元。它们就像是一组开关和控制器通过对这些寄存器进行读写操作可以实现对单片机的功能配置、数据传输、中断处理等多种操作。 1、存储器映射 概念存储器映射是将芯片中的各种存储器如闪存、SRAM等和外设如定时器、GPIO等统一编址把它们看成一个连续的地址空间。就好像一个大仓库不同的区域存放着不同的东西这个大仓库的每个存储单元都有一个唯一的地址。这样CPU可以通过这个统一的地址来访问不同的资源。举例在GD32F450ZG单片机中整个存储区域可能从0x00000000开始一直到某个较大的地址其中不同的段分配给了不同的用途。例如一部分地址范围是闪存程序存储区用来存放程序代码另一部分是SRAM数据存储区用于存放程序运行时的数据。 2、存储器映射表 概念存储器映射表是一张详细的“地图”它记录了存储区域中每个地址段对应的具体资源。它告诉用户从哪个地址开始到哪个地址结束是闪存、从哪个地址开始是SRAM、哪个地址范围是某个外设如UART、SPI等的寄存器等信息。用途通过查看存储器映射表开发者可以准确地找到想要访问的资源的地址范围。例如在编写程序时如果要访问某个外设的寄存器就需要根据这个表来确定正确的地址。详细可见文章末尾存储器映射表。 3、寄存器 概念寄存器是一种特殊的存储单元它位于芯片内部用于控制和监视芯片的各种功能。可以把寄存器想象成一个个小的“控制盒”每个“控制盒”负责一个特定的功能。例如对于GPIO通用输入输出端口有控制引脚方向输入或输出的寄存器、控制引脚输出电平高或低的寄存器等。功能分类 控制寄存器用于控制外设的工作模式。比如定时器的控制寄存器可以设置定时器的计数模式向上计数、向下计数等、是否使能定时器等。状态寄存器用于反映外设的当前状态。以UART为例状态寄存器可以指示是否有数据接收完成、是否有数据发送缓冲区为空等状态。数据寄存器用于存储要发送或接收的数据。在SPI通信中数据寄存器用于存放要发送出去的数据或者读取接收到的数据。 4、寄存器映射 概念寄存器映射是将寄存器的物理地址映射到一个便于编程访问的虚拟地址空间。这样在编程时就可以通过简单的地址操作来访问寄存器而不需要关心寄存器的实际物理位置。举例GD32F450ZG单片机可能将一些外设寄存器映射到特定的地址范围比如将GPIOA的寄存器映射到从地址A开始的一段连续地址这样在程序中通过访问这个地址范围就相当于访问GPIOA的寄存器。 5、寄存器重映射 概念寄存器重映射是改变寄存器的默认映射地址将其映射到另外一个地址空间。这样做的目的通常是为了方便布线、解决资源冲突或者满足特定的应用需求。举例在某些情况下默认的GPIO引脚对应的寄存器地址可能在布线时不太方便访问通过寄存器重映射可以将这些寄存器映射到一个更容易访问的地址从而方便对GPIO进行操作。 6、总线基地址、外设基地址、外设寄存器地址 总线基地址它是整个存储系统中某条总线如APB总线、AHB总线的起始地址。就像一条街道的起点门牌号所有连接在这条总线上的外设的地址都是基于这个总线基地址来确定的。外设基地址是某个外设在总线上的起始地址。例如GPIOA这个外设在总线上有一个基地址从这个地址开始的一段连续地址空间就是GPIOA的寄存器地址范围。外设寄存器地址是外设中每个具体寄存器的地址。以GPIOA为例有控制引脚方向的寄存器地址、控制引脚输出电平的寄存器地址等这些都是基于GPIOA的外设基地址来确定的。 7、操作寄存器以操作一个GPIO口为例 以下是基于GD32F450ZG芯片通过操作寄存器的方式来控制GPIOD的第7引脚输出高电平以点亮LED的示例代码假设LED阳极接该引脚阴极接地这种常见连接方式以下代码使用C语言编写且是示意性代码你可能需要根据实际的编译环境等做适当调整 // 首先定义寄存器相关的地址这些地址可以从芯片手册中获取对应的值 #define RCC_AHB1ENR (*(volatile unsigned int *)0x40023830) // 时钟使能寄存器地址 #define GPIOD_MODER (*(volatile unsigned int *)0x40020C00) // GPIOD 模式寄存器地址 #define GPIOD_OTYPER (*(volatile unsigned int *)0x40020C04) // GPIOD 输出类型寄存器地址 #define GPIOD_OSPEEDR (*(volatile unsigned int *)0x40020C08) // GPIOD 输出速度寄存器地址 #define GPIOD_PUPDR (*(volatile unsigned int *)0x40020C0C) // GPIOD 上拉下拉寄存器地址 #define GPIOD_ODR (*(volatile unsigned int *)0x40020C14) // GPIOD 输出数据寄存器地址// 函数用于初始化GPIOD的相关配置 void GPIOD_Configuration(void) {// 使能GPIOD时钟对应RCC_AHB1ENR寄存器中相关位设置为1RCC_AHB1ENR | (1 3); // 配置GPIOD的第7引脚为通用输出模式01参考芯片手册对MODER寄存器的描述GPIOD_MODER ~(3 14); // 先清除原来的设置GPIOD_MODER | (1 14); // 设置为输出模式// 设置输出类型为推挽输出0对应OTYPER寄存器设置默认就是推挽输出这里做下示意性设置GPIOD_OTYPER ~(1 7); // 设置输出速度这里设置为高速11可根据实际需求调整参考OSPEEDR寄存器说明GPIOD_OSPEEDR ~(3 14);GPIOD_OSPEEDR | (3 14);// 设置上拉下拉电阻这里设置为无上下拉00参考PUPDR寄存器GPIOD_PUPDR ~(3 14); }int main() {// 进行GPIOD引脚的初始化配置GPIOD_Configuration();// 将GPIOD的第7引脚输出数据寄存器对应位置1输出高电平GPIOD_ODR | (1 7); while(1){// 可以在这里添加其他需要循环执行的代码如果不需要可以为空循环} }下面详细解释一下代码各部分的含义 1. 寄存器地址定义部分 通过 #define 宏定义了一系列寄存器的地址使用 volatile 关键字修饰是为了告诉编译器该变量实际代表的寄存器内容可能会被硬件等外部因素改变编译器不要对其访问做优化要每次都从实际的内存地址寄存器所在地址读取其值。 例如 RCC_AHB1ENR (*(volatile unsigned int *)0x40023830) 就定义了 RCC_AHB1ENR 这个寄存器对应的内存地址是 0x40023830后续可以通过对这个定义好的变量进行读写操作来操作对应寄存器。 2. GPIOD_Configuration 函数部分 时钟使能 首先在函数内通过 RCC_AHB1ENR | (1 3); 操作 RCC_AHB1ENR 寄存器来使能GPIOD的时钟。在芯片中各个外设模块比如这里的GPIOD端口都需要时钟才能正常工作将该寄存器对应位第3位对应GPIOD的时钟使能位具体参考芯片手册的寄存器说明置1就是开启其时钟。 引脚模式配置 对于 GPIOD_MODER 寄存器它用来设置每个引脚的工作模式比如输入、输出、复用功能等。先通过 GPIOD_MODER ~(3 14); 清除原来对应引脚第7引脚对应寄存器的位是从低位开始算第7引脚对应的位在第14、15两位控制因为每两位控制一个引脚的模式所以左移14位的模式设置然后 GPIOD_MODER | (1 14); 将其设置为通用输出模式01表示输出模式参考芯片手册的模式编码定义。 输出类型配置 GPIOD_OTYPER 寄存器用于设置引脚是推挽输出还是开漏输出这里 GPIOD_OTYPER ~(1 7); 表示将第7引脚设置为推挽输出默认一般就是推挽输出这里做明确设置也就是可以输出高低电平且具有一定的驱动能力。 输出速度配置 通过操作 GPIOD_OSPEEDR 寄存器来设置引脚的输出速度这里 GPIOD_OSPEEDR ~(3 14); 先清除原来的速度设置然后 GPIOD_OSPEEDR | (3 14); 将其设置为高速输出速度等级的编码同样参考芯片手册定义这里设置为11表示高速根据实际电路和对速度的需求可以选择不同的速度等级。 上拉下拉电阻配置 最后使用 GPIOD_PUPDR 寄存器设置引脚的上拉下拉情况GPIOD_PUPDR ~(3 14); 操作是将第7引脚设置为无上下拉状态00表示无上下拉不同编码对应不同的上拉下拉设置参考芯片手册。 3. main 函数部分 首先调用 GPIOD_Configuration 函数对GPIOD的第7引脚进行初始化配置使其具备合适的输出条件。 然后通过 GPIOD_ODR | (1 7); 操作 GPIOD_ODR 寄存器将第7引脚对应的位第7位置1这样就使得该引脚输出高电平从而如果连接的LED电路正确阳极接该引脚阴极接地就可以点亮LED。 最后的 while(1) 循环可以根据实际需求添加其他要不断执行的代码逻辑如果暂时不需要额外逻辑空循环即可保证程序持续运行并维持引脚的输出电平状态。 请注意以上代码只是基于芯片手册对寄存器操作的常规实现示例实际应用中可能需要考虑更多如系统初始化等完整的环境搭建内容并且要严格对照芯片手册确保寄存器地址、位操作等都符合芯片的具体规定。 二、库函数 1、为什么要使用库函数 提高开发效率直接操作寄存器来控制芯片的功能是非常繁琐的。例如配置一个通用输入输出GPIO引脚需要对多个寄存器进行位操作包括配置模式寄存器、输出数据寄存器等。使用库函数可以避免这些复杂的底层寄存器操作减少代码编写量和出错的概率。增强代码的可移植性不同的芯片可能有不同的寄存器地址和操作方式。如果使用库函数只要库函数的接口不变在不同的同系列芯片或者经过适当修改的其他芯片之间移植代码会更加方便。便于代码维护库函数将复杂的硬件操作封装起来使代码结构更加清晰。当需要修改功能时例如改变GPIO引脚的功能或者更新芯片的某些配置只需要调用相应的库函数或者修改库函数的参数而不需要在大量的寄存器操作代码中寻找和修改。 2、什么是库函数 库函数是芯片厂商或者第三方为了方便开发者使用芯片的功能而编写的一组函数。这些函数封装了对芯片内部寄存器的操作为开发者提供了一个更高级的编程接口。以GD32F450ZG为例它的库函数可以实现诸如GPIO配置、定时器设置、中断处理等各种功能。库函数通常是基于芯片的硬件手册编写的它准确地反映了芯片的功能和特性。 3、库函数的详解以GPIO为例 函数分类 初始化函数用于配置GPIO引脚的模式输入、输出、复用等、速度等参数。例如gpio_mode_set()函数用于设置GPIO引脚的模式它会根据传入的参数配置相应的寄存器。读写函数用于读取GPIO引脚的输入状态或者写入输出状态。像gpio_output_bit_set()和gpio_output_bit_reset()函数可以分别设置和清除GPIO引脚的输出电平。 参数含义 以gpio_mode_set()函数为例它通常需要传入GPIO端口如GPIOD、引脚号如GPIO_PIN_7、模式如GPIO_MODE_OUTPUT等参数。这些参数明确了要操作的具体引脚和要设置的功能。 4、如何操作库函数以点亮LED连接到PD7为例 步骤一包含头文件 首先需要包含相关的头文件这些头文件包含了库函数的声明。对于GD32F450ZG的GPIO操作通常需要包含gd32f4xx_gpio.h头文件。在C语言中使用#include gd32f4xx_gpio.h语句将头文件包含到源文件中。 步骤二初始化GPIO时钟 芯片的GPIO模块需要时钟才能正常工作。可以使用rcu_periph_clock_enable()函数来使能GPIOD的时钟。例如 rcu_periph_clock_enable(RCU_GPIOD);步骤三配置GPIO引脚模式 使用gpio_mode_set()函数将PD7配置为输出模式。示例代码如下 gpio_mode_set(GPIOD, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_7);- 这里GPIOD表示要操作的是D端口GPIO_MODE_OUTPUT表示设置为输出模式- GPIO_PUPD_NONE表示不使用上下拉电阻GPIO_PIN_7表示操作的是第7个引脚。步骤四点亮LED设置高电平 使用gpio_output_bit_set()函数将PD7引脚设置为高电平来点亮LED。代码如下 gpio_output_bit_set(GPIOD, GPIO_PIN_7);完整示例代码如下 #include gd32f4xx.h #include gd32f4xx_gpio.h int main() {rcu_periph_clock_enable(RCU_GPIOD);gpio_mode_set(GPIOD, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_7);gpio_output_bit_set(GPIOD, GPIO_PIN_7);while (1);return 0; }在上述代码中while(1)语句用于让程序保持运行状态这样可以持续保持LED点亮。如果没有这个循环程序执行完后可能会导致LED熄灭或者出现其他不可预期的行为。 请注意以上代码可能需要根据具体的开发环境和工程配置进行适当的调整如添加启动文件、正确配置链接脚本等。 三、寄存器和库函数的区别 1、寄存器与库函数的区别 操作层次不同 寄存器是芯片内部的存储单元直接与硬件电路相关联。例如在GD32F450ZG芯片中GPIO通用输入输出寄存器用于控制引脚的输入输出模式、电平状态等。每个寄存器都有特定的地址和位定义开发者需要直接对这些寄存器进行读写操作来控制硬件。比如通过向GPIO端口的控制寄存器写入特定的值来设置引脚为输入或输出模式。库函数是对寄存器操作的封装。它提供了一种更高级的编程接口隐藏了寄存器操作的细节。例如库函数内部会根据传入的参数如设置引脚为输出模式自动对相应的寄存器进行正确的读写操作开发者只需要调用库函数并传入合适的参数而不需要了解具体是哪个寄存器以及如何对其进行位操作。 代码形式不同 寄存器操作代码通常涉及直接访问寄存器地址。在C语言中可能会使用指针来访问寄存器。例如*(volatile uint32_t *)0x40021000 0x00000001;这只是一个简单示例实际地址和值根据芯片手册确定这里将值0x00000001写入到地址为0x40021000的寄存器中这种代码比较底层不易理解。库函数调用代码看起来更加简洁明了。以设置GPIO引脚模式为例可能会有类似gpio_mode_set(GPIOD, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_7);这样的函数调用。其中gpio_mode_set是库函数后面的参数用于指定端口、模式、上下拉电阻状态和引脚号等信息。 2、寄存器操作的优势和劣势 优势 高度灵活性可以实现对芯片硬件的最精细控制。开发者能够根据自己的需求精确地设置每个寄存器位以实现特殊的功能或者对硬件进行优化。例如在某些低功耗应用中可以通过对特定寄存器的位操作来精确控制芯片各个模块的功耗状态。资源占用少由于直接操作寄存器没有额外的代码封装层所以生成的代码体积可能相对较小。这在资源受限的嵌入式系统中如一些小型的传感器节点或者简单的微控制器应用中是一个重要的优势。执行效率高没有函数调用的开销直接对寄存器进行读写在一些对实时性要求极高的应用场景中能够更快地响应硬件事件。例如在高速数据采集系统中直接操作寄存器可以更快地获取和处理数据。 劣势 开发难度大需要开发者深入了解芯片的寄存器手册包括寄存器的地址、位定义、复位值等信息。对于复杂的芯片寄存器数量众多操作起来容易出错。例如在配置一个复杂的通信接口如SPI或I2C时需要正确设置多个相关寄存器的多个位这对开发者的硬件知识和耐心是一个很大的考验。代码可读性差直接操作寄存器的代码通常是一些十六进制或二进制的常量赋值以及指针操作这些代码对于其他开发者或者后期维护代码的人员来说理解起来非常困难。而且代码缺乏高层次的抽象使得业务逻辑被底层硬件操作细节所掩盖。可移植性差不同芯片的寄存器布局和功能定义不同。如果要将基于某个芯片寄存器操作的代码移植到另一个芯片上几乎需要重新编写大部分代码。例如从GD32F450ZG移植到另一个型号的微控制器由于寄存器地址和功能可能完全不同原有的寄存器操作代码无法直接使用。 3、库函数的优势和劣势 优势 易于开发降低了开发难度开发者不需要深入了解芯片的每个寄存器细节。只需要熟悉库函数的接口和功能就可以快速实现对芯片硬件的控制。例如使用库函数来配置定时器只需要按照函数的参数要求传入定时时间、计数模式等信息就可以完成定时器的配置而不需要了解定时器相关寄存器的具体操作。代码可读性好库函数的调用使得代码更具有逻辑性和可读性。代码能够清晰地表达其功能例如gpio_output_bit_set(GPIOD, GPIO_PIN_7);很容易理解是设置GPIOD端口的第7引脚为输出高电平。这种高层次的抽象使得代码的维护和协作开发更加方便。可移植性强在同一系列芯片或者具有相似库函数接口的芯片之间代码移植相对容易。只要库函数的接口和功能没有大的变化就可以在不同芯片上使用相同的代码逻辑。例如在GD32系列的不同型号芯片中如果库函数接口保持一致就可以方便地移植GPIO控制代码。 劣势 灵活性相对较低库函数提供了一种标准化的操作方式可能无法满足一些特殊的硬件控制需求。例如在某些非常特殊的硬件调试或者优化场景下需要对寄存器进行一些非标准的位操作而库函数可能没有提供这样的功能接口。资源占用可能较多由于库函数是对寄存器操作的封装内部可能会包含一些额外的代码来处理参数检查、错误处理等功能。这可能导致生成的代码体积比直接操作寄存器的代码要大在资源受限的系统中可能会受到限制。执行效率可能稍低库函数调用会带来一定的函数调用开销包括参数传递、栈操作等。在对性能要求极高的场景下可能会影响系统的实时响应速度。不过在大多数嵌入式应用中这种效率损失通常是可以接受的。 四、GD32F4xx 系列器件的存储器映射表
http://www.hkea.cn/news/14258469/

相关文章:

  • 郑州做网站推广外包多个图片怎样导入到多个wordpress
  • 上海建网站的公司网站风格什么意思
  • 资兴做网站公司建设招聘网站需要注册什么证
  • 中国著名的个人网站哪个网站可以做字体大小
  • wordpress自建站上可以买卖建站教程的优点
  • 怎么把文件发送到网站企业网站建设组织人员可行性分析
  • 网站网站怎么搭建怎样做自己的 优惠卷网站
  • 港口建设征收 申报网站wordpress网页美化教程
  • 有做美食的视频网站么诸城网站开发
  • 公众号做微网站上海网站建设建议
  • 漳州正规网站建设新手 网站建设 书籍
  • 个人网站该怎么打广告做 cad效果图网站
  • 微信小程序设计网站网络营销主要做哪些事情
  • 外贸做的好的网站苏州互联网公司排名榜
  • 企业网站asp源代码昆山公司做网站
  • 生态农庄网站模板上海网络推广公司排名
  • 网站客户案例怎么确定网站关键词
  • 关于网站建设的问题云南电信网站备案
  • 网站维护等建网站 云主机
  • 仿做网站网站网站行高
  • 企业门户网站建设方案后台管理招聘网站上找在家做
  • 建设网站有哪些公司一般做网站上传的图片大小
  • 西安网站建设模板教育培训网站建设
  • 聊城app制作网站乐山网站开发公司电话
  • 青岛网站建设与推广适合女生的计算机专业有哪些
  • 韩国化妆品网站金色flash片头网站建设总结体会
  • 国家建设网站杭州做网站比较好的公司
  • 建网站 域名株洲市
  • 网站建设结构设计方案3000元做网站
  • 网站 宗旨wordpress x theme