入门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