嵌入式实验报告
课题:按键控制流水灯
专业:物联网工程
班级:01
学号:********
*****
*******
设计日期:2016.12.21—2016.12.30
成绩:
重庆大学城市科技学院电气学院
嵌入式设计报告
一、设计目的作用
通过编程实现对LED灯项目的改变,加深对stm32芯片的理解,对keil软件的熟悉掌握,工程的搭建以及头文件的使用。掌握外部设备的接入以及外部中断的实现。
GPIO_ResetBits(GPIOB,GPIO_Pin_11);
delay_ms(3);//延时函数
GPIO_SetBits(GPIOB,GPIO_Pin_13);
GPIO_ResetBits(GPIOB,GPIO_Pin_12);
delay_ms(3);//延时函数
GPIO_SetBits(GPIOB,GPIO_Pin_14);
out_center();
break;
}
}
}
LED函数部分代码如下,实现对LED灯的控制,可在主函数中选取流水灯显示方式:
void left_right()
{
GPIO_SetBits(GPIOB,GPIO_Pin_15);GPIO_ResetBits(GPIOB,GPIO_Pin_8);
delay_ms(3);//延时函数
delay_ms(3);//延时函数
GPIO_SetBits(GPIOB,GPIO_Pin_12);
GPIO_ResetBits(GPIOB,GPIO_Pin_13);
delay_ms(3);//延时函数
GPIO_SetBits(GPIOB,GPIO_Pin_11);
GPIO_ResetBits(GPIOB,GPIO_Pin_12);
delay_ms(3);//延时函数
GPIO_SetBits(GPIOB,GPIO_Pin_10);
GPIO_ResetBits(GPIOB,GPIO_Pin_11);
delay_ms(3);//延时函数
GPIO_SetBits(GPIOB,GPIO_Pin_9);
GPIO_ResetBits(GPIOB,GPIO_Pin_10);
5、设置软件触发中断函数
void EXTI_GenerateSWInterrupt(uint32_t EXTI_Line);
6、读取指定EXTI外中断线的请求挂起标志
FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line);
7、清除指定EXTI线的挂起标志
void EXTI_ClearFlag(uint32_t EXTI_Line);
GPIO_SetBits(GPIOB,GPIO_Pin_14);
GPIO_ResetBits(GPIOB,GPIO_Pin_15);
delay_ms(3);//延时函数
GPIO_SetBits(GPIOB,GPIO_Pin_13);
GPIO_ResetBits(GPIOB,GPIO_Pin_14);
默认的流水方式:
(1)对时钟中断的次数进行计数
(2)当时钟中断的次数除以4的余数为0时:按从左到右的顺序流水显示
(3)当时钟中断的次数除以4的余数为1时:按从右到左的顺序流水显示
(4)当时钟中断的次数除以4的余数为2时:按中心开花的方式流水显示
(5)当时钟中断的次数除以4的余数为3时:从两边到中心移动的方式流水显示。
GPIO_ResetBits(GPIOB,GPIO_Pin_15);
delay_ms(3);//延时函数
GPIO_SetBits(GPIOB,GPIO_Pin_9);
GPIO_ResetBits(GPIOB,GPIO_Pin_8);
delay_ms(3);//延时函数
GPIO_SetBits(GPIOB,GPIO_Pin_10);
2、用设定值初始化寄存器
void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);
3、用缺省值初始化寄存器
void EXTI_DeInit(void);
4、把缺省值给初始化结构体变量
void EXTI_StructInit(EXTI_InitTypeDef* EXTI_InitStruct);
4、端口位设置/清除寄存器
GPIOx_BSRR(高16位清0,低16位设置)
高16位各位写1清0,低16位写1置1;写0不影响
5、端口位清除寄存器
GPIOx_BRR(低16位写1清0,写1不影响)
6、端口配置锁存寄存器
GPIOx_LCKR(低16位有效)
GPIO引脚功能配置表:
引脚功能
CNF1
CNF0
PE、PF、PG
都是复用的,最少有2种
功能,最多有6种功能
GPIO的基本结构:
GPIO的工作模式
输入模式:浮空输入、上拉输入、下拉输入、模拟输入
输出模式:通用开漏输出、通用推挽输出、复用推挽输出、复用开漏输出
GPIO的复用功能
引脚的其它功能
A/D输入、D/A输出 中断请求输入
计数或时钟输入/输出
串行数据、时钟、握手、片选,等输入/输出
7个中断通道:EXTI0、1、2、3、4各占1个,EXTI9—5为1个,EXTI15—10为1个通道。
另外4个中断源连接的是内部设备,用于检测电压、RTC闹钟、两个唤醒CPU,且各占1个通道。
STM32F103只有60个设备中断,STM32F107有68个设备中断。
管理中断优先级只用寄存器中的4位,只能有16个优先级(包括主、次优先级)。
包括非屏蔽中断、异常、指令中断、复位。
2、设备中断(43~68个通道)
指STM32微控制器片内所有设备的中断,其数量与型号有关,对于大容量(hd)类型,共60个。
3、外部中断(16/20个中断源、7/11个通道)
16个中断源,通过7个端口(PA、PB、PC、PD、PE、PF、PG)引脚接外部设备信号。
delay_ms(3);//延时函数
GPIO_SetBits(GPIOB,GPIO_Pin_8);
GPIO_ResetBits(GPIOB,GPIO_Pin_9);
delay_ms(3);//延时函数
}
/*左往右移*/
void right_left()
{
GPIO_SetBits(GPIOB,GPIO_Pin_8);
GPIO_SetBits(GPIOB,GPIO_Pin_10);
GPIO_ResetBits(GPIOB,GPIO_Pin_11);
GPIO_SetBits(GPIOB,GPIO_Pin_13);
GPIO_ResetBits(GPIOB,GPIO_Pin_12);
delay_ms(3);//延时函数
{
case 1:
left_right();
break;
case 2:
right_left();
break;
case 3:
center_out();
break;
case 4:
out_center();
break;
case 5:
left_right();
right_left();
center_out();
主函数部分代码如下,实现对程序的总体控制:
int main(void)
{
LED_Init();//LED引脚初始化
GPIO_KeyInit();//按键引脚初始化
EXTIx_Init();//外部中断初始化
NVIC_EXTIInit();//给NVIC配置外部中断
while(1)
{
switch(key_num)
5、GPIO_WriteBits()函数写位,写1/0
6、GPIO_Write()函数写端口
7、GPIO_ReadInputData()
8、GPIO_ReadInputDataBit()
9、FWLib函数参数的检查
这些函数在“stm32f10x_gpio.c”中定义
初始化结构体GPIO_InitTypeDef的定义:
STM32F10x系列中断优先级会有相同的。优先级相同时要参考设备编号,小者优先。
EXTI控制器主要有以下特点:
1)每个中断或事件有独立的触发和屏蔽
2)每个中断(源)都有请求挂起状态标志
3)每个中断(源)可以独立地配置输入类型(脉冲或挂起)
4)每个中断(源)可以独立地配置为上升沿触发、下降沿触发、双边沿触发
{
GPIO_SetBits(GPIOB,GPIO_Pin_11);
GPIO_ResetBits(GPIOB,GPIO_Pin_8);
GPIO_SetBits(GPIOB,GPIO_Pin_12);
GPIO_ResetBits(GPIOB,GPIO_Pin_15);
delay_ms(3);//延时函数
二、设计要求
用四个按键控制8个流水灯的流水显示
(1).按键A按下时候流水灯按从左往右的流水显示。
(2).按键B按下时候流水灯按从右往左的流水显示。
(3).按键C按下时候流水灯按中心开花的方式流水显示:从中间向两边流水显示
(4).按键D按下时候流水灯按从两边到中心移动的方式流水显示。
(5).(选做)引入时针中断:
USART、IIC、SPI、IIS、USB、JTAG等
总线(FSMC、SD数据、地址、控制)
系统启动信息输入,等
GPIO寄存器的格式
1、端口控制(配置)寄存器
GPIOx_CRL、GPIOx_CRH
2、端口数据输入寄存器
GPIOx_IDR(低16位有效)