基于标准外设库的LED流水灯

1.GPIOx端口介绍


GPIO全拼叫General Purpose Input Output(通用输入输出)简称IO口也叫总线扩展器,GPIO口是由引脚,功能寄存器组成,不同的架构中的GPIO封装不同,所使用的引脚数与寄存器数不同,具体可以参考芯片手册里的GPIO篇。

GPIOx(x为数字,例如GPIO0、GPIO1、GPIO2等)是指在单片机中用于控制通用输入输出(GPIO)的端口。在常见的单片机中,这些GPIO端口具有可编程性,可以被程序员设置为输入或输出模式,以便与外部器件进行通信或控制。在很多应用场合中,GPIOx端口非常重要,例如控制LED、读取按钮、驱动电机等。在不同的单片机中,GPIOx端口数量和功能有所不同,需要根据具体的单片机型号和应用需求进行选择。

GPIO的作用是用来控制连接在此GPIO口上的外设,我们一般通过观察原理图找到当前板子的GPIO口引出在哪个口上或者排针上,我们把我们的外设接到上面去就可以通过GPIO与这个外设进行交互控制,在驱动层我们通过读写GPIO口中的功能寄存器来改变连接在此GPIO上的外设状态。

2.添加STM32标准外设库文件(*.c,*.h)

1.文件夹介绍:

下面介绍一下各个文件夹和它的作用:

_htmresc:图片文件,给Release_Notes.html文件显示用的,对我们没什么用处;
Project:标准外设库驱动的完整例程;
Utilities:用于STM32评估板的专用驱动;
stm32f10x_stdperiph_lib_um.chm:库函数使用的帮助文档;
Libraries:库函数的源文件,这个目录下的文件就是我们要使用的 。

CMSIS分为3个功能层:

  • 核内外设访问层: ARM公司提供,定义处理器内部寄存器地址以及功能函数 ;
  • 中间件访问层: ARM公司提供,定义访问中间件的API(CPU的调试功能集成于此) ;
  • 器件级外设访问层: 也称片内外设访问层,定义硬件寄存器的地址和外设访问函数 。

关键目录文件介绍
关键文件位于Libraries目录下:

system_stm32f10x.c和system_stm32f10x.h

Libraries\CMSIS\CM3\CoreSupport下的core_cm3.c、core_cm3.h是CMSIS的核心文件,提供进入Crotex-M3内核的接口,这是由ARTM公司提供的,对所有M3内核的芯片都适用。和CoreSupport目录同级的还用DeviceSupport目录,DeviceSupport\ST\STM32F10x目录下主要存放一些启动文件以及基础的寄存器和中断向量的定义的文件。

官网下载

填上邮箱网址软件会发

download后解压可以完成STM32标准外设库文件的下载

keil工程的创立

2.创建工程

NEW一个工程

选者stm32f103c8

在Manage Project Ltems中创建并添加USER、CMSIS、STDLIB的组(Groups)

在所属组下添加文件

2.2修改目标设置在C/C++中添加Define(标准库没有对宏定义的声明);在IncludePaths中选择文件路径

文件路径添加如下

2.3代码编写 

将主程序改为空循环并编译:


 主程序

#include "stm32f10x.h"                  // Device header
void Delay_ms(u32 i)
 {
     u32 temp;
	 SysTick->LOAD=9000*i;      //设置重装数值, 72MHZ时
     SysTick->CTRL=0X01;        //使能,减到零是无动作,采用外部时钟源
    SysTick->VAL=0;            //清零计数器
     do
   {
        temp=SysTick->CTRL;       //读取当前倒计数值
    }
    while((temp&0x01)&&(!(temp&(1<<16))));    //等待时间到达
     SysTick->CTRL=0;    //关闭计数器
    SysTick->VAL=0;        //清空计数器
}
int main(void)
{
		GPIO_InitTypeDef GPIO_InitStructure;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	while (1)
	{
		GPIO_Write(GPIOA, ~0x0001);	//0000 0000 0000 0001
		Delay_ms(1000);
		GPIO_Write(GPIOA, ~0x0002);	//0000 0000 0000 0010
		Delay_ms(1000);
	}
}
 

3.实验: 

1.接线

烧录 

点亮

4.利用KEIL的软件仿真的逻辑分析仪功能观察GPIO的波形

环境配置

 

灯的亮/灭周期主要由软件循环延时和硬件时钟频

LED灯的亮/灭周期大致为:

循环延时(ms) / 硬件时钟频率(Hz) 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值