1、跑马灯实验
操作步骤:
①建立hardware文件夹,在其中建立led子文件夹,建立led.h、led.c
②编写led.h,
#ifndef __LED_H
#define __LED_H
#define LED0 PFout(9)//F9
#define LED0 PFout(10)//F10
void LED_Init(void);
#endif
首先要懂得ifndef define endif这个结构
void LED_Init(void) 是led的初始化函数,在头文件里先声明,然后在.c文件中直接定义、应用就行了;
PFout(9)这个是位带操作(说实话,不太懂)
③编写led.c文件
#include "led.h"
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;//定义一个结构体
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);//使能GPIO时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;//LED0和LED1对应的IO口
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//输出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
GPIO_Init(GPIOF, &GPIO_InitStructure);//初始化IO口
GPIO_SetBits(GPIOF,GPIO_Pin_9 | GPIO_Pin_10);//GPIOF9,F10设置为高电平,灯灭
}
④编写主函数
#include
#include
int main (void)
{
delay_init(168);
LED_Init();
/*这是通过位带操作完成的*/
while(1)
{
LED0=0;
LED1=0;
delay_ms(500);
LED0=1;
LED1=1;
delay_ms(500);
}
}
//下面的是通过库函数来实现的(较常用)
whlie(1)
{
GPIO_ResetBits(GPIOF,GPIO_Pin_9 | GPIO_Pin_10);//PIOF9,F10设置为低电平,灯亮
delay_ms(500);
GPIO_SetBits(GPIOF,GPIO_Pin_9 | GPIO_Pin_10);//PIOF9,F10设置为高电平,灯灭
delay_ms(500);
}
2.按键输入实验
操作步骤
①编写key.h文件
#ifndef __KEY_H
#define __KEY_H
/*下面是通过库函数来读取IO口*/
#define key0 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4)
#define key1 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3)
#define key2 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)
#define key_up GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)
/*只是通过位带操作来读取IO口
#define key0 PEin(4) //PE4
#define key1 PEin(3) //PE3
#define key2 PEin(2) //P32
#define key_up PAin(0) //PA0
*/
void KEY_Init(void);//初始化IO口
u8 KEY_Scan(u8)//按键扫描
#define KEY0_PRES 1
#define KEY1_PRES 2
#define KEY2_PRES 3
#define WKUP_PRES 4
#endif
②编写key.c函数
#include
#include
#include
void KEY_Init(void)
{
GPIO_InitTypeDef key;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOE,ENBALE);//使能时钟
key.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4; //KEY0 KEY1 KEY2对应引脚
key.GPIO_Mode = GPIO_Mode_IN;//普通输入模式
key.GPIO_Speed = GPIO_Speed_100MHz;//100M
key.GPIO_PuPd = GPIO_PuPd_UP;//上拉输入
GPIO_Init(GPIOE,&key);//初始化GPIOE2、E3、E4
key.GPIO_Pin = GPIO_Pin_0;//key——up对应的引脚
key.GPIO_PuPd = GPIO_PuPd_DOWN;//下拉输入
GPIO_Init(GPIOA,&key);//初始化GPIOA0
}
//按键处理函数
//返回按键值
//mode 0不支持连续按,1支持连续按
//0,没有任何按键按
//1,key0按下
//2,key1按下
//3,key2按下
//4,key_up按下
//注意此函数有响应优先级,key0>key1>key2>key_up
u8 KEY_Scan(u8 mode)
{
static u8 key_up=1//按键松开标志
if (mode) u8 key_up=1
if(key_up&&(KEY0==0||KEY1==0||KEY2==0||WK_UP==1))
{
delay_ms(10);/消抖
key_up=0;
if(KEY0==0)return 1;
else if(KEY1==0)return 2;
else if(KEY2==0)return 3;
else if(WK_UP==1)return 4;
}
else if(KEY0==1&&KEY1==1&&KEY2==1&&WK_UP==0)
key_up=1;
return 0;//没有按键输入
③编写主函数
#include
#include
#include
int main()
{
u8 flag;
KEY_Init();
LED_Init();
while(1)
{
flag=KEY_Scan(0);
switch(flag)
{
case key0:
LED0=!LED0;//led0翻转
break;
case key1:
LED1=!LED1;//led1翻转
break;
case key2:
LED0=!LED0;//led0翻转
LED1=!LED1;//led1翻转
break;
}
}
}
3、串口通信实验
①编写usart.h
#ifndef __USART_H
#define __USART_H
void my_USART_Init(void);//usart1串口的初始化
void USART1_IRQHandler(void);//usart1的中断服务程序
#endif
②编写usart.c
#include
#include
void my_USART_Init(void)
{
GPIO_InitTypeDef led0;
USART_InitTypeDef Usart1;
NVIC_InitTypeDef NVIC0;
//使能串口
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
//串口1对应引脚复用映射
GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);
GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);
//USART端口配置
led0.GPIO_Mode=GPIO_Mode_AF;
led0.GPIO_OType=GPIO_OType_PP;
led0.GPIO_Pin=GPIO_Pin_9|GPIO_Pin_10;
led0.GPIO_PuPd=GPIO_PuPd_UP;
led0.GPIO_Speed=GPIO_Speed_100MHz;
GPIO_Init(GPIOA,&led0);
//USART1初始化设置
Usart1.USART_BaudRate=9600;//波特率
Usart1.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//无硬件数据流控制
Usart1.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;//收发模式
Usart1.USART_Parity=USART_Parity_No;//无奇偶位校验
Usart1.USART_StopBits=USART_StopBits_1;//1位停止位
Usart1.USART_WordLength=USART_WordLength_8b;//字长为8的数据格式
USART_Init(USART1,&Usart1);//初始化USART串口
//使能USART串口
USART_Cmd(USART1,ENABLE);
//开启相关中断
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
//USART1 NVIC配置
NVIC0.NVIC_IRQChannel=USART1_IRQn;//串口1中断通道
NVIC0.NVIC_IRQChannelCmd=ENABLE;//开启中断
NVIC0.NVIC_IRQChannelPreemptionPriority=1;//设置抢占优先级
NVIC0.NVIC_IRQChannelSubPriority=1;//设置子优先级
NVIC_Init(&NVIC0); //根据指定的参数初始化NVIC寄存器
}
//串口1中断服务程序
void USART1_IRQHandler(void)
{
u8 res;
if(USART_GetITStatus(USART1,USART_IT_RXNE))
{
res=USART_ReceiveData(USART1);//接受发送过来的数据
if(res=='a')
LED0=!LED0;//LED0反转
if(res=='b')
LED1=!LED1;//LED1反转
}
}
③编写主函数
#include
#include
#include
int main()
{
//设置优先级分组
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
LED_Init();
my_USART_Init();
LED0=0;
LED1=0;
while(1);
}
1、跑马灯实验
操作步骤:
①建立hardware文件夹,在其中建立led子文件夹,建立led.h、led.c
②编写led.h,
#ifndef __LED_H
#define __LED_H
#define LED0 PFout(9)//F9
#define LED0 PFout(10)//F10
void LED_Init(void);
#endif
首先要懂得ifndef define endif这个结构
void LED_Init(void) 是led的初始化函数,在头文件里先声明,然后在.c文件中直接定义、应用就行了;
PFout(9)这个是位带操作(说实话,不太懂)
③编写led.c文件
#include "led.h"
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;//定义一个结构体
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);//使能GPIO时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;//LED0和LED1对应的IO口
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//输出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
GPIO_Init(GPIOF, &GPIO_InitStructure);//初始化IO口
GPIO_SetBits(GPIOF,GPIO_Pin_9 | GPIO_Pin_10);//GPIOF9,F10设置为高电平,灯灭
}
④编写主函数
#include
#include
int main (void)
{
delay_init(168);
LED_Init();
/*这是通过位带操作完成的*/
while(1)
{
LED0=0;
LED1=0;
delay_ms(500);
LED0=1;
LED1=1;
delay_ms(500);
}
}
//下面的是通过库函数来实现的(较常用)
whlie(1)
{
GPIO_ResetBits(GPIOF,GPIO_Pin_9 | GPIO_Pin_10);//PIOF9,F10设置为低电平,灯亮
delay_ms(500);
GPIO_SetBits(GPIOF,GPIO_Pin_9 | GPIO_Pin_10);//PIOF9,F10设置为高电平,灯灭
delay_ms(500);
}
2.按键输入实验
操作步骤
①编写key.h文件
#ifndef __KEY_H
#define __KEY_H
/*下面是通过库函数来读取IO口*/
#define key0 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4)
#define key1 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3)
#define key2 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)
#define key_up GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)
/*只是通过位带操作来读取IO口
#define key0 PEin(4) //PE4
#define key1 PEin(3) //PE3
#define key2 PEin(2) //P32
#define key_up PAin(0) //PA0
*/
void KEY_Init(void);//初始化IO口
u8 KEY_Scan(u8)//按键扫描
#define KEY0_PRES 1
#define KEY1_PRES 2
#define KEY2_PRES 3
#define WKUP_PRES 4
#endif
②编写key.c函数
#include
#include
#include
void KEY_Init(void)
{
GPIO_InitTypeDef key;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOE,ENBALE);//使能时钟
key.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4; //KEY0 KEY1 KEY2对应引脚
key.GPIO_Mode = GPIO_Mode_IN;//普通输入模式
key.GPIO_Speed = GPIO_Speed_100MHz;//100M
key.GPIO_PuPd = GPIO_PuPd_UP;//上拉输入
GPIO_Init(GPIOE,&key);//初始化GPIOE2、E3、E4
key.GPIO_Pin = GPIO_Pin_0;//key——up对应的引脚
key.GPIO_PuPd = GPIO_PuPd_DOWN;//下拉输入
GPIO_Init(GPIOA,&key);//初始化GPIOA0
}
//按键处理函数
//返回按键值
//mode 0不支持连续按,1支持连续按
//0,没有任何按键按
//1,key0按下
//2,key1按下
//3,key2按下
//4,key_up按下
//注意此函数有响应优先级,key0>key1>key2>key_up
u8 KEY_Scan(u8 mode)
{
static u8 key_up=1//按键松开标志
if (mode) u8 key_up=1
if(key_up&&(KEY0==0||KEY1==0||KEY2==0||WK_UP==1))
{
delay_ms(10);/消抖
key_up=0;
if(KEY0==0)return 1;
else if(KEY1==0)return 2;
else if(KEY2==0)return 3;
else if(WK_UP==1)return 4;
}
else if(KEY0==1&&KEY1==1&&KEY2==1&&WK_UP==0)
key_up=1;
return 0;//没有按键输入
③编写主函数
#include
#include
#include
int main()
{
u8 flag;
KEY_Init();
LED_Init();
while(1)
{
flag=KEY_Scan(0);
switch(flag)
{
case key0:
LED0=!LED0;//led0翻转
break;
case key1:
LED1=!LED1;//led1翻转
break;
case key2:
LED0=!LED0;//led0翻转
LED1=!LED1;//led1翻转
break;
}
}
}
3、串口通信实验
①编写usart.h
#ifndef __USART_H
#define __USART_H
void my_USART_Init(void);//usart1串口的初始化
void USART1_IRQHandler(void);//usart1的中断服务程序
#endif
②编写usart.c
#include
#include
void my_USART_Init(void)
{
GPIO_InitTypeDef led0;
USART_InitTypeDef Usart1;
NVIC_InitTypeDef NVIC0;
//使能串口
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
//串口1对应引脚复用映射
GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);
GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);
//USART端口配置
led0.GPIO_Mode=GPIO_Mode_AF;
led0.GPIO_OType=GPIO_OType_PP;
led0.GPIO_Pin=GPIO_Pin_9|GPIO_Pin_10;
led0.GPIO_PuPd=GPIO_PuPd_UP;
led0.GPIO_Speed=GPIO_Speed_100MHz;
GPIO_Init(GPIOA,&led0);
//USART1初始化设置
Usart1.USART_BaudRate=9600;//波特率
Usart1.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//无硬件数据流控制
Usart1.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;//收发模式
Usart1.USART_Parity=USART_Parity_No;//无奇偶位校验
Usart1.USART_StopBits=USART_StopBits_1;//1位停止位
Usart1.USART_WordLength=USART_WordLength_8b;//字长为8的数据格式
USART_Init(USART1,&Usart1);//初始化USART串口
//使能USART串口
USART_Cmd(USART1,ENABLE);
//开启相关中断
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
//USART1 NVIC配置
NVIC0.NVIC_IRQChannel=USART1_IRQn;//串口1中断通道
NVIC0.NVIC_IRQChannelCmd=ENABLE;//开启中断
NVIC0.NVIC_IRQChannelPreemptionPriority=1;//设置抢占优先级
NVIC0.NVIC_IRQChannelSubPriority=1;//设置子优先级
NVIC_Init(&NVIC0); //根据指定的参数初始化NVIC寄存器
}
//串口1中断服务程序
void USART1_IRQHandler(void)
{
u8 res;
if(USART_GetITStatus(USART1,USART_IT_RXNE))
{
res=USART_ReceiveData(USART1);//接受发送过来的数据
if(res=='a')
LED0=!LED0;//LED0反转
if(res=='b')
LED1=!LED1;//LED1反转
}
}
③编写主函数
#include
#include
#include
int main()
{
//设置优先级分组
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
LED_Init();
my_USART_Init();
LED0=0;
LED1=0;
while(1);
}
举报