氨氮怎么去除?可以用pac、pam处理吗? 去除氨氮最好的是用什么药剂
2023-08-22
很多朋友对stm32单片机编程软件,STM32单片机中的C语言基础知识不是很了解,每日小编刚好整理了这方面的知识,今天就来带大家一探究竟。
c语言是单片机开发中必不可少的基础知识。本文列举了STM32学习中一些常见的C语言基础知识。
1位运算我们先来解释几个位运算符,再来解释位运算的技巧。c语言支持以下六种位操作:下面主要讲解单片机开发中位操作的一些实用技巧。
1.1在不改变其他位的值的情况下,单片机开发中经常用到设置某些位的值的场景。方法是我们先用运算符把要设置的位复位,然后用|运算符设置值。
比如我要改变GPIOA的状态,我可以先把寄存器的值清零,然后用| OR与要设置的值:1.2移位操作,提高代码的可读性。移位操作在单片机开发中非常重要。
下面是delay_init函数的一行代码:sy stick-CTRL |=11;该操作将CTRL寄存器的第一位(从0开始计数)设置为1。为什么要通过左移而不是直接设置固定值?其实这是为了提高代码的可读性和复用性。
这行代码可以非常直观明了的知道,就是把第一位设置为1。如果写成:sy stick-CTRL |=0x 0002;虽然这样也能达到同样的效果,但是可读性稍差,修改起来也比较麻烦。
1.3 ~使用技巧的逐位取反运算在设置寄存器时经常使用逐位取反,它经常被用来清零某个/某些位。下面是delay_us函数的一行代码:sy stick-CTRL=~(10);这段代码可以解释为:只将CTRL寄存器的第0位(最低位)置0,其他位的值保持不变。
同样,我们也不使用按位求逆,把代码写成:sy stick-ctrl=0x ffffffe;可以看出前者的可读性和可维护性要比后者好很多。1.4按位异或运算的使用技巧该函数非常适合控制位翻转。
常见的应用场景是控制LED闪烁,如下:GPIO B-ODR=15;执行一次这段代码会使PB5的输出状态翻转一次。如果我们的LED连接到PB5,我们可以看到LED闪烁。
2define宏定义define是C语言中的一个预处理命令。用于宏定义(定义常数),可以提高源代码的可读性,为编程提供方便。
常见格式:“标识符”是定义的宏名。“字符串”可以是常数、表达式、格式字符串等。
例如,定义标识符HSE_VALUE的值是8000000,数字后面的U表示无符号。至于define宏定义的其他一些知识,比如带参数的宏定义,这里就不解释了。
3ifdef条件编译在单片机程序开发过程中,经常会遇到满足某个条件时编译一组语句,不满足条件时编译另一组语句的情况。条件编译命令最常见的形式是:#ifdef标识符程序段1#else程序段2#endif。
它的作用是当标识符已经定义好(通常用#define命令定义)时编译程序段1,否则编译程序段2。#else部分可以省略,即HAL库中广泛使用#ifdef程序段1#endif的条件编译。
在头文件stm32mp1xx_hal_conf.h中,经常会看到以下语句:#if!defined(HSE_VALUE)# define HSE_VALUE 24000000U # Endif如果未定义宏HSE_VALUE,则定义宏HSE _ VALUE,HSE _ VALUE的值为24000000 u。条件编译也是C语言的基础知识。
这里,24000000U U中的U代表无符号整数,常见的有UL代表无符号长整型,F代表浮点型。在这里加上U后,系统在编译时不会检查类型,直接把值以U的形式赋给一个对应的内存,如果超出了定义变量的范围,就会被拦截。
4extern变量说明在C语言中,extern可以放在变量或函数的前面,表示该变量或函数的定义在另一个文件中,提示编译器在遇到该变量和函数时,在其他模块中查找其定义。应该注意的是,对于extern,变量可以声明多次,但它们只定义一次。
在我们的代码中,你会看到如下语句:externuint16 _ tg _ usart _ rx _ sta这个语句是声明g_usart_rx_sta变量已经在其他文件中定义了,所以这里要用到。所以,你一定可以在某处找到一个带有变量定义的语句:uint16 _ tg _ usart _ rx _ staextern的使用相对简单,但是经常使用,需要掌握。
5typedef类型别名typedef用于为现有类型或类型别名创建新名称,以简化变量的定义。Typedef在HAL库中最常用来定义结构的类型别名和枚举类型。
struct _ GPIO { _ _ IOuint32 _ tCRL_ _ IOuint32 _ tCRH…};定义了一个结构GPIO,所以我们定义结构变量如下:struct _ GPIOgpiox但是这个很复杂,HAL库中有很多这样的结构变量要定义。这里可以为结构定义一个别名GPIO_TypeDef,这样就可以在其他地方用别名GPIO_TypeDef来定义结构变量,如下所示:typedefstruct { _ _ IOuint32 _ tCRL_ _ IOuint32 _ tCRH…} GPIO _ TypeDef;Typedef为结构定义了一个别名GPIO_TypeDef,这样我们就可以通过GPIO_TypeDef: GPIO_TypeDef gpiox来定义结构变量;这里的GPIO_TypeDef相当于struct _GPIO,但是GPIO_TypeDef用起来方便多了。
回顾唐子红。
以上知识分享希望能够帮助到大家!
版权声明:本站所有作品图文均由用户自行上传分享,仅供网友学习交流。若您的权利被侵害,请联系我们
推荐阅读
2023-08-22
2023-08-22
2023-08-22
2023-08-22
2023-08-22
2023-08-22
2023-08-22
2023-08-22
2023-08-22
2023-08-22
2023-08-22
2023-08-22
2023-08-22
2023-08-22
栏目热点
氨氮怎么去除?可以用pac、pam处理吗? 去除氨氮最好的是用什么药剂
LilyGoT手表键盘C3迷你电脑套件
索泰ZBOXEdgeCI342迷你电脑正式上市
谷歌在最新的视频预告片中展示了PixelWatch的独特设计
三星与设计师Juun.J合作推出限量版可折叠产品和配件
从2023年起Fitbit设备将需要Google帐户
TOKKCAMC2+智能WiFi独立日 夜视摄像头
三星正在与全球时尚品牌JUUN.J合作
OnePlusNordWatch的颜色选项通过泄露的渲染揭示
就在第一款Nothing手机发布之前一种新的TWS芽设计浮出水面