STM32寄存器与结构体

2023-05-16

piaolin 发表于 2015-9-30 01:02 | 只看该作者 回帖奖励 | 倒序浏览 | 阅读模式
第16集 蜂鸣器实验
这个实验和流水灯是一样的,只是将相对应的IO口拉高拉低即可控制蜂鸣器。
值得注意的是电路设计方面,根据视频描述,STM32上电是其IO口为浮空状态,
电平不确定,加入R38 10K 电阻,当上电时有小电流时会直接被R38流入GND,
当电流达到一定时才会进入S8050三极管。

第17集 按键实验
主要是将IO口设置为输入,然后轮训获取该IO口的状态,根据状态点亮相应的 LED 灯。
这一集还未看之前就自己先敲代码,对比视频上的代码,自己写的移植性较好,视频上的代码思路比较好,
而且代码更加精简一些。总体来说,视频的代码甚于我的代码。
按键有两种扫描方式:
1、长按时,只看做是一次按下
    实现思路:如果此次是按下状态则检查上一次是否弹起状态,只有上一次是弹起状态时才当成按下。
2、长按时,被看作连续按下
    实现思路:读取当前按键所处于的状态直接返回该状态
总结:这两种方式唯一不一样且关键的地方在于是否需要判断上一次是否为弹起状态,所以要切换模式时
      只需要让这关键的地方失效或者生效即可,这种思路可以用在其他地方。
//按键处理函数
//返回按键值
//mode:0,不支持连续按;1,支持连续按;
//0,没有任何按键按下
//1,KEY0按下
//2,KEY1按下
//3,KEY2按下
//4,KEY3按下 WK_UP
//注意此函数有响应优先级,KEY0>KEY1>KEY2>KEY3!!
#define KEY0  GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4)//读取按键0
#define KEY1  GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3)//读取按键1
#define KEY2  GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)//读取按键2
#define WK_UP   GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)//读取按键3(WK_UP)
u8 KEY_Scan(u8 mode)
{     
    static u8 key_up=1;        //默认为松开状态  
    if(mode)        // mode = 1 则让此条件失效
        key_up=1;  //支持连按   
    if(key_up && (KEY0==0 || KEY1==0 || KEY2==0 || WK_UP==1))
    {
        delay_ms(10);    //去抖动
        key_up=0;    // 更新标志位 为按下状态
        if(KEY0==0)
            return KEY0_PRES;
        else if(KEY1==0)
            return KEY1_PRES;
        else if(KEY2==0)
            return KEY2_PRES;
        else if(WK_UP==1)
            return WKUP_PRES;
    }
    else if(KEY0==1 && KEY1==1 && KEY2==1 && WK_UP==0)
    {
        key_up=1;         // 当所有都是弹起时才将标志位更新为松开状态
     }
    return 0;// 无按键按下
}
这个函数缺陷是同时只能检测一个按键并且有优先级顺序所限制,一种改进的方式是修改按键状态标志,
每个按键状态对于整数的一个位,将这些按键状态合并起来,成为一个整数,判断时再拆分起来即可。

