野火教程——寄存器电灯并闪烁

本文介绍了在STM32中如何通过配置寄存器CRL和ODR来控制GPIO口的电平变化,实现电灯闪烁效果。作者分享了在配置时钟和IO口模式时遇到的误解,并提供了简单的延时函数实现。同时,指出了RCC_APB2ENR寄存器在开启GPIO端口时钟中的作用。
摘要由CSDN通过智能技术生成

野火教程——寄存器电灯并闪烁,

注意事项,配置时钟是整个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--);
}

添加的文件

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值