物联网|可变参数的使用技巧|不一样的点灯实验|访问外设的寄存器|操作寄存器实现点灯|硬件编程的基本流程-学习笔记(11)

文章目录

  • 可变参数的使用技巧
  • 第三阶段-初级实验
    • Lesson5:不一样的点灯实验---学习I/O的输出
  • ☆点灯的电路图分析
    • 1 一起看看点灯的电路图
    • Tip1:另一种点灯的电路
    • Tip1:如何访问外设的寄存器
    • 2 STM32F407中操作GPIO的方法
  • 通过直接操作寄存器实现点灯实验
    • Tip1:硬件编程的基本流程
  • 2代码实现及分析

可变参数的使用技巧

void fixed_args_func(int a, double b, char c)
{
        printf("a = 0x%p\n", &a);
        printf("b = 0x%p\n", &b);
        printf("c = 0x%p\n", &c);
if(&a==MCULowPower)
}
void var_args_func(const char * fmt, ...)
{
    ... ...
}
void var_args_func(const char * fmt, ...)
{
    char    *ap;

    ap = ((char*)&fmt) + sizeof(fmt);
    printf("%d\n", *(int*)ap);

    ap =  ap + sizeof(int);
    printf("%d\n", *(int*)ap);

    ap =  ap + sizeof(int);
    printf("%s\n", *((char**)ap));
}

在这里插入图片描述

第三阶段-初级实验

Lesson5:不一样的点灯实验—学习I/O的输出

1: 理论基础 CPU工作机制 如何对CPU编程
外设的的原理
2:代码实现以及分析
3:在板实验和调试
嵌入式开发必知会之三—
了解LED☆点灯的电路图分析区
STM32F407中GPIO的特性及操作方法
1.LED的功能,特点和用途
在这里插入图片描述

发光二极管
在这里插入图片描述

2.LED的工作原理

课后作业:请同学们课后了解电阻,电容和电感的功能,特点,用途及电路符号表示

☆点灯的电路图分析

1 一起看看点灯的电路图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Tip1:另一种点灯的电路

1 STM32F407中GPIO的特性
Tip1:如何访问外设的寄存器

