Stm32CubeMx入门及编写LED灯闪烁(基于stm32f103vetx)

Stm32CubeMx入门(基于stm32f103vetx)

基于stm32f103vetx的Stm32CubeMx入门配置

创建stm32CubeMx工程

创建一个新的工程

在这里插入图片描述

选择相应的型号

在这里插入图片描述

进行相应配置

在这里插入图片描述
我的开发板PE6连接着LED2,这里就配置LED2闪烁
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
选择完上面两步以后,引脚会发生相应的变化
在这里插入图片描述

设置时钟

默认时钟树如下
在这里插入图片描述
修改为如下:
在这里插入图片描述

工程配置

在这里插入图片描述
在这里插入图片描述

配置完成,生成代码

在这里插入图片描述

编写代码

在这里插入图片描述
这时cubemx已经帮我们完成了所有的配置代码
要让PE6(LED2)闪烁,我们需要用到以下函数:

HAL_Delay(500);//延时五百毫秒
HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_6);//反转PE6的电平	

或者

HAL_Delay(500);
HAL_GPIO_TogglePin(LED2_GPIO_Port,LED2_Pin);//反转LED2的电平

最终代码:
在这里插入图片描述

注意!!!!!!

上面的两坨代码是相同的,唯一不同的是HAL_GPIO_TogglePin里面的东西不同
其实 LED2_GPIO_Port 和 GPIOE是一样的,LED2_Pin和GPIO_Pin_6也是一样的
cubemx再帮我们生成初始代码的时候,也根据我们给引脚起的名字帮我们定义了相应的名称,不信你可以打开main.h看一下~
在这里插入图片描述

  • 7
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是使用定时器控制LED1s闪烁1次的代码: ```c /* 包含头文件 */ #include "stm32f10x.h" /* 定义LED的GPIO端口和引脚号 */ #define LED_GPIO_PORT GPIOB #define LED_GPIO_PIN GPIO_Pin_5 /* 定义定时器的时钟频率和周期 */ #define TIMER_CLOCK_FREQ 72000000 #define TIMER_PERIOD 1000 /* 函数声明 */ void LED_Init(void); void TIM_Init(void); /* 主函数 */ int main(void) { /* 初始化LED和定时器 */ LED_Init(); TIM_Init(); while (1) { /* 无限循环 */ } } /* LED初始化函数 */ void LED_Init(void) { GPIO_InitTypeDef GPIO_InitStruct; /* 使能LED对应的GPIO时钟 */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); /* 配置LED对应的GPIO为推挽输出模式 */ GPIO_InitStruct.GPIO_Pin = LED_GPIO_PIN; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(LED_GPIO_PORT, &GPIO_InitStruct); } /* 定时器初始化函数 */ void TIM_Init(void) { TIM_TimeBaseInitTypeDef TIM_InitStruct; /* 使能定时器2时钟 */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); /* 配置定时器2为向上计数模式,时钟频率为72MHz */ TIM_InitStruct.TIM_Period = TIMER_PERIOD - 1; TIM_InitStruct.TIM_Prescaler = TIMER_CLOCK_FREQ / TIMER_PERIOD - 1; TIM_InitStruct.TIM_ClockDivision = TIM_CKD_DIV1; TIM_InitStruct.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_InitStruct); /* 使能定时器2的更新事件中断 */ TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); /* 启动定时器2 */ TIM_Cmd(TIM2, ENABLE); /* 配置中断优先级 */ NVIC_InitTypeDef NVIC_InitStruct; NVIC_InitStruct.NVIC_IRQChannel = TIM2_IRQn; NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0; NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStruct); } /* 定时器2中断处理函数 */ void TIM2_IRQHandler(void) { /* 判断是否为定时器2的更新事件中断 */ if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) { /* 翻转LED的状态 */ GPIO_WriteBit(LED_GPIO_PORT, LED_GPIO_PIN, (BitAction)(1 - GPIO_ReadOutputDataBit(LED_GPIO_PORT, LED_GPIO_PIN))); /* 清除定时器2的更新事件中断标志位 */ TIM_ClearITPendingBit(TIM2, TIM_IT_Update); } } ``` 该代码使用定时器2控制LED1s闪烁1次,具体实现方式是: 1. 在LED_Init函数中,配置LED对应的GPIO为推挽输出模式; 2. 在TIM_Init函数中,配置定时器2为向上计数模式,时钟频率为72MHz,定时器周期为1000,即1ms;然后使能定时器2的更新事件中断,并启动定时器2;最后配置中断优先级; 3. 在TIM2_IRQHandler函数中,判断是否为定时器2的更新事件中断,如果是,则翻转LED的状态。 注意:该代码是基于StdPeriph库编写的,需要在工程中添加StdPeriph库,并在main函数中调用RCC_Configuration函数。此外,需要在STM32的硬件电路中连接一个LED到GPIOB的5号引脚。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值