【STM32】单片机中常用C语言知识复习

目录

前言

位操作

define 宏定义

ifdef 条件编译

extern 变量申明

结构体 


前言

        这篇文章我们主要讲解一下 C 语言基础知识。 C 语言知识博大精深,也不是我们三言两语能讲解清楚,这里主要是简单的复习一下几个 C 语言基础知识点, 引导那些 C 语言基础知识不是很扎实的用户能够快速开发 STM32 程序。同时希望各位能够多去复习一下 C 语言基础知识, C 语言毕竟是单片机开发中的必备基础知识。

位操作

六种常见运算符:

运算符含义运算符含义
&按位与~取反
|按位或<<左移
^按位异或>>右移

        这些与或非,取反,异或,右移,左移这些到底怎么回事, 这里我们就不多做详细,相信
大家学 C 语言的时候都学习过了。如果不懂的话,可以百度一下,非常多的知识讲解这些操作
符。下面我们想着重讲解位操作在单片机开发中的一些实用技巧。

1) 不改变其他位的值的状况下,对某几个位进行设值。
这个场景单片机开发中经常使用,方法就是先对需要设置的位用&操作符进行清零操作,然后用|操作符设值。比如我要改变 GPIOA 的状态,可以先对寄存器的值进行&清零操作:

GPIOA->CRL&=0XFFFFFF0F; //将第 4-7 位清 0 

然后再与需要设置的值进行|或运算:

GPIOA->CRL|=0X00000040; //设置相应位的值,不改变其他位的值 

2) 移位操作提高代码的可读性。

GPIOA->ODR|=1<<5; //PA.5 输出高,不改变其他位

5 告诉我们是第 5 位也就是第 6 个端口, 1 告诉我们是设置为 1 了。

3) ~取反操作使用技巧

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。

ifdef 条件编译

        单片机程序开发过程中,经常会遇到一种情况, 当满足某条件时对一组语句进行编译,而
当条件不满足时则编译另一组语句。 条件编译命令最常见的形式为:

#ifdef 标识符
程序段 1
#else
程序段 2
#endif

        它的作用是:当标识符已经被定义过(一般是用#define 命令定义),则对程序段 1 进行编译,
否则编译程序段 2。
 

extern 变量申明

        C 语言中 extern 可以置于变量或者函数前,以表示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。 这里面要注意,对于 extern 申明变量可以多次,但定义只有一次。在我们的代码中你会看到看到这样的语句:

extern u16 USART_RX_STA;

这个语句是申明 USART_RX_STA 变量在其他文件中已经定义了,在这里要使用到。所以,你肯定可以找到在某个地方有变量定义的语句:

u16 USART_RX_STA; 

结构体
 

声明结构体类型:

Struct 结构体名{
成员列表;
}变量名列表;

例如:

Struct U_TYPE {
Int BaudRate
Int WordLength;
}usart1,usart2;

也可以这样:

Struct 结构体名字结构体变量列表 ;

struct U_TYPE usart1,usart2;

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值