IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 07_STM32常用C语言和寄存器地址名称映射详解 -> 正文阅读

[嵌入式]07_STM32常用C语言和寄存器地址名称映射详解

STM32常用C语言和寄存器地址名称映射详解

?6种操作运算符:

?

按位与&:bit位相同的时候,同1为1,其中有一个不为1,则0。

举例:

? ? ? ? ? ? ? ? ? ?1001 1100

????????????????& 1010 1010

等于? ? ? ? ? ? 1000 1000

常用方法:GPIOB->CRL&=0xFFF0; ??将低4位清0

按位或|:bit位相同的时候,有1则为1,全是零则0。

举例:

? ? ? ? ? ?1001 1100

? ? ? ? ? |1010 1010

等于 ???1010 1110

常用方法:GPIOB->CRL|=0x000F; ??将低4位置1,不改变其他位的值

按位异或^:bit位相同的时候,相同位1,不同为0。

? ? ? ? ? ?1001 1100

? ? ? ? ?^1010 1010

等于 ???0011 0110

按位取反~:bit位相同的时候,相同位1,不同为0。

? ? ? ? ? ~1001 1100

等于 ????0110 0011

常用方法:GPIOB->CRL=0x0F; ??答案会是0xF0

右移运算>>:

举例: ?0x0F>>1 转换成二进制0x0000 1111>>1答案等于0x07 ?转换成二进制0x0000 0111相当于数据整体的右移了一位,高位补0;

左移运算<<:

举例: ?0x01<<3 转换成二进制0x0000 0001<<3答案等于0x08 ?转换成二进制0x0000 1000相当于数据整体的左移了3位,低位补0;

Define是C语言中的预处理命令,在编译的时候会代替我们写的宏定义。

格式:

#define 标识符 字符串

“标识符”是所定义的宏名字,”字符串”可以是常数,表达式,格式串。


#define  N  100
定义了标识符 N的值位100  




#define add(a,b)  a+b
uint8_t C = add(1,2);
定义标识符add有2个参数,内容是a+b,C的答案会是3。





#define A 1
#define B A+1
可以嵌套宏定义




#define PIN1 int*
PIN1 a;等价于int* a;
PIN1定义成指针




#ifndef  _UART_H_
#define  _UART_H_
#endif 
表示如果没定义_UART_H_ 那就定义,如果定义了就不会在定义,避免重复定义






#define test(x,y) do \
{				 \
Uint8_t a = x;  \
Uint8_t b =y;  \
Printf(“%d”,a); \
}while(0)			 \
类似于函数一样的宏定义\表示后面还有代码。





#define PI 3.14159

Int main(){
//code 
}

#undef PI
Void func(){
//code
}
表示在PI只在#undef之前有效在main函数有效,在#undef之后无效 func函数无效






ifdef条件编译


#ifdef 标识符
程序段1
#else
程序段2
#endif
表示如果定义了标识符就编译程序段1,否则编译程序段2







#ifdef 标识符1
代码段1
#elif 标识符2
代码段2
#elif 标识符3
代码段3
#else 
代码段4
#endif
表示如果定义了标识符1就编译程序段1,如果没有就继续找#elif看下剩下的有被定义么,如果都没被定义那就编译代码段4。相当于C语言的if (){}elseif();





ifndef条件编译

#ifndef 标识符
程序段1
#else
程序段2
#endif
表示如果没有定义了标识符就编译程序段1,否则编译程序段2

?寄存器地址名称映射

对于MCU,一切底层配置,最终都是配置寄存器

51中的映射方法

Sft P0 = 0x80;//P0映射到地址0x80

P0 = 0X00;//给0x80地址里面赋值0x00

?STM32中的映射方法

以GPIOA为例:

先定义了一个结构体,从命名为GPIO_TypeDef,这个__IO是指静态?volatile?uint32_t 是指32位的无符号整形变量uint32_t 是指32位的无符号整形变量,volatile?类型是这样的,其数据确实可能在未知的情况下发生变化。

Typedef struct{
__IO uint 32_t CRL;
__IO uint 32_t CRH;
__IO uint 32_t IDR;
__IO uint 32_t ODR;
__IO uint 32_t BSRR;
__IO uint 32_t BRR;
__IO uint 32_t LCKR;
}GPIO_TypeDef



#define PERIPH_BASE  ((uint32_t)0x40000000)
定义一个外设基地址,可以看手册,这是出厂就被定死了的。


#define APB2PERIPH_BASE (PERIPH_BASE+0x10000)
在定义APB2的偏移地址,基于外设基地址的偏移找到APB2的起始地址。


#define GPIOA_BASE (APB2PERIPH_BASE + 0X0800)
查看手册,由因为GPIOA是在APB2上的,以APB2的基地址在偏移找到GPIOA的地址。


#define GPIOA  ((GPIO_TypeDef*)GPIOA_BASE)
最后定义了一个GPIOA,强制转换为(GPIO_TypeDef*)的结构体指针类型,
相当于从GPIOA_BASE开始是以GPIO_TypeDef结构体变量的大小顺序存放,
因为是结构体指针所以我们可以直接用GOIOA->CRL,
相当于直接访问GPIOA基地址加结构体成员变量CRL的偏移地址。

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-10-31 12:14:20  更:2022-10-31 12:18:45 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 20:13:25-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码