GPIO:通用输入输出口

GPIO在开发板上是占用了大部分的引脚,因此stm32学习可以从GPIO开始

可以通过控制GPIO引脚,实现一个简单的流水灯

简单的延时函数

想让流水灯能够达到“流水”效果,需要延时函数

void delay_us(u32 nus)
{
 u32 temp;
 SysTick->LOAD = 9*nus;
 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(u16 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; //清空计数器
}

这种延时效果使用了SysTick timer (STK),调用了内核自带的定时器

设置一个reload值,定时器会从reload值开始递减到0,当定时器到0值以后,读取STK_CTRL寄存器中COUNTFLAG位,如果为1,则时间到,关闭并清空计时器,如果为0,则继续等待。

主函数

#include "stm32f10x.h"
#include "delay.h"
int main(){
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	//开启RCC的APB2外设时钟
  
	GPIO_InitTypeDef GPIOInitstruct;
	GPIOInitstruct.GPIO_Mode=GPIO_Mode_Out_PP;
	GPIOInitstruct.GPIO_Pin=GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;
	GPIOInitstruct.GPIO_Speed=GPIO_Speed_50MHz;
	//配置GPIO的初始化参数
  
	GPIO_Init(GPIOA,&GPIOInitstruct);
	//初始化GPIO
  
	while(1){
		GPIO_WriteBit(GPIOA,GPIO_Pin_1,Bit_SET);
		delay_ms(300);
		GPIO_WriteBit(GPIOA,GPIO_Pin_1,Bit_RESET);
		
		GPIO_WriteBit(GPIOA,GPIO_Pin_2,Bit_SET);
		delay_ms(300);
		GPIO_WriteBit(GPIOA,GPIO_Pin_2,Bit_RESET);
		
		GPIO_WriteBit(GPIOA,GPIO_Pin_3,Bit_SET);
		delay_ms(300);
		GPIO_WriteBit(GPIOA,GPIO_Pin_3,Bit_RESET);
		
		GPIO_WriteBit(GPIOA,GPIO_Pin_4,Bit_SET);
		delay_ms(300);
		GPIO_WriteBit(GPIOA,GPIO_Pin_4,Bit_RESET);
	}
}


STM32学习笔记——GPIO使用_stm32

最后灯就会来回闪烁