当前位置: 首页 > news >正文

深圳app网站设计wordpress默认主题twenty

深圳app网站设计,wordpress默认主题twenty,做海报的参考网站,php网站开发发展趋势【星云 Orbit-F4 开发板】04. 一触即发#xff1a;外部中断控制 摘要 本文详细介绍了如何使用STM32F407微控制器的HAL库实现外部中断功能。通过配置GPIO引脚作为外部中断源#xff0c;并在中断回调函数中处理按键事件#xff0c;实现了按键控制LED状态翻转的功能。本文旨在…【星云 Orbit-F4 开发板】04. 一触即发外部中断控制 摘要 本文详细介绍了如何使用STM32F407微控制器的HAL库实现外部中断功能。通过配置GPIO引脚作为外部中断源并在中断回调函数中处理按键事件实现了按键控制LED状态翻转的功能。本文旨在为初学者提供一个详细、易懂的教程包括硬件电路设计、软件架构、代码实现及应用示例。 1. 引言 外部中断是嵌入式系统中常见的功能用于检测外部事件并触发相应的中断处理程序。STM32F407微控制器提供了丰富的GPIO资源和灵活的中断配置通过HAL库可以方便地实现外部中断功能。本文以STM32F407开发板为例详细介绍了如何配置外部中断实现按键控制LED状态翻转的功能。 2. 硬件设计 2.1 硬件资源 本实验使用STM32F407开发板上的两个按键和两个LED具体资源如下 LED LED0连接到GPIOF的Pin 9LED1连接到GPIOF的Pin 10 按键 WKUP连接到GPIOA的Pin 0KEY0连接到GPIOE的Pin 4 2.2 硬件接线 本实验使用的两个 STM32F407 板载按键分别为 KEY0 按键和 WKUP 按键其与板载 MCU 的连接原理图如下所示 从原理图中可以看出WKUP 按键和 KEY0 按键的一端连接到了电源正极VCC而另一端分别与 MCU 的 PA0 引脚和 PE4 引脚相连接。对于该硬件设计PA0 引脚和 PE4 引脚应当配置为下拉模式这样一来在按键被按下的时候PA0 引脚或 PE4 引脚就会从原来的低电平状态变为高电平状态在这期间就会有一个上升沿的跳变因此可以使用该上升沿信号作为中断的触发源。 3. 软件设计 3.1 软件架构 本实验的软件架构主要包括以下几个部分 系统初始化初始化HAL库、时钟、延时、串口和LED。外部中断初始化配置GPIO引脚作为外部中断源并设置中断优先级。中断服务函数处理外部中断事件实现按键控制LED状态翻转的功能。 为了提高代码的可读性和可维护性我们将代码分为多个模块每个模块负责一个特定的功能。 3.2 GPIO 配置 使用 HAL 库配置 GPIO 引脚为外部中断模式 模式上升沿触发中断。上拉/下拉下拉模式。 3.3 中断配置 3.3.1 设置中断优先级 使用 HAL_NVIC_SetPriority 函数设置中断优先级 HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority, uint32_t SubPriority);IRQnNVIC 中断请求例如 EXTI0_IRQn、USART1_IRQn 等在 stm32f407xx.h 文件中有定义。PreemptPriority抢占优先级。SubPriority子优先级。 3.3.2 使能中断 使用 HAL_NVIC_EnableIRQ 函数使能中断 HAL_NVIC_EnableIRQ(IRQn_Type IRQn);IRQnNVIC 中断请求例如 EXTI0_IRQn、USART1_IRQn 等在 stm32f407xx.h 文件中有定义。 3.3 中断服务函数 编写中断服务函数处理按键按下事件 WKUP_INT_IRQHandler处理 WKUP 按键中断。KEY0_INT_IRQHandler处理 KEY0 按键中断。 3.4 中断回调函数 使用 HAL_GPIO_EXTI_Callback 函数处理中断事件翻转 LED 状态。 4. 代码实现 4.1 系统初始化模块 4.1.1 HAL库初始化 #include stm32f4xx_hal.h// 初始化HAL库 void hal_init(void) {HAL_Init(); // 初始化HAL库 }4.1.2 时钟配置 #include stm32f4xx_hal.h// 配置时钟 void sys_stm32_clock_init(uint32_t pllm, uint32_t plln, uint32_t pllp, uint32_t pllr) {RCC_OscInitTypeDef RCC_OscInitStruct {0};RCC_ClkInitTypeDef RCC_ClkInitStruct {0};// 初始化RCC OscRCC_OscInitStruct.OscillatorType RCC_OSCILLATORTYPE_HSE;RCC_OscInitStruct.HSEState RCC_HSE_ON;RCC_OscInitStruct.PLL.PLLState RCC_PLL_ON;RCC_OscInitStruct.PLL.PLLSource RCC_PLLSOURCE_HSE;RCC_OscInitStruct.PLL.PLLM pllm;RCC_OscInitStruct.PLL.PLLN plln;RCC_OscInitStruct.PLL.PLLP pllp;RCC_OscInitStruct.PLL.PLLR pllr;if (HAL_RCC_OscConfig(RCC_OscInitStruct) ! HAL_OK){// 初始化失败while (1){}}// 初始化RCC ClkRCC_ClkInitStruct.ClockType RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;RCC_ClkInitStruct.SYSCLKSource RCC_SYSCLKSOURCE_PLLCLK;RCC_ClkInitStruct.AHBCLKDivider RCC_SYSCLK_DIV1;RCC_ClkInitStruct.APB1CLKDivider RCC_HCLK_DIV4;RCC_ClkInitStruct.APB2CLKDivider RCC_HCLK_DIV2;if (HAL_RCC_ClockConfig(RCC_ClkInitStruct, FLASH_LATENCY_5) ! HAL_OK){// 初始化失败while (1){}} }4.1.3 延时初始化 #include stm32f4xx_hal.h// 延时函数 void delay_ms(uint32_t ms) {HAL_Delay(ms); // 使用HAL库提供的延时函数 }4.1.4 串口初始化 #include stm32f4xx_hal.h// 初始化串口 void usart_init(uint32_t baudrate) {USART_HandleTypeDef huart1;huart1.Instance USART1;huart1.Init.BaudRate baudrate;huart1.Init.WordLength UART_WORDLENGTH_8B;huart1.Init.StopBits UART_STOPBITS_1;huart1.Init.Parity UART_PARITY_NONE;huart1.Init.Mode UART_MODE_TX_RX;huart1.Init.HwFlowCtl UART_HWCONTROL_NONE;huart1.Init.OverSampling UART_OVERSAMPLING_16;if (HAL_UART_Init(huart1) ! HAL_OK){// 初始化失败while (1){}} }4.1.5 LED初始化 #include stm32f4xx_hal.h// 定义LED和按键的GPIO引脚 #define LED0_GPIO_PORT GPIOF #define LED0_GPIO_PIN GPIO_PIN_9 #define LED1_GPIO_PORT GPIOF #define LED1_GPIO_PIN GPIO_PIN_10// 初始化LED void led_init(void) {GPIO_InitTypeDef gpio_init_struct {0};// 使能GPIO端口时钟__HAL_RCC_GPIOF_CLK_ENABLE();// 配置LED0引脚gpio_init_struct.Pin LED0_GPIO_PIN;gpio_init_struct.Mode GPIO_MODE_OUTPUT_PP;gpio_init_struct.Pull GPIO_NOPULL;gpio_init_struct.Speed GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(LED0_GPIO_PORT, gpio_init_struct);// 配置LED1引脚gpio_init_struct.Pin LED1_GPIO_PIN;HAL_GPIO_Init(LED1_GPIO_PORT, gpio_init_struct);// 关闭LEDHAL_GPIO_WritePin(LED0_GPIO_PORT, LED0_GPIO_PIN, GPIO_PIN_RESET);HAL_GPIO_WritePin(LED1_GPIO_PORT, LED1_GPIO_PIN, GPIO_PIN_RESET); }4.2 外部中断初始化模块 4.2.1 GPIO引脚配置 #include stm32f4xx_hal.h// 定义按键的GPIO引脚 #define WKUP_INT_GPIO_PORT GPIOA #define WKUP_INT_GPIO_PIN GPIO_PIN_0 #define WKUP_INT_GPIO_CLK_ENABLE() do { HAL_RCC_GPIOA_CLK_ENABLE(); } while (0) #define WKUP_INT_IRQn EXTI0_IRQn #define WKUP_INT_IRQHandler EXTI0_IRQHandler#define KEY0_INT_GPIO_PORT GPIOE #define KEY0_INT_GPIO_PIN GPIO_PIN_4 #define KEY0_INT_GPIO_CLK_ENABLE() do { HAL_RCC_GPIOE_CLK_ENABLE(); } while (0) #define KEY0_INT_IRQn EXTI4_IRQn #define KEY0_INT_IRQHandler EXTI4_IRQHandler// 初始化外部中断 void exti_init(void) {GPIO_InitTypeDef gpio_init_struct {0};// 使能GPIO端口时钟WKUP_INT_GPIO_CLK_ENABLE();KEY0_INT_GPIO_CLK_ENABLE();// 配置WKUP控制引脚gpio_init_struct.Pin WKUP_INT_GPIO_PIN;gpio_init_struct.Mode GPIO_MODE_IT_RISING;gpio_init_struct.Pull GPIO_PULLDOWN;gpio_init_struct.Speed GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(WKUP_INT_GPIO_PORT, gpio_init_struct);// 配置KEY0控制引脚gpio_init_struct.Pin KEY0_INT_GPIO_PIN;gpio_init_struct.Mode GPIO_MODE_IT_RISING;gpio_init_struct.Pull GPIO_PULLDOWN;gpio_init_struct.Speed GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(KEY0_INT_GPIO_PORT, gpio_init_struct);// 配置中断优先级并使能中断HAL_NVIC_SetPriority(WKUP_INT_IRQn, 0, 0);HAL_NVIC_EnableIRQ(WKUP_INT_IRQn);HAL_NVIC_SetPriority(KEY0_INT_IRQn, 0, 0);HAL_NVIC_EnableIRQ(KEY0_INT_IRQn); }4.3 中断服务函数模块 4.3.1 外部中断服务函数 #include stm32f4xx_hal.h// 外部中断服务函数 void WKUP_INT_IRQHandler(void) {HAL_GPIO_EXTI_IRQHandler(WKUP_INT_GPIO_PIN); // 处理WKUP按键的外部中断 }void KEY0_INT_IRQHandler(void) {HAL_GPIO_EXTI_IRQHandler(KEY0_INT_GPIO_PIN); // 处理KEY0按键的外部中断 }4.3.2 HAL库外部中断回调函数 #include stm32f4xx_hal.h// HAL库外部中断回调函数 void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {// 机械按键消抖仅演示切勿在实际工程的中断服务函数中进行阻塞延时delay_ms(20);switch (GPIO_Pin){case WKUP_INT_GPIO_PIN:HAL_GPIO_TogglePin(LED0_GPIO_PORT, LED0_GPIO_PIN); // 翻转LED0状态break;case KEY0_INT_GPIO_PIN:HAL_GPIO_TogglePin(LED1_GPIO_PORT, LED1_GPIO_PIN); // 翻转LED1状态break;} }4.4 主程序模块 4.4.1 主程序 #include stm32f4xx_hal.h #include system_init.h #include exti_init.h #include led_init.h #include usart_init.h #include delay.hint main(void) {hal_init(); // 初始化HAL库sys_stm32_clock_init(336, 8, 2, 7); // 配置时钟168MHzdelay_init(168); // 初始化延时usart_init(115200); // 初始化串口led_init(); // 初始化LEDexti_init(); // 初始化外部中断while (1){// 主循环中不执行任何操作} }5. 下载验证 在完成编译和烧录操作后可以看到板子上的LED0和LED1默认是处于熄灭的状态。若此时按下WKUP按键则能够看到LED0的亮灭状态发生了一次翻转。同样的若此时按下KEY0按键则能够看到LED1的亮灭状态发生了一次翻转与预期的实验现象效果相符。 6. 总结 本文详细介绍了如何使用STM32F407微控制器的HAL库实现外部中断功能通过配置GPIO引脚作为外部中断源并在中断回调函数中处理按键事件实现了按键控制LED状态翻转的功能。本文涵盖了硬件电路设计、软件架构、代码实现及应用示例旨在为初学者提供一个详细、易懂的教程。通过本文的学习读者可以掌握STM32F407外部中断的基本配置和使用方法为后续的嵌入式系统开发打下坚实的基础。 证 在完成编译和烧录操作后可以看到板子上的LED0和LED1默认是处于熄灭的状态。若此时按下WKUP按键则能够看到LED0的亮灭状态发生了一次翻转。同样的若此时按下KEY0按键则能够看到LED1的亮灭状态发生了一次翻转与预期的实验现象效果相符。 6. 总结 本文详细介绍了如何使用STM32F407微控制器的HAL库实现外部中断功能通过配置GPIO引脚作为外部中断源并在中断回调函数中处理按键事件实现了按键控制LED状态翻转的功能。本文涵盖了硬件电路设计、软件架构、代码实现及应用示例旨在为初学者提供一个详细、易懂的教程。通过本文的学习读者可以掌握STM32F407外部中断的基本配置和使用方法为后续的嵌入式系统开发打下坚实的基础。
http://www.hkea.cn/news/14350033/

