本例子代码参考了STM32库开发实战指南中的代码,由于使用的板子是尚学STM32F103ZET6,为了配合板上已有资源,也参考了其配套代码。为了便于书写文本,我尽量将代码都写到了一个文件中,这种方式是不推荐的,在做具体工程时最好代码分类管理,使工程逻辑清晰。

  现在对板上一些资源说明:板上有两个LED灯,引脚为PE5、PE6,均为ResetBits时点亮。有三个按钮,依次为黄色复位,红色PE4(按下接GND)、红色PA0(按下接3.3V,WAKE UP按钮)。ISP口为靠近电源开关的USB,也是USART1口。USART2口为PA3(Rx)、PA2(Tx)。IPD为高电平中断(按键一边接高电平),IPU为低电平中断。

接下来例举基本操作:

        1、用GPIO点亮灯(GPIO输出)

#include "stm32f10x.h"
void Delay(__IO u32 nCount) //简单的延时函数
{
for(; nCount != 0; nCount--);
} void GPIO_Config(void) //配置LED用到的I/O口
{
GPIO_InitTypeDef GPIO_InitStructure; //定义一个GPIO_InitTypeDef类型的结构体
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOE, ENABLE); //开启GPIOE的外设时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6; //选择要控制的GPIOE引脚,这里选了PE5、PE6
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //设置引脚模式为:通用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置引脚速率为:50MHz
GPIO_Init(GPIOE, &GPIO_InitStructure); //调用库函数,初始化GPIOE
GPIO_SetBits(GPIOE, GPIO_Pin_5 | GPIO_Pin_6); //关闭所有LED灯
} int main(void)
{
GPIO_Config();
while(1)
{
GPIO_SetBits(GPIOE , GPIO_Pin_5); //PE5输出高电平
GPIO_ResetBits(GPIOE,GPIO_Pin_6); //PE6输出低电平
Delay(1000000);//1,000,000 六个零以上才有明显闪烁
GPIO_SetBits(GPIOE , GPIO_Pin_6); //PE6输出高电平
GPIO_ResetBits(GPIOE,GPIO_Pin_5); //PE5输出低电平
Delay(1000000);
}
}

实现效果:PE6、PE5两盏灯闪烁。

2、按键输入(GPIO输入)

#include "stm32f10x.h"
#define KEY1 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4) //读PE4(GND)
#define KEY2 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0) //读PA0(VCC) void Delay(__IO u32 nCount) //简单的延时函数
{
for(; nCount != 0; nCount--);
} void GPIO_Config(void) //配置LED用到的PE5、PE6
{
GPIO_InitTypeDef GPIO_InitStructure; //定义一个GPIO_InitTypeDef类型的结构体
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOE, ENABLE); //开启GPIOE的外设时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6; //选择要控制的GPIOE引脚,这里选了PE5、PE6
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //设置引脚模式为:通用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置引脚速率为:50MHz
GPIO_Init(GPIOE, &GPIO_InitStructure); //调用库函数,初始化GPIOE
GPIO_SetBits(GPIOE, GPIO_Pin_5 | GPIO_Pin_6); //关闭所有LED灯
} void Key_GPIO_Config(void)//按键配置,这里用PE4、PE5输入
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);//开启GPIOE的时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; //设置引脚PE4
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入模式(按键按下接GND用这个)
GPIO_Init(GPIOE, &GPIO_InitStructure); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //下拉输入模式(按键按下接VCC用这个)
GPIO_Init(GPIOA, &GPIO_InitStructure);
} unsigned char KEY1_Scan(void)
{
static char key_up0=0;//按键按松开标志
if(KEY1==0)
{
Delay(10000);//延时去抖动
if(KEY1==0)
{
key_up0=1;
} }
if(KEY1==1&&key_up0==1)
{
key_up0=0;
return 1;
}
return 0;
} unsigned char KEY2_Scan(void)
{
static char key_up2=0;//按键按松开标志
if(KEY2==1)
{
Delay(10000);//延时去抖动
if(KEY2==1)
{
key_up2=1;
}
}
if(KEY2==0&&key_up2==1)
{
key_up2=0;
return 1;
}
return 0;
} unsigned char KEY_Scan(void)
{
unsigned char key_code;
if(KEY1_Scan()==1) key_code=1;
else if(KEY2_Scan()==1) key_code=2;
else key_code=0;
return key_code;
} int main(void)
{
int value=0;
GPIO_Config();
Key_GPIO_Config();//配置按键
while(1)
{
value=KEY_Scan();//获取按键值
if(value==1)
GPIO_WriteBit(GPIOE, GPIO_Pin_5, (BitAction)(1-(GPIO_ReadOutputDataBit(GPIOE, GPIO_Pin_5))));//LED灯PE5反转
else if(value==2)
GPIO_WriteBit(GPIOE, GPIO_Pin_6, (BitAction)(1-(GPIO_ReadOutputDataBit(GPIOE, GPIO_Pin_6))));//LED灯PE6反转
}
}

