历史上的今天
返回首页

历史上的今天

今天是:2024年12月03日(星期二)

正在发生

2019年12月03日 | STM32的操作过程,寄存器配置与调试过程

2019-12-03 来源:eefocus

很多学习stm32的,为什么学习stm32他也不知道,我们所知道的就是各个论坛讨论stm32的很多,而我们很多人之所以学习stm32是很多的淘宝卖家做了大量的图片文字宣传,于是我们经不住诱惑就买了板子,然后我们就开始了我们的学习之旅。


在淘宝卖家的眼里有着齐全的入门资料是板子的最大的卖点,于是当我们拿到开发板的时候,我们感觉我们永远不能和别人说自己熟悉stm32,因为脱离了网络的资料我们什么都做不了,这是我们最害怕的事情。


今天我就就像在这里记录下自己一无所有建立stm32工程的过程,是我自己的一个探索过程,同时也是大家互相交流的过程。

第一步:当然是新建一个工程我把它命名为small(这个随便你,青菜萝卜各有所爱……)

 

第二部:就是选择芯片的型号了,这个按照每个人手上的板子的不同就选择不同的芯片型号。

 

 

选择完了之后按确认,然后会出来一个对话框,是问你要不要添加启动文件的,这个简单我们都是白手起家了,别人好不容易送你点东西我们当然照单全收,直接点是啊!哈哈。。。。。

 

点完是后我们的工程就是差不多建立好了,大家可以看到里面就一个代码文件,是以.s结尾的,是一个启动文件里面的代码全是汇编的,看了有点晕死。。。。,以后再说吧这个。。。。

 

要不我们编译了看看结果?

 

一串鸟文的错误,看不怎么懂,但是好像是说什么没有main函数。想想也是啊,自己确实没写main函数,要不我们自己建立一个.c文件,然后写一个main函数?说做就做。。。。。


直接点击file下面的新建图标,然后写一个名字保存,注意别忘保存好之后在工程里面“add files to group”,然后我们再自己写一个空的main函数,大家看看我做的对不对?

这下可以编译了吧?

编译有警告说什么main函数的返回值必须是int。。。。不知道为什么?

百度看了下好像是编译器和c语言标准规范的问题,没办法那就修改下main函数的返回值吧,把前面的main前面的void变成int就好了。


编译通过了。。。

要不我们接下来设置工程属性看看?这个是很多教程中有的,我不想多少,大家自己找找吧。。。。

 

你看都可以仿真,哈哈那就说明系统运行起来了。。。。但是我们什么都看不到,接下来我们的任务就是想办法点亮一个led灯。


首先我们要控制灯的话就要操作寄存器,还记得我们在51里面要操作P0口吗?是用P0=0x00,这里面简单的说下51里面操作IO口的原理,我们看到这里有一个P0,这个P0是哪里来的?显然不像是int一样是是c语言本身自带的,也不是某一个变量是我们自己定的,其实这个是在reg52.h里面定义的,有图有真相。

 

可以看到在我们一直使用reg52.h里面他做了这样一件事情,就是把我们的真实物理地址是0x90的这个P1寄存器和P1这个代名词相互联系了,其实P1只是一个代名词,假如我在reg52.h里面修改 把sfr P1 = 0x90;修改为sfr XX = 0x90;这样也是可以用的,只不过下一次你要对P1口进行操作的时候要写XX=0x00;了,所以为了好记我们就把名字取成P1,现在我们知道了51的原理,我们可以依葫芦画瓢来操作stm32的GPIO,先不管我们要操作什么寄存器,我们要接解决的第一个问题怎么使用c语言操作单片机中知道绝对物理地址的寄存器,比如我们通过查资料RM0008的179页知道了关于IO操作的一个寄存器GPIOA_CRL的绝对地址是0x40010800+0x00(其中0x40010800是起始地址,0x00是偏移地址),接下来我们怎么操作他呢?用 sfr?好像sfr是51汇编特有的指令,在arm里面没有。。。这时候我们是否想到c语言的一个和地址紧密相关的内容----指针,我们在上课的时候知道指针的本质就是地址,这样我们是否可以通过它来把实际的物理地址和c语言变量建立关系呢?首先我们要把绝地地址变为指针变量 ,肯定是强制类型转换了(int*(0x40010800+0x00))通过这一步我们已经有一个int类型的指针,这个指针指向的地址就是我们GPIOA_CRL的绝对地址(0x40010800+0x00),有了指针之后我们要取变量,那么很简单只要一个简单的*取变量运算符就可以了(int*(0x40010800+0x00)),这下变量有了那么我们是不是需要给变量取一个名字啊?