贴出自己写的源码:
-------------------------------------------------------------------------------
key.h
-------------------------------------------------------------------------------
#ifndef __KEY_H
#define __KEY_H
enum en_KEY_NUMBER
{
    eKEY_NUMBER_1,
    eKEY_NUMBER_2,
};
enum en_KEY_STATUS
{
    eKEY_STATUS_DOWN,
    eKEY_STATUS_UP,
};
void KEY_Init(void);
enum en_KEY_STATUS KEY_Read(enum en_KEY_NUMBER number);
enum en_KEY_STATUS KEY_ReadKey1_One(void);
enum en_KEY_STATUS KEY_ReadKey2_One(void);
#endif
-------------------------------------------------------------------------------
key.c
-------------------------------------------------------------------------------
#include "public.h"
#include "key.h"
// 移植部分 ------------------------------------------------------------
#define KEY1_GPIO       A
#define KEY1_GPIO_Pin   0
#define KEY2_GPIO       C
#define KEY2_GPIO_Pin   13
// 上拉或下拉
#define KYE1_MODE        GPIO_Mode_IPD
#define KYE2_MODE        GPIO_Mode_IPU
// 按键按下时的电平状态,这点做的比较好,可以统一起来
#define KEY1_DOWN        1
#define KEY2_DOWN        0
// 移植部分 ------------------------------------------------------------
/* 初始化按键 */
void KEY_Init(void)
{
    GPIO_InitTypeDef    GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(TORCC(KEY1_GPIO) | TORCC(KEY2_GPIO), ENABLE);
    GPIO_InitStructure.GPIO_Mode = KYE1_MODE;
    GPIO_InitStructure.GPIO_Pin = TOPIN(KEY1_GPIO_Pin);
    GPIO_Init(TOGPIO(KEY1_GPIO), &GPIO_InitStructure);
    GPIO_InitStructure.GPIO_Mode = KYE2_MODE;
    GPIO_InitStructure.GPIO_Pin = TOPIN(KEY2_GPIO_Pin);
    GPIO_Init(TOGPIO(KEY2_GPIO), &GPIO_InitStructure);
}
/* 读取指定按键的状态 长按时连续返回状态*/
enum en_KEY_STATUS KEY_Read(enum en_KEY_NUMBER number)
{
    enum en_KEY_STATUS status;
    uint8_t tmp;
    switch((int)number)
    {
        case eKEY_NUMBER_1:
            tmp = GPIO_ReadInputDataBit(TOGPIO(KEY1_GPIO), TOPIN(KEY1_GPIO_Pin));
            status = (tmp == KEY1_DOWN) ? eKEY_STATUS_DOWN : eKEY_STATUS_UP;
            break;
        case eKEY_NUMBER_2:
            tmp = GPIO_ReadInputDataBit(TOGPIO(KEY2_GPIO), TOPIN(KEY2_GPIO_Pin));
            status = (tmp == KEY2_DOWN) ? eKEY_STATUS_DOWN : eKEY_STATUS_UP;
            break;
    }
    return status ;
}
/* 读取指定按键的状态 长按时只会返回一次按下状态*/
enum en_KEY_STATUS KEY_ReadKey1_One(void)
{
    static enum en_KEY_STATUS oldstatus = eKEY_STATUS_UP;
    enum en_KEY_STATUS status;
    status = KEY_Read(eKEY_NUMBER_1);
    if(eKEY_STATUS_UP == oldstatus && eKEY_STATUS_DOWN == status)
    {
        oldstatus = eKEY_STATUS_DOWN;
        return eKEY_STATUS_DOWN;
    }
    if(eKEY_STATUS_UP == status)
    {
        oldstatus = eKEY_STATUS_UP;
    }
    return eKEY_STATUS_UP ;
}
/* 读取指定按键的状态 长按时只会返回一次按下状态*/
enum en_KEY_STATUS KEY_ReadKey2_One(void)
{
    static enum en_KEY_STATUS oldstatus = eKEY_STATUS_UP;
    enum en_KEY_STATUS status;
    status = KEY_Read(eKEY_NUMBER_2);
    if(eKEY_STATUS_UP == oldstatus && eKEY_STATUS_DOWN == status)
    {
        oldstatus = eKEY_STATUS_DOWN;
        return eKEY_STATUS_DOWN;
    }
    if(eKEY_STATUS_UP == status)
    {
        oldstatus = eKEY_STATUS_UP;
    }
    return eKEY_STATUS_UP ;
}
第18集 C语言复习-寄存器地址名称映射
一、C语言复习
    这里将一些C语音的位操作、宏定义这些基础知识,此处略
   
