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中定义了位操作

所有工程文件如图

STM32学习中遇到的问题-(1)跑马灯的实现_第1张图片

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


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

你可能感兴趣的:(STM32学习)