活动介绍
file-type

STM32寄存器版按键点灯实验手册

下载需积分: 45 | 84KB | 更新于2025-01-27 | 96 浏览量 | 21 下载量 举报 收藏
download 立即下载
### STM32按键点灯实验寄存器版程序知识点详解 #### 1. STM32概述 STM32是一系列基于ARM Cortex-M微控制器的产品系列,由STMicroelectronics(意法半导体)生产。该系列微控制器广泛应用于嵌入式系统开发,以其高性能、低功耗、丰富的外设支持和成本效益而受到开发者的青睐。 #### 2. 按键点灯实验的含义 按键点灯实验是嵌入式系统中常见的入门级实验之一。该实验通过编程实现按键控制LED灯的开关,从而帮助开发者学习和掌握微控制器的GPIO(通用输入输出)操作、中断处理、寄存器配置等基本技能。 #### 3. 寄存器版程序的特点 寄存器版程序指的是直接通过操作微控制器的寄存器来控制硬件资源。相比于使用库函数操作,寄存器版程序虽然编写难度较高,但能够更深入地理解硬件工作原理,且在代码量和运行效率上具有优势。 #### 4. STM32的GPIO操作 在STM32中,GPIO的操作主要包括配置GPIO的工作模式、输出类型、速度和上拉/下拉电阻等。在本实验中,需要配置与LED灯和按键相关的GPIO引脚,以确保它们能够正常工作。 #### 5. 中断处理 中断处理在按键点灯实验中非常关键。当按键被按下时,微控制器需要通过中断服务程序来响应按键事件,完成LED灯状态的切换。在本实验中,需要配置相关的中断控制器,并编写中断服务函数。 #### 6. 实验步骤详解 1. **初始化硬件环境**:首先需要初始化STM32的时钟系统,确保CPU及其他外设能够正常工作。 2. **配置LED对应的GPIO**:根据实验板上的LED连接情况,配置相应的GPIO引脚为输出模式,并设置合适的输出速率。 3. **配置按键对应的GPIO**:同样,根据按键连接情况,配置按键对应的GPIO引脚为输入模式,并开启内部上拉电阻,以便在按键未按下时读取高电平。 4. **设置中断**:配置按键GPIO的中断功能,并在中断控制器中设置优先级和中断类型,编写中断服务函数以响应按键事件。 5. **编写主循环代码**:主循环中通常不包含太多代码,主要是维持系统的运行,并可能响应某些非中断的事件。 6. **编写中断服务函数**:当中断发生时,执行中断服务函数,根据中断情况切换LED灯的状态。 #### 7. 文档提供的学习资源 文档作为本实验的重要组成部分,通常会详细解释以上每一步骤的实现原理和代码细节。文档中可能包括寄存器的配置方法、如何编写中断服务函数以及如何通过编程实现LED灯的闪烁效果等。 #### 8. 关于STM32神舟IV号 “STM32神舟IV号”不是一个官方的STM32系列名称,可能是一个基于STM32开发板的非官方项目或产品名称。在此实验中,它可能是作为学习平台或实验板的代称。 #### 9. 开发环境与工具 进行STM32开发,通常需要以下工具和环境: - **集成开发环境(IDE)**:如Keil MDK、IAR Embedded Workbench、STM32CubeIDE等。 - **烧录工具**:如ST-Link、J-Link等用于将编译好的程序烧录到STM32芯片中。 - **调试工具**:用于调试程序,寻找可能出现的问题。 #### 10. 下载学习的建议 - 在下载学习之前,建议准备好上述提到的开发环境和工具。 - 仔细阅读文档中的每一步,确保理解程序的运行逻辑和代码结构。 - 可以尝试修改程序,例如改变LED灯闪烁的频率或按键响应的逻辑,以加深对STM32编程的理解。 - 实际操作中,注意观察实验板上LED灯和按键的实时变化,对照程序代码,理解每一步的功能和作用。 通过以上内容,希望您能够深入理解STM32按键点灯实验寄存器版程序的方方面面,并在实际操作中取得宝贵的经验。

相关推荐

filetype