二、寄存器地址名称映射
这里讲解利用C语言的一些特性,实现结构体来访问对应的寄存器地址。是一个非常有意思的技巧。
按照自己的理解,尝试描述一遍,从设置GPIOA组的第一个pin为高电平的方式为切入点进行分析。
// 设置 GPIOA组的第1引脚为高电平
GPIO_SetBits(GPIOA, GPIO_Pin_1);   
// 函数的实现
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
  /* Check the parameters */
  assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
  assert_param(IS_GPIO_PIN(GPIO_Pin));
  GPIOx->BSRR = GPIO_Pin;
}
从上面看,最终设置的是GPIOA的BSRR寄存器,那这个寄存器的地址是多少呢?GPIOx是从 GPIOA 传进来的。
看GPIOA的定义:(STM32F10x.h)
#define GPIOA               ((GPIO_TypeDef *) GPIOA_BASE)
#define GPIOA_BASE            (APB2PERIPH_BASE + 0x0800)    // GPIOA的基址
#define APB2PERIPH_BASE       (PERIPH_BASE + 0x10000)        // APB2总线的基址
#define PERIPH_BASE           ((uint32_t)0x40000000)        // 片上外设基址
1、外设基址
#define PERIPH_BASE           ((uint32_t)0x40000000)
STM32使用的ARM M3的内核,该内核的外设基址是从0x40000000开始。(M3权威指南 86页)
从STM32官方的参考手册来看也是从 0x40000000开始(STM32中文参考手册 29页)
所以STM32的外设基址为 0x40000000 ,即所有外设都是从 0x40000000 ~ 0x5003FFFF
2、APB2基址
#define APB2PERIPH_BASE       (PERIPH_BASE + 0x10000)        // APB2总线的基址
外设基址为 0x40000000 + APB2偏移0x10000 = APB2的基址。
从STM32官方的参考手册来看也是从 0x40010000开始 (STM32中文参考手册V10 28页)
3、GPIOA基址
#define GPIOA_BASE            (APB2PERIPH_BASE + 0x0800)    // GPIOA的基址
从上图看,GPIOA的基址是0x40010800,而APB2基址为 0x40010000 + GPIOA偏移0x0800 = 0x40010800
该宏完全展开后是这样的 ( 0x40000000 + 0x10000 )+ 0x0800 = 0x40010800
   
    4、强制转换为 GPIO_TypeDef 类型的指针(重点,精华)
    #define GPIOA               ((GPIO_TypeDef *) GPIOA_BASE)
    强制转为GPIO_TypeDef 类型的指针,表示从 0x40010800 开始连续占用sizeof(GPIO_TypeDef) 字节的长度。
    注意,它把 0x40010800 转为 GPIO_TypeDef 类型的指针,即GPIOA的地址0x40010800。
该结构体定义如下:
typedef struct
{
  __IO uint32_t CRL;    // 占用 4 个字节 即 0x40010800 ~ 0x40010804 为CRL寄存器
  __IO uint32_t CRH;    // 占用 4 个字节 即 0x40010804 ~ 0x40010808 为CRH寄存器
  __IO uint32_t IDR;    // 占用 4 个字节 即 0x40010808 ~ 0x4001080C 为IDR寄存器
  __IO uint32_t ODR;    // 占用 4 个字节 即 0x4001080C ~ 0x40010810 为ODR寄存器
  __IO uint32_t BSRR;    // 占用 4 个字节 即 0x40010810 ~ 0x40010814 为BSRR寄存器
  __IO uint32_t BRR;    // 占用 4 个字节 即 0x40010814 ~ 0x40010818 为BSRR寄存器
  __IO uint32_t LCKR;    // 占用 4 个字节 即 0x40010818 ~ 0x4001081C 为BSRR寄存器
} GPIO_TypeDef;
    对应STM32的GPIO寄存器映射表,刚好完全对齐。( STM32中文参考手册V10 129页 )
   
5、看看GPIO_Pin的定义
#define GPIO_Pin_0                 ((uint16_t)0x0001)  /*!< Pin 0 selected */
#define GPIO_Pin_1                 ((uint16_t)0x0002)  /*!< Pin 1 selected */
#define GPIO_Pin_2                 ((uint16_t)0x0004)  /*!< Pin 2 selected */
#define GPIO_Pin_3                 ((uint16_t)0x0008)  /*!< Pin 3 selected */
#define GPIO_Pin_4                 ((uint16_t)0x0010)  /*!< Pin 4 selected */
#define GPIO_Pin_5                 ((uint16_t)0x0020)  /*!< Pin 5 selected */
#define GPIO_Pin_6                 ((uint16_t)0x0040)  /*!< Pin 6 selected */
#define GPIO_Pin_7                 ((uint16_t)0x0080)  /*!< Pin 7 selected */
#define GPIO_Pin_8                 ((uint16_t)0x0100)  /*!< Pin 8 selected */
#define GPIO_Pin_9                 ((uint16_t)0x0200)  /*!< Pin 9 selected */
#define GPIO_Pin_10                ((uint16_t)0x0400)  /*!< Pin 10 selected */
#define GPIO_Pin_11                ((uint16_t)0x0800)  /*!< Pin 11 selected */
#define GPIO_Pin_12                ((uint16_t)0x1000)  /*!< Pin 12 selected */
#define GPIO_Pin_13                ((uint16_t)0x2000)  /*!< Pin 13 selected */
#define GPIO_Pin_14                ((uint16_t)0x4000)  /*!< Pin 14 selected */
#define GPIO_Pin_15                ((uint16_t)0x8000)  /*!< Pin 15 selected */
仔细观察,发现定义的宏都很有规律,展开二进制来看刚刚好是对应16位数的每一个位。
6、回头看看
// 函数的实现
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
  /* Check the parameters */
  assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
  assert_param(IS_GPIO_PIN(GPIO_Pin));
  GPIOx->BSRR = GPIO_Pin;
}
我们传给GPIO_SetBits()是GPIOA和GPIO_Pin_1,GPIOx->BSRR = GPIO_Pin;
是将GPIO_Pin_1((uint16_t)0x0002) 写入到 GPIOA(0x40010800)->BSRR(10)中。
简单的来说,是将0x0002写入到 0x40010810为首的寄存器中,再通俗的来说,就是将0x40010810 中的第1bin置1。置1会出现神马情况呢?
    YES,就会将GPIOA的第1 pin 置为高电平。