那就这样#define GPIOA_CRL *((int*)(0x40010800+0x00)) 好了完成了我们终于可以再c语言的环境中操作我们的寄存器了,接下来我们只要给GPIOA_CRL 这个变量赋值就是我们在给GPIOA_CRL 这个寄存器赋值,先休息下再说。。。。。


这篇文章其实我是一边写代码做测试一边写的,就在上面我想要控制IO的时候花了好长的时间,就是因为自己的不仔细吧!犯了几个小错误。先看我的最终代码。

代码非常的简单,但是为了这几行代码花了我好久的时间,我已经在代码后面写了注释了,具体的怎么来的让我婉婉道来,首先是上面那几行的define的机构我在上面已经介绍过了,具体的地址是怎么知道的?下面我来简单的说下,在stm32的

RM0008 
Reference manual 
STM32F101xx, STM32F102xx, STM32F103xx, STM32F105xx 
and STM32F107xx advanced ARM-based 32-bit MCUs

这个开发文档中的44页内存映射表,如下图

 

我截图的只是上半部分,还有下半部分,在下半部分我们可以看到

从这里可以看到和GPIOA相关的寄存器的起始地址是0x40010400所以代码中的一开始的基址是这个,然后我们需要知道不同的寄存器的偏移地址,这个是在后面的跳转的链接可以看到的,跳转到179页,偏移地址的表格

这样的话上面的几个define的计算也就水落石出了。


这里简单的说下自己当时犯的一个错误。我一开始写的#define GPIOA_CRL *((int*)0x40010800+0x00) 是这样的,调试后死活不是我想要的工作效果,后来花了好大的力气才想起来原来是宏定义的括号的问题,大家仔细比对下我在代码中的写的和我上面的写法,发现什么端倪没?#define GPIOA_CRL *((int*)(0x40010800+0x00)) 看到红色的括号没?就是因为一个小小的括号耽误了很长时间。


花了这么长的时间我们终于可以操作IO口了,那怎么操作呢?在学过51的人的眼里那是很简单的,就是直接把我们要IO口输出的值送到数据寄存器中不就好了,但是毕竟他是高级的stm32,所以要复杂点,首先我们要开启GPIOA的端口时钟,这也许大家会疑惑了,怎么还和时钟有关系了。。。。还是看资料吧!

可以看到GPIOA是挂载在AHB2总线上面的,他们都有自己的时钟信号的控制端,这是由stm32的机构决定的,我想之所以这样做,一方面可以降低系统功耗,让工作的模块的时钟使能,不工作的就不使能,其实这里的时钟信号就好比是模块的心脏一样,只有先让他工作了我们才可以去对他进行操作,这就是代码上RCC_APB2ENR=0x00000004;//开启GPIOA的端口时钟这一句的作用,我尝试过,假如去掉这一句话的话,即使我后面对寄存器赋值了,也是没有作用的。所以这一句很重要,而且与下面的顺序是不好交换的。接下来就是设置GPIO的工作方式什么输入输出 模式之类的,对于只学过51的人来说有点新鲜感觉,如果学过其他高级点单片机的 估计已经习以为常了,就那么回事,具体的寄存器的每一位我就多说了,直接看stm32f10XXXX参考手册的113页上满写的很清楚了。

