ARM32开发--外部中断EXTI

2024-06-11 10:04
文章标签 开发 中断 外部 arm32 exti

本文主要是介绍ARM32开发--外部中断EXTI,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

知不足而奋进 望远山而前行


目录

文章目录

前言

目标

内容

外部中断概念

中断触发机制

中断触发源

硬件外部中断

需求

开发流程

关心的内容

完整代码

软件外部中断

需求

开发流程

关心的内容

完整代码

中断消抖处理

系统计数模块

自定义计数器

systick完成代码

消抖完整逻辑

总结


前言

在许多嵌入式系统中,包括STM32和GD32等,EXTI模块通常由多个输入线、边沿检测电路、触发选择寄存器、软件中断事件寄存器、请求挂起寄存器、中断屏蔽寄存器、事件屏蔽寄存器等部分组成,可以实现对外部中断和事件的高效检测和处理。


目标

  1. 掌握外部中断开发流程
  2. 理解中断触发机制
  3. 掌握硬件触发机制实现
  4. 掌握软件触发机制实现
  5. 掌握中断消抖处理方式

内容

外部中断概念

外部中断,英文缩写为EXTI,全称为External Interrupt的缩写,直译过来就是是外部的中断。它是指在嵌入式系统中负责检测和处理外部中断和事件的模块。它通过检测外部信号的电平变化或边沿触发,生成对应的中断或事件,并将其送到中断控制器或事件屏蔽控制器进行处理。

在许多嵌入式系统中,包括STM32和GD32等,EXTI模块通常由多个输入线、边沿检测电路、触发选择寄存器、软件中断事件寄存器、请求挂起寄存器、中断屏蔽寄存器、事件屏蔽寄存器等部分组成,可以实现对外部中断和事件的高效检测和处理。

EXTI(中断/事件控制器)包括 23 个相互独立的边沿检测电路并且能够向处理器内核产生中断 请求或唤醒事件。

中断触发机制

外部中断触发机制,分为两种:

  • 硬件触发
  • 软件触发

硬件触发机制主要是针对外部触发了芯片的引脚,造成引脚的电平发生变化,从而导致中断产生。

硬件触发机制支持三种触发类型:上升沿触发、下降沿触发和任意沿触发。

上升沿:之前是低电平,突然变成高电平了,这个数瞬间,我们称之为触发了上升沿

上升沿:之前是高电平,突然变成低电平了,这个数瞬间,我们称之为触发了下降沿

硬件触发外部中断,简单的理解就是,如果我配置了某个引脚外部中断功能,那么当这个引脚的电平发生变化时,就会触发中断机制,代码层级就会调用到我的中断函数。

软件触发机制,主要针对的是业务逻辑中,需要手动的触发中断事件,去执行中断逻辑而去设计的。他不需要对引脚做任何处理,也可以触发。

中断触发源

引脚的外部中断总共有15个,对于同一个PIN,例如PA0和PB0是不可以同时触发的。

硬件外部中断

需求

  • 按键按下时,打印日志
  • 按键抬起时,打印日志
  • 不通过键盘扫描实现,通过中断实现
开发流程
  1. 依赖添加

添加gd32f4xx_exti.c

添加gd32f4xx_syscfg.c

  1. 外部中断初始化
static void EXTI_config() {/********************* GPIO config *********************/// 时钟初始化rcu_periph_clock_enable(RCU_GPIOA);// 配置GPIO模式gpio_mode_set(GPIOA, GPIO_MODE_INPUT, GPIO_PUPD_NONE, GPIO_PIN_0);/********************* EXTI config *********************/// 时钟配置rcu_periph_clock_enable(RCU_SYSCFG);// 配置中断源syscfg_exti_line_config(EXTI_SOURCE_GPIOA, EXTI_SOURCE_PIN0);// 中断初始化exti_init(EXTI_0, EXTI_INTERRUPT, EXTI_TRIG_BOTH);// 配置中断优先级nvic_irq_enable(EXTI0_IRQn, 1, 1);// 使能中断exti_interrupt_enable(EXTI_0);// 清除中断标志位exti_interrupt_flag_clear(EXTI_0);
}

初始化流程:

    1. GPIO初始化
    2. 外部中断初始化
  1. 外部中断函数
