STM32点灯

main.c

#include "stm32f10x.h" //STM32头文件
#include "sys.h"
#include "delay.h"
vu32 tick=0;
void GPIO_Configuration(void);
void Systick_Configuration(void);
void Delay_Second(void);

int main (void){//主程序
	RCC_Configuration(); //时钟设置
	GPIO_Configuration();//设置GPIO端口
	Systick_Configuration();
	while(1)
	{
		GPIO_WriteBit(GPIOB,GPIO_Pin_0,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_0)));
		Delay_Second(); //延时1秒
	}
}
void GPIO_Configuration(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
	GPIO_Init(GPIOB,&GPIO_InitStructure);
}
void Systick_Configuration(void)
{
	SysTick_Config(9000000/1000);//设置1ms所需要的时间间隔
	SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
}
void Delay_Second(void)//延时函数
{
	tick=0;
	while(tick<=1000)
		;
}

stm32f10x_it.c

#include "stm32f10x_it.h"
extern vu32 tick;
void SysTick_Handler(void)
{
	tick++;
}

几种点灯方法


		//方法1:
		GPIO_WriteBit(LEDPORT,LED1,(BitAction)(1)); //LED1接口输出高电平1
		delay_us(50000); //延时1秒
		GPIO_WriteBit(LEDPORT,LED1,(BitAction)(0)); //LED1接口输出低电平0
		delay_us(50000); //延时1秒
			
		//方法2:
//		GPIO_WriteBit(LEDPORT,LED1,(BitAction)(1-GPIO_ReadOutputDataBit(LEDPORT,LED1))); //取反LED1
//		delay_ms(500); //延时1秒

		//方法3:
//		GPIO_SetBits(LEDPORT,LED1); //LED灯都为高电平(1)
//		delay_s(1); //延时1秒
//		GPIO_ResetBits(LEDPORT,LED1); //LED灯都为低电平(0)
//		delay_s(1); //延时1秒

		//方法4
//		GPIO_Write(LEDPORT,0x0001); //直接数值操作将变量值写入LED
//		delay_s(2); //延时1秒
//		GPIO_Write(LEDPORT,0x0000); //直接数值操作将变量值写入LED
//		delay_s(2); //延时1秒

固件库函数查固件库函数库即可得

<think>好的,用户让我介绍一下如何在STM32点灯。首先,我需要回忆一下STM32开发的基本流程。点灯通常是第一个实验,涉及GPIO的配置。 用户可能是刚接触STM32的初学者,所以需要从基础讲起。首先得确定硬件连接,比如LED接在哪个GPIO口,是否需要上拉或下拉电阻,以及电流限制电阻的阻值。这部分如果用户不清楚,可能需要提醒他们查看开发板原理图。 接下来是软件部分。STM32的开发通常使用HAL库或者标准外设库,这里可能需要选择一种来讲解。HAL库更现代,而且STM32CubeMX生成的代码基于HAL,可能更适合新手。所以应该用HAL库的例子。 然后需要初始化GPIO。要设置引脚为输出模式,推挽输出,速度,以及初始状态。可能还需要讲解时钟配置,因为STM32的每个外设都需要先使能时钟才能使用。 代码结构方面,主函数里先进行HAL初始化,然后系统时钟配置,接着GPIO初始化,最后进入循环,控制LED闪烁。这里可能需要提醒用户注意延时函数的使用,HAL_Delay是常用的方法,但需要确保系统时钟正确配置。 另外,用户可能需要知道如何生成项目。使用STM32CubeMX工具可以图形化配置引脚和生成代码框架,这对新手来说比较方便。不过如果用户没有安装这个工具,可能需要手动编写代码,但步骤会复杂一些。 还要检查是否有常见的错误,比如引脚配置错误,时钟未使能,或者延时不准。例如,如果用户发现LED不亮,可能需要检查硬件连接是否正确,或者GPIO是否设置为输出模式。 可能用户的问题背后是想了解整个开发流程,而不仅仅是点灯代码。所以需要适当扩展,比如编译、下载程序到开发板的方法,可能需要用到Keil、IAR或者STM32CubeIDE等工具。 最后,确保语言通俗易懂,步骤清晰,避免专业术语过多,但必要的术语需要解释。比如GPIO、HAL库、时钟配置这些概念,可能需要简要说明。</think>STM32点灯实验是嵌入式开发的"Hello World",下面分步骤讲解实现原理和操作方法: 一、硬件准备 1. 开发板选择:STM32F103C8T6最小系统板(蓝色药丸板) 2. LED连接方式: $$ V_{CC} \rightarrow 限流电阻(220Ω-1kΩ) \rightarrow LED正极 \rightarrow LED负极 \rightarrow GPIO引脚 $$ 3. 典型电路参数: $$ I_{LED} = \frac{V_{CC} - V_{LED}}{R} \quad (通常3.3V供电时R取330Ω) $$ 二、软件开发环境 1. 工具链: - STM32CubeMX(图形化配置) - Keil MDK-ARM/IAR/STM32CubeIDE 2. 库选择: ```c // 使用HAL库关键头文件 #include "stm32f1xx_hal.h" ``` 三、代码实现步骤(以PC13引脚为例): 1. GPIO初始化: ```c void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; __HAL_RCC_GPIOC_CLK_ENABLE(); // 使能GPIOC时钟 GPIO_InitStruct.Pin = GPIO_PIN_13; // 选择13号引脚 GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // 推挽输出模式 GPIO_InitStruct.Pull = GPIO_NOPULL; // 无上下拉 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; // 低速模式 HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); // 应用配置 } ``` 2. 主函数逻辑: ```c int main(void) { HAL_Init(); // 初始化HAL库 SystemClock_Config(); // 配置系统时钟 MX_GPIO_Init(); // 初始化GPIO while (1) { HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13); // 翻转引脚电平 HAL_Delay(500); // 500ms延时 } } ``` 四、关键原理说明 1. 时钟控制: $$ RCC(AHB总线) \rightarrow GPIOC外设时钟使能 $$ 2. GPIO寄存器操作: $$ ODR寄存器: 控制输出电平 \quad (0:低电平, 1:高电平) $$ $$ BSRR寄存器: 原子操作设置/清除位 $$ 五、常见问题排查 1. LED不亮: - 检查硬件:万用表测量引脚电压是否变化 - 验证时钟配置:确认__HAL_RCC_GPIOC_CLK_ENABLE()被调用 - 检查GPIO模式:必须配置为输出模式 六、进阶技巧 1. 使用位带操作实现快速IO控制: ```c #define LED_PIN BITBAND_PERI(GPIOC->ODR, 13) // 位带别名 LED_PIN = 1; // 直接操作 ``` 建议实际开发时使用STM32CubeMX生成初始化代码,可自动完成时钟树配置和引脚分配,提高开发效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王蒟蒻

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值