下面这些是在STM32的库文件中摘抄的,可以在以后的编程中利用这些方法。 以下为把IO口转化为一个结构体指针的步骤: 首先是GPIO的定义,把其转化为了一个结构体,然后定义一个该结构体的对象,并把该端口的基地址赋给它即可操作该IO口了。然后给该结构体内的变量赋值即是向对应的IO口的对应寄存器内赋值。 一、GPIO的定义按各寄存器的顺序定义变量(定义32位的是因为寄存器的大小是32位的)(按寄存器顺序排放是因为结构体内的变量是按定义的顺序来顺序排放的,因此正好与IO口内的寄存器的排放相对应): 二、确定IO口的地址以上为各外设的起始地址,以下为各GPIO的首地址(GPIO是挂载在APB2上的) (故下面的写法是APB2的基地址加上各端口的偏移地址) 各GPIO的首地址如下,故得出上面的写法 三、得到一个指向以该IO口地址的结构体的指针变量以下把GPIO转化为了一个指针(方法是把相应的地址强制类型转化)(GPIOA为指针)
如何更好的配置寄存器STM32给我们把每种的寄存器功能的配置转化为了一个个宏定义,让人一目了然。 GPIO工作模式设置(已定义好,直接用其名字即可) 为了达到见名知意的效果,各寄存器的每一种配置功能的二进制形式都转化为了一个符号常量。 为了方便配置每个io端口,把相应功能组合起来,构成一个结构体。完成此结构体的赋值,再调用相应的函数把这些值写入对应的寄存器,即可完成io端口的配置。 该结构体即是IO口的功能配置结构体,可实现IO口的某一个引脚的速度、工作模式的配置。 (配置的方法可使用上面定义好的宏常量)
好的程序写法枚举可以使一些对象的取值只限定在一定的范围内,减少出错,而且更直观。 注意下面的写法,可以使数字更直观,而且清晰易懂,例如1左移31位即第31位为1。
具体例子例如这个使用左右移方式十分的方便且清晰: (*volatile unsigned long)0x40010C00 =(2<<20) | (0<<22); // 为简单起见,不管其他位了 *(volatile unsigned long *)0x40010C0C =1<<5; (还可利用上面的方式,把5,20利用宏定义转化为更清晰的字符) 一些简写的写法RCC_APB2ENR:RCC 是时钟寄存器 , APB2 是外设2 ,ENR可以理解为 enable GPIOB_CRL:GPIO Bcontrol 控制寄存器
GPIOB_ODR:GPIO(general purpose input output) Boutput data register 输出数据寄存器 位的经典处理方法: 对寄存器的配置采用读、修改、写方式
STM32的库有许多好的思路,学习的时候可以把这些总结下来,多思考,多学习,这样才能慢慢提高。
|