void EXTI0_IRQHandler(void)
{// 判断中断中断触发if(SET == exti_interrupt_flag_get(EXTI_0)) {if(gpio_input_bit_get(GPIOA, GPIO_PIN_0) == SET) {printf("down \r\n");} else {printf("up \r\n");}}// 清除中断标志位exti_interrupt_flag_clear(EXTI_0);
}

中断执行函数流程:

    1. 判断中断是否触发
    2. 清除中断标记
关心的内容
static void EXTI_config() {uint32_t extix = EXTI_0; // 哪个中断uint32_t extix_irq = EXTI0_IRQn;uint32_t extix_trig = EXTI_TRIG_BOTH; // 中断触发条件uint32_t extix_src_port = EXTI_SOURCE_GPIOA; // 中断触发源,哪个引脚uint32_t extix_src_pin = EXTI_SOURCE_PIN0;uint32_t extix_io_rcu = RCU_GPIOA;uint32_t extix_io_port = GPIOA;uint32_t extix_io_pin = GPIO_PIN_0;/********************* GPIO config *********************/// 时钟初始化rcu_periph_clock_enable(extix_io_rcu);// 配置GPIO模式gpio_mode_set(extix_io_port, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, extix_io_pin);/********************* EXTI config *********************/// 时钟配置rcu_periph_clock_enable(RCU_SYSCFG);// 配置中断源syscfg_exti_line_config(extix_src_port, extix_src_pin);// 中断初始化exti_init(extix, EXTI_INTERRUPT, extix_trig);// 配置中断优先级nvic_irq_enable(extix_irq, 1, 1);// 使能中断exti_interrupt_enable(extix);// 清除中断标志位exti_interrupt_flag_clear(extix);
}

总结起来,关心的内容:

  • 中断源,是哪个,EXTI_x
  • 引脚,是哪个硬件触发的。
  • 触发的条件,是高电平触发还是低电平触发
