您的位置:首页 > 其它

嵌入式学习--step5 实战篇--跑马灯实验

2016-07-30 17:22 267 查看
开始为期一个月的嵌入式学习之路,将会参考某嵌入式开发板资料,使用的是STMF4系列开发,以MDK为编程软件,不做广告,因而不提及具体厂商,以下的内容均为学习笔记。


实战———————————–跑马灯实验

在前面的学习中,有很多原理性的东西,我们先跳过了,比如时钟呀,system文件夹里面的函数呀等,这些知识繁杂,在这里我们试试直接上手,弄点东西吧。

#——————————————————–

开写,工程组下所含的文件

1、组FWLib下面存放的是ST官方提供的固件库函数,每一个源文件stm32f4xx_ppp.c 都对应一个头文件stm32f4xx_ppp.h . 分组内的文件我们可以根据工程需要添加和删除。

2、组CORE下面存放的是固件库必须的核心文件和启动文件,startup_stm32f40_41xxx.s

3、组system是开发板所提供的,含delay、usart、sys.

4、组HARDWRE 下面存放的是每个实验的外设驱动代码,它的实现是通过调用FWlib下面的固件库文件实现的,比如led.c 里面调用stm32f4xx_gpio.c 内定义的函数对led进行初始化。

5、组USER 下面存放的主要是用户代码。

#—————————

STM32F4每组通用I/O有10个32位寄存器控制

STM32F4每组通用I/O端口包括4个32位配置寄存器(MODER、OTYPER、OSPEEDER、PUPDR)、2个32位数据寄存器(IDR和ODR)、1个32位置位/复位寄存器(BSSR)、1
4000
个32位锁定寄存器(LCKR)和2个32位复用功能选择寄存器(AFRH、AFRL)

该代码里面就包含了一个函数void LED_Init(void) ,该函数的功能就是用来实现配置 PF9和PF10为推挽输出;

在配置STM32外设的时候,任何时候都要先使能该外设的时钟,

GPIO是挂载在AHB1总线上的外设,在固件库中对挂载在AHB1总线上的外设时钟使能是通过函数 RCC_AHB1PeriphClockCmd()来实现的

如:

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE); //使能GPIOF时钟

在这里使用库函数某个IO口的1个位:

GPIO_SetBits(GPIOF,GPIO_Pin_9);

//设置GPIOF.9 输出1

GPIO_ResetBits(GPIOF,GPIO_Pin_9);

//设置GPIOF.9 输出0

void LED_Init(void)
{
GPIO_InitTypeDef  GPIO_InitStructure;

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);     //使能GPIOF时钟

//GPIOF9,F10初始化设置
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;   //LED0和LED1对应IO口
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;             //普通输出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;            //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;        //100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;              //上拉
GPIO_Init(GPIOF, &GPIO_InitStructure);                    //初始化GPIO

GPIO_SetBits(GPIOF,GPIO_Pin_9 | GPIO_Pin_10);           //GPIOF9,F10设置高,灯灭

}


1、库函数–核心代码部分:

int main(void)
{

delay_init(168);                        //初始化延时函数
LED_Init();                             //初始化LED端口

/**下面是通过直接操作库函数的方式实现IO控制**/

while(1)
{
GPIO_ResetBits(GPIOF,GPIO_Pin_9);       //LED0对应引脚GPIOF.9拉低,亮  等同LED0=0;
GPIO_SetBits(GPIOF,GPIO_Pin_10);        //LED1对应引脚GPIOF.10拉高,灭 等同LED1=1;
delay_ms(500);                          //延时300ms
GPIO_SetBits(GPIOF,GPIO_Pin_9);         //LED0对应引脚GPIOF.0拉高,灭  等同LED0=1;
GPIO_ResetBits(GPIOF,GPIO_Pin_10);      //LED1对应引脚GPIOF.10拉低,亮 等同LED1=0;
delay_ms(500);                          //延时300ms
}
}


2、位带操作-核心代码部分:

int main(void)
{
delay_init(168);            //初始化延时函数
LED_Init();                 //初始化LED端口
while(1)
{
LED0=0;                //LED0亮
LED1=1;                //LED1灭
delay_ms(500);
LED0=1;                //LED0灭
LED1=0;                //LED1亮
delay_ms(500);
}
}


3、直接操作寄存器-核心代码部分:

int main(void)
{
delay_init(168);               //初始化延时函数
LED_Init();                    //初始化LED端口
while(1)
{
GPIOF->BSRRH=GPIO_Pin_9;    //LED0亮
GPIOF->BSRRL=GPIO_Pin_10;   //LED1灭
delay_ms(500);
GPIOF->BSRRL=GPIO_Pin_9;    //LED0灭
GPIOF->BSRRH=GPIO_Pin_10;   //LED1亮
delay_ms(500);
}
}


led.h

#ifndef __LED_H
#define __LED_H
#include "sys.h"
//LED端口定义
#define LED0 PFout(9)   // DS0
#define LED1 PFout(10)  // DS1
void LED_Init(void);    //初始化
#endif


**总结一下就是:在我们拿到模板函数库时,如何将其修改成我们需要的功能呢

1 、先建立HAREWARE文件夹,新建led.c 写下关于如何调用FWlib库文件里的驱动来实现相应的功能。

2、 写下 led.h 头文件,写一些简单的,利于程序员阅读的宏定义;及声明led.c 要用的函数。

3、 书写main.c, 里面含要怎么去实现这个led闪烁,可以调用delay、usart、led.c 文件。**

下载时注意是:DTR的低电平复位,RTS高电平进BootLoader



/[b]*************************[/b]/

小知识:关于static位于全局变量前还是局部变量前,抑或是函数前都有不同的作用。具体请参考:http://blog.csdn.net/keyeagle/article/details/6708077

如果是static加在了函数之前,那么就是,私有函数只有该类的成员变量或成员函数可以访问。在C语言中,也有“private函数”,它就是接下来要说的static函数,完成面向对象编程中private函数的功能。

当你的程序中有很多个源文件的时候,你肯定会让某个源文件只提供一些外界需要的接口,其他的函数可能是为了实现这些接口而编写,这些其他的函数你可能并不希望被外界(非本源文件)所看到,这时候就可以用static修饰这些“其他的函数”。

所以static函数的作用域是本源文件,把它想象为面向对象中的private函数就可以了。

/[b]****[/b]/

例如:static void SystemClock_Config(void) 这个函数只能在本源文件内使用了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