相关文章:

  • 简约淘宝网站模板免费下载重庆网站推广网络推广
  • 关于做公司官方网站域名申请超炫网站欣赏
  • 做网站诈钱合肥网站搜索引擎优化
  • 省级别网站建设方案免费的app推广平台
  • 做网站的相关教程wordpress 静态发布
  • 公司网站开发费账务处理软件编程入门自学教程
  • 高端营销型网站拓者设计吧官网图片
  • 调用wordpress栏目列表页seo搜索优化待遇
  • 专业做网站报价安居客网官网入口
  • 帮建网站的人ps做网站首页设计教程
  • 做图素材网站开哪个vip好详情页模板素材
  • 营销型网站建设排名优化百度网站
  • 免费做mc皮肤网站龙岗网站设计案例
  • 建设银行官方网站个人注册新公司流程和资料
  • 网站建设工作总结培训锦州网站优化
  • 酒店网站建设案例室内装饰设计平面图
  • 为什么要建设应急管理网站html5旅游网站源码
  • 漳州专业网站建设费用互联网大厂名单
  • 网站下载端口建设北京建设高端网站的
  • 加快网站平台建设网站建设亇金手指专业
  • 江西网站建设价位中国建设平台官网
  • 接推广网站鞍山网站网站建设
  • 长春 网站建设网络推广网页设计推广 外贸 网站
  • 关于宠物的网站网页设计小公司做网站需要
  • 主页网站建设做简单的html网站
  • php中做购物网站的教程网站你懂我意思正能量晚上在线观看不用下载免费魅族
  • 电子商务网站建设系统功能18款免费软件app下载推荐
  • 公司互联网站全面改版自媒体时代做网站有前途吗
  • 网站登录模版互动营销公司
  • 自助定制网站开发公司贵阳seo技术