精准定时呼吸灯-STM32F103C8

入门STM32的第一贴:
之前一直停留在51的水平,最近因为课题需要,硬着头皮开始了STM32,主要是完成了以下学习目标:
1.完成了基于库函数的STM32软件框架的组建;
2.掌握了非中断型的精准微秒级和毫秒级的延迟函数的使用。

下面举例 呼吸灯的实现。
具体效果因视频不方便展示。

主函数

/*
Title:呼吸灯
Author:小呼呼哈哈哈
*/

#include "led.h"
#include "stm32f10x.h"
#include "Delay.h"

unsigned int CYCLE1=1000,PWM_L;
	
int main(void)
{
	LED_Init();
	GPIO_SetBits(GPIOB,GPIO_Pin_15);
	delay_ms(500);		
	while(1)
	{
		for (PWM_L=1;PWM_L<CYCLE1;PWM_L++)
		{
			GPIO_ResetBits(GPIOB,GPIO_Pin_15);
			delay_us(PWM_L);
			GPIO_SetBits(GPIOB,GPIO_Pin_15);
			delay_us(CYCLE1-PWM_L);			
		}		
		GPIO_ResetBits(GPIOB,GPIO_Pin_15);
		delay_ms(500);
		delay_ms(500);		
		for (PWM_L=CYCLE1-1;PWM_L>0;PWM_L--)
		{
			GPIO_ResetBits(GPIOB,GPIO_Pin_15);
			delay_us(PWM_L);
			GPIO_SetBits(GPIOB,GPIO_Pin_15);
			delay_us(CYCLE1-PWM_L);				
		}	
//		GPIO_SetBits(GPIOB,GPIO_Pin_15);//点亮
	}
}

非中断型精准延迟函数

//不进入systic中断精准延迟

#include "stm32f10x.h"
#include "Delay.h"

void delay_us(u32 nus) 
{
	u32 temp;
	SysTick->LOAD = 9*nus;  //SYSTICK 的时钟设定为HCLK 时钟的1/8,此处若系统时钟频率为72MHz,则取9*
	SysTick->VAL=0X00;//清空计数器
	SysTick->CTRL=0X01;//使能,减到零是无动作,采用外部时钟源
	do
		{
			temp=SysTick->CTRL;//读取当前倒计数值
		}
		while((temp&0x01)&&(!(temp&(1<<16))));//等待时间到达
	SysTick->CTRL=0x00; //关闭计数器
	SysTick->VAL =0X00; //清空计数器
}
 
void delay_ms(u32 nms)
{
	u32 temp;
	SysTick->LOAD = 9000*nms; 
	SysTick->VAL=0X00;//清空计数器 
	SysTick->CTRL=0X01;//使能,减到零是无动作,采用外部时钟源 
	do
		{
			temp=SysTick->CTRL;//读取当前倒计数值 
		}
		while((temp&0x01)&&(!(temp&(1<<16))));//等待时间到达 
	SysTick->CTRL=0x00; //关闭计数器 
	SysTick->VAL =0X00; //清空计数器 
}

Delay.h函数

#include "stm32f10x.h"
extern void delay_us(u32 nus);
extern void delay_ms(u32 nms);

LED函数

#include "led.h"
void LED_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	
	/*打开LED使用的GPIO的时钟使能*/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);  //
	
	GPIO_InitStructure.GPIO_Pin = PIN_LED;
	
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
	
	/*初始化相应的GPIO*/
	GPIO_Init(GPIOB, &GPIO_InitStructure);	 //初始化GPIO_LED
	GPIO_ResetBits(GPIOB,PIN_LED);   					//PB设置为L

}

led.h函数

#ifndef __LED_H
#define __LED_H

#include "stm32f10x.h"

/**************8位LED的IO口定义************/
#define PIN_LED 	(GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12\
|GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15)

void LED_Init(void);
#endif

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值