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

秦皇岛网站建设哪里有金华建设局网站

秦皇岛网站建设哪里有,金华建设局网站,重庆做网站的公司,杭州市建设工程管理集团有限公司一、引言 本文将对STM32入门开发的基本C语言基础知识进行回顾和总结#xff0c;一边学者在开发过程中能较顺利地进行。主要包括位操作、define宏定义、ifdef条件编译、extern变量申明、typedef类型别名、结构体等基本知识。 二、基础C语言开发知识总结 #xff08;一…一、引言 本文将对STM32入门开发的基本C语言基础知识进行回顾和总结一边学者在开发过程中能较顺利地进行。主要包括位操作、define宏定义、ifdef条件编译、extern变量申明、typedef类型别名、结构体等基本知识。 二、基础C语言开发知识总结 一、位操作 下面列举几类常见的位操作 以上的这些位操作在单片机编程开发中到底有什么强大的用处呢 1 可以在不改变其他值的情况下对某几个位进行设值 相信学过51单片机的读者会时常听说过“取高八位”、“取低四位”、“将最高位置低”、“将最高位置高”……等等。其实我在初学51单片机的时候听老师讲的一头雾水直至了解了位操作的原理和使用方法后才真正懂得了位操作的实用性。 下面进入正题可以在不改变其他值的情况下对某几个位进行设值 方法就是先对需要设置的位用 “” 操作符进行清零操作然后用 “|” 操作符设值。比如我要改变 GPIOA 的状态 1、可以先对寄存器的值进行清零操作。 GPIOA-CRL0XFFFFFF0F; //将第 4-7 位清 0 2、然后再与需要设置的值进行|或运算 GPIOA-CRL|0X00000040; //设置相应位的值不改变其他位的值 2移位操作提高代码的可读性 移位操作在单片机开发中也非常重要下面让我们看看固件库的 GPIO 初始化的函数里面的一行代码 GPIOx-BSRR (((uint32_t)0x01) pinpos);   这个操作就是将 BSRR 寄存器的第 pinpos 位设置为 1为什么要通过左移而不是直接设置一个固定的值呢其实这是为了提高代码的可读性以及可重用性。这行代码可以很直观明了的知道是将第 pinpos 位设置为 1。如果你写成 GPIOx-BSRR 0x0030;   这样的代码就不好看也不好重用了。   此外类似这样的代码 GPIOA-ODR|15; //PA.5 输出高,不改变其他位 这样我们一目了然 5 告诉我们是第 5 位也就是第 6 个端口 1 告诉我们是设置为 1 了。这就是当时学习51单片机的时候老师讲的将某一位置高即置位高低。 3) ~取反操作使用技巧  SR 寄存器的每一位都代表一个状态某个时刻我们希望去设置某一位的值为 0同时其他位都保留为 1简单的作法是直接给寄存器设置一个值 TIMx-SR0xFFF7 这样的做法设置第 3 位为 0但是这样的做法同样不好看并且可读性很差。看看库函数代码中怎样使用的 TIMx-SR (uint16_t)~TIM_FLAG; 而 TIM_FLAG 是通过宏定义定义的值#define TIM_FLAG_Update ((uint16_t)0x0001) #define TIM_FLAG_CC1 ((uint16_t)0x0002)看这个应该很容易明白可以直接从宏定义中看出 TIM_FLAG_Update 就是设置的第 0 位了可读性非常强。 二、define宏定义  define 是 C 语言中的预处理命令它用于宏定义可以提高源代码的可读性为编程提供 方便。常见的格式 #define 标识符 字符串 “标识符”为所定义的宏名。“字符串”可以是常数、表达式、格式串等。例如 #define SYSCLK_FREQ_72MHz 72000000 定义标识符 SYSCLK_FREQ_72MHz 的值为 72000000   关于define宏定义的理解我个人觉得可以这样理解给一个变量或者函数取一个别名。但是为什么要刻意去取别名呢因为变量为具体数值时不方便记忆和阅读开发所以取一个别名来代替的话更方便识别同时更改变量时也只需改数值即可其名具有“行不更名坐不改姓”的通用性。 三、 ifdef 条件编译 单片机程序开发过程中经常会遇到一种情况 当满足某条件时对一组语句进行编译而 当条件不满足时则编译另一组语句。 条件编译命令最常见的形式为 #ifdef 标识符 程序段 1 #else 程序段 2 #endif它的作用是什么呢 它的作用是当标识符已经被定义过(一般是用#define 命令定义)则对程序段 1 进行编译否则编译程序段 2。 其中#else 部分也可以没有即 #ifdef 程序段 1 #endif 这个条件编译在MDK里面是用得很多的在stm32f10x.h这个头文件中经常会看到这样的语句 #ifdef STM32F10X_HD 大容量芯片需要的一些变量定义 #end 四、extern 变量申明 C 语言中 extern 可以置于变量或者函数前以表示变量或者函数的定义在别的文件中提示编译器遇到此变量和函数时在其他模块中寻找其定义。 这里面要注意对于 extern 申明变量可以多次但定义只有一次。在我们的代码中你会看到看到这样的语句 extern u16 USART_RX_STA; 这个语句是申明 USART_RX_STA 变量在其他文件中已经定义了在这里要使用到。所以你肯定可以找到在某个地方有变量定义的语句 u16 USART_RX_STA; 的出现。下面通过一个例子说明一下使用方法。 在 Main.c 定义的全局变量 id id 的初始化都是在 Main.c 里面进行的。 Main.c文件 u8 id;//定义只允许一次 main() { id1; printf(d%,id);//id1 test(); printf(d%,id);//id2 } 但是我们希望在test.c的 changeId(void)函数中使用变量id,这个时候我们就需要在test.c里面去申明变量 id 是外部定义的了因为如果不申明变量 id 的作用域是到不了 test.c 文件中。看下面test.c 中的代码 extern u8 id;//申明变量 id 是在外部定义的申明可以在很多个文件中进行 void test(void){ id2; } 在 test.c 中申明变量 id 在外部定义然后在 test.c 中就可以使用变量 id 了。 五、typedef 类型别名 typedef 用于为现有类型创建一个新的名字或称为类型别名用来简化变量的定义。typedef 在 MDK 用得最多的就是定义结构体的类型别名和枚举类型了。   struct _GPIO { __IO uint32_t CRL; __IO uint32_t CRH; … }; 这里定义了一个结构体GPIO这样我们定义变量的方式为 struct _GPIO GPIOA;//定义结构体变量 GPIOA 但是这样很繁琐 MDK 中有很多这样的结构体变量需要定义。这里我们可以为结体定义一个别名 GPIO_TypeDef这样我们就可以在其他地方通过别名 GPIO_TypeDef 来定义结构体变量了。方法如下 typedef struct { __IO uint32_t CRL; __IO uint32_t CRH; … } GPIO_TypeDef; Typedef 为结构体定义一个别名 GPIO_TypeDef这样我们可以通过 GPIO_TypeDef 来定义结构体变量GPIO_TypeDef _GPIOA,_GPIOB; 这里的 GPIO_TypeDef 就跟 struct _GPIO 是等同的作用了。 六 、结构体 在32单片机的开发中MDK 中太多地方使用结构体以及结构体指针这回时刚开始学习32单片机的同学倍感陌生一下子摸不着头脑。致使学习 STM32 的积极性大大降低其实结构体并不是那么复杂。下面我稍微提及一下有关结构体的知识 声明结构体类型 Struct 结构体名{         成员列表; }变量名列表 例如 Struct U_TYPE {         Int BaudRate         Int WordLength; }usart1,usart2; 在结构体申明的时候可以定义变量也可以申明之后定义方法是 Struct 结构体名字 结构体变量列表 ; 例如 struct U_TYPE usart1,usart2; 结构体成员变量的引用方法是 结构体变量名字.成员名 比如要引用 usart1 的成员 BaudRate方法是 usart1.BaudRate; 结构体指针变量定义也是一样的跟其他变量没有啥区别。例如 struct U_TYPE *usart3 //定义结构体指针变量 usart1;结构体指针成员变量引用方法是通过“-”符号实现比如要访问 usart3 结构体指针指向的结 构体的成员变量 BaudRate,方法是Usart3-BaudRate; 上面讲解了结构体和结构体指针的一些知识其他的什么初始化这里就不多讲解了。讲到这里 有人会问结构体到底有什么作用呢为什么要使用结构体呢下面我们将简单的通过一个实 例回答一下这个问题。 在我们单片机程序开发过程中经常会遇到要初始化一个外设比如串口它的初始化状态 是由几个属性来决定的比如串口号波特率极性以及模式。对于这种情况在我们没有学习结构体的时候我们一般的方法是void USART_Init(u8 usartx,u32 u32 BaudRate,u8 parity,u8 mode); 但是如果我们这个函数的入口参数是随着开发不断的增多那么是不是我们就要不断的修改函数的定义呢这是不是给我们开发带来很多的麻烦那又怎样解决这种情况呢这样如果我们使用到结构体就能解决这个问题了。我们可以在不改变入口参数的情况下只需要改变结构体的成员变量就可以达到上面改变入口参数的目的。 结构体就是将多个变量组合为一个有机的整体。上面的函数 BaudRate,wordlength, Parity,mode,wordlength 这些参数他们对于串口而言是一个有机整体都是来设置串口参数的所以我们可以将他们通过定义一个结构体来组合在一个。 MDK 中是这样定义的 typedef struct {         uint32_t USART_BaudRate;         uint16_t USART_WordLength;         uint16_t USART_StopBits;         uint16_t USART_Parity;         uint16_t USART_Mode;         uint16_t USART_HardwareFlowControl; } USART_InitTypeDef; 于是我们在初始化串口的时候入口参数就可以是 USART_InitTypeDef 类型的变量或者指针变量了 MDK 中是这样做的void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct); 这样做有什么好处吗  当然有好处不然干嘛如此费劲咧~~~~~~~~~~~~~~~~~~ 于是我们在初始化串口的时候入口参数就可以是 USART_InitTypeDef 类型的变量或者指针变量了 MDK 中是这样做的 void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct); 这样任何时候我们只需要修改结构体成员变量往结构体中间加入新的成员变量而不需要修改函数定义就可以达到修改入口参数同样的目的了。 这样的好处是不用修改任何函数定义就可以达到增加变量的目的。 理解了结构体在这个例子中间的作用吗在以后的开发过程中如果你的变量定义过多 如果某几个变量是用来描述某一个对象你可以考虑将这些变量定义在结构体中这样也许可以提高你的代码的可读性。使用结构体组合参数可以提高代码的可读性不会觉得变量定义混乱。当然结构体的作用就远远不止这个了同时 MDK 中用结构体来定义外设也不仅仅只是这个作用这里我只是举一个例子通过最常用的场景让大家理解结构体的一个作用而已。 七、结语  以上就是我对单片机开发入门时应该掌握和回顾的知识总结作为一个经历者和开发者我希望读者一定不要忽视以上知识的重要性 愿我们携手同行逐梦不止 冲冲冲……
http://www.pierceye.com/news/784055/

