野火教程——寄存器电灯并闪烁,
注意事项,配置时钟是整个PB口,但是ODR寄存器是控制IO口高低电平的,CRL也是控制IO口的输出模式的,他们只控制一个io口,一一对应,所以CRL和ODR 要配合使用
我以为CRL是把所有的管脚模式都配置了呢,后来才发现他是单个控制的,
所以我以为只要修改ODR就可以了呢,造成了怎莫修改灯都不亮。哈哈哈哈啊哈哈哈
哈哈延时函数不会写,哈哈复制清翔51开发板的延时函数。
ODR寄存器只有低16位有效,对应GPIO 的16个管脚,
端口配置低寄存器(CRL),32位都有效,还有端口配置高寄存器(CRH)
每4位分成一组控制一个IO口,这是我上面造成错误的原因。
打开端口时钟我以为是GPIO的地址,原来不是,是配置RCC_APB2ENR寄存器(复位时钟控制寄存器地址+偏移量),因为这个寄存器默认把GPIOB关闭,所以要打开。
#include "stm32f10x.h"//各种寄存器的映射
void delay(unsigned int z);
int z,x,y;
int main(void)
{
//打开GPIOB端口的时钟
*( unsigned int*)0x40021018 |=((1)<<3);
//控制CRL寄存器
*( unsigned int*)0x40010C00|= ((1)<<(4*1));//CRL其用来配置具体哪个管脚的模式
while(1)
{
//控制ODR寄存器,配置IO口输出模式因为默认是输入
*( unsigned int*)0x40010C0C= 0XFFFD ;// 强制转换为指针,四个为一组左移零位,置1操作用|,配置io口高低电平
delay(1000);
//控制ODR寄存器,配置IO口输出模式因为默认是输入
*( unsigned int*)0x40010C0C= 0XFFFF ;// 强制转换为指针,四个为一组左移零位,置1操作用|,配置io口高低电平
delay(1000);
}
}
void SystemInit(void)
{
//用来存放stm32寄存器映射的代码
}
//毫秒级延时函数
void delay(unsigned int z)
{
unsigned int x,y;
for(x = z; x > 0; x--)
for(y = 120; y > 0 ; y--);
}
添加的文件