2、蓝牙打印机点灯-GPIO输出控制

发布于:2025-02-11 ⋅ 阅读:(35) ⋅ 点赞:(0)

1、硬件

1.1、看原理图

初始状态位高电平.

需要驱动PA1输出高低电平控制PA1.

1.2、看手册

a、系统架构图

GPIOA在APB2总线上。

b、RCC使能

GPIOA在第2位。

c、GPIO寄存器配置

端口:PA1

模式:通用推挽输出模式 -- 输出0、1即可

速度:50M --- 芯片的最高频率是72M,输出高低电平的时候2M、10M、50M都可以。

2、软件

2.1、创建led.c和led.h文件

led.h

#ifndef _LED_H
#define _LED_H

#include "stm32f10x.h"
#include "io_bit.h"




#endif

led.c

#include "led.h"

2.2、将led.c加载到项目中

2.3、初始化灯操作

led.c

/********************************************************************
*  函数名:  void init_led(void);
*  功能描述: LED初始化
*  输入参数:无   
*  返回:     无      
*  其他:          
*  硬件连接: PA1   低电平亮,高电平灭
*********************************************************************/	
void init_led(void){
	// 使能2号引脚
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	// 初始化引脚
	GPIO_InitTypeDef GPIO_InitStruct;
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1;
	
	// 推挽输出
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	
	GPIO_Init(GPIOA,&GPIO_InitStruct);
	
	// 初始状态
	LED1 = 1;
}

led.h

#ifndef _LED_H
#define _LED_H

#include "stm32f10x.h"
#include "io_bit.h"

#define LED1 PAout(1)

void init_led(void);


#endif

2.4、添加延时模块

添加delay.h和delay.c

delay.c

/***********************************************************************************************
SysTick 控制及状态寄存器 (SysTick->CTRL)地址:0xE000_E010

第0位:ENABLE,Systick 使能位  		 (0:关闭Systick功能;1:开启Systick功能)

第1位:TICKINT,Systick 中断使能位    (0:关闭Systick中断;1:开启Systick中断)

第2位:CLKSOURCE,Systick时钟源选择   (0:使用HCLK/8 作为Systick时钟;1:使用HCLK作为Systick时钟)

第16位:CountFlag,Systick计数比较标志,如果在上次读取本寄存器后,SysTick 已经数到了0,则该位为1。
		如果读取该位,该位将自动清零
*************************************************************************************************/


#include "stm32f10x.h"


///
static u8  fac_us=0;//us延时倍乘数
static u16 fac_ms=0;//ms延时倍乘数

/**************************************************************
 **** 函 数 名:delay_init(u8 SYSCLK)
 **** 功    能:延时初始化,配置systick时钟
 **** 参    数:SYSCLK  系统时钟 MHz
 **** 返    回:
 **** 其    他:SysTick的时钟固定为HCLK时钟的1/8
 ****
 **** 编    写:信盈达  冯工
 **** 编写时间:2014-10-21 23:29:39 
 **** 最后修改: 
**************************************************************/
void init_delay(u8 SYSCLK)
{
	SysTick->CTRL&=0xfffffffb;//bit2清空,选择外部时钟  HCLK/8
	
	fac_us=SYSCLK/8;		    
	fac_ms=(u16)fac_us*1000;
}		



/**************************************************************
 *** 函 数 名:	delay_ms(u16 nms)
 *** 功    能:	延时n毫秒
 *** 参    数:	nms   需要延时的毫秒数
 *** 返    回:
 *** 其    他:	SysTick->LOAD为24位寄存器,所以,最大延时为:
				nms <= 0xffffff* 8/(SYSCLK*1000)
				SYSCLK单位为MHz,nms单位为ms
				对72M条件下,nms<=1864
 ***
 *** 编    写:信盈达  冯工
 *** 编写时间:2014-10-21 23:29:39 
 *** 最后修改: 
**************************************************************/
void delay_ms(u16 nms)
{	 		  	  
	SysTick->LOAD=(u32)nms*fac_ms;		//时间加载(SysTick->LOAD为24bit)
	SysTick->VAL =0x00;           		//清空计数器
	SysTick->CTRL=0x01;          		//开始倒数  

	while( !(SysTick->CTRL & (1<<16)) );//等待时间到达 
	SysTick->CTRL=0x00;       			//关闭计数器
	SysTick->VAL |=0X00;       			//清空计数器	  	    
} 


/**************************************************
 *** 函 数 名:	delay_us(u16 nus)
 *** 功    能:	延时n微秒
 *** 参    数:	nus   需要延时的微秒数
 *** 返    回:
 *** 其    他:	SysTick->LOAD为24位寄存器,所以,最大延时为:
				nms <= 0xffffff* 8/SYSCLK
				SYSCLK单位为MHz,nus单位为us
				对72M条件下,nus<=1864135
 ***
 *** 编    写:	信盈达  冯工
 *** 编写时间:	2014-10-21 23:35:37
 *** 最后修改: 
**************************************************/
void delay_us(u32 nus)
{		
	SysTick->LOAD=(u32)nus*fac_us;		//时间加载(SysTick->LOAD为24bit)
	SysTick->VAL =0x00;           		//清空计数器
	SysTick->CTRL=0x01;          		//开始倒数  

	while( !(SysTick->CTRL & (1<<16)) );//等待时间到达 
	SysTick->CTRL=0x00;       			//关闭计数器
	SysTick->VAL |=0X00;       			//清空计数器	  	    
}

delay.h

#ifndef __DELAY_H
#define __DELAY_H

#include "stm32f10x.h"

void init_delay(u8 SYSCLK);
void delay_ms(u16 nms);
void delay_us(u32 nus);

#endif

2.5、测试代码

main.c

功能:隔1s灯的状态在亮和灭之间切换。


#include "led.h"
#include "delay.h"

int main()
{
	init_delay(72); // 全速72M
	init_led();
	
	
	while(1)
	{
		LED1 = 0;
		
		// 延迟
		delay_ms(1000);
		
		LED1 = 1;
		
		
		// 延迟
		delay_ms(1000);
	
	}
	
}


网站公告

今日签到

点亮在社区的每一天
去签到