stm32寄存器点亮led灯

前提:本博客不详细讲原理,重点在于实践,如需要了解原理请参考下列博客:

http://t.csdn.cn/caa3I

软件准备

1.Keil uVision5

2.mcuisp

 3.CH340驱动程序

 软件设置及创建工程

进入Keil uVision5 点击新建project 选择第一个选项

 

 要安装对应的芯片包,我的是stm32F103VE

 选择好芯片之后问需不需要这些自带的软件包,我们这个实验用不到的。关闭即可。

 双击Source Group 1将启动文件添加至文件夹下,启动文件在官方提供的固件库下下载

程序展示

 再在文件夹下新建main.c存放我们编写的程序

根据需要自行屏蔽或者修改达到闪烁/常亮/改变颜色

#include "stm32f10x.h"

void delay(unsigned int t)
{
	unsigned int i,j;
	for(i=0;i<t;i++)
	for(j=0;j<110;j++);
}

int main(void)
{
	//白灯
	//打开RCC总控制信号APB2->GPIOB中IO端口B时钟使能
//	*(unsigned int *)0x40021018|=(1<<3);
//	//配置IO口为通用推挽输出模式,开发板需要配置PB0,PB1,PB5
//	*(unsigned int *)0x40010C00|=(1<<0);//PB0  G
//	*(unsigned int *)0x40010C00|=(1<<4);//PB1  B
//	*(unsigned int *)0x40010C00|=(1<<20);//PB5 R
	//配置端口输出数据寄存器当前状态
//	*(unsigned int *)0x40010C0C|=(0<<0);//G
//	*(unsigned int *)0x40010c0c|=(0<<1);//B
//	*(unsigned int *)0x40010c0c|=(0<<5);//R
		//打开GPIOB端口的时钟
	//蓝灯
//  *(unsigned int *)0x40021018 |= ((1) << 3);	
//	//配置IO口为输出
//	*(unsigned int *)0x40010C00 |= ((1) << (4*1));
//	//控制ODR寄存器
//	*(unsigned int *)0x40010C0C &= ~(1<<1);
	//打开GPIOB端口的时钟
	//绿灯
  *(unsigned int *)0x40021018 |= ((1) << 3);	
	//配置IO口为输出
	*(unsigned int *)0x40010C00 |= ((1) << (4*0));
//	//控制ODR寄存器
//	*(unsigned int *)0x40010C0C &= ~(1<<0);
	//打开GPIOB端口的时钟
	//红灯
//  *(unsigned int *)0x40021018 |= ((1) << 3);	
//	//配置IO口为输出
//	*(unsigned int *)0x40010C00 |= ((1) << (4*5));
//	//控制ODR寄存器
//	*(unsigned int *)0x40010C0C &= ~(1<<5);



	while(1)
	{
				int i=0;
        *(unsigned int*)(0x40010C0C) &=~(1<<0); //点亮小灯
        for (i=0; i<10000; i++);    //延时一段时间
        *(unsigned int*)(0x40010C0C) |=(1<<0);  //熄灭小灯
        for (i=0; i<30000; i++);  //延时一段时间
	}
}
void SystemInit(void)
{

	
}

void System Init() 是为了骗过编译器不报错

project架构

stm32f10x.h自己创建一个空白的头文件,其会自动匹配。

 

编译

自动生成的文件

 

 object文件夹下有编译后产生的文件

烧录程序

连接stm32和电脑

选择编译好的程序文件.hex


 搜索串口搜索到CH340对应stm32

上述检查无误点击开始编程,烧录成功会有提示。

RESET复位可以重新执行程序,如果没有成功可以按一下复位键 

效果图

参考博客:

1.http://t.csdn.cn/ZpX4b

2.http://t.csdn.cn/1tWoS

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
STM32单片机中,通过按键控制LED亮的操作通常涉及以下几个步骤: 1. **初始化**: - 首先需要配置GPIO模块,将LED和按键连接的GPIO口设置为输出模式和输入模式。对于LED,通常是设为推挽输出;对于按键,则设为上拉模式。 2. **定时中断处理**: - 如果是通过按键触发LED亮灭,可能会利用外部中断(如INT0或EXTI),当按键按下时,产生中断请求。在中断服务函数中处理按键事件。 3. **按键检测**: - 使用STM32提供的GPIO功能读取按键的状态,如果按键被按下,值会变为低电平。 4. **控制LED**: - 当检测到按键按下时,更改GPIO对应的LED状态。如果是点亮LED,设置该GPIO口为高电平;如果是关闭LED,设置为低电平。 5. **延时操作**: - 可能会在中断处理结束后添加一个延时,防止频繁闪烁,这可以通过计数器或者软件延时函数实现。 6. **错误处理和复位**: - 考虑异常情况,比如按键长时间未释放,需要有适当的错误处理机制,并在必要时复位系统。 以下是一个简单的伪代码示例: ```c void EXTI_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; // 初始化GPIOA和GPIOB为通用IO GPIO_InitStructure.GPIO_Pin = LED_PIN | KEY_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; HAL_GPIO_Init(GPIOA, &GPIO_InitStructure); } void Key_IRQHandler() { if (HAL_GPIO_ReadPin(GPIOA, KEY_PIN) == GPIO_PIN_RESET) { // 按键被按下 HAL_GPIO_SetPinState(GPIOA, LED_PIN); // LED亮起 __disable_irq(); // 阻止其他中断 while (1) { // 这里可以加入延时函数,例如:delay_ms(500); if (HAL_GPIO_ReadPin(GPIOA, KEY_PIN) == GPIO_PIN_SET) { // 按键松开 HAL_GPIO_ResetPin(GPIOA, LED_PIN); // LED熄灭 break; } } __enable_irq(); // 启动中断 } } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值