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