#手撕STM32寄存器:Proteus仿真电路 LED灯的寄存器配置的详细说明
CPU:STM32F103
功能:点亮、点亮、点亮PB9寄存器:
实现: Keil Proteus仿真
#一、电路图
##二、Keil中的main.c 代码
# define time0x9fffvoiddelayms (unsigned int count ) ) for ); 出局了!=0; count--; }intmain(void ) (* ) unsignedint* ) )0x40021000 0x18 )|=(13 ); 启用GPIOB端口时钟*(unsignedint* ) (0X40010C00 0x04 )|=() ) (4*(9-8) )//Pb9置于推挽输出中,输出速度为10m * (uuu ) //PB9=0,while(1) {*(unsignedint* ) ) 0X40010C000x0C ) ) (~) 19 ); //PB9=0,点亮Delayms(time ); *(unsignedint* () 0X40010C000x0C )|=) 19; //PB9=1,熄灭延迟ms (time ); }//这是寄存器地址编程voidsysteminit(void ); //系统时钟初始化函数,此处为空,曾欺骗编译器以免出现错误} ###二、寄存器配置的详细说明
/*
控制IO输出的高电平通常需要三个步骤:配置三个寄存器(为寄存器赋值)。
1 .打开端口时钟: RCC_APB2ENR |=(1n ); 打开GPIOn端口时钟
设置GPIO输出模式和输出速度:配置GPIOx_CRL或GPIOx_CRH寄存器
3 .输出高/低电平:构成GPIO_ODR寄存器或GOIOB_BSRR,以及GPIOB_BRR
*/
/*说明:每个外围设备都有“块”外围设备地址。 @2.3请参照内存映像表1:指示各外围设备的“开始地址”
各外围设备有很多寄存器,各寄存器Reg被分配了固定的地址(4Byte=32bits )
该寄存器Reg地址=该寄存器所在的外围设备的起始地址(该寄存器)偏移地址
外围设备的起始地址===2.3存储器映像表1
该寄存器Reg的偏移地址====各章外围设备手册: @ 3@ 27,例如@7.3 RCC寄存器—7.3.7 APB2外围设备时钟使能寄存器RCC _ AP B2 ENR—RCC
注意: GPIO中的每个端口(PA、PB、…、PG )具有不同的外围设备起始地址,但每个端口(PA、PB、…、PG )有七个功能完全类似的寄存器。
因此,各端口(PA、PB、…、PG )的7个寄存器的偏移地址相同
*/
/*寄存器设定/代入的步骤(1)从查找表中获取寄存器的地址=(有寄存器的)外围设备的起始地址)寄存器的偏置地址
)调查该寄存器结构,明确分配的值
(3) ) unsigned int ) ) (寄存器的地址)=代入
*/
/
#define Time0x9ffff
无符号输入计数) )。
{
for (; 出局了!=0; 计数;
}
输入主(语音) )。
{
/*配置第一步(RCC寄存器--- APB2外部时钟使能寄存器) RCC_APB2ENR ) )启用GPIOB端口的时钟)1)查阅表, 该寄存器地址外部地址) @2.3存储器图像表1 )复位和时钟控制) RCC ) )的起始地址:0x4002 1000寄存器偏移地址: @7.3 RCC寄存器--7.3 C_APB2ENR的偏移地址:0x18寄存器地址=外部设备的起始地址(寄存器)偏移地址=RCC 20000x18(2)参考该寄存器结构明确分配的值:启用GPIOx端口(unsigned int* ) )寄存器的地址)=赋值:启用GPIOB端口的时钟3360* ) (unsigned int* ) )。 启用GPIOB端口时钟/*第二步:配置GPIOx端口n引脚:设置GPIO输出模式和输出速度:配置GPIOx_CRL或GPIOx_CRH寄存器目的:推挽输出PB9,输出速度为10M PBn的情况下”GPIOB_crh(1)的gpiob_CRH寄存器的地址=GPIOB的开头地址CRH寄存器的偏移地址表1 ) gpiob的开头地址=0X4001 0C00; @8.2.2端口配置高寄存器(GPIOx_CRH ) x=A.E )的偏移地址=0x04 GPIOB_CRH寄存器的地址=0x40010c00x04 )2)参考此寄存器配置并显式=0001:即|=(() () ) ) ) ) )1) )1) )1) )1) )1) ) uunsii */*(unsignedint* ) (0X40010C00 0x04 ) | 将//PB9配置为推挽输出,输出速度为10M /*第三步:配置GPIOx端口n端输出的高/低电平: GPIOx_ODR寄存器或GOIOx_BSRR, GPIOx_BRR的目的:点亮构成Pb9输出低电平的LED1的方法: GPIOB_ODR寄存器(1) GPIOB_ODR寄存器的地址=GPIOB的起始地址ODR寄存器的偏移地址表1 ) @8.2.4端口输出数据寄存器(GPIOx_ODR ) x=A.E )的偏移地址=0x0C GPIOB_ODR寄存器的地址=0x40010c00x0c )2)参照该寄存器结构) unsignedint* ) )寄存器的地址)=赋值: *(unsignedint* ) (0X40010C00 0x0C ) ) ) 19 ); */*(unsignedint* )0x40010c0c=~~(19 ); while(1) (*(unsignedint* ) ) 0X40010C000x0C ) ) () () 19 ); 延迟ms (time; *(unsignedint* () 0X40010C000x0C )|=) 19; 延迟ms (time; //这是寄存器地址编程
语音系统(语音)。
{
;
}