相关文章:

  • 优秀校园网站建设汇报个人备案的网站
  • 网站信息化建设报送电商网站 设计
  • 写作网站哪个好用有没有必要给企业做网站
  • 长沙cms建站模板设计说明英文翻译
  • 做的差的网站河北网站制作公司地址
  • 网站的推广有哪些方式AWS免费套餐做网站可以吗
  • 如何建设公司网站 需要注意什么iis搭建多个网站
  • 青海住房与建设厅网站本地门户网站源码
  • 自己做付费网站网站版式有哪几种
  • 商丘市做1企业网站的公司贵阳网站建设是什么
  • 如何制作动漫网站模板下载定制网站制作广州
  • 西安网站策划我做的网站不知道网站怎么办啊
  • 商务类网站设计成都网站设计建设推荐
  • 网站建设浏览器不兼容阳信做网站
  • 站酷设计网站官网网址网站多国语言
  • 网站建设经费保障中国域名网官网
  • 网站备案如何查询在wordpress教程
  • 新准则中公司网站建设费用计入什么科目360网页入口
  • 公司要网站建设thinkphp商城源码
  • 网站的定义tomcat做公司网站
  • 小程序开发公司网站源码下载阿里云搭建公司网站
  • 网站营销方案设计公司凡科可以做视频网站吗
  • 网站seo优化费用wordpress 做商城
  • 宁波网站设计哪家公司好电子商务电商网站设计
  • 网站添加提醒租网站需要多少钱
  • 网站关键字优化地点如何用手机做网站吗
  • 中国建设银行网站签名通下载站长工具seo词语排名
  • 七牛云官网登录郑州优化网站收费标准
  • 三亚专业网站建设电商网站开发思路
  • app手机端电子商务网站功能提供网站建设课程