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

装修公司网站源码金融网站怎么做

装修公司网站源码,金融网站怎么做,邢台网络运营中心,杭州建设网公益广告宣传寄存器开发 1、单片机的简介1.1、什么是单片机1.2、F1系列内核和芯片的系统架构1.3、存储器映像1.4、什么是寄存器 2、寄存器开发模板工程3、使用寄存器点亮一个LED4、代码改进15、代码改进2 本教程使用的是STM32F103C8T6最小系统板#xff0c;教程来源B站up“嵌入式那些事”。… 寄存器开发 1、单片机的简介1.1、什么是单片机1.2、F1系列内核和芯片的系统架构1.3、存储器映像1.4、什么是寄存器 2、寄存器开发模板工程3、使用寄存器点亮一个LED4、代码改进15、代码改进2 本教程使用的是STM32F103C8T6最小系统板教程来源B站up“嵌入式那些事”。 1、单片机的简介 1.1、什么是单片机 单片机(Single-Chip Microcomputer)单片机微型计算机是一种集成电路芯片把具有数据处理能力的中央处理器CPU、随机存储器RAM、闪存flash、多种l/O口和中断系统、定时器/计数器等功能可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路集成到一块硅片上构成的一个小而完善的微型计算机系统在工业控制领域广泛应用。 STM32F103C8T6又被称为32位单片机那么这个32代表着什么意思喃     ——其中32代表着地址总线有32位即最小存储单元1字节B的地址编号是32位二进制构成的。所以stm32的存储空间位2^32B 4GB地址0x0000 0000~0xFFFF FFFF ①FLASHFLAS又称闪存它是ROM的一部分只读存储器现在往里面写数据用于存放向单片机烧录的代码。而ROM的另外一部分为系统存储器和字节选项。一般情况下单片机读取FLASH里面的数据要通过FLASH接口所以读取FLASH的数据比较慢。 ②RAM临时存储器掉电里面的数据会丢失读写速度比ROM快。主要存储代码运行时的临时变量内核和片上外设寄存器的配置参数。 ③总线就像是桥梁用于CPU与外设之间的连接DMA与外设之间的连接等进行数据从传输 ④时钟由内部晶振或者外部晶振产生的时钟频率脉冲信号时钟频率决定了CPU处理0/1的快慢程度单片机执行代码的快慢程度除了CPU需要时钟频率脉冲信号片上外设也需要时钟信号时钟频率脉冲信号其作用是启动边沿触发器。而像定时器这样的片上外设需要时钟频率脉冲信号来进行计数。 ⑤外设单片机除了CPU还有很多的片上外设比如GPIO定时器TIM等只有CPU和这些片上外设共同作用才能完成我们想要的功能 1.2、F1系列内核和芯片的系统架构 如上图为F1系列单片机内核和芯片的系统架构其中分为4个主动单元和4个被动单元。 四个主动单元     ——能够主动的发起请求主动的访问数据。 ①Dcode总线②System总线③DMA1④DMA2(stm32f103c8t6没有DMA2) 四个被动单元     ——不能够主动的发起请求被动的访问数据。 ①FLASH②SRAM③FSMC④桥接1和桥接2上面连接的片上外设 1.3、存储器映像 由前面得知stm32单片机里面有4GB的存储空间人们将这4GB的空间进行了地址编号就叫存储器映像。划分为8个区域不同区域代表存储不同功能的信息。如下图所示 由上图存储器映像得出如下结论 1.4、什么是寄存器 寄存器的本质就是内存若通过给某个内存a里面写入数据来控制外设A那么这个内存a就是外设A的控制寄存器。若某个内存b里面的数据来表示此时外设B的状态那么这个内存b就是外设B的状态寄存器。我们知晓stm32里面由很多的外设那么这些外设的寄存器怎么寻找喃答案通过地址我们由前面得知外设寄存器的起始地址为0x4000 0000即之后的地址就代表着寄存器地址不同的寄存器的地址不同。 如下图为部分外设的寄存器地址 而寄存器开发就是找到外设的寄存器通过给这些寄存器里面写入数据来进行对外设配置进而完成我们想要实现的功能一般情况下单片机使用寄存器开发的执行效率比使用库函数开发的执行效率更高但是人们的寄存器代码开发效率会比使用库函数的代码开发效率低。 2、寄存器开发模板工程 开发环境安装和创建工程请参考stm32标准库入门教程的第1章和第2章。寄存器开发必要文件如下图所示 模板资料链接 link 3、使用寄存器点亮一个LED 实物按照如下图所示连接好。创建好工程模板后我们在模板中的main()函数里面按照如下步骤编写代码 1、开启时钟 如图LED引脚连接着A0则开启片上外设GPIOA的时钟——RCC寄存器(与外设的时钟有关) ① 打开参考手册找到存储器映像如下图所示 如图所示地址0x4002 1000——0x4002 13FF这段的内存是与RCC有关的寄存器。 ②打开参考手册找到RCC寄存器描述如下图所示 如图RCC的第一个寄存器为RCC_CR(时钟控制寄存器)它的地址偏移为0x00,则这个寄存器的地址就是0x4002 1000。RCC的第二个寄存器为RCC_CFGR(时钟配置寄存器)它的地址偏移为0x04那为什么第二个寄存器的地址偏移是0x04喃 如图寄存器的地址其实是所包含4个字节中的首字节的地址一个寄存器中包含4个字节所以每增加一个寄存器地址就偏移0x04。 ③GPIOA挂载在APPB2时钟总线上面我们找到APB2使能寄存器如下图所示 如图RCC_APB2ENR寄存器的地址偏移为0x18而与GPIOA时钟的位在32位中的第3位只需要在这一位写入1即开启了片上外设GPIOA的时钟。那如何用代码表示喃 *(uint32_t *)(0x40021000 0x18) 0x04;//指针代表地址 将十六进制的数值通过类型转换为指针类型然后通过*取内容给其赋值。2、配置IO口的输出模式 ①打开参考手册找到存储器映像如下图所示 如图地址0x4001 0800——0x4001 0BFF这段的内存是与GPIOA引脚有关的寄存器。 ②打开参考手册找到GPIO寄存器描述如下图所示 如上图配置低引脚IOIO0~IO7的寄存器的地址偏移为0x00那么配置高引脚IOIO8 ~ IO15的寄存器的地址偏移为0x04。而我们的LED负极连接着A0所以我们需要对低寄存器进行配置。那如何用代码配置喃 *(uint32_t *)(0x40010800 0x00) 0x03;//MODE0 11CNF0 00 MODE0 11表示配置为输出模式且输出速度为50MHz CNF0 00表示配置为通用推挽输出模式能输出低电平0和高电平1 地址为0x4001 0800如何进行地址偏移若需要配置GPIOB0则地址为0x4001 0C00进行地址偏移3、IO输出逻辑电平 ①打开参考手册找到GPIO寄存器描述如下图所示 如图给ODR0写入1则对应的IO0引脚则输出高电平1若写入0则引脚输出低电平0 由实物连接图可知LED的正极连接着VCC负极连接着IO引脚所以引脚输出低电平LED点亮输出高电平LED熄灭。代码如下: *(uint32_t *)(0x40010800 0x0C) 0xFFFE;//1111 1111 1111 1110 IO1引脚~IO15引脚输出高电平IO0引脚输出低电平综上使用寄存器编程点亮一个LED灯完整的代码如下 int main(void) {//1、开启对应的GPIOA的时钟*(uint32_t *)(0x40021000 0x18) 0x04;//2、给IO口设置工作模式PA0配置为通用推挽输出模式*(uint32_t *)(0x40010800 0x00) 0x03;//3、对应的IO口设置值1/0PA0输出0点亮LED*(uint32_t *)(0x40010800 0x0C) 0xFFFE;while(1){} }4、代码改进1 从上面的代码开发步骤中我们每次需要配置某个片上外设的寄存器时我们都需要打开存储器映像来找到这个片上外设的寄存器初始地址基地址然后在通过寄存器的地址偏移然后通过基地址偏移地址最终定位到我们需要的那个寄存器的地址。使用这种开发方式大大降低了我们开发的效率而st公司也想到了这一点。 所示它在stm32f10x.h这个文件里面已经将每个片上外设的寄存器基地址用#define定义好了如下图所示RCC的基地址就用RCC这个字符串来表示了即RCC (uint32_t *)(0x40021000) 我们以外设RCC为例查看它的代码是如何定义的如下图所示 如图RCC的基地址 RCC_BASE 0x4000 0000 0x20000 0x1000 0x4002 1000正好和存储器映像里面的一样。 而RCC_TypeDef *(RCC_BASE)将基地址转换为结构体的指针类型我们转到这个结构体的定义看看如下图所示 如上图所示这个结构体里面的变量全是RCC的寄存器且都是按照参考手册的顺序一比一排列的且都是定义的和参考手册一样的32位方便地址偏移。则由C语言结构体的如下的基础知识 P-a 结构体的基地址偏移了1个字节P-b结构体的基地址偏移了5个字节。 既然RCC就是结构体的地址那么通过地址表示结构体的变量如下 RCC-CRRCC寄存器的基地址偏移了0位 RCC-CFGRRCC寄存器的绝对值偏移了32位 RCC-CIRRCC寄存器的绝对值偏移了64位… 综上通过上面的基础知识我们进行如下的代码改进 int main(void) {//1、开启对应的GPIOA的时钟//*(uint32_t *)(0x40021000 0x18) 0x04;//2、给IO口设置工作模式PA0配置为通用推挽输出模式//*(uint32_t *)(0x40010800 0x00) 0x03;//3、对应的IO口设置值1/0PA0输出0点亮LED//*(uint32_t *)(0x40010800 0x0C) 0xFFFE;/*改进1地址换为st公司定义好的宏 *///1、开启对应的GPIOA的时钟RCC-APB2ENR 0x04;//2、给IO口设置工作模式PA0配置为通用推挽输出模式GPIOA-CRL 0x03;//3、对应的IO口设置值1/0PA0输出0点亮LEDGPIOA-ODR 0xFFFE;//1111 1111 1111 1110while(1){} }5、代码改进2 1、为了提高程序员开发的效率st公司早已经将需要写入寄存器里面的值使用宏定义好了。 例如开启对应的GPIOA的时钟我们需要给RCC_APB2ENR寄存器里面写入数值0x04而我们则可以通过RCC_APB2ENR_IOPAEN这段字符串来代替0x40这个数值。 RCC-APB2ENR 0x04;//开启对应的GPIOA的时钟 改进为 RCC-APB2ENR RCC_APB2ENR_IOPAEN; //开启对应的GPIOA的时钟2、前面给寄存器写入数据的时候都是通过某某寄存器 数值。这样写入数据必然会影响寄存器中的其他位置的数据例如GPIOA-ODR 0xFFFE;//1111 1111 1111 1110这段代码我只需要个IO0口输出低电平0虽然我们成功写入了0但是其他的IO引脚却因为我们写入的数据写入了高电平1。为了解决这种现象我们可以通过位运算 | ~来解决我们的问题。 RCC-APB2ENR RCC_APB2ENR_IOPAEN; //开启对应的GPIOA的时钟 改进为 RCC-APB2ENR | RCC_APB2ENR_IOPAEN; //开启对应的GPIOA的时钟综上改进的代码如下 int main(void) { /*改进2地址换为st公司定义好的宏且使用位运算 *///1、开启对应的GPIOA的时钟RCC-APB2ENR | RCC_APB2ENR_IOPAEN;//2、给IO口设置工作模式PA0配置为通用推挽输出模式即MODE0 11CNF0 00GPIOA-CRL | GPIO_CRL_MODE0;GPIOA-CRL ~GPIO_CRL_CNF0;//3、对应的IO口设置值1/0PA0输出0点亮LEDGPIOA-ODR ~GPIO_ODR_ODR0;//PA0引脚输出0while(1){} }改进代码总结 ①寄存器使用结构体指针来进行表示 ②写入寄存器的值使用通过定义好的宏 ③为了不影响寄存器的其他位的值最好使用位运算 ④位运算时若需要写入寄存器的值为1则用 |若需要写入寄存器的值为0则用 其中数值则需要取反。
http://www.dnsts.com.cn/news/151829.html