``` #include "./SYSTEM/sys/sys.h" #include "./SYSTEM/usart/usart.h" #include "./SYSTEM/delay/delay.h" #include "./USMART/usmart.h" #include "./BSP/LED/led.h" #include "./BSP/LCD/lcd.h" #include "./BSP/KEY/key.h" #include "./BSP/DMA/dma.h" const uint8_t TEXT_TO_SEND[] = {"正点原子 STM32F103 DMA 串口实验"}; /* 要循环发送的字符串 */ #define SEND_BUF_SIZE (sizeof(TEXT_TO_SEND) + 2) * 200 /* 发送数据长度, 等于sizeof(TEXT_TO_SEND)+2的200倍. */ uint8_t g_sendbuf[SEND_BUF_SIZE]; /* 发送数据缓冲区 */ int main(void) { uint8_t key = 0; uint16_t i, k; uint16_t len; uint8_t mask = 0; float pro = 0; /* 进度 */ sys_stm32_clock_init(9); /* 设置时钟, 72Mhz */ delay_init(72); /* 延时初始化 */ usart_init(72, 115200); /* 串口初始化为115200 */ led_init(); /* 初始化LED */ lcd_init(); /* 初始化LCD */ key_init(); /* 初始化按键 */ dma_usart1_tx_config((uint32_t)g_sendbuf); /* 初始化串口1 TX DMA */ lcd_show_string(30, 50, 200, 16, 16, "STM32", RED); lcd_show_string(30, 70, 200, 16, 16, "DMA TEST", RED); lcd_show_string(30, 90, 200, 16, 16, "ATOM@ALIENTEK", RED); lcd_show_string(30, 110, 200, 16, 16, "KEY0:Start", RED); len = sizeof(TEXT_TO_SEND); k = 0; for (i = 0; i < SEND_BUF_SIZE; i++) /* 填充ASCII字符集数据 */ { if (k >= len) /* 入换行符 */ { if (mask) { g_sendbuf[i] = 0x0a; k = 0; } else { g_sendbuf[i] = 0x0d; mask++; } } else /* 复制TEXT_TO_SEND语句 */ { mask = 0; g_sendbuf[i] = TEXT_TO_SEND[k]; k++; } } i = 0; while (1) { key = key_scan(0); if (key == KEY0_PRES) /* KEY0按下 */ { printf("\r\nDMA DATA:\r\n"); lcd_show_string(30, 130, 200, 16, 16, "Start Transimit....", BLUE); lcd_show_string(30, 150, 200, 16, 16, " %", BLUE); /* 显示百分号 */ USART1->CR3 = 1 << 7; /* 使能串口1的DMA发送 */ dma_enable(DMA1_Channel4, SEND_BUF_SIZE); /* 开始一次DMA传输! */ /* 等待DMA传输完成,此时我们来做另外一些事情,比如点灯 * 实际应用中,传输数据期间,可以执行另外的任务 */ while (1) { if (DMA1->ISR & (1 << 13)) /* 等待 DMA1_Channel4 传输完成 */ { DMA1->IFCR |= 1 << 13; /* 清除 DMA1_Channel4 传输完成标志 */ break; } pro = DMA1_Channel4->CNDTR; /* 得到当前还剩余多少个数据 */ len = SEND_BUF_SIZE; /* 总长度 */ pro = 1 - (pro / len); /* 得到百分比 */ pro *= 100; /* 扩大100倍 */ lcd_show_num(30, 150, pro, 3, 16, BLUE); /* 显示传输进度 */ } lcd_show_num(30, 150, 100, 3, 16, BLUE); /* 显示100% */ lcd_show_string(30, 130, 200, 16, 16, "Transimit Finished!", BLUE); /* 提示传送完成 */ } i++; delay_ms(10); if (i == 20) { LED0_TOGGLE(); /* LED0闪烁,提示系统正在运行 */ i = 0; } } }```通过修改代码实现功能:使用串口DMA接收数据并在LCD屏上显示进度

filetype

/* Includes ------------------------------------------------------------------*/ #include "stm32f10x.h" #include <stdio.h> #include <string.h> void GPIO_Configuration(void); void Delay (uint32_t nCount); int main(void) { /* Add your application code here */ uint8_t Key; GPIO_Configuration(); Key=4; /* Infinite loop */ while (1) { if(!(GPIOC->IDR & 0x0001)) Key=0; else if(!(GPIOC->IDR & 0x0002)) Key=1; else if(!(GPIOC->IDR & 0x0004)) Key=2; else if(!(GPIOC->IDR & 0x0008)) Key=3; switch(Key) { case 0: GPIO_SetBits(GPIOC , GPIO_Pin_4); Delay(0xfffff); GPIO_ResetBits(GPIOC , GPIO_Pin_4); Delay(0xfffff); break; case 1: GPIO_SetBits(GPIOC , GPIO_Pin_5); Delay(0xfffff); GPIO_ResetBits(GPIOC , GPIO_Pin_5); Delay(0xfffff); break; case 2: GPIO_SetBits(GPIOC , GPIO_Pin_6); Delay(0xfffff); GPIO_ResetBits(GPIOC , GPIO_Pin_6); Delay(0xfffff); break; case 3: GPIO_SetBits(GPIOC , GPIO_Pin_7); Delay(0xfffff); GPIO_ResetBits(GPIOC , GPIO_Pin_7); Delay(0xfffff); break; default:break; } } } void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOA , ENABLE); /** * KEY */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //GPIO_Init(GPIOC, &GPIO_InitStructure); /* LED */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOC, &GPIO_InitStructure); } void Delay (uint32_t nCount) { for(; nCount != 0; nCount--); } 本代码实现程序运行后,D1~D4都被点亮。当按键K1按键时,D1连续闪烁,每个按键对应相应的LED灯,按下哪个按键对应的灯闪烁,其他的LED灯常亮。 改成 使用实验箱上的8个LED灯和2个按键,实现以下功能: (1)按K1键时,8个LED灯先全部亮起,再全部灭掉,循环往复。 (2)按K2键时,8个LED灯从左到右依次亮起(跑马灯),循环往复。

普通网友
  • 粉丝: 0
上传资源 快速赚钱