学习stm32 让我们一起回顾一下C语言吧
ODR 是一个端口输出数据寄存器,也只用了低 16 位。该寄存器为可读写,从该寄存器读出来的数据可以用于判断当前 IO 口的输出状态。而向该寄存器写数据,则可以控制某个 IO 口的输出电平。该寄存器的各位描述如图 6.1.3 所示:
端口输出数据寄存器(GPIOx_ODR)
| ODR15 | ODR14 | ODR13 | ODR12 | ODR11 | ODR10 | ODR9 | ODR8 | ODR7 | ODR6 | ODR5 | ODR4 | ODR3 | ODR2 | ODR1 | ODR0 |
| 位31:16 | 保留,始终读为0。 |
| 位15:0 | ODRy[15:0]:端口输出数据(y = 0…15) (Port output data) 这些位可读可写并只能以字(16位)的形式操作。 注:对GPIOx_BSRR(x = A…E),可以分别地对各个ODR位进行独立的设置/清除。 |
c语言实用位操作
&:按位与 ~:取反 |:按位或 <<:左移 >>:右移
清零操作:&运算实现清零--------GPIOA->ODR&=0XFF0F;//将4-7位清零
置一操作:|运算实现置一---------GPIOA->ODR|=0X0040;//将第6位置一
实用移位操作可以提高代码可读性----GPIOA->ODR|=1<<5;//第五位置一
宏定义define讲解:
1:不带参数的宏定义 格式:#define 标示符 字符串
作用:在编译预处理时,将源程序中所有的标示符换成字符串
例如:
#define PI 3.148 //PI即为3.148
#define uchar unsigned char //在定义数据类型时,uchar 等效于 unsigned char
注意:编译与处理时,不做语法检查,只是简单的字符替换,只有在编译时才对已经展开宏名(比如已经将源程序中的PI替换成3.148)的源程序进行语法检查
宏定义时可以引用已经定义的宏名:
#define PI 3.148
#define X 2.0
#define ALL PI*X
2:带参数的宏定义 一般格式:#define 标示符(参数表) 字符串
作用:在编译预处理时,将源程序中所有标示符替换成字符串,并且将字符串中的参数用实际用的参数替换
例如:#define s(a,b) (a*b)/2
若程序中使用了s(3,4),在编译预处理时,将替换为(3*4)/2
extern:
C语言中extern可以置于变量和函数之前,用以表示变量或则函数定义在别的文件中,提示编译器遇到此变量和函数时在其他模块寻找定义。
注意:extern声明变量可以多次,但是定义只有一次
变量存储类型:
auto型:在动态存储区中 register型:在寄存器中 satic型和extern型;在静态存储器中
局部变量默认存储类型:auto 全局变量默认存储类型:extern
auto和register型只用于定义局部变量
satic型即可定义局部变量(值将被保留,而且只第一次进入此函数时初始化该变量,也就是只操作一次),也可定义全局变量,定义全局变量时它的有效范围
为它所在的源文件,其他源文件不能使用
注意:auto类型分配在栈上, 属于动态存储类别, 占动态存储区空间, 函数调用结束后自动释放, 而static分配在静态存储区, 在程序整个运行期间都不释放
函数:
若函数存储类型为satic型,则为内部函数或静态函数,他表示由多个源文件组成的一个程序,该函数只能在其所在的文件中使用,在其他文件终不能使用
若函数的存储类型为extern型,则为外部函数,他表示该函数能被其他源文件调用。
函数默认存储类型:extern
结构体:
1,在程序中使用结构体,必须对结构体的组成进行描述,这个描述过程为结构体类型定义。
形式: struct person
{
long no;
char name[12];
};
在上面的例子中,struct为关键字,person为结构体名,no,name为成员。
注意:与其他变量不同,定义结构体类型,并不意味着系统将分配一段内存单元来存放各个数据成员,这只是定义类型而不是结构体变量。他告诉系统该结构有哪些成员构成,并把它们当做一个整体来处理。
2.结构体变量定义:一旦定义了结构体,就可以定义结构体变量,可以采用不同方式定义结构体变量。
A- struct person stu,worker;
上面定义了两个结构体变量(stu,worker),它们是结构体 struct person(此如同int一样,代表类型名) 的变量。
B-
struct person
{
long no;
char name[12];
}teacher,doctor;
上面定义了两个结构体变量(teacher,doctor)。
C-
struct
{
long no;
char name[12];
}teacher,doctor;
上面只是定义了teacher和doctor两个变量为结构体类型,但没有定义该结构体类型的名字,所以不能再用来定义其他变量,struct stu 是不合法的。
3,结构体变量初始化:
struct person
{
long no;
char name[12];
};
***********************************************************************************
A: struct person teacher ={"4300","LI MING"};
B:
struct person
{
long no;
char name[12];
} teacher ={"4300","LI MING"};
注意:不能直接对结构体变量赋予一组常量:teacher ={"4300","LI MING"};
4,结构体变量引用:
struct
{
long no;
char name[12];
}teacher,doctor,*w;(指针w指向结构体变量doctor)
A:doctor.no B:(*w).no C:doctor->no 是对结构体变量doctor的no成员的正确引用。
补充:
指针变量的定义:[存储类型] 数据类型 *指针变量名[=初值];
指针变量使用:
赋值:(1) int i,*p;
p=&i;
(2) int i,*p=&i;
将指针p指向变量i的地址。
引用:
(1)*p-------代表所指变量的值
(2)p--------代表所指变量的地址
typedef:类型别名
typedef用于为现有的类型创建一个新的名字,或称为类型别名。这样可以简化变量的定义,一般用在结构体上。
例如:
typedef struct
{
long no;
char name[12];
}GPIO_TYPEDEF;
typedef 为结构体定义了一个别名叫GPIO_TYPEDEF,这样就可以通过GPIO_TYPEDEF来定义结构体了。
例如;GPIO_TYPEDEF teacher,doctor;
这里GPIO_TYPEDEF与struct person是等同的作用。
学习stm32 让我们一起回顾一下C语言吧的更多相关文章
- 学习STM32单片机,从菜鸟到牛人就是这样简单(配视频资料)
我想说,为了学习单片机而去学习单片机的思路不对. 你问,如何系统地入门学习stm32? 本身就是一个错误的问题.假如你会使用8051 , 会写C语言,那么STM32本身并不需要刻意的学习. 你要考虑的 ...
- 单片机小白应该如何学习stm32的一些实践心得!
嵌入式搬砖道路上的大三狗一枚,撑死算个初学者吧.才学有限,下面仅仅是本人对STM32学习的一点心得与建议,希望对题主有帮助吧. 心得:本人当初学习STM32的时候有一些跟风的因素,自以为学的芯片越多就 ...
- 学习STM32,你不得不了解的五大嵌入式操作系统
学习STM32,你不得不了解的五大嵌入式操作系统 原标题:学习STM32,你不得不了解的五大嵌入式操作 ...
- C#学习笔记(基础知识回顾)之值类型与引用类型转换(装箱和拆箱)
一:值类型和引用类型的含义参考前一篇文章 C#学习笔记(基础知识回顾)之值类型和引用类型 1.1,C#数据类型分为在栈上分配内存的值类型和在托管堆上分配内存的引用类型.如果int只不过是栈上的一个4字 ...
- C#学习笔记(基础知识回顾)之值传递和引用传递
一:要了解值传递和引用传递,先要知道这两种类型含义,可以参考上一篇 C#学习笔记(基础知识回顾)之值类型和引用类型 二:给方法传递参数分为值传递和引用传递. 2.1在变量通过引用传递给方法时,被调用的 ...
- C#学习笔记(基础知识回顾)之值类型和引用类型
一:C#把数据类型分为值类型和引用类型 1.1:从概念上来看,其区别是值类型直接存储值,而引用类型存储对值的引用. 1.2:这两种类型在内存的不同地方,值类型存储在堆栈中,而引用类型存储在托管对上.存 ...
- Netty学习-IO体系架构系统回顾 & 装饰模式Decorator的具体使用
Netty学习-IO体系架构系统回顾 IO和NIO的学习 NIO - 1.4 开始出的 在网络应用框架中,NIO得到了大量的使用,特别是netty里面 前提:对IO及其了解 对IO的总结和回顾 理解J ...
- MySQL学习总结:提问式回顾 undo log 相关知识
原文链接:MySQL学习总结:提问式回顾 undo log 相关知识 1.redo 日志支持恢复重做,那么如果是回滚事务中的操作呢,也会有什么日志支持么? 也回滚已有操作,那么就是想撤销,对应的有撤销 ...
- 零基础学习STM32之入门学习路线
可以说就目前的市场需求来看,stm32在单片机领域已经拥有了绝对的地位,51什么的已经过时了也只能拿来打基础了,最后依然会转到stm32来,也正是因为这样stm32的学习者越来越多,其中不难发现绝大部 ...
随机推荐
- redis 数据类型为list命令整理以及示例
常用来制作队列,当然lpush+rpop也能做栈 #将RPUSH RPUSHX LPUSH LPUSHX一并介绍(具体介绍RPUSH和RPUSHX,因为其实就是插入的方向的区别) RPUSH key ...
- 探索未知种族之osg类生物---呼吸分解之事件循环一
事件循环和更新循环 终于到了我们嘴里经常念叨的事件循环.更新循环以及渲染循环了.首先我们来区分一下事件循环和渲染循环,他们两个首先是两个不同顺序执行的过程,我们有时候会用到任意node的updateC ...
- 调试程序时如何用syslog来打印信息
转自:https://www.cnblogs.com/vigarbuaa/archive/2013/02/05/2892544.html Linux下C语言编程的-把程序输出信息加到系统日志里去关键词 ...
- HISAT,sTRINGTIE,ballgown三款RNA-seq信息分析软件
HISAT,sTRINGTIE,ballgown三款RNA-seq信息分析软件 2015年04月02日 11:35:47 夜丘 阅读数:8940 标签: 生物 更多 个人分类: 论文笔记 Bowt ...
- android Run模式也会出现"Waiting for debugger"的解决方法
android Run模式也会出现"Waiting for debugger"的解决方法 出现“waiting for debugger”窗口是在debug模式下运行出现的.但是, ...
- OneZero第三周第一次站立会议(2016.4.4)
1. 时间: 13:30--13:45 共计15分钟. 2. 成员: X 夏一鸣 * 组长 (博客:http://www.cnblogs.com/xiaym896/), G 郭又铭 (博客:http ...
- spring自动类型转换========Converter和PropertyEditor
Spring有两种自动类型转换器,一种是Converter,一种是propertyEditor. 两者的区别:Converter是类型转换成类型,Editor:从string类型转换为其他类型. 从某 ...
- mysql之表与表关联和表操作
一 表于表之间的关联 foregin key:设置外键表于表之间建立关联. 多对一关联: 创建步骤,应该先创建好被关联的那一张表,然后再去创建关联的那一张表. 关联表的多条对应着被关联的那张表的一条记 ...
- poj-3928(树状数组)
题目链接:传送门 题意:n个乒乓球运动员要互相练习,都去一个运动员那里比赛,举办训练的运动员不能水平最高或最低. 现在给出n个运动员的水平,求出最终有多少种组合. 思路:先对运动员进行离散化,然后进行 ...
- react native项目的创建和运行
1.创建项目 react-native init projectName 2.运行项目 在AndroidStudio上运行安卓模拟器 cd projectName react-native run-a ...