实现效果:PE4按下控制PE5灯反转,PA0按下控制PE6灯反转(亮、灭)。

       3、按键中断(EXTI外部中断操作)

#include "stm32f10x.h"
void Delay(__IO u32 nCount) //简单的延时函数
{
for(; nCount != 0; nCount--);
} void GPIO_Config(void) //配置LED用到的PE5、PE6
{
GPIO_InitTypeDef GPIO_InitStructure; //定义一个GPIO_InitTypeDef类型的结构体
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOE, ENABLE); //开启GPIOE的外设时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6; //选择要控制的GPIOE引脚,这里选了PE5、PE6
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //设置引脚模式为:通用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置引脚速率为:50MHz
GPIO_Init(GPIOE, &GPIO_InitStructure); //调用库函数,初始化GPIOE
GPIO_SetBits(GPIOE, GPIO_Pin_5 | GPIO_Pin_6); //关闭所有LED灯
} static void NVIC_Configuration(void)//NVIC(中断控制器)初始化配置,这里配PE4、PA0
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);//把NVIC中断优先级分组设为第1组
NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn;//PE4对应EXTI线为EXTI4,填EXTI4_IRQn。(EXTI5~EXTI9使用同一中断向量,则填EXTI9_5_IRQn)
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;//抢占优先级2
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//响应优先级1
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);//向寄存器写入参数 NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;//PA0对应EXTI线为EXTI0,填EXTI0_IRQn
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;//抢占优先级2
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;//响应优先级2
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//IRQ(中断请求)通道使能
NVIC_Init(&NVIC_InitStructure);//向寄存器写入参数
} void EXTI_Config(void)//配置PE4、PA0为线中断口,并设置中断优先级
{
GPIO_InitTypeDef GPIO_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO,ENABLE);//配置中断线(PA0)时钟和第二功能AFIO时钟,AFIO指GPIO口的复用功能
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO,ENABLE);//配置中断线(PE4)时钟和第二功能AFIO时钟 NVIC_Configuration();//配置NVIC中断控制器 //以下配PE4
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; //选定要配置为EXTI线的gpio口和设置其工作模式
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//上拉输入
GPIO_Init(GPIOE, &GPIO_InitStructure);
//以下配PA0
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;//选PA0
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;//下拉输入
GPIO_Init(GPIOA, &GPIO_InitStructure);
//以下配PE4中断线、初始化配置
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource4); //EXTI中断线(PE5)工作模式配置
EXTI_InitStructure.EXTI_Line = EXTI_Line4;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿中断
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
//以下配PA0中断线、初始化配置
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0); //EXTI中断线(PA0)工作模式配置
EXTI_InitStructure.EXTI_Line = EXTI_Line0;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; //上升沿中断
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
} int main(void)
{
GPIO_Config();//LED(PE5、PE6)配置
EXTI_Config(); //外部中断EXTI配置,这里是选PE4、PA0
while(1)//等待中断
{
}
}

在stm32f10x_it.c中加入名为EXTI0_IRQHandler(void)和EXTI4_IRQHandler(void)函数:

void EXTI0_IRQHandler(void)
{
Delay(10000);//延时消抖
if(EXTI_GetITStatus(EXTI_Line0) != RESET)//检查指定的EXTI0线路触发请求发生与否
{
GPIO_WriteBit(GPIOE, GPIO_Pin_6, (BitAction)(1-(GPIO_ReadOutputDataBit(GPIOE, GPIO_Pin_6))));//控制LED的PE6翻转
}
EXTI_ClearITPendingBit(EXTI_Line0);//清除EXTI0线路挂起位
} void EXTI4_IRQHandler(void)
{
Delay(10000);//延时消抖
if(EXTI_GetITStatus(EXTI_Line4) != RESET)//确保是否产生了EXTI4 Line中断
{
GPIO_WriteBit(GPIOE, GPIO_Pin_5, (BitAction)(1-(GPIO_ReadOutputDataBit(GPIOE, GPIO_Pin_5))));//控制LED的PE5翻转
}
EXTI_ClearITPendingBit(EXTI_Line4);//清除中断标志位
}

实现效果:PE4按下触发中断,控制PE5灯反转;PA0按下触发中断,控制PE6灯反转(亮、灭)。