相关文章:

  • 手机大全网站郑州餐饮网站建设公司
  • 网站推广费用一般多少钱wordpress聚合平台模板
  • 不属于企业网站建设基本标准是友情链接交换统计表
  • 浦东网站建设箱海运页面设计自述
  • 东莞网站设计讯息闲置tp路由自己做网站
  • 成都企业网站备案流程揭阳网站制作建设
  • 手机架设网站阿里云服务器 个人网站
  • 上海网站备案流程网站和app软件制作公司
  • p2p理财网站开发附近最好的装修公司
  • 两学一做网上答题网站wordpress登录地址插件
  • 21天学会网站开发同性恋色做视频网站
  • 建筑师网站有哪些北京网站设计公司sx成都柚米科技15
  • 网站建设和网络优化网络销售的方法和技巧
  • 深圳外贸建站学做网站论坛账号
  • 免费建网站平台教免费ai写作网站
  • 有什么网站可以接手工加工做大连专业制作网站
  • 微博网站开发与设计开题报告wordpress公司模板
  • 外贸电商网站开发营销技巧美剧
  • 南宁网站建设nnit30网页传奇游戏中心
  • 借贷网站建设方案企业馆
  • 福建省龙岩市建设培训中心网站网站源码带手机版
  • asp网上书店网站开发沈阳哪有wordpress
  • 郑州知名网站建设哪里建设网站不需要备案
  • 教育网站制作方案广州现在可以正常出入吗
  • asp网站管理系统东莞最大的广告公司
  • 宁波cms模板建站百度导航是哪个国家的公司
  • 电子商务网站建设的一般流程百度开屏广告优缺点
  • 怎么在一个网站做多个页面做网站的分工
  • 50个优秀网站网站建设教程下载
  • 郑州网站建设多少钱深圳红酒网站建设