当前位置: 首页 > article >正文

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

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);
	
	}
	
}


http://www.kler.cn/a/468926.html

相关文章:

  • Nginx——入门介绍、安装与核心配置文件结构(一/五)
  • 51单片机(二)中断系统与外部中断实验
  • 安徽省乡镇界面图层+arcgis数据shp格式-乡镇名称和编码2020年+wgs84坐标内容测评
  • C++ static关键字(八股总结)
  • 【LC】2469. 温度转换
  • Objective-C 是一种面向对象的编程语言
  • AdaBoost算法详解与PyTorch实现
  • STM32CUBEMX+PLS_D1000激光测距模块+MT6701角度传感器,获取三角形第三边长度
  • 国内Ubuntu环境Docker部署 SenseVoice
  • Vue动态控制disabled属性
  • 基于单片机的肺功能MVV简单测算
  • Go语言的 的同步与异步编程(Synchronization Asynchronous Programming)基础知识
  • 聊聊 C# 中的委托
  • 数据库系统概论期末复习
  • 资金管理系统——python
  • iOS 逆向学习 - iOS Architecture Core OS Layer
  • pytorch索引操作函数介绍
  • DOM HTML
  • 【Vim Masterclass 笔记05】第 4 章:Vim 的帮助系统与同步练习(L14+L15+L16)
  • 银行账户类别详解
  • 【Springboot知识】Springboot监控工具SpringbootAdmin
  • 游泳溺水识别数据集,对25729张图片进行YOLO,COCO JSON, VOC XML 格式的标注,溺水平均识别率在89.9%
  • 数据结构复习 (顺序查找,对半查找,斐波那契查找,插值查找,分块查找)
  • 鸿蒙UI开发——Toast即时提示框的使用
  • 【Qt】QLabel显示图片
  • 【STM32项目】智能物联网驱动的生物样本培育与管理辅助系统(完整工程资料源码)