4、串口打印(用USART1)

#include "stm32f10x.h"
#include "stdio.h"
void Delay(__IO u32 nCount) //简单的延时函数
{
for(; nCount != 0; nCount--);
} int fputc(int ch, FILE *f)//重定向c库函数printf到USART1
{
USART_SendData(USART1, (unsigned char) ch);//将Printf内容发往串口
while( USART_GetFlagStatus(USART1,USART_FLAG_TC)!= SET);
return (ch);
} void USART1_Config(unsigned int bound)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);//配置串口1时钟 //以下串口GPIO端口配置
//以下配置串口1的Tx(PA9)参数
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;//PA9为Tx
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//以下配置串口1的Rx(PA10)参数
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入模式,Rx不需配Speed
GPIO_Init(GPIOA, &GPIO_InitStructure);
//以下配置串口1的模式mode
USART_InitStructure.USART_BaudRate = bound;//USART1的波特率
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//串口传输的字长
USART_InitStructure.USART_StopBits = USART_StopBits_1;//停止位1位
USART_InitStructure.USART_Parity = USART_Parity_No;//不设置奇偶校验位
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//不用硬件流控制
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//双线全双工。Rx、Tx都开启
USART_Init(USART1, &USART_InitStructure);//向寄存器写入配置
USART_Cmd(USART1, ENABLE); //使能串口1
} int main(void)
{
int a=0;
USART1_Config(115200);
while(1)
{
printf("\r\n Sandeepin poi %d \r\n",a);
a++;
Delay(2000000);
Delay(2000000);
}
}

实现效果:可在串口调试助手中看到Sandeepin poi 0、Sandeepin poi 1……等信息。

5、串口中断(用USART1)

#include "stm32f10x.h"
#include "stdio.h"
void Delay(__IO u32 nCount) //简单的延时函数
{
for(; nCount != 0; nCount--);
} int fputc(int ch, FILE *f)//重定向c库函数printf到USART1
{
USART_SendData(USART1, (unsigned char) ch);//将Printf内容发往串口
while( USART_GetFlagStatus(USART1,USART_FLAG_TC)!= SET);
return (ch);
} void USART1_Config(unsigned int bound)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);//配置串口1时钟 //以下串口GPIO端口配置
//以下配置串口1的Tx(PA9)参数
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;//PA9为Tx
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//以下配置串口1的Rx(PA10)参数
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入模式,Rx不需配Speed
GPIO_Init(GPIOA, &GPIO_InitStructure);
//以下配置串口1的模式mode
USART_InitStructure.USART_BaudRate = bound;//USART1的波特率
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//串口传输的字长
USART_InitStructure.USART_StopBits = USART_StopBits_1;//停止位1位
USART_InitStructure.USART_Parity = USART_Parity_No;//不设置奇偶校验位
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//不用硬件流控制
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//双线全双工。Rx、Tx都开启
USART_Init(USART1, &USART_InitStructure);//向寄存器写入配置
USART_Cmd(USART1, ENABLE); //使能串口1 USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启中断
} void NVIC_Configuration(void)//NVIC(中断控制器)初始化配置,这里配USART1
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);//把NVIC中断优先级分组设为第0组
//以下使能串口1中断
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//抢占优先级1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;//响应优先级0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//IRQ(中断请求)通道使能
NVIC_Init(&NVIC_InitStructure);//根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器USART1
} int main(void)
{
USART1_Config(115200);
NVIC_Configuration();
while(1)
{
Delay(2000000);
}
}

在stm32f10x_it.c中加入名为USART1_IRQHandler(void)函数:

USART1_IRQHandler(void)
{
unsigned char code;
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
code=USART_ReceiveData(USART1);
printf("%c",code);//将接受到的数据直接返回打印
}
}

实现效果:在串口调试助手中输入一系列字符,STM32接收到后直接将收到字符原样打印出来。

6、定时器(用TIM3)

