stm32 流水灯

初次接触到stm32,感觉到手足无措的感觉,于是拿着代码照着写,发现还是能够熟悉起来的。
使用stm32芯片的时候,对于标准库函数和芯片技术手册要足够的熟悉。
在stm32上写一个流水灯的程序,流程和51单片机差不多,步骤如下:

1. 初始化GPIO口。(查看原理图,为相应GPIO口配置时钟)
2. 延时初始化,这是为了delay函数做准备,准确知道自己延时多久。使用SysTick来进行计数。
3. 设置GPIO的模式,GPIO口可以软配成8种模式: 输入浮空、 输入上拉、 输入下拉、模拟输入、开漏输出、  推挽输出、
推挽式复用功能、开漏复用功能。这里我们使用的推挽输出。
4.使用GPIO_SetBits()和GPIO_ResetBits()函数进行高低电平的控制输出

这就是一个流水灯程序的大概流程。

下面给出代码:

#include "stm32f10x.h"

static u8 fac_us;
static u16 fac_ms;

void led_init(void)
{
 GPIO_InitTypeDef GPIO_InitStructure;
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOE,ENABLE);   // led0  PB5  led1 PE5
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;      // 推挽输出
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   
 GPIO_Init(GPIOB,&GPIO_InitStructure);
 GPIO_SetBits(GPIOB,GPIO_Pin_5);
 
 
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
 GPIO_Init(GPIOE,&GPIO_InitStructure);
 GPIO_SetBits(GPIOE,GPIO_Pin_5);

}

void delay_init()
{
  SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);    
  fac_us = SystemCoreClock/8000000;
  fac_ms = (u16)fac_us*1000;
 
}
void delay_ms(u16 nms)
{
    u32 temp;
  SysTick->LOAD = nms*fac_ms;
  SysTick->VAL = 0x0;
  SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;      
  do
  {
    temp = SysTick->CTRL;
  }while(temp&0x01 &&!(temp&(1<<16)));   
 
  SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;    
  SysTick->VAL = 0x0;
 
 
}

void delay_us(u16 nus)
{
  u32 temp;
  SysTick->LOAD = nus*fac_us;
  SysTick->VAL = 0x00;
  SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
  do
  {
   temp = SysTick->CTRL;
   
  }while(temp&0x01 && !(temp&(1<<16)));
 
  SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
  SysTick->VAL = 0x0;
}

int main()
{
 delay_init();
 led_init();
 while(1)
 {
  GPIO_SetBits(GPIOB,GPIO_Pin_5);     
  GPIO_ResetBits(GPIOE,GPIO_Pin_5); 
  delay_ms(500);
  GPIO_SetBits(GPIOE,GPIO_Pin_5);
  GPIO_ResetBits(GPIOB,GPIO_Pin_5);
  delay_ms(500);
 
 }
}

你可能感兴趣的:(stm32 流水灯)