/*使用普中PZ6806L开发板*/
由对应的LED模块的电路可知, 要想点亮一个LED,就要将其对应的引脚输出低电平。
要使用寄存器,首先要对其进行封装,具体代码如下:
#define PERIPH_BASE ((uint32_t)0x40000000)
#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000)
#define GPIOC_BASE (APB2PERIPH_BASE + 0x1000)
#define GPIOC_CRL *(int*)(GPIOC_BASE+0X00)
#define GPIOC_CRH *(int*)(GPIOC_BASE+0X04)
#define GPIOC_IDR *(int*)(GPIOC_BASE+0X08)
#define GPIOC_ODR *(int*)(GPIOC_BASE+0X0C)
#define GPIOC_BSRR *(int*)(GPIOC_BASE+0X10)
#define GPIOC_BRR *(int*)(GPIOC_BASE+0X14)
#define GPIOC_LCKR *(int*)(GPIOC_BASE+0X18)
#define AHBPERIPH_BASE (PERIPH_BASE + 0x20000)
#define RCC_BASE (AHBPERIPH_BASE + 0x1000)
#define RCC_APB2ENR *(unsigned int*)(RCC_BASE+0X18)
这些代码写在stm32f10x.h里,我使用的是写好的头文件,所以自己在写这些代码时其中的PERIPH_BASE,APB2PERIPH_BASE,GPIOC_BASE,AHBPERIPH_BASE,RCC_BASE都是定义好的,不需要再定义了,否则会出现警告"macro redefined"。其他寄存器的地址则通过“基地址+相对基地址的偏移量”得到。具体数据通过查询数据手册和开发板原理图可得到。
例如:
所有I/O接口均挂载在APB2上,而APB2又挂载在block2上,所以PERIPH_BASE为0x40000000。
而APB2PERIPH_BASE为(PERIPH_BASE+0x10000)
/*APB2起始地址*/
GPIOC地址为:
所以GPIOC_BASE=(APB2PERIPH_BASE+0x1000)
之后的GPIOC_CRL等寄存器可直接通过参考手册查的偏移量,在GPIOC_BASE上加就可以。
要注意的是这里的"unsigned int*"的作用是将立即数变为指针,外面的“*”是取内容运算符,使寄存器得到相应地址。
之后就是点亮LED的主程序:
int main()
{
/*第一步必须先开启时钟*/
RCC_APB2ENR |= 1<<4; //通过移位运算开启GPIOC的时钟,'|'运算保持GPIOC之前的位不变
/*设置输入输出模式*/
GPIOC_CRL &= ~(0X0F<<(4*0)); //对要进行操作的管脚复位,要操作几号管脚就是4*几
GPIOC_CRL |= (3<<(4*0)); //置位,设置输入输出模式
GPIOC_BSRR=(1<<(16+0)); //对应管脚输出低电平,LED亮
while(1){
GPIOC_BSRR=(1<<(16+0));
delay(0xFFFFF);
GPIOC_BSRR=(1<<(0+0)); //对应管脚输出高电平,LED灭
delay(0xFFFFF);
}
}
之后下载程序到开发板就可以点亮LED了!!!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)