STM32学习心得六:相关C语言学习及寄存器地址名称映射解读

记录一下,方便以后翻阅~
主要内容:
1)常用C语言讲解;
2)寄存器地址名称映射解读。
官方资料:《STM32中文参考手册V10》第8章 通用和复用功能IO(GPIO和AFIO)
1.常用C语言
1.1 位操作:6种位操作运算符
1) 按位与:&
例:1011&0010=0010
2) 按位或:|
例:1011|0010=1011
3) 按位异或:^
例:1011^0010=1001
4) 取反:~
例:~1011=0100
5) 左移:<<
例:0110<<1=1100
6) 右移:>>
例:0110>>1=0011
7) 组合:按位与后赋值:&=

GPIOA->CRL&=0XFFFFFF0F;      //将第4-7位清0
GPIOA->CRL|=0X00000040;  //设置相应位的值,不改变其他位的值

1.2 define宏定义关键词
define是C语言中的预处理命令,用于宏定义,可提高源代码的可读性,为编程提供方便。
常见格式:
#define 标识符 字符串
标识符为所定义的宏名。字符串可以是常数、表达式、格式串等。
例:

#define SYSCLK_FREQ_72MHz 72000000

定义标识符SYSCLK_FREQ_72MHz的值为72000000。
1.3 ifdef条件编译
单片机程序开发过程中,经常会遇到一种情况,当满足某条件时对一组语句进行编译,而当条件不满足时则编译另一组语句。条件编译命令最常见的形式为:
#ifdef 标识符
程序段1
#else
程序段2
#endif
例:

#ifdef STM32F10X_HD
//大容量芯片需要的一些变量定义
#end

1.4 extern变量申明
C语言中extern可以置于变量或函数前,以表示变量或函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找定义。对于extern申明变量可以多次,但定义只有一次

1.5 typedef类型别名
定义一种类型的别名,而不是简单的宏替换。可以用作同时声明指针型的多个对象。
typedef unsigned char uint8_t;
typedef unsigned short int uint16_t;
typedef unsigned int uint32_t;
typedef unsigned __int64 uint64_t;

1.6 结构体:构造类型
Struct结构体名{
成员列表1;
成员变量2;
。。。
}变量名列表;

在结构体申明的时候可以定义变量,也可以申明之后定义,方法是:
Struct 结构体名字 结构体变量列表;
作用:同一类型可以用数组,不同类型可以用结构体组织。
结构体可扩展性强。
例:

void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)

1.7 static
static申明的局部变量,存储在静态存储区。
它在函数调用结束后,不会被释放,值会一直保留下来。
所以说static申明的局部变量,具有记忆功能。
2. MDK中寄存器地址名称映射分析
概念:对MCU,一切底层配置,最终都是配置寄存器
STM32中操作
GPIOA->ODR=0x00000000;
问题:值0x00000000是怎么赋值给GPIOA的ODR寄存器地址的?即GPIOA->ODR这种写法,是怎么与GPIOA的ODR寄存器地址映射起来的?理解了下面这张图就能明白。
STM32学习心得六:相关C语言学习及寄存器地址名称映射解读_第1张图片
旧知识点
1)复习寄存器地址,可参考STM32学习心得四:GPIO实验-基于寄存器和STM32学习心得五:GPIO实验-基于位操作。

你可能感兴趣的:(数字信号处理,STM32学习心得,综合学习)