四. 实验任务
4.1 实验一按键检测和LED显示
1.实验目的
(1) 掌握STM32的I/O模块的使用;
(2) 理解独立按键检测和阵列按键检测原理,编程并实现按键检测功能; (3) 理解八段数码管显示原理,编程并实现数码管的显示; (4) 熟悉JTAG调试工具和调试技术。
2.重点、难点
重点:按键检测及数码管显示的实现。 难点:按键去抖技术、在线调试技术。
3.作业及课外学习要求
课前预习,撰写预习报告,课后书写实验报告。
4.实验原理
单微处理器与外部芯片或设备最常见的交互,就是通过对I/O口的操作实现的。无论MCU对外界进行何种数字控制,或接受外部的何种数字控制,都可以通过I/O口进行。键盘、LED、等外设都是通过I/O口的输入、输出来进行读取或控制的。LED显示电路如下。
1 / 14
(1) 独立按键检测原理
F8MCUSTM32F103ZCT6F9F10FC0
图4.1 按键检测基础知识
本实验箱用的按键为弹性按键,存在按下和弹起的抖动问题,可通过延时去抖法实现按键检测。如图4.1中的流程图所示。实验例程参见“实验一_IAR_GPIO_独立按键测试”。 本实验箱独立按键和独立LED的硬件定义如下:
#define LED0(x) GPIO_WriteBit(GPIOA, GPIO_Pin_8, x) #define LED1(x) GPIO_WriteBit(GPIOC, GPIO_Pin_9, x) #define LED2(x) GPIO_WriteBit(GPIOC, GPIO_Pin_8, x) #define LED3(x) GPIO_WriteBit(GPIOC, GPIO_Pin_7, x) #define LED4(x) GPIO_WriteBit(GPIOC, GPIO_Pin_6, x) #define LED5(x) GPIO_WriteBit(GPIOG, GPIO_Pin_7, x) #define LED6(x) GPIO_WriteBit(GPIOG, GPIO_Pin_6, x) #define LED7(x) GPIO_WriteBit(GPIOB, GPIO_Pin_0, x)
#define KEY0 GPIO_ReadInputDataBit(GPIOF,GPIO_Pin_8)//读取按键0 #define KEY1 GPIO_ReadInputDataBit(GPIOF,GPIO_Pin_9)//读取按键1 #define KEY2 GPIO_ReadInputDataBit(GPIOF,GPIO_Pin_10)//读取按键2 #define KEY3 GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_0)//读取按键3
(2) 阵列按键检测原理
在MCU系统中键盘中按钮数量较多时,为了减少I/O口的占用,常常将按钮排列成矩阵形式,如下图4.2所示。
图4.2 阵列按键原理图与实物图对应关系
矩阵连接式键盘键按矩阵排列,各键处于矩阵行/列的结点处,CPU通过对连在行(列)的I/O线送已知电平的信号,然后读取列(行)线的状态信息。逐线扫描,得出键码。其特点是键多时占用I/O口线少,硬件资源利用合理,但判断按键速度慢。多用于设置数字键,适用于键数多的场合。
按键识别方法:先把某一行置为低电平,其余各行置为高电平,检查各列线电平的变化,如果某列线电平为低电平,则可确定此行此列交叉点处的按键被按下。
实验例程参见“实验一_IAR_GPIO_阵列按键扫描_数码管显示”。 本实验箱阵列按键硬件定义如下:
static struct io_port key_output[4] = { //输出行线 {GPIOF, GPIO_Pin_6}, {GPIOC, GPIO_Pin_10}, {GPIOF, GPIO_Pin_7}, {GPIOC, GPIO_Pin_13}};
static struct io_port key_input[4] = { //输入列线 {GPIOC, GPIO_Pin_14}, {GPIOE, GPIO_Pin_5}, {GPIOC, GPIO_Pin_15}, {GPIOE, GPIO_Pin_6} };
本实验箱8段数码管硬件定义如下: SEG_led0 --PE2 SEG led1 --PE3 SEG led2 --PB1 SEG led3 --PB8 SEG led4 --PG14 SEG led5 --PG13 SEG led6 --PD2 SEGled_DP --PG11 SEG led_s0 -- PD7 SEG led_s1 --PG9
SEG led_s2 --PD6 SEG led_s3 --PD3
注意:本实验箱的8段数码管为4位一体共阳数码管。数码管与STM32直接相连,用户可通过STM32直接输出信号至数码管。由于七段数码管LED公共端连接到VCC(共阳极),当STM32对应的I/O引脚输出低电平时,对应的七段数码管LED中的LED点亮;当STM32对应的I/O引脚输出高电平时,对应的七段数码管LED中的LED熄灭。通过控制led_s0--led_s3 4个管脚,分时控制4个数码管的亮面,通过视觉暂留效应,达到4个数码管同时显示的效果。
5 实验任务
实验任务1:按键检测和LED显示实验
1.1 实际运行例程1 “实验一_IAR_GPIO_独立按键测试”
1.1.1 学习、理解IO口初始化,掌握IO口操作的相关操作方法 1.1.2 说明程序用SW0点亮LED0,用SW1点亮LED1,两者的点亮方式有何不同。 1.2 编程,按下按键SW0后,8个LED灯从左向右依次发亮。 实验任务2: 阵列按键扫描与数码管显示
2.1 运行例程2“实验一_IAR_GPIO_阵列按键扫描_数码管显示”
学习,理解阵列按键扫描与数码管显示器的相关概念。 掌握阵列按键与数码管显示器的编程方法。 2.2 编程,扫描键盘, 若按下“1”,用7段LED显示你的学号后4位数。 若按下“2”,用7段LED显示你的学号前4位数。
6 实验报告要求
? 实验报告必须有下列内容:
? 实验目的 ? 实验原理
? 简要说明库函数作用
? GPIO_Init ? GPIO_SetBits ? GPIO_ResetBits ? GPIO_WriteBit
? GPIO_ReadInputDataBit
? 实验任务1.2
? 实验原理 ? 主要编程要点 ? 主要程序代码
? 实验任务2.2
? 实验原理 ? 主要编程要点 ? 主要程序代码
4.2 实验二IO中断和定时器中断
1.实验目的
(1) 理解I/O中断的概念,掌握采用I/O中断的按键识别技术; (2) 理解定时器的工作原理,掌握定时器中断的工作方式; (3) 掌握采用定时器的独立按键扫描及阵列按键扫描功能。
2.重点、难点
重点:I/O中断及定时器的使用,采用定时器的独立按键扫描及阵列按键扫描功能。 难点:中断的概念及编程实现技巧。
3.作业及课外学习要求
课前预习,撰写预习报告,课后书写实验报告。
4.实验原理
一、IO中断
IO中断模式,可使得外部设备可以主动请求MCU与其传输状态或数据,提高MCU对事件的相应速度。
STM32的所有I/O端口可作为外部中断输入,同时可有16个中断输入源,其中PA0可作为从待机模式唤醒的管脚,PC13可作为侵入检测管脚。外部中断的库函数将表4.1。I/0中断的使用请参考“STM32中文参考手册.pdf”中 “通用和复用功能I/O(GPIO和AFIO)”的
描述,库函数的详细描述见“STM32F10xxx_库函数_cn.pdf”相应章节。
表4.1 STM32外部中断的库函数
STM32的中断服务函数,均在Library->src->stm32f10x_it.c中。
本实验例程“实验二_IAR_IO中断”采用SW3做为IO中断,对应的管脚为PC0,中断线为EXTI0_IRQChannel,中断服务函数为void EXTI0_IRQHandler(void)。STM32所有模块在