完整代码
#include "gd32f4xx.h"
#include "systick.h"
#include <stdio.h>
#include "main.h"
#include "Usart0.h"void Usart0_recv(uint8_t *data, uint32_t len) {printf("recv: %s\r\n", data);
}static void EXTI_config() {uint32_t extix = EXTI_0; // 哪个中断uint32_t extix_irq = EXTI0_IRQn;uint32_t extix_trig = EXTI_TRIG_BOTH; // 中断触发条件uint32_t extix_src_port = EXTI_SOURCE_GPIOA; // 中断触发源,哪个引脚uint32_t extix_src_pin = EXTI_SOURCE_PIN0;uint32_t extix_io_rcu = RCU_GPIOA;uint32_t extix_io_port = GPIOA;uint32_t extix_io_pin = GPIO_PIN_0;/********************* GPIO config *********************/// 时钟初始化rcu_periph_clock_enable(extix_io_rcu);// 配置GPIO模式gpio_mode_set(extix_io_port, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, extix_io_pin);/********************* EXTI config *********************/// 时钟配置rcu_periph_clock_enable(RCU_SYSCFG);// 配置中断源syscfg_exti_line_config(extix_src_port, extix_src_pin);// 中断初始化exti_init(extix, EXTI_INTERRUPT, extix_trig);// 配置中断优先级nvic_irq_enable(extix_irq, 1, 1);// 使能中断exti_interrupt_enable(extix);// 清除中断标志位exti_interrupt_flag_clear(extix);
}// 中断函数
void EXTI0_IRQHandler(void)
{if(SET == exti_interrupt_flag_get(EXTI_0)) {if(gpio_input_bit_get(GPIOA, GPIO_PIN_0) == SET) {printf("down \r\n");} else {printf("up \r\n");}// 清除中断标志位exti_interrupt_flag_clear(EXTI_0);}
}int main(void)
{systick_config();Usart0_init();EXTI_config();while(1) {}
}

软件外部中断

需求

接收串口消息,手动触发中断事件

开发流程
  1. 添加必要的依赖
  2. 外部中断初始化
static void EXTI_config() {uint32_t extix = EXTI_0; // 哪个中断uint32_t extix_irq = EXTI0_IRQn;/********************* EXTI config *********************/// 时钟配置rcu_periph_clock_enable(RCU_SYSCFG);// 中断初始化exti_init(extix, EXTI_INTERRUPT, EXTI_TRIG_NONE);// 配置中断优先级nvic_irq_enable(extix_irq, 1, 1);// 使能中断exti_interrupt_enable(extix);// 清除中断标志位exti_interrupt_flag_clear(extix);
}
  1. 外部中断函数
void EXTI0_IRQHandler(void)
{printf("IRQ \r\n");if(SET == exti_interrupt_flag_get(EXTI_0)) {printf("exti 0 \r\n");// 清除中断标志位exti_interrupt_flag_clear(EXTI_0);}
}
  1. 手动触发逻辑
void Usart0_recv(uint8_t *data, uint32_t len) {printf("recv: %s\r\n", data);exti_software_interrupt_enable(EXTI_0);
}
关心的内容

哪个中断源。EXTI_x,x为0到22

完整代码
#include "gd32f4xx.h"
#include "systick.h"
#include <stdio.h>
#include "main.h"
#include "Usart0.h"void Usart0_recv(uint8_t *data, uint32_t len) {printf("recv: %s\r\n", data);exti_software_interrupt_enable(EXTI_0);
}static void EXTI_config() {uint32_t extix = EXTI_0; // 哪个中断uint32_t extix_irq = EXTI0_IRQn;/********************* EXTI config *********************/// 时钟配置rcu_periph_clock_enable(RCU_SYSCFG);// 中断初始化exti_init(extix, EXTI_INTERRUPT, EXTI_TRIG_NONE);// 配置中断优先级nvic_irq_enable(extix_irq, 1, 1);// 使能中断exti_interrupt_enable(extix);// 清除中断标志位exti_interrupt_flag_clear(extix);
}// 中断函数
void EXTI0_IRQHandler(void)
{printf("IRQ \r\n");if(SET == exti_interrupt_flag_get(EXTI_0)) {printf("exti 0 \r\n");// 清除中断标志位exti_interrupt_flag_clear(EXTI_0);}
}int main(void)
{systick_config();Usart0_init();EXTI_config();while(1) {}
}

中断消抖处理

消抖方式:

  • 硬件消抖

  • 软件消抖

在按键操作过程中,如果我们采用的是扫描方式实现,消抖的处理方式通常为:

  1. 降低扫描频率。通常我们delay个20ms,也就是1秒扫50次,人的手速是到不了的,比较符合逻辑。
  2. 状态比较。比较本次和上次的状态,从而确定是否触发,降低触发误操作。

理论上我们可以将这种行为使用到中断处理方式中,但是,我们需要明确一点,中断中不可以睡眠时间过长。会影响其他任务执行。

我们可以通过以下两种方式间隔进行判断:

  1. 在定时器的中断函数里,按照指定间隔时间进行判断,这种需要占用一个Timer的中断函数。
  2. 通过时间差决定是否进行按键判定,即本次外部中断发生和上次中断发生的时间差。时间差就需要有时间计数概念,那么我们如何获得时间计数,可以利用System Tick。

系统计数模块

通常我们称之为System Tick,System Tick 不是基于标准定时器(Timer)实现的,而是使用了专门的 SysTick 定时器模块。SysTick 定时器是一个专用的计数器,用于实现系统的计时和调度。

SysTick 定时器是一个 24 位的递减计数器,其工作与标准定时器(Timer)不同。它的时钟源通常是系统时钟(CPU 时钟),并且它是硬件级别的计时器,专门用于实现系统级别的计时和调度功能,比如操作系统的任务调度、延时等。

我们的代码中其实已经使用到了,观察systick.hsystick.c,这个就是采用系统级别的计数器实现的。

计数器初始化逻辑如下:

计数器中断函数在gd32f4xx_it.c中:

这里每调用一次,就是一个时钟计数。同时也会调用到delay_decrement:

进行简单的总结:

整个系统在启动时,配置了时钟计数,SystemCoreClock / 1000000U),这里的意思是每秒钟调用delay_decrement()函数1000000次。

自定义计数器
volatile static uint32_t tick;
...
tick = 0

每次tick的时候,进行自增长,这样就相当于记录了时间:

void delay_decrement(void)
{if(0U != delay) {delay--;}tick++;
}

再将这个tick时间对外,外面使用者就可以获得时间计数了

uint32_t get_tick() {return tick;
}
systick完成代码
/*!\file    systick.h\brief   the header file of systick\version 2016-08-15, V1.0.0, firmware for GD32F4xx\version 2018-12-12, V2.0.0, firmware for GD32F4xx\version 2020-09-30, V2.1.0, firmware for GD32F4xx\version 2022-03-09, V3.0.0, firmware for GD32F4xx
*//*Copyright (c) 2022, GigaDevice Semiconductor Inc.Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:1. Redistributions of source code must retain the above copyright notice, thislist of conditions and the following disclaimer.2. Redistributions in binary form must reproduce the above copyright notice,this list of conditions and the following disclaimer in the documentationand/or other materials provided with the distribution.3. Neither the name of the copyright holder nor the names of its contributorsmay be used to endorse or promote products derived from this software withoutspecific prior written permission.THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
OF SUCH DAMAGE.
*/#ifndef SYS_TICK_H
#define SYS_TICK_H#include <stdint.h>/* configure systick */
void systick_config(void);
/* delay a time in milliseconds */
void delay_1ms(uint32_t count);
/* delay decrement */
void delay_decrement(void);void delay_1us(uint32_t count);
uint32_t get_tick();#endif /* SYS_TICK_H */
/*!\file    systick.c\brief   the systick configuration file\version 2016-08-15, V1.0.0, firmware for GD32F4xx\version 2018-12-12, V2.0.0, firmware for GD32F4xx\version 2020-09-30, V2.1.0, firmware for GD32F4xx\version 2022-03-09, V3.0.0, firmware for GD32F4xx
*//*Copyright (c) 2022, GigaDevice Semiconductor Inc.Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:1. Redistributions of source code must retain the above copyright notice, thislist of conditions and the following disclaimer.2. Redistributions in binary form must reproduce the above copyright notice,this list of conditions and the following disclaimer in the documentationand/or other materials provided with the distribution.3. Neither the name of the copyright holder nor the names of its contributorsmay be used to endorse or promote products derived from this software withoutspecific prior written permission.THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
OF SUCH DAMAGE.
*/#include "gd32f4xx.h"
#include "systick.h"volatile static uint32_t delay;
volatile static uint32_t tick;/*!\brief    configure systick\param[in]  none\param[out] none\retval     none
*/
void systick_config(void)
{tick = 0;/* setup systick timer for 1000000Hz interrupts */if(SysTick_Config(SystemCoreClock / 1000000U)) {/* capture error */while(1) {}}/* configure the systick handler priority */NVIC_SetPriority(SysTick_IRQn, 0x00U);
}/*!\brief    delay a time in milliseconds\param[in]  count: count in milliseconds\param[out] none\retval     none
*/
void delay_1ms(uint32_t count)
{delay = count * 1000;while(0U != delay) {}
}/*!\brief    delay decrement\param[in]  none\param[out] none\retval     none
*/
void delay_decrement(void)
{if(0U != delay) {delay--;}tick++;
}void delay_1us(uint32_t count)
{delay = count;while(0U != delay) {}
}uint32_t get_tick() {return tick;
}
消抖完整逻辑
#include "gd32f4xx.h"
#include "systick.h"
#include <stdio.h>
#include "main.h"
#include "Usart0.h"#define SCAN_DELAY	1000
static uint32_t last_tick = 0;static FlagStatus pre_state;void Usart0_recv(uint8_t *data, uint32_t len) {printf("recv: %s\r\n", data);
}static void EXTI_config() {uint32_t extix = EXTI_0; // 哪个中断uint32_t extix_irq = EXTI0_IRQn;uint32_t extix_trig = EXTI_TRIG_BOTH; // 中断触发条件uint32_t extix_src_port = EXTI_SOURCE_GPIOA; // 中断触发源,哪个引脚uint32_t extix_src_pin = EXTI_SOURCE_PIN0;uint32_t extix_io_rcu = RCU_GPIOA;uint32_t extix_io_port = GPIOA;uint32_t extix_io_pin = GPIO_PIN_0;/********************* GPIO config *********************/// 时钟初始化rcu_periph_clock_enable(extix_io_rcu);// 配置GPIO模式gpio_mode_set(extix_io_port, GPIO_MODE_INPUT, GPIO_PUPD_NONE, extix_io_pin);/********************* EXTI config *********************/// 时钟配置rcu_periph_clock_enable(RCU_SYSCFG);// 配置中断源syscfg_exti_line_config(extix_src_port, extix_src_pin);// 中断初始化exti_init(extix, EXTI_INTERRUPT, extix_trig);// 配置中断优先级nvic_irq_enable(extix_irq, 1, 1);// 使能中断exti_interrupt_enable(extix);// 清除中断标志位exti_interrupt_flag_clear(extix);
}// 中断函数
void EXTI0_IRQHandler(void)
{if(SET == exti_interrupt_flag_get(EXTI_0)) {uint32_t current_tick = get_tick();if(current_tick - last_tick > SCAN_DELAY) {last_tick = current_tick;FlagStatus state = gpio_input_bit_get(GPIOA, GPIO_PIN_0);if(SET == state && RESET == pre_state) {// 如果当前为高电平,上一次为低电平,按下pre_state = state;printf("down \r\n");} else if(RESET == state && SET == pre_state) {// 如果当前为低电平,上一次为高电平,抬起pre_state = state;printf("up \r\n");}}}// 清除中断标志位exti_interrupt_flag_clear(EXTI_0);
}int main(void)
{systick_config();Usart0_init();EXTI_config();pre_state = RESET;while(1) {}
}

总结

外部中断触发机制,分为两种:

  • 硬件触发
  • 软件触发

硬件触发机制主要是针对外部触发了芯片的引脚,造成引脚的电平发生变化,从而导致中断产生。

硬件触发机制支持三种触发类型:上升沿触发、下降沿触发和任意沿触发。

这篇关于ARM32开发--外部中断EXTI的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1050858

相关文章

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始,按照书籍的划分,第10章开始就进入保护模式(Protected Mode)部分了,感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断(Interrupt)的设计,中断的几种方式:外部硬件中断、内部中断和软中断。通过中断做了一个会走的时钟和屏幕上输入字符的程序。 我自己理解中断的一些作用: 为了更好的利用处理器的性能。协同快速和慢速设备一起工作

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

Linux_kernel驱动开发11

一、改回nfs方式挂载根文件系统         在产品将要上线之前,需要制作不同类型格式的根文件系统         在产品研发阶段,我们还是需要使用nfs的方式挂载根文件系统         优点:可以直接在上位机中修改文件系统内容,延长EMMC的寿命         【1】重启上位机nfs服务         sudo service nfs-kernel-server resta

【区块链 + 人才服务】区块链集成开发平台 | FISCO BCOS应用案例

随着区块链技术的快速发展,越来越多的企业开始将其应用于实际业务中。然而,区块链技术的专业性使得其集成开发成为一项挑战。针对此,广东中创智慧科技有限公司基于国产开源联盟链 FISCO BCOS 推出了区块链集成开发平台。该平台基于区块链技术,提供一套全面的区块链开发工具和开发环境,支持开发者快速开发和部署区块链应用。此外,该平台还可以提供一套全面的区块链开发教程和文档,帮助开发者快速上手区块链开发。

Vue3项目开发——新闻发布管理系统(六)

文章目录 八、首页设计开发1、页面设计2、登录访问拦截实现3、用户基本信息显示①封装用户基本信息获取接口②用户基本信息存储③用户基本信息调用④用户基本信息动态渲染 4、退出功能实现①注册点击事件②添加退出功能③数据清理 5、代码下载 八、首页设计开发 登录成功后,系统就进入了首页。接下来,也就进行首页的开发了。 1、页面设计 系统页面主要分为三部分,左侧为系统的菜单栏,右侧

v0.dev快速开发

探索v0.dev:次世代开发者之利器 今之技艺日新月异,开发者之工具亦随之进步不辍。v0.dev者,新兴之开发者利器也,迅速引起众多开发者之瞩目。本文将引汝探究v0.dev之基本功能与优势,助汝速速上手,提升开发之效率。 何谓v0.dev? v0.dev者,现代化之开发者工具也,旨在简化并加速软件开发之过程。其集多种功能于一体,助开发者高效编写、测试及部署代码。无论汝为前端开发者、后端开发者