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);
}
}
最后灯就会来回闪烁