这里再顺便解释下下我看到的一个现象,先看文档

从这里面我们知道任何IO在复位之后都处于浮空输入状态,这是PDF上说的通过我的代码大家看到我只是改变GPIOA0这位的状态所以其他IO口应该还是浮空输入的模式,但是实际上是的吗?


看仿真截图:

大家可以看到其他几个口还是听话的就是PA12 PA13 PA14 PA15不怎么对劲,怎么回事呢?一开始我也疑惑,后来突然想起来了,这不是我们仿真用的jtag口吗?这样的话就对了,于是为了验证我的想法,我查看jtag用的其他IO口的情况,都不是默认的浮空输入模式,这样的话就应该是这个原因了。(提醒大家一下以后设计硬件的时候尽量避免使用jtag口,如果实在避免不了的话在设计程序的时候就要注意关闭jtag模式释放那几个IO口,在此做一个友情提醒因为被坑过几次。。。)

推荐阅读

史海拾趣

ARRA Inc公司的发展小趣事

由于ARRA Inc公司在电子行业中的具体发展故事并不为公众所熟知,我无法提供关于该公司具体的5个发展起来的相关故事。此外,每个故事至少500字的要求也比较具体,需要详细的资料和数据来支持。

不过,一般来说,一个电子行业的发展故事可能包括其创始人的背景、公司的初创阶段、遇到的挑战和机遇、技术突破、市场拓展、合作伙伴关系、融资历程、产品创新以及市场影响力等方面。每个阶段都可能包含一系列有趣而重要的事件和决策,这些事件和决策共同构成了公司的发展历程。

如果您对ARRA Inc公司的发展感兴趣,建议您查找相关的新闻报道、行业分析、公司年报或者访问其官方网站,以获取更准确和详细的信息。同时,也可以关注电子行业的专业论坛和社交媒体平台,以获取更多行业内幕和专家观点。

在撰写故事时,应确保遵循事实,避免夸大或歪曲事实,尽量保持客观中立的立场。如果需要,可以引用可靠的数据和资料来支持故事中的观点和事实。

请注意,由于我无法直接获取ARRA Inc公司的详细资料,因此无法为您提供具体的故事。如果您有其他问题或需要关于其他公司的信息,我将尽力提供帮助。

GSR Technology Ltd公司的发展小趣事

随着技术的成熟和市场的认可,GSR Technology Ltd开始寻求国际合作机会,以进一步扩大其市场影响力。公司与欧洲一家知名雷达制造商达成战略合作,共同开发面向全球市场的先进GSR系统。这一合作不仅提升了公司的产品竞争力,还为公司打开了欧洲市场的大门。随后,公司逐步在北美、亚洲等地设立分支机构,实现了全球化布局。

BRIGHT公司的发展小趣事

近年来,BRIGHT公司积极投身于太阳能领域的发展。他们推出了一种创新的商业模式,即帮助用户免费安装太阳能面板,并随后收取服务费。这一模式类似于有线电视的收费方式,有效降低了用户安装太阳能系统的门槛。通过与私人投资者的合作,BRIGHT公司成功承担了安装成本,并致力于向全球提供优质的屋顶太阳能解决方案。这一突破性的举措使得BRIGHT公司在太阳能领域取得了显著的成绩。

星海公司的发展小趣事

星海钢琴始终注重技术创新和品质提升。从引进国外先进技术到自主研发,星海钢琴在钢琴设计和制造方面取得了显著成果。公司特聘德国钢琴制造大师劳瑟·切尔先生为公司顾问,不断提升产品的工艺水平和音质表现。同时,星海钢琴还通过了ISO9001国际质量管理体系认证,确保每一架钢琴都符合高标准的质量要求。

振华新云(CEC)公司的发展小趣事

背景:为了进一步扩大市场份额和提高品牌影响力,振华新云积极开展市场拓展和国际合作。

内容:公司积极参加国内外电子展会和论坛等活动,加强与国内外客户的沟通和交流。同时,积极寻求与国际先进企业的合作机会,共同开展技术研发和市场推广等活动。

