编译有警告说什么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)),这下变量有了那么我们是不是需要给变量取一个名字啊?
|