物联网|可变参数的使用技巧|不一样的点灯实验|访问外设的寄存器|操作寄存器实现点灯|硬件编程的基本流程-学习笔记(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 168int main(void)
{Led_init();//初始化LED0delay_init(SYS_MAX_CLK);//初始化系统时钟while(1){LED0_ON;//点亮LED0delay_ms(1000);//延时1sLED0_OFF;//关闭leddelay_ms(1000);//延时1s}
}

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTML5+CSS3小实例:带标题的3D多米诺人物卡片

实例:带标题的3D多米诺人物卡片 技术栈:HTML+CSS 效果: 源码: 【html】 <!DOCTYPE html> <html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"><meta name="viewport" content…

【信号去噪】基于马氏距离和EDF统计(IEE-TSP)的基于小波的多元信号去噪方法研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Linux 终端生成二维码

1、安装qrencode [rootnode1 script]# yum -y install qrencode2、输出正常的 [rootnode1 aihuidi]# echo https://blog.csdn.net/weixin_43822878?t1|qrencode -o - -t utf83、输出彩色的 [rootnode1 aihuidi]# qrencode -t utf8 -s 1 https://blog.csdn.net/weixin_4382…

魔法上网端口号被占用通过端口号找到进程并且杀掉进程随笔

Windows11系统由于魔法上网被异常关闭导致再次启动的时候报出端口号被占用问题记录以前忘记的通过端口杀掉进程相关操作。 在命令行&#xff08;winr,输入cmd&#xff09;中输入: netstat -ano 可以看到本机正在使用的ip地址和端口号如图&#xff1a; 在命令行&#xff08;wi…

算法题--找规律(构建乘积数组、剪绳子、圆圈中最后剩下的数字)

目录 找规律 构建乘积数组 原题链接 解析 核心思想 答案 剪绳子 原题链接 解析 核心思想 答案 圆圈中最后剩下的数字 原题链接 解析 核心思想 答案 找规律 需要通过列举多个示例&#xff0c;从多个示例的输入到输出中得到规律去普遍化。 构建乘积数组 给定…

【娱乐圈明星知识图谱2】信息抽取

目录 1. 项目介绍 2. 信息抽取介绍 3. ChatGPT 信息抽取代码实战 4. 信息抽取主逻辑 5. 项目源码 1. 项目介绍 利用爬虫项目中爬取的大量信息 【娱乐圈明星知识图谱1】百科爬虫_Encarta1993的博客-CSDN博客娱乐圈明星知识图谱百度百科爬虫百度百科爬虫百度百科爬虫百度百…

redisson分布式锁学习

什么是分布式锁? 当有多个线程并发访问同一共享数据时,如果多个线程同时都去修改这个共享数据,且修改操作不是原子操作,就很有可能出现线程安全问题&#xff0c;而产生线程安全问题的根本原因是缺乏对共享数据访问的同步和互斥。 为了解决这个问题&#xff0c;通常我们的做法…

【Golang 接口自动化07】struct转map的三种方式

目录 背景 struct转map 使用json模块 使用reflect模块 使用第三方库 测试 总结 资料获取方法 背景 我们在前面介绍过怎么使用net/http发送json或者map数据&#xff0c;那么它能不能直接发送结构体数据呢&#xff1f;我们今天一起来学习结构体struct转map的三种方法&am…

PHM的设备故障模型如何构建?

预测性维护与健康管理&#xff08;Prognostics Health Management&#xff0c;PHM&#xff09;是现代工业中的一个关键概念&#xff0c;它旨在通过使用数据和先进的分析技术&#xff0c;实现设备故障的早期预测和预防&#xff0c;从而最大限度地提高设备的可用性和可靠性。而在…

如何运行疑难解答程序来查找和修复Windows 10中的常见问题

如果Windows 10中出现问题&#xff0c;运行疑难解答可能会有所帮助。疑难解答人员可以为你找到并解决许多常见问题。 一、在控制面板中运行疑难解答 1、打开控制面板&#xff08;图标视图&#xff09;&#xff0c;然后单击“疑难解答”图标。 2、单击“疑难解答”中左上角的…

大牛练成记:用JavaScript徒手写出一个日期选择插件

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;全栈领域新星创作者✌&#xff0c;阿里云社区专家博主&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;本文已收录于专栏&#xff1a;100个JavaScript的小应用。 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收…

【C语言】初识指针

【C语言】初识指针 一、指针是什么&#xff1f;二、指针和指针类型1. 指针-整数2. 指针的解引用三、野指针1.野指针成因2 .如何规避野指针四、指针运算五、二级指针七、指针数组 &#x1f388;个人主页&#xff1a;库库的里昂&#x1f390;CSDN新晋作者&#x1f389;欢迎 &…

ansible安装及rhel8仓库配置

目录 一、本地仓库 问题&#xff1a; 解决&#xff1a; 1.创建一个仓库&#xff1a; 内容&#xff1a; 2.挂载&#xff1a; 挂载&#xff1a; 测试&#xff1a; 3.或者直接使用阿里云的源 二.配置ansible仓库 1.下载&#xff1a; 2.检查 一、本地仓库 问题&#xff1a; 当…

vue3+uniapp自定义tabbar

首先把tabbar中的元素写在一个list中用v-for进行渲染 用一个interface进行定义接口&#xff0c;这样别人在review你的代码就可以清晰知道你的tabbar包含什么元素。 利用typescript特性进行类型定义&#xff0c;可以省去很多麻烦 import { reactive } from "vue" imp…

docker快速入门

文章目录 简介&#xff1a;组成&#xff1a;安装&#xff1a;运行&#xff1a;原理&#xff1a;常用命令&#xff1a;1.帮助启动类命令2.镜像命令3.容器命令4.命令交互图5.将镜像打包发布到阿里云1.将本地容器制作为镜像2.登录阿里云3.创建个人实例4.创建镜像仓库5.将镜像推送到…

马上解锁 StarRocks 存算分离,降本增效无需等!

StarRocks 于 4 月底正式发布了 3.0 版本&#xff0c;该里程碑版本带来了大家期盼已久的新特性--存算分离。此新功能一推出&#xff0c;立即受到社区热情追捧&#xff0c;用户纷纷开始在自己的业务中评估和测试存算分离效果。从芒果TV、聚水潭、网易邮箱、浪潮、天道金科等数十…

桥接模式——处理多维度变化

1、简介 1.1、概述 桥接模式是一种很实用的结构型设计模式。如果软件系统中某个类存在两个独立变化的维度&#xff0c;通过该模式可以将这两个维度分离出来&#xff0c;使两者可以独立扩展&#xff0c;让系统更加符合单一职责原则。与多层继承方案不同&#xff0c;它将两个独…

游戏APP开发:创新设计的秘诀

在游戏 APP开发中&#xff0c;创新设计是游戏开发公司的一大追求&#xff0c;为了可以为用户带来更好的游戏体验&#xff0c;这就需要对游戏 APP开发进行创新设计。那么&#xff0c;游戏 APP开发中的创新设计是什么呢&#xff1f;接下来&#xff0c;我们就一起来看看吧。 想要…

mongodb docker 及常用命令

MongoDB属于非关系型数据库&#xff0c;它是由C编写的分布式文档数据库。内部使用类似于Json的bson二进制格式。 中文手册 https://www.w3cschool.cn/mongodb/ 安装 https://www.mongodb.com/try/download/community 二进制安装可见另一篇&#xff1a; centos7 mongodb 4.0.28…

SSL原理详解

SSL协议结构&#xff1a; SSL协议分为两层&#xff0c;下层为SSL记录协议&#xff0c;上层为SSL握手协议、SSL密码变化协议和SSL警告协议。 1.下层为SSL记录协议&#xff0c;主要作用是为高层协议提供基本的安全服务 建立在可靠的传输之上&#xff0c;负责对上层的数据进行分块…