7、BSRR寄存器
该寄存器对应位写1,就会让对应的IO口置为高电平。从而完成目的。
关于结构体,还有一个技巧,是我从A20的源码中看到的,蛮有意思的,很巧妙的将联合体、位域、结构体融合起来,实现非常灵活的操作寄存器方式。
/* 联合体 只占用4个字节*/
typedef union
{
__u32 dwval;    // 这里是对寄存器整体赋值修改   
struct
{
__u32 io_map_sel        : 1 ;    // default: 0;
__u32 res0            : 29 ;    // default: ;
__u32 tcon_gamma_en    : 1 ;    // default: 0;
__u32 tcon_en         : 1 ;    // default: 0;
} bits;            // 这里个单独对某些寄存器进行操作
} tcon_gctl_reg_t;
因联合体的特性,dwval与 bits 共用同一个内存空间,因结构体的特性,将每个寄存器分开,因位域的特性,得以单独修改某一位或几个位。
如果我要修改 tcon_gctl_reg_t 寄存器中的其中 bin31 位。那么可以这样:
#define SUNXI_LCD0_BASE 0X01C0C000
static volatile tcon_gctl_reg_t  *lcd_dev;
lcd_dev=(__de_lcd_dev_t *)SUNXI_LCD0_BASE;
lcd_dev-> tcon_en  = 1;
如果想要对这个寄存器所有位都赋值则可以这样:
lcd_dev-> dwval = 0x01;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32寄存器与结构体 的相关文章

  • Linux下终止正在执行的shell脚本

    一 问题 Linux系统Shell中提交了一个脚本 xff0c 但是需要停止这个进程 xff0c 如何处理 xff1f 二 方案1 killall fileName 说明 xff1a killall是一个命令 xff0c 不是kill al
  • Qt对象树的销毁

    一 问题 在C 43 43 中中 xff0c 我们都知道 xff1a delete 和 new 必须配对使用 一 一对应 xff1a delete少了 xff0c 则内存泄露 为什么Qt使用new来创建一个控件 xff0c 但是却没有使用d
  • DNS域名解析之递归与非递归查询

    DNS域名解析之递归与非递归查询 递归查询迭代查询实例 递归查询 主机向本地域名服务器的查询一般是递归查询 xff1a 如果本地域名服务器不知道查询的IP地址 xff0c 那么本地域名服务器就会以DNS客户的身份向根域名服务器继续发生请求
  • spi,iic,uart,pcie区别

    一 spi SPI 是英语Serial Peripheral interface的缩写 xff0c 顾名思义就是串行外围设备接口 xff0c 是同步传输协议 xff0c 特征是 xff1a 设备有主机 xff08 master xff09
  • 决策树的介绍

    一 介绍 决策树 decision tree 是一类常见的机器学习方法 它是一种树形结构 xff0c 其中每个内部节点表示一个属性上的判断 xff0c 每个分支代表一个判断结果的输出 xff0c 最后每个叶节点代表一种分类结果 例如 xff
  • 支持向量机

    一 是否线性可分的问题 考虑图6 1中 xff0c A D共4个方框中的数据点分布 xff0c 一个问题就是 xff0c 能否画出一条直线 xff0c 将圆形点和方形点分开呢 xff1f 比如图6 2中 xff0c 方框A中的两组数据 xf
  • cmake 链接库名称扩展

    多个文件 macro span class token punctuation span configure lib by types OUTLIBS DebugSuffix span class token punctuation spa
  • 如何自定义TCP通信协议

    物联网行业智能硬件之间的通信 异构系统之间的对接 中间件的研发 以及各种即时聊天软件等 xff0c 都会涉及自定义协议 为了满足不同的业务场景的需要 xff0c 应用层之间通信需要实现各种各样的网络协议 以异构系统的对接为例 在早期 xff
  • 使用米联客FPGA开发板 固化程序失败

    问题描述 xff1a 使用米联客FPGA ZYNQ7020开发板 xff0c 在利用工程和FSBL生成BOOT bin和fsbl elf文件 烧录FLASH时 xff0c 总是失败 这个问题折腾我小半天 xff0c xff0c 无语了 后来
  • Qt串口接收数据长度不稳定问题

    最近在做一个实时接收数据的项目 xff0c 需要每2ms接收下位机发来的两帧数据 xff0c 算是串口高速接收 在使用的过程中 xff0c 发现串口接收的数据长度不稳定 xff0c 有时长有时短 代码如下 xff1a connect ser
  • git的使用入门

    1 添加个人信息 git config global user name 名字 git config global user email 邮箱 git config global user phone 手机号 查看是否提交 git conf
  • Python-OpenCV之形态学转换

    目标 学习不同的形态学操作 xff0c 例如腐蚀 xff0c 膨胀 xff0c 开运算 xff0c 闭运算等 我们要学习的函数有 xff1a cv2 erode xff0c cv2 dilate xff0c cv2 morphologyEx
  • 在windows10系统中搭建mmdetection(2020.7.19)

    参考博客 https blog csdn net david lee13 article details 102940221 本人使用的版本 python 61 3 6cuda 61 10 0cudnn 61 7 5 1pytorch 61
  • C语言字节对齐详解

    C语言字节对齐12345 不同系统下的C语言类型长度 Data TypeILP32ILP64LP64LLP64char8888short16161616int32643232long32646432long long64646464poin
  • 深入学习卷积神经网络中卷积层和池化层的意义

    xff08 文章转载自 xff1a https www cnblogs com wj 1314 p 9593364 html xff09 为什么要使用卷积呢 xff1f 在传统的神经网络中 xff0c 比如多层感知机 xff08 MLP x
  • 关于LSTM的units参数

    LSTM units input shape 3 1 这里的units指的是cell的个数么 xff1f 如果是 xff0c 按照LSTM原理这些cell之间应该是无连接的 xff0c 那units的多少其意义是什么呢 xff0c 是不是相
  • C语言的queue函数

    转自 xff1a https blog csdn net zhang2622765758 article details 81709820 queue 模板类的定义在 lt queue gt 头文件中 与stack 模板类很相似 xff0c
  • pip/anaconda修改镜像源,加快python模块安装速度

    文章来源 xff1a https blog csdn net leviopku article details 80113021 修改镜像源的原因是pip和conda默认国外镜像源 xff0c 所以每次安装模块pip install 或者
  • Python-PackagesNotFoundError: The following packages are not available from current channels

    Python PackagesNotFoundError The following packages are not available from current channels 转载自 xff1a https blog csdn ne
  • Linux 下静态链接库.a 和动态链接库.so 的生成

    1 库 所谓的库就是一种可执行代码的二进制形式 xff0c 可以被操作系统载入内存执行 2 静态库和动态库 静态库 a 文件的命名方式 xff1a libxxx a 库名前加 lib xff0c 后缀是 a 库名是 xxx 链接时间 xff

