62
770
2436
初级工程师
1.STM32芯片长啥样
6735064763215f2e4f.png (153.21 KB ) 下载附件 2023-5-31 01:27 上传 11216476321bd6e9b.png (411.18 KB ) 下载附件 2023-5-31 01:27 上传
6735064763215f2e4f.png (153.21 KB )
下载附件
2023-5-31 01:27 上传
11216476321bd6e9b.png (411.18 KB )
芯片四周都是引脚,这些引脚连接到各个传感器上,编程就是通过控制这些引脚输出高低电平然后来控制各个传感器。
使用特权
75878647632375ad38.png (90.06 KB )
2023-5-31 01:28 上传
508426476323ccdbcf.png (127.93 KB )
17990647632658438d.png (102 KB )
2023-5-31 01:29 上传
97630647632748708c.png (196.45 KB )
302486476328ec7afe.png (61.35 KB )
比如,我们找到 GPIOB 端口的输出数据寄存器 ODR 的地址是 0x4001 0C0C(至于这 个地址如何找到可以先跳过,后面我们会有详细的讲解),ODR 寄存器是 32bit,低 16bit 有效,对应着 16 个外部 IO,写 0/1 对应的的 IO 则输出低/高电平。现在我们通过 C 语言指 针的操作方式,让 GPIOB 的 16 个 IO 都输出高电平,具体见代码 6-1。 代码 6-1 通过绝对地址访问内存单元 ----------------------------------------------- 1 // GPIOB 端口全部输出 高电平 2 *(unsigned int*)(0x4001 0C0C) = 0xFFFF; ----------------------------------------------- 0x4001 0C0C 在我们看来是 GPIOB 端口 ODR 的地址,但是在编译器看来,这只是一 个普通的变量,是一个立即数,要想让编译器也认为是指针,我们得进行强制类型转换, 把它转换成指针,即(unsigned int *)0x4001 0C0C,然后再对这个指针进行 * 操作。 刚刚我们说了,通过绝对地址访问内存单元不好记忆且容易出错,我们可以通过寄存 器的方式来操作,具体见代码 6-2。 代码 6-2 通过寄存器别名方式访问内存单元 ----------------------------------------------- 1 // GPIOB 端口全部输出 高电平 2 #define GPIOB_ODR (unsigned int*)(GPIOB_BASE+0x0C) 3 * GPIOB_ODR = 0xFF; ----------------------------------------------- 为了方便操作,我们干脆把指针操作“*”也定义到寄存器别名里面,具体见代码 6-3。 代码 6-3 通过寄存器别名访问内存单元 ----------------------------------------------- 1 // GPIOB 端口全部输出 高电平 2 #define GPIOB_ODR *(unsigned int*)(GPIOB_BASE+0x0C) 3 GPIOB_ODR = 0xFF; -----------------------------------------------
96111647632cc03e4d.png (104.37 KB )
2023-5-31 01:30 上传
发表回复 本版积分规则 回帖后跳转到最后一页
0
扫码关注 21ic 官方微信
扫码关注嵌入式微处理器
扫码关注21ic项目外包
扫码关注21ic视频号
扫码关注21ic抖音号
本站介绍 | 申请友情链接 | 欢迎投稿 | 隐私声明 | 广告业务 | 网站地图 | 联系我们 | 诚聘英才 | 论坛帮助
京公网安备 11010802024343号