STM32学习中遇到的问题-(1)跑马灯的实现

基于正点原子mini开发板  STM32F103RCT6

基础几乎为零,从头开始学起。

依据"正点原子教程视频,零死角玩转STM32,STM32不完全手册,STM32F103固件函数库,STM32中文参考手册,STM32F10X数据手册"进行学习。

主要要自己进行编写的有,main.c,led.c,led.h

首先写led.h  这一部分为led.c的头文件,必不可少,代码很短

#ifndef _LED_H
#define _LED_H
void LED_Init(void);
#endif

其中LED_Init为自己定义的函数名。
然后写led.c 主要是一些定义、初始化
#include "led.h"
#include "stm32f10x.h"

void LED_Init(void)
{
	GPIO_InitTypeDef  GPIO_InitStructure;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOD, ENABLE);	
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; 
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
	GPIO_Init(GPIOA,&GPIO_InitStructure); 
	GPIO_SetBits(GPIOA,GPIO_Pin_8); 
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; 
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
	GPIO_Init(GPIOD,&GPIO_InitStructure); 
	GPIO_SetBits(GPIOD,GPIO_Pin_2);
}

都还比较好理解,注意不要忘记#include “stm32f10x.h”,如果没有加这句,在后面的编写中会有很多错误,因为GPIO_InitTypeDef ,RCC_APB2PeriphClockCmd这些函数名都在stm32f10x.h中。

还要注意每个函数名的书写,有大小写的区别,例如GPIO_Mode_Out_PP,设置为推挽输出,其中PP为大写。当然,这些都可以直接复制粘贴= =,只要通过Go To Definition查看对应函数即可。


最后便是main.c  为应用程序代码,即实现功能作用

#include "stm32f10x.h"
#include "led.h"
#include "delay.h"
int main(void)
{
	delay_init();
	LED_Init();
while(1){
        GPIO_SetBits(GPIOA,GPIO_Pin_8); 
	GPIO_SetBits(GPIOD,GPIO_Pin_2); 
	delay_ms(500);
	
	GPIO_ResetBits(GPIOA,GPIO_Pin_8); 
	GPIO_ResetBits(GPIOD,GPIO_Pin_2); 
  delay_ms(500);
	}
}
delay为正点原子教程中带的一个已经编写好了的延时程序,添加之后可以直接使用。

GPIO_SetBits即将对应的IO口置1

GPIO_ResetBits则为置0

注意函数名的书写,刚开始没注意大小写没对上就错误了。


编写完成之后,编译出现了一个错误

..\SYSTEM\delay\delay.c(130): error:  #20: identifier "SysTick_CLKSource_HCLK_Div8" is undefined

问了度娘之后,解决办法为:在delay.c中添加一句代码:#include "misc.h"

灯怎么亮需要看对应的硬件图,如果led一端接io口,另一端拉高,那么io口输出低电平的时候就会亮;如果另一端接地,那么输出高电平时候会亮。

在自己创建工程模板的时候要细心,每一个文件夹都不能缺失,.h文件一定记得添加到MDK中,不然会无法识别

有一个文件为stm32f10x_conf.h,是管理各种库中头文件的,其中可能有的.h被注释掉了,需要自己点看查看一下,也可以注释掉自己没用到的.h

还有就是在led.h中不用去写#define GPIO_SetBits这种语句,可以在main.c中直接调用

如果是进行位操作的话,需要在led.h中进行定义

            #define LED0 PAOut(8)
           #define LED1 PDOut(2)

同时还要添加#include “sys.h”

sys.h中定义了位操作

所有工程文件如图


再其他就没有遇到什么问题,开始比较简单。


说的不对的地方,请大家指正。初学

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值