随机推荐

  • CSDN如何转载别人的博客

    在参考 如何快速转载CSDN中的博客 后 xff0c 由于自己不懂html以及markdown相关知识 xff0c 所以花了一些时间来弄明白怎么转载博客 xff0c 以下为转载CSDN博客步骤和一些知识小笔记 参考博客原址 xff1a ht
  • 你有一条linux命令学习之解压缩.tar .gz .xz .bz .zip

    下载的包解压还是压缩本地的包 xff0c 都要用到解压缩命令 1 tar tar命令生成的压缩包 1 命令语法 tar xcfvzjJ pathname tar file 2 参数 c 创建包 x 解压包 v 显示解压缩过程 f 指定包名
  • raspberry pi 3 ModelB 更换内核、文件系统初探

    1 镜像烧录 1 下载官方最新镜像 xff1a https www raspberrypi org downloads 2 Win32DiskImager烧录 xff1a https sourceforge net projects win
  • char类型与int类型的相互转换、

    相关知识 xff1a 1 计算机中的一个unsigned char型数据表示0 255 xff0c 而一个signed char型数据表示 128 43 127 xff0c 都是256的数字 这256个数字 xff0c 在计算机的存储单元都
  • 使用printf输出各种格式的字符串

    xfeff xfeff 分类 xff1a 43 43 主题 使用printf输出各种格式的字符串 日期 2004 06 29 43 43 1 原样输出字符串 printf 34 s 34 str 2 输出指定长度的
  • float型变量和“零值”比较的方法

    前一段时间读了一下林锐博士的 高质量C C 43 43 编程指南 xff0c 其中有一个比较经典的问题 请写出float x与 零值 比较的if语句 xff1f 当时只知道不能直接用float类型的值与0进行 61 61 或 61 比较 x
  • 全局变量和局部变量

    全局变量也称为外部变量 xff0c 它是在函数外部定义的变量 它不属于哪一个函数 xff0c 它属于一个源程序文件 其作用域是整个源程序 在函数中使用全局变量 xff0c 一般应作全局变量说明 只有在函数内经过说明的全局变量才能使用 但是在
  • c 内存管理

    其他相关链接 xff1a https blog csdn net wind19 article details 5964090 一 几个基本概念 在C语言中 xff0c 关于内存管理的知识点比较多 xff0c 如函数 变量 作用域 指针等
  • Springboot操作MongoDB,包括增改查及复杂操作

    单条件查询 使用BasicDBObject配置查询条件 List span class token generics function span class token punctuation lt span AbstractMongoEn
  • 搭建Spark实战环境(3台linux虚拟机集群)(一)样板机的搭建

    系统及软件配置 系统配置 内存 xff1a 16g 2400 cpu xff1a i5 9400F 软件配置 Windows 10 1903版本VMware workstation 15 10CentOS centos release 7
  • 独立个人项目开发心得 - 任务切分、挑战性、实用性和半途而废

    在写文章前容许我啰嗦一下 xff1a 对于软件开发 xff0c 我走了不少弯路 xff0c 有时觉得自己作为API侠 xff0c 无所不能 xff0c 有时又觉得自己很多LeetCode题写不出来 xff0c 无能为力 我有一个博客 xff
  • 传统软件服务器与游戏服务器架构区别

    项目智能客服爬虫SLG游戏语言javapythonkotlin模型异步事件驱动可能没什么模型可言actor模型传输协议httphttptcp 43 netty传输结构jsonjsonprotobuf数据库oracle xff0c redis
  • Linux C++ Socket实战

    本文主要介绍Linux C 43 43 基础Socket网络编程 大部分知识来自于网站 xff1a https www geeksforgeeks org socket programming cc Socket编程状态图 从图中可以看到
  • CSAPP第二章-信息的表示与处理-随手记

    仅作为学习 深入理解计算机系统 第二章时的笔记 xff0c 仅记录对自己有启发的部分 xff0c 不作为知识整理 xff08 直接看电子书就可以了 xff09 因为这本书知识点非常多 xff0c 所以我会抽时间多次阅读 xff0c 本文也会
  • Vue的路由配置及手动改地址栏为啥又跳转回来??

    vue cli xff08 vue脚手架 xff09 超详细教程 xff1a https blog csdn net wulala hei article details 85000530 这个教程里面是使用 vue init webpac
  • GPS卫星轨道

    GPS卫星轨道周期几乎是24小时 xff0c 而自己的卫星在太阳同步轨道上的周期大概是1 5个小时 xff0c 那么就是说太阳同步轨道已经绕几周了 xff0c GPS卫星才饶一周 所以当算多普勒频移的时候只需要算出GPS一个周期时间内的多普
  • 快速了解S7-1200 PLC的存储器及存储区的寻址方式

    S7 1200 PLC的存储器地址包括输入I 输出Q 位存储器M 数据块DB xff0c 以及本地或临时存储器L eg xff1a 标识存储区M0 0 MB0 MW0 MD0 分别是 B位 字节B 8位 字W 16位 双字D 32位 输入过
  • 网络编程之UDP简单示例

    UDP编程函数recvfrom inet pton sendto UDP协议 user data protrol 用户数据协议特点 xff1a TCP xff1a 面向连接 gt 一定双方连接上了才能进行通信 xff01 UDP xff1a
  • 微信开发(二)http请求工具类

    说明 进行微信开发 xff0c 后台程序需要与微信服务器进行交互 xff0c 通过调用接口来完成服务 xff0c 阅读微信开发文档 xff0c 发现接口的调用都是通过http请求进行的 xff0c 所以必须有个HttpUtil来支撑 xff
  • STM32寄存器与结构体

    piaolin 发表于 2015 9 30 01 02 只看该作者 倒序浏览 阅读模式 第16集 蜂鸣器实验 这个实验和流水灯是一样的 xff0c 只是将相对应的IO口拉高拉低即可控制蜂鸣器 值得注意的是电路设计方面 xff0c 根据视频描