#include "stm32f10x.h"
void Delay(__IO u32 nCount) //简单的延时函数
{
for(; nCount != 0; nCount--);
} void LED_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_5;//PE5、PE6
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//通用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOE, &GPIO_InitStructure);
GPIO_SetBits(GPIOE,GPIO_Pin_5);//PE5初始输出高
GPIO_ResetBits(GPIOE,GPIO_Pin_6);//PE6初始输出低
} void TIME_NVIC_Configuration(void)//TIM3中断优先级配置
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置NVIC中断分组2
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//抢占优先级0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;//响应优先级3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
NVIC_Init(&NVIC_InitStructure);//初始化外设
} void TIME_Configuration(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //定时器TIM3时钟使能
TIM_TimeBaseStructure.TIM_Period = 5000; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值,计数到5000为500ms
TIM_TimeBaseStructure.TIM_Prescaler =(7200-1);//设置用来作为TIMx时钟频率除数的预分频值
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
TIM_ITConfig(TIM3,TIM_IT_Update|TIM_IT_Trigger,ENABLE);//使能、失能指定的TIM中断
TIM_Cmd(TIM3, ENABLE);//使能TIMx外设
} int main(void)
{
LED_GPIO_Config();//开LED的GPIO
TIME_NVIC_Configuration();//TIM3定时器中断配置
TIME_Configuration();//TIM3定时器配置
while(1)
{
}
}

在stm32f10x_it.c中加入名为TIM3_IRQHandler(void)函数:

void TIM3_IRQHandler(void)
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除TIMx的中断待处理位
GPIO_WriteBit(GPIOE, GPIO_Pin_5, (BitAction)(1-(GPIO_ReadOutputDataBit(GPIOE, GPIO_Pin_5))));//控制LED灯PE5翻转
GPIO_WriteBit(GPIOE, GPIO_Pin_6, (BitAction)(1-(GPIO_ReadOutputDataBit(GPIOE, GPIO_Pin_6))));//控制LED灯PE6翻转
}
}

实现效果:每隔500ms后LED灯PE5、PE6翻转。

    7、SysTick(系统滴答定时器)

#include "stm32f10x.h"
u32 TimingDelay; void LED_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_5;//PE5、PE6
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//通用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOE, &GPIO_InitStructure);
GPIO_SetBits(GPIOE,GPIO_Pin_5);//PE5初始输出高
GPIO_ResetBits(GPIOE,GPIO_Pin_6);//PE6初始输出低
} void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断组为2
NVIC_InitStructure.NVIC_IRQChannel = SysTick_IRQn;//中断线
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级为2
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;//响应优先级为0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //允许SysTick_IRQn中断
NVIC_Init(&NVIC_InitStructure);
} void SysTick_Init(void)
{
/* SystemFrequency / 1000 1ms中断一次
* SystemFrequency / 100000 10us中断一次,分析:ticks=SystemFrequency / 100000=720,T=ticks/f,f=72000000,T=720/72=10us
* SystemFrequency / 1000000 1us中断一次*/
while(SysTick_Config( SystemCoreClock / 1000));//Systick 配置延时n*ms。输入的参数为两个中断之间的脉冲数。
} void Delay(u32 nTime)//用Systick延时
{
TimingDelay = nTime;
while(TimingDelay != 0);
} int main(void)
{
SysTick_Init();
LED_GPIO_Config();
NVIC_Configuration();//中断配置
while(1)
{
GPIO_SetBits(GPIOE,GPIO_Pin_6);
GPIO_ResetBits(GPIOE,GPIO_Pin_5);
Delay(200);//Systick 配置延时200*ms
GPIO_SetBits(GPIOE,GPIO_Pin_5);
GPIO_ResetBits(GPIOE,GPIO_Pin_6);
Delay(200);//Systick 配置延时200*ms
}
}

在stm32f10x_it.c中找SysTick_Handler(void)函数,填入如下内容:

extern u32 TimingDelay;
void SysTick_Handler(void)
{
if (TimingDelay != 0x00)
{
TimingDelay--;
}
}

实现效果:每隔200ms后LED灯PE5、PE6翻转。