成果:通过市场拓展和国际合作,振华新云的产品逐渐走向世界舞台,赢得了广大客户的信赖和好评。同时,公司也积累了宝贵的国际化经验和资源,为未来的国际化发展奠定了坚实基础。

EPIGAP公司的发展小趣事

EPIGAP公司非常重视创新文化的建设。公司鼓励员工提出新的想法和创意,并为员工提供充分的支持和资源。此外,EPIGAP还积极引进和培养人才,建立了一支高素质、专业化的研发团队。这支团队在公司的发展历程中发挥了至关重要的作用,不断推动公司产品的升级换代和技术创新。

问答坊 | AI 解惑

嵌入式产业前景的真相

嵌入式技术已经无处不在,从随身携带的mp3、语言复读机、手机、PDA到家庭之中的智能电视、智能冰箱、机顶盒,再到工业生产、娱乐中的机器人,无不采用嵌入式技术。各大跨国公司及国内家电巨头如INTEL、TI、SONY、三星、TCL、联想和康佳等都面临着嵌 ...…

查看全部问答>

Flash Programmer下提示arm2410开发板连不PC

电脑连不上开发板,Flash Programmer提示如下: Target Communications Error:PC to Target Cable disconneted 我是一个新手,自学嵌入式,放弃原来的java开发,学了4个月的C和linux, 第一次用Realarm2410开发板, 系统windowsxpsp2克隆版 ...…

查看全部问答>

我该怎么办啊?真的要再重头来做嵌入式吗?太灰心

我们单位原来做的那一块极度萎缩,认为没有前途,根据大政方针要深入嵌入式开发,可是我对于这一块很不熟悉,对于C、DSP、硬件、linux内核都是重头入门,做了10多年的MIS,都快要人到中年了,现在又要重头入门,我该怎么办啊?真的要再重头来做嵌入 ...…

查看全部问答>

[转载]FPGA经验总结

看到这篇文章写得比较好,就转载过来了。   时序是设计出来的  我的boss有在华为及峻龙工作的背景,自然就给我们讲了一些华为及altera做逻辑的一些东西,而我们的项目规范,也基本上是按华为的那一套去做。在工作这几个月中,给我感触最深的是 ...…

查看全部问答>

51单片机比较经典的资料和例程

发表一些51单片机比较经典的资料,看完了,也就掌握了吧 …

查看全部问答>

CCSV6简易安装包安装教程

本帖最后由 Sur 于 2014-11-1 12:14 编辑 1、  首先要下载一个ccs_setup_win32安装包(8.72M)地址https://download.eeworld.com.cn/detail/Sur/5371212、  下面需要注意的是电脑里面的防病毒软件,如果没有关的话会有如下对 ...…

查看全部问答>

关于变压器的问题

请问各位大神、、我用信号发生器产生一个10V左右的方波信号,然后通过一个小的变压器(变比1;3),次级线圈接示波器,可以得到一个大约30V的方波信号,但是方波信号有点失真,这是怎么回事。还有 就次级线圈接我的超声波换能器,30V方波信号的电压 ...…

查看全部问答>

【OpenWRT】.7 问题小结

本帖最后由 le062 于 2015-10-15 10:11 编辑 1. 内核版本与官网15.05源不一致 解决:已将git中的master回溯到15.05,重新拉取编译即可。放在百度云中的dl文件夹也已更新。 2. nfs服务器不能开机自启动以及启动后局域网不能访问 在/etc/pro ...…

查看全部问答>

寻MTK蓝牙播放器方案

功能要求: 1,MT66XX平台,根据功能要求选取性价比最合适的。 2,蓝牙抗干扰性强 3,无线电广播 4,电源充放 Q:久陆七叁叁5零,重酬!! 此内容由EEWORLD论坛网友9673350原创,如需转载或用于商业用途需征得作者同意并注明出处 …

查看全部问答>