完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
一、GPIO是什么?
GPIO是stm32的外设,是通用输入输出端口的总称,简单来说就是STM32可控制的引脚,其基本功能是控制引脚输出高电平或者低电平。 1.1GPIO的寄存器地址 GPIO 有很多个寄存器,每一个都有特定的功能。每个寄存器为 32bit,占四个字节, 在该外设的基地址上按照顺序排列,寄存器的位置都以相对该外设基地址的偏移地址来描述。例如GPIO的端口寄存器的地址表:
输入模式 -输入浮空(GPIO_Mode_IN_FLOATING) -输入上拉(GPIO_Mode_IPU) -输入下拉(GPIO_Mode_IPD) -模拟输入(GPIO_Mode_AIN) 输出模式 -开漏输出(GPIO_Mode_Out_OD) -开漏复用功能(GPIO_Mode_AF_OD) -推挽式输出(GPIO_Mode_Out_PP) -推挽式复用功能(GPIO_Mode_AF_PP) 二、STM32F103芯片的地址映射和存储器映射原理 内存映射:事实并非如此,一般的外设为了加快处理速度都有自己的片内RAM(比如说显存,你也知道显存对显卡性能的重要性),分出去的地址空间也就与片内RAM物理连接起来,这样CPU就能像访问内存一样去访问外设的片内RAM,这也就是所谓的内存映射 存储器映射原理:在存储器的区域单元中,每一个单元对应不同的功能,当我们控制这些单元时就可以驱动外设工作。我们可以找到每个单元的起始地址,然后通过 C 语言指针的操作方式来访问这些单元,如果每次都是通过这种地址的方式来访问,不仅不好记忆还容易出错,这时我们可以根据每个单元功能的不同,以功能为名给这个内存单元取一个别名,这个别名就是我们经常说的寄存器,这个给已经分配好地址的有特定功能的内存单元取别名的过程就叫寄存器映射 三、c语言进行流水灯点灯 1.创建工程 选择STM32F103C8芯片: 添加文件: 不要忘记点击魔法棒勾选生成HEX文件: 2.GPIO端口的设置 GPIO端口的初始化设置三步骤时钟配置: GPIO端口B的地址从0x4001 0C00开始。只寻找时钟使能寄存器的地址:复位和时钟控制RCC的地址从0x4002 1000开始;找到APB2外设时钟使能寄存器(RCC_APB2ENR),偏移地址是0x18,所以APB2的地址就是0x4002 1018。RCC_APB2ENR,位3是IOPBEN,名字是IO端口B时钟使能,就是我们想要的。把RCC_APB2ENR的位3赋值为1,就是开启GPIOB时钟。在本次实验中,使用按位操作即可开启GPIO RCC->APB2ENR|=1<<3; //开启GPIOB端口的时钟输入输出模式:点亮led灯应该为推挽模式 这里我分别使用GPIOB、GPIOC、GPIOD这3个端口控制LED灯,在stm32手册中我们选择PB5、PC3、PD2这三个IO口来作为本次实验的输出口 GPIOB->CRL|=0X00003000;PB4推挽输出因为00与11组合为3,即输出模式为推挽输出模式,最大速度为50MHz 3.C语言程序的编写 关于流水灯的有关函数在led.h中声明 四、硬件使用 1.使用到的器材: 正点原子STM32mini开发板,杜邦线若干,不同颜色led灯3只,面包板一块 2.连线: LED灯的短脚连接IO口,长脚连接3.3V(注:连接5V的端口可能会容烧坏LED灯),使用面包板能够更加方便的连线 3.HEX文件的烧录: (1)如图上操作步骤对Fly Mcu V0.188进行操作,该步骤仅为个人习惯,可与之不同 (2)最后一步选择前面工程生成的HEX文件,点击开始编程 4.运行结果 五、汇编语言实现流水灯点亮 1.汇编语言代码如下: (1)这部分采用的是软件延时,具体原理为R0、R1、R2初始化为0,R0加1,当R0大于300时,R1加1,然后R0为变为0,R0继续加1,循环往复,当R1大于300时,R2加1,R0、R1变为0,继续此操作。 (2)这部分汇编语言的代码本质上也是通过改变寄存器的值来实现电平的变化,进行LED的轮流点亮,但是代码部分重复,我是参考同学的代码,不清楚该如何修改。 (3)HEX文件烧录同上步骤,不在重复, 总结 在开始学习STM32F103系列芯片的地址映射和寄存器映射原理时,在最初查看零死角玩转STM32—F103指南者时,觉得概念太过抽象,其中映射的概念并不是很懂,但在CSDN上查看博客时,发现寄存器映射的关系和数学中函数的映射可以类比,然后在慢慢理解。LED程序的编写,关于汇编语言的时候,是借鉴的同学的代码,而且关于汇编语言特别陌生而且不知道从何下手。整次实验下来,在代码改编的时候只有C语言能做到,而且出现了很多问题,包括程序的烧录,串口软件的使用,汇编程序代码的调试和改变,直到最后在同学的帮助下才完成。本次实验在同学的帮助下最后成功点亮了LED流水灯十分高兴,也有一点成就感。在以后的学习中,希望继续能够坚持下去。 |
||
|
||
只有小组成员才能发言,加入小组>>
3314 浏览 9 评论
2995 浏览 16 评论
3494 浏览 1 评论
9059 浏览 16 评论
4088 浏览 18 评论
1179浏览 3评论
605浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
599浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2335浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1896浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 16:04 , Processed in 2.525771 second(s), Total 79, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号