2 STM32F407中操作GPIO的方法

  • 输出的配置

  • 高低电平的配告

  • 手册描述
    通用IO (GPIO)
    除非特别说明,否则本部分适用于整个STM32F4xx系列。

    • 7.1 GPIO简介
      每个通用IO端口包括4个32位配置寄存器(GPIOx_MODER、GPIOx_OTYPER、GPIOx_OSPEEDR和 GPIOx_PUPDR)、2个32位数据寄存器(GPIOx_IDR和
      GPIOx_ODR)、1个 32位置位/复位寄存器(GPIOx_BSRR)、1个32位锁定寄存器(GPIOx_LCKR)和2个32位复用功能选择寄存器(GPIOx_AFRH 和GPIOx_AFRL)。

    • 7.2 GPIO主要特性受控IO多达16个
      输出状态:推挽或开漏+上拉/下拉
      从输出数据寄存器(GPIOx_ODR)或外设(复用功能输出)输出数据可为每个IO选择不同的速度
      输入状态:浮空、上拉/下拉、模拟
      将数据输入到输入数据寄存器(GPIOx_IDR)或外设(复用功能输入)置位和复位寄存器(GPIOx_BSRR),对GPIOx_ODR具有按位写权限锁定机制(GPIOx_LCKR),可冻结IO配置
      模拟功能
      复用功能输入/输出选择寄存器(一个IO最多可具有16个复用功能>快速翻转,每次翻转最快只需要两个时钟周期
      引脚复用非常灵活,允许将IO引脚用作GPIO或多种外设功能中的一种

    • 7.3 GPIO功能描述
      根据数据手册中列出的每个lO端口的特性,可通过软件将通用IVO(GPIO)端口的各个端口位分别配置为多种模式;
      输入浮空
      输入上拉
      输入下拉模拟功能
      具有上拉或下拉功能的开漏输出具有上拉或下拉功能的推挽输出具有上拉或下拉功能的复用功能推挽具有上拉或下拉功能的复用功能开漏
      每个IO端口位均可自由编程,但IO端口寄存器必须按32位字、半字或字节进行访问。GPIOx_BSRR寄存器旨在实现对GPIO ODR寄存器进行原子读取/修改访问。这样便可确保在读取和修改访问之间发生中断请求也不会有问题。
      在这里插入图片描述

    • 8.3.10 Output配置
      在这里插入图片描述 在这里插入图片描述
      当lO口编程为输出时:。输出缓冲区被启用:
      在这里插入图片描述

    -漏极模式:输出寄存器中的“O”激活N-MOS,而“1”激活N-MOS
    在输出寄存器中离开Hi-Z端口(P-MOS从未激活)
    推挽模式:输出寄存器中的“O”激活N-MOS,而输出寄存器中的“1”激活P-MoS
    施密特触发器输入被激活
    弱上拉和下拉电阻是否激活取决于GPIOx_PUPDR寄存器中的值
    l/O引脚上的数据在每个AHB1时钟周期中被采样到输入数据寄存器中
    对输入数据寄存器的读访问获得I/O状态。
    对输出数据寄存器的区域访问获得最后写入的值。
    图29显示了IO端口位的输出配置。
    原文:
    8.3.10 Output configuration
    When the I/O port is programmed as output:
    • The output buffer is enabled:
    – Open drain mode: A “0” in the Output register activates the N-MOS whereas a “1”
    in the Output register leaves the port in Hi-Z (the P-MOS is never activated)
    – Push-pull mode: A “0” in the Output register activates the N-MOS whereas a “1” in
    the Output register activates the P-MOS
    • The Schmitt trigger input is activated
    • The weak pull-up and pull-down resistors are activated or not depending on the value
    in the GPIOx_PUPDR register
    • The data present on the I/O pin are sampled into the input data register every AHB1
    clock cycle
    • A read access to the input data register gets the I/O state
    • A read access to the output data register gets the last written value
    Figure 29 shows the output configuration of the I/O port bit.

Tip1:如何访问外设的寄存器

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2 STM32F407中操作GPIO的方法

  • 输出的配置
  • 高低电平的配置

通过直接操作寄存器实现点灯实验

  • 实验的需求分析(实验目的)
    • 学会基本的硬件操作—I/O的输出高低电平
    • 操作学习利用系统时钟实现较为精确的延时
    • 学习规范的模块化编程
    • 学会使用CMSIS的支持库
  • 通过直接操作寄存器实现点灯代码
  • 代码下载及调试演示
    1程序流程分析
    • 如何利用系统时钟实现较为精确的延时
      9.5SysTick 定时器
      9.5.1 为什么要有SysTick 定时器
      Cortex-M处理器内集成了一个小型的名为SysTick(系统节拍)的定时器,它属于NVIC的一部分,且可以产生SysTick 异常(异常类型#15)。SysTick 为简单的向下计数的24位计数器,可以使用处理器时钟或外部参考时钟(通常是片上时钟源)。
      在现代操作系统中,需要一个周期性的中断来定期触发OS内核,如用于任务管理和上下文切换,处理器也可以在不同时间片内处理不同任务。处理器设计还需要确保运行在非特权等级的应用任务无法禁止该定时器,否则任务可能会禁止SysTick 定时器并锁定整个系统。
      之所以在处理器内增加一个定时器,是为了提高软件的可移植性。由于所有的Cortex-M处理器都具有相同的SysTick定时器,为一种Cortex-M3/M4微控制器实现的OS也能适用于其他的Cortex-M3/M4微控制器。
      若应用中不需要使用OS,SysTick定时器可用作简单的定时器外设﹐用以产生周期性中断、延时或时间测量。
      9.5.2SysTick定时器操作

      在这里插入图片描述
      如表9.6所示,SysTick定时器中存在4个寄存器。CMSIS-Core头文件中定义了一个名为SysTick的结构体,方便对这些寄存器的访问。
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述

      SysTick内部包含一个24位向下计数器,如图9.15所示。它会根据处理器时钟或一个参考时钟信号(在ARM Cortex-M3或Cortex-M4 技术参考手册中也被称作STCLK)来减小计数。参考时钟信号取决于微控制器的实际设计,有些情况下﹐它可能会不存在。由于要检测上升沿,参考时钟至少得比处理器时钟慢两倍。
      在设置控制和状态寄存器的第О位使能该计数器后,当前值寄存器在每个处理器时钟周期或参考时钟的上升沿都会减小。若计数减至0,它会从重加载寄存器中加载数值并继续运行。
      另外一个寄存器为SysTick校准值寄存器。它为软件提供了校准信息。由于CMSIS-Core提供了一个名为SystemCoreClock 的软件变量(CMSIS 1.2 及之后版本可用,CMSIS 1.1或之前版本则使用变量SystemFrequency) ,因此它就未使用SysTick校准值寄存器。系统初始
      化函数SystemInit()函数设置了该变量,而且每次系统时钟配置改变时都要对其进行更新。这种软件手段比利用SysTick校准值寄存器的硬件方式更灵活。
      SysTick寄存器的细节如表9.7~表9.10所示。
      9.5.3使用 SysTick定时器
      若只想产生周期性的SysTick中断,最简单的方法就是使用CMSIS-Core函数 SysTick_Config :
      uint32_t SysTick_Conf ig(uint32_t ticks) ;
      该函数将SysTick 中断间隔设置为ticks,使能计数器使用处理器时钟,然后设置SysTick异常为最低优先级。
      例如,若要在30MHz的时钟频率下产生1kHz的SysTick异常,则可以使用:SysTick_Config(SystemCoreClock / 1000) ;
      变量SystemCoreClock应该存放正确的时钟频率数值,也就是30×10°。另外,只需使用:
      SysTick_Config( 30000) ;
      //30MHz / 1000 = 30000
      SysTick_Handler( void)的触发频率就变成了1kHz。
      若SysTick_Config 函数的输入参数不满足24位重加载数值寄存器(大于0xFFFFFF),SysTick_Config函数返回1,否则会返回0。
      许多情况下,可能会使用参考时钟或者不想使能SysTick 中断,那么就不要使用SysTick_Config 函数。此时需要直接操作 SysTick寄存器,推荐使用下面的流程:
      (1)将0写人 SysTick->CTRL禁止 SysTick定时器。这个操作是可选的。若重用了其他代码,则由于SysTick之前可能已经使能过了,因此本操作是推荐使用的。
      (2)将新的重加载值写入SysTick->LOAD,重加载值应该为周期数减1。
      (3)将任何数值写人SysTick当前值寄存器SysTick->VAL,该寄存器会被清零
      (4)写入 SysTick控制和状态寄存器SysTick->CTRL启动SysTick定时器。
      由于SysTick定时器向下计数到0,因此,若要设置SysTick周期为1000,则应该将重加载值(SysTick->LOAD)设置为999。
      若要在轮询模式中使用SysTick定时器,则可以利用SysTick 控制和状态寄存器(SysTick->CTRL)中的计数标志来确定定时器何时变为0。例如,可以将SysTick定时器设置为特定数值,然后等它变为0,并以此实现延时:
      SysTick-> CTRL = 0;
      /禁止SysTick
      SysTick - > LOAD = OxFF;
      //计数范围255~0 (256个周期)
      SysTick-> VAL = 0 ;
      //清除当前值和计数标志
      SysTick- > CTRL = 5;
      //使能SysTick定时器并使用处理器时钟 5的二进制是0101
      while ( (SysTick - >CTRL & Ox00010000) == 0);//等待计数标志置位
      SysTick - > CTRL= 0 ;
      /!禁止 SysTick
      若要将SysTick中断用作在一定时间后触发的单发操作,则可以将重加载值减小12个周期,以补偿中断等待时间。例如,要使SysTick定时器在300个时钟周期后执行:
      volatile int SysTickFired;
      1/全局软件标志,表示 SysTickAlarm已执行

      SysTick-> CTRL= 0 ;
      /禁止 SysTick
      SysTick -> LOAD = (300-12);
      //设置重加载值,由于异常等待减去12
      SysTick - > VAL=0;
      //将当前值清为0
      SysTickFired = 0;
      //将软件标志设为0
      SysTick - > CTRL= 0x7;
      1/使能SysTick,使能 SysTick异常且使用处理器时钟 0x7=0111
      while (SysTickFired == 0 );
      1/等待SysTick处理将软件标志置位
      在单发SysTick处理中﹐需要禁止SysTick,以防SysTick 异常再次产生。若由于所需的处理任务花费的时间太长而导致挂起状态再次置位﹐则可能还需要清除SysTick 的挂起状态:
      void SysTick_Handler(void)
      // SYSTICK异常处理
      {
      SysTick ->CTRL = Ox0 ;
      /1禁止SysTick
      …;
      //执行所需任务
      SCB->ICSR | = 1 <<25;
      //清除SYSTICK挂起位,防止再次挂起
      sysTickFired++ ;
      //更新软件标志,主程序据此可以知道SysTick
      定时任
      务已执行
      return;
      若同时产生了另一个异常,则 SysTick异常可能会延迟。
      SysTick 定时器可用于时间测量。例如,可以用下面的代码测量一个短函数的持续时间:
      unsigned int start_time,stop_time,cycle_count;
      SysTick - > CTRL= 0 ;
      /I/禁止SysTick
      SysTick - > LOAD =0xFFFFFFFF;
      //将重加载值设置为最大
      SysTick -> VAL= 0 ;
      //将当前值清为0
      SysTick ->CTRL= 0x5;
      /1使能SysTick,使用处理器时钟
      while(SysTick- > VAL != 0);
      //等待SysTick重加载
      start_time = SysTick - > VAL;
      //获取开始时间
      function();
      //执行要测量的函数
      stop_time =SysTick- > VAL;
      1/获取停止时间
      由于SysTick定时器向下计数, start_time的数值比 stop_time要大。可能还需要在时间
      测量的结尾检查一下count_flag。若count_tlag 置位时测则风的NE大了 A旧 t六敝还要能SysTick异常且在SysTick处理中计算SyslicK T效奋恤出的认效。nW川心欢u一考虑SysTick 异常。
      SysTick定时器还提供了一个校准值寄存器。若该信息存在,则SysTick->CALIB寄存
      器的最低24位表示要得到10ms SysTick间隔所需的重加载值。个过,计多似丘润’P开仅有这个信息,TENMS位域读出为0。CMSIS-Core方案则提供」一个表水频平信忌的队什受量,这种方式更加灵活且得到了多数微控制器供应商的支持。
      可以利用 SysTick校准值寄存器的第31位确定参考时钟是否存在。9.5.4其他考虑
      在使用SysTick定时器时需要考虑以下几点:
      . SysTick定时器中的寄存器只能在特权状态下访问。·参考时钟在一些微控制器设计中可能会不存在。
      ·若应用中存在嵌入式OS,SysTick定时器会被OS使用,因此就不能冉放应用在方使用了。
      ·当处理器在调试期间暂停时,SysTick定时器会停止计数。
      ·根据微控制器的实际设计,SysTick定时器可能会在某些休眠模式中停止计数。

/初始化延迟函数
//当使用uoo=的时候,此函数会初始化uco=的时钟节拍7/SYSTICK的时钟固定为AHB时钟的1/8
//sYSCLK:系统时钟频率
void delay_init (u8 sYSCLK)
{
SysTick->CTRL&=~(1<<2);//SYSTICR使用外部时钟源 只操作了第2位
fac_us=SYSCLK/8;//每个us需要的systick时钟数
fac_ms= (u16) fac_us*1000;//每个ns需要的systick时钟数
}
  • 如何初始化I/O

Tip1:硬件编程的基本流程

1、初始化硬件:总线始终初始化,申请区域存放寄存器,配置IO的输出形式,设置IOspeed,是否需要AF(第2功能)

2代码实现及分析

#include "sys tick.h"
#include "led.h"

#define SYS_MAX_CLK 168

int main(void)
{
		Led_init();//初始化LED0
		delay_init(SYS_MAX_CLK);//初始化系统时钟
		while(1)
		{
			LED0_ON;//点亮LED0
			delay_ms(1000);//延时1s
			LED0_OFF;//关闭led
			delay_ms(1000);//延时1s
		}
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/54554.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot(九)jwt + 拦截器实现token验证

前面两篇文章的过滤器和拦截器&#xff0c;我们都提到过可以做诸如权限验证的事情。http/https是无状态的协议&#xff0c;当用户访问一个后端接口时&#xff0c;如何判断该用户有没有权限&#xff1f;当然&#xff0c;可以使用账号密码去验证。但是&#xff0c;如果使用账号和…

统信UOS安装mysql数据库(mariadb)-统信UOS安装JDK-统信UOS安装nginx(附安装包)

统信UOS离线全套安装教程&#xff08;手把手教程&#xff09; 银河麒麟的各种离线全套安装教程&#xff1a; https://blog.csdn.net/ACCPluzhiqi/article/details/131988147 1.统信UOS桌面系统安装mysql&#xff08;mariadb&#xff09; 2.统信UOS桌面系统安装JDK 3.统信UOS桌…

网络出口技术中的单一出口网络结构,你会用吗?

我们在设计一个园区网络的时候&#xff0c;园区网络的出口需要和运营商的网络进行对接&#xff0c;从而提供internet服务。 在和运营商网络对接的时候&#xff0c;一般采用如下3终方式&#xff1a; 单一出口网络结构 1、网络拓扑 终端用户接入到交换机&#xff0c;交换机直…

PostgreSQL-Centos7源码安装

卸载服务器上的pg13 本来是想删除原来的postgis重新源码安装就行,但是yum安装的PostgreSQL不能直接使用,会提示以下问题: 之前服务是用yum安装的,现在需要删除 -- 删除数据的postgis插件 drop extension postgis; drop extension postgis cascade;删除相关安装包 # 查询…

Linux安装操作(Mac版本)

Parallels Desktop的简介 Parallels Desktop是Mac平台上的虚拟机软件&#xff0c;也是Mac平台最好的虚拟机软件之一。它允许用户在Mac OS X系统上同时运行其他操作系统&#xff0c;例如Windows、Linux等。Parallels Desktop为Mac用户提供了使用其他操作系统和软件的便利性&…

shell脚本:使用mysqldump实现分库分表备份

一.什么是分库分表备份 分库分表备份是一种数据库备份策略&#xff0c;用于处理大型数据库系统中的数据分布和备份需求。当数据库的数据量非常大时&#xff0c;单个数据库可能无法满足性能和可扩展性的要求。为了解决这个问题&#xff0c;使用分库分表技术将数据库拆分成多个库…

Centos7 如何用命令直接更改配置文件里面内容

环境&#xff1a; Centos7.7 问题描述&#xff1a; Centos7 如何用命令直接更改配置文件里面内容 ifcfg-bond1文件里面DNS想替换改成114 解决方案&#xff1a; 1.使用sed命令 sed -i -e "s:匹配参数.*:匹配参数替换后的内容:g" 对应的文件路径本案例命令 se…

使用ansible playbook编写lnmp架构

使用ansible playbook编写lnmp架构 - name: nginx playgather_facts: falsehosts: lnmpremote_user: roottasks: - name: stop firewalldservice: namefirewalld statestopped- name: syslinuxcommand: /usr/sbin/setenforce 0ignore_errors: true- name: nginx.repocopy: src/…

Spring Cloud简单记录

1. Spring Cloud是什么 工作这么多年&#xff0c;哈哈。。。没深入理解spring&#xff0c;spring cloud也是没有用过。趁着周末&#xff0c;搞一搞概念&#xff0c;先搞清楚是什么&#xff0c;虽然是什么只有用过之后才能理解的更具体&#xff0c;但是还是需要先整体的熟悉一下…

网站服务器出错的原因分析和解决方法

​  网站在日常运行的过程中&#xff0c;难免会遇见一些问题&#xff0c;这次我们就来分析关于网站服务器出错、服务器异常的原因以及如何解决网站服务器错误的方法。 如何知道是网站服务器的问题呢? 只要网站不能正常访问运行&#xff0c;那么一定会反馈相关的错误代码和原…

3ds Max如何进行合成的反射光泽通道渲染

推荐&#xff1a; NSDT场景编辑器 助你快速搭建可二次开发的3D应用场景 1. 准备场景 步骤 1 打开 3ds Max。smart_phone.max打开已 随教程提供。 打开 3ds Max 步骤 2 按 M 打开材质编辑器。选择空材料 槽。单击漫射通道。它将打开材质/贴图浏览器窗口。选择位图&#xff0…

Ubuntu 离线部署的常见操作

Ubuntu 离线安装的常见操作 **说明&#xff1a;**很多情况下,生产环境都是离线环境&#xff0c;然而开发环境都是互联网的环境&#xff0c;因此部署的过程中需要构建离线安装包; 1. 下载但是不安装 # 例如使用 apt 下载 wireshark 安装包 sudo apt download wireshark # 下载…

【JavaEE】简单了解JVM

目录 一、JVM中的内存区域划分 二、JVM的类加载机制 1、类加载的触发时机 2、双亲委派模型 1.1、向上委派 1.2、向下委派 三、JVM中的垃圾回收机制&#xff08;GC&#xff09; 1、确认垃圾 1.1、引用计数&#xff08;Java实际上没有使用这个方案&#xff0c;但是Pytho…

K8S暴露pod内多个端口

K8S暴露pod内多个端口 一、背景 公司统一用的某个底包跑jar服务&#xff0c;只暴露了8080端口 二、需求 由于有些服务在启动jar服务后&#xff0c;会启动多个端口&#xff0c;除了8080端口&#xff0c;还有别的端口需要暴露&#xff0c;我这里就还需要暴露9999端口。 注&a…

玩转顺序表——【数据结构】

在C语言学习中&#xff0c;我们经常会遇见增删查改等一系列操作&#xff0c;而这些操作全都与线性表关联&#xff0c;没有线性表将会对这些操作完成的十分艰难&#xff01;那今天就让我们来了解一下顺序表如何增删查改&#xff01;&#xff01;&#xff01; 目录 1.线性表 2…

解码“平台工程”,VMware 有备而来

随着全球数字化进程加快&#xff0c;企业使用前沿技术加快商业创新&#xff0c;以提高竞争力。其中如何加快开发效率&#xff0c;为客户创造更多价值成为新的关注焦点。 继DevOps后&#xff0c;“平台工程”&#xff08;Platform Engineering&#xff09; 一词引发热议。平台工…

无涯教程-jQuery - Dialog组件函数

小部件对话框函数可与JqueryUI中的小部件一起使用。对话框是在HTML页面上显示信息的一种不错的方法。对话框是一个带有标题和内容区域的浮动窗口。此窗口可以移动&#xff0c;调整大小&#xff0c;并且默认情况下可以使用" X"图标关闭。 Dialog - 语法 $( "#d…

Qt 4. 发布exe

把ex2.exe放在H盘Ex2文件夹下&#xff0c;执行 H:\Ex2>windeployqt ex2.exe H:\Ex2>windeployqt ex2.exe H:\Ex2\ex2.exe 64 bit, release executable Adding Qt5Svg for qsvgicon.dll Skipping plugin qtvirtualkeyboardplugin.dll due to disabled dependencies (Qt5…

GitHub访问问题与FastGithub下载及使用(详细篇)

目录 FastGithub的介绍 FastGithub的下载 FastGithub的安装及使用 FastGithub的软件功能 FastGithub的部署方式 FastGithub的介绍 FastGithub是一个开源的软件主要为了使GitHub畅通无阻&#xff0c;有超大量的IP资源、快速的IP检测功能&#xff0c;github加速神器&#xf…

android Android Studio Giraffe | 2022.3.1 版本Lombok不兼容 解决方案

android Android Studio Giraffe | 2022.3.1 版本Lombok不兼容 解决方案 1.查看当前的android studio 版本 Android Studio Giraffe | 2022.3.1 Build #AI-223.8836.35.2231.10406996, built on June 29, 2023 2.打开 idea 官网下载页面 idea下载历史版本 找到对应的版本编号…