STM32学习笔记:基础例子的更多相关文章

  1. stm32学习笔记——外部中断的使用

    stm32学习笔记——外部中断的使用 基本概念 stm32中,每一个GPIO都可以触发一个外部中断,但是,GPIO的中断是以组为一个单位的,同组间的外部中断同一时间只能使用一个.比如说,PA0,PB0 ...

  2. STM32学习笔记——OLED屏

    STM32学习笔记--OLED屏 OLED屏的特点: 1.  模块有单色和双色可选,单色为纯蓝色,双色为黄蓝双色(本人选用双色): 2.  显示尺寸为0.96寸 3.  分辨率为128*64 4.   ...

  3. STM32学习笔记——点亮LED

    STM32学习笔记——点亮LED 本人学习STM32是直接通过操作stm32的寄存器,使用的开发板是野火ISO-V2版本: 先简单的介绍一下stm32的GPIO: stm32的GPIO有多种模式: 1 ...

  4. jQuery学习笔记 - 基础知识扫盲入门篇

    jQuery学习笔记 - 基础知识扫盲入门篇 2013-06-16 18:42 by 全新时代, 11 阅读, 0 评论, 收藏, 编辑 1.为什么要使用jQuery? 提供了强大的功能函数解决浏览器 ...

  5. stm32学习笔记----双串口同时打开时的printf()问题

    stm32学习笔记----双串口同时打开时的printf()问题 最近因为要使用串口2外接PN532芯片实现通信,另一方面,要使用串口1来将一些提示信息输出到上位机,于是重定义了printf(),使其 ...

  6. Python学习笔记基础篇——总览

    Python初识与简介[开篇] Python学习笔记——基础篇[第一周]——变量与赋值.用户交互.条件判断.循环控制.数据类型.文本操作 Python学习笔记——基础篇[第二周]——解释器.字符串.列 ...

  7. STM32学习笔记(四)——串口控制LED(中断方式)

    目录: 一.时钟使能,包括GPIO的时钟和串口的时钟使能 二.设置引脚复用映射 三.GPIO的初始化配置,注意要设置为复用模式 四.串口参数初始化配置 五.中断分组和中断优先级配置 六.设置串口中断类 ...

  8. 数论算法 剩余系相关 学习笔记 (基础回顾,(ex)CRT,(ex)lucas,(ex)BSGS,原根与指标入门,高次剩余,Miller_Rabin+Pollard_Rho)

    注:转载本文须标明出处. 原文链接https://www.cnblogs.com/zhouzhendong/p/Number-theory.html 数论算法 剩余系相关 学习笔记 (基础回顾,(ex ...

  9. 《python基础教程(第二版)》学习笔记 基础部分(第1章)

    <python基础教程(第二版)>学习笔记 基础部分(第1章)python常用的IDE:Windows: IDLE(gui), Eclipse+PyDev; Python(command ...

  10. STM32学习笔记-NVIC中断知识点

    STM32学习笔记-NVIC中断知识点总结 中断优先级设置步骤 1. 系统运行后先设置中断优先级分组 函数:void NVIC_PriorityGroupConfig(uint32_tNVIC_Pri ...

随机推荐

  1. Xamarin 的一些资源汇总

    https://github.com/xamarin/xamarin-forms-sampleshttps://github.com/EgorBo/CrossChat-Xamarin.Formshtt ...

  2. java 如何重写equals

    java中重写equals表面上看只涉及equals与hashCode两个方法,但如果仔细考虑发现重写一个逻辑完整的equals并不容易,需要考虑克隆,继承(多态)等问题,下面是最近的几点心得 1.先 ...

  3. Strongly Connected Tournament

    题解: 有一个很重要的性质就是 对于一张完全强联通图来说 一定有一个强联通分量入度为0(或者出度为0) 然后就一些计数题的基本套路 https://www.cnblogs.com/onioncyc/p ...

  4. 【译】PEP 318--函数和方法的装饰器

    PEP原文 : https://www.python.org/dev/peps/pep-0318 PEP标题: Decorators for Functions and Methods PEP作者: ...

  5. sqlyong到期后怎么办

    Sqlyog作为一款可视化的数据库管理工具,各种方便我就不说了,但是未经汉化或者绿色过的软件存在30天的生命期,到期后我们就不可以使用了,要摸卸载重装,我们还可以去修改注册表,来延长它的生命期,具体步 ...

  6. 【题解】地精部落(DP)

    [题解]地精部落(DP) 设\(f_i\)表示强制第一个是谷的合法方案数 转移枚举一个排列的最大值在哪里,就把序列分成了互不相干的两个部分,把其中\(i-1\choose j-1\)的数字分配给前面部 ...

  7. golang编译之vendor机制

    Go 1.5引入了vendor 机制,但是需要手动设置环境变量 GO15VENDOREXPERIMENT= 1,Go编译器才能启用.从Go1.6起,,默认开启 vendor 目录查找,vendor 机 ...

  8. 在Git的PR(Pull Request)提示冲突无法merge合并的解决方案

    问题 假设有一个分支A,向master分支提交PR,然后发生无法自动解决的冲突,PR提示不能执行merge合并. 解决方案1 本地checkout检出并切换到A分支,pull拉取更新到最新代码 在本地 ...

  9. docker 修改实例名称

    docker 容器(服务)重命名只要一个命令就可以: docker rename 原容器名 新容器名 如:

  10. Serv_U FTP服务端使用教程

    Serv-U FTP Server是一种被广泛运用的FTP服务器端软件,可以设定多个FTP服务器.限定登录用户的权限.登录主目录及空间大小等,功能非常完备.具有非常完备的安全特性,支持SSl FTP传 ...