STM32入门开发--LED模块实现跑马灯

1、案例描述
利用STM32F103ZE开发板实现控制LED灯实现跑马灯现象。
正在不断学习嵌入式开发中,博客还会持续更新,敬请关注!
2、开发环境
keil 5.14 + Windows 10 + FlyMcu
参考资料:STM32参考手册
3、实现原理
A.根据硬件接口图:

由接口图发现,开发板上面的两个LED分别接在PB5,和PE5接口处。即我们可以操作GPIO口的寄存器从而操作GPIO端口的控制器。

B、初始化(使能)PB,PE端口,查找手册发现端口PB,PE分别由APB2ENR端口的第三位和第六位控制。我们就将该位置1,其他位不变( |=操作
APB2ENR:外设时钟使能寄存器

C、配置GPIOx端口


首先将PB5对应的20-23位清0,设置为输入模式,清0(&=操作)
其次配置LED对应的GPIOB和GPIOE端口为推挽输出,即通用推挽输出即00,输出模式速度根据实际情况定义,我这里为50MHz,即11,由于GPIOB_CRL为32位,即20-23位应设置为0011 = 3,其他位不变
PE5端口和PB5端口设置一样。
led.c:
void led_init()
{
	  	// 由结构图可知,LED0接在PB5,LED1接在PE5
		// RCC_APB2ENR  APB2外设时钟使能寄存器
	  	RCC->APB2ENR |= 1<<3;	// 设置第三位,即使能IOPB
		RCC->APB2ENR |= 1<<6;	// 设置第六位,即使能IOPE
		
		// 端口配置低寄存器 GPIOx_CRL 32位
		GPIOB->CRL &= 0XFF0FFFFF;	// 设置第23-20位为0 ,即设置在输入模式
		GPIOB->CRL |= 0X00300000;      // 设置第23-22位为00 设置第21-20位为11
															//  推挽输出,最大速度50MHz
		// ODR 端口数据输出寄存器
		GPIOB->ODR = 1<<5;	      // 使能ODR5,由于LED灯分别接在PB5,PE5,所以要由ODR5输出
		
	
		GPIOE->CRL &= 0XFF0FFFFF;
		GPIOE->CRL |= 0X00300000;
		GPIOE->ODR	= 1<<5;
}
  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现跑马灯程序,可以使用 STM32 的通用定时器来控制 LED 灯的闪烁频率。下面是一个简单的跑马灯程序的实现步骤: 1. 首先,需要初始化 GPIO 端口,将要控制的 LED 灯连接到 STM32 开发板的 GPIO 引脚。 2. 然后,需要初始化定时器 TIM2。可以选择使用 TIM2 或者其他的可用定时器。在初始化定时器时,需要设置计数模式、分频系数、计数周期等参数。 3. 接下来,需要配置定时器的中断,使得每次计数完成时,定时器会触发中断。 4. 在中断处理函数中,可以将 LED 灯的状态取反,从而实现 LED 灯的闪烁效果。 下面是一个完整的示例代码: ```c #include "stm32f10x.h" void GPIO_Configuration(void); void TIM2_Configuration(void); int main(void) { GPIO_Configuration(); TIM2_Configuration(); while(1); } void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_SetBits(GPIOB, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3); } void TIM2_Configuration(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); TIM_TimeBaseStructure.TIM_Period = 999; TIM_TimeBaseStructure.TIM_Prescaler = 7199; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); TIM_Cmd(TIM2, ENABLE); NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } void TIM2_IRQHandler(void) { if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) { GPIO_ToggleBits(GPIOB, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3); TIM_ClearITPendingBit(TIM2, TIM_IT_Update); } } ``` 在上述代码中,我们使用了 TIM2 定时器,并将其分频系数设置为 7199,计数周期设置为 999。这意味着定时器将以 10ms 的频率触发中断,从而实现 LED 灯的闪烁效果。 在 GPIO 配置函数中,我们将 LED 灯连接到了 GPIOB 的引脚 0、1、2、3 上,并将它们初始化为输出模式,初始化为高电平。在中断处理函数中,使用 GPIO_ToggleBits 函数将 LED 灯的状态取反。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值