IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 物联网单片机基础项目-3(时钟树与GPIO) -> 正文阅读

[嵌入式]物联网单片机基础项目-3(时钟树与GPIO)

1. 时钟系统

为什么要有时钟系统?

  1. 为了统一管理,比如单片机内部外设比如GPIO、TIM等等统一口号
  2. 为了节能,现在芯片越来越注重低功耗,因此在一个单片机系统中如果希望某些器件工作快一点就把它的频率设置高一点,反之就设置低一点。

1.1 时钟树图

数据手册
在这里插入图片描述
在这里插入图片描述

1.2 配置时钟

使用CUBEMAX配置时钟可视化非常方便,值得注意的是,这里的时钟初始化配置的只是总线上的时钟,外设的时钟并没有打开,当我们使用对应的外设的时候还需要打开对应外设的时钟。

2. GPIO

在这里插入图片描述

2.1 GPIO模式

  • 推挽输出
    这个模式提高反应速度,当输出控制输出高电平时,PMOS导通,I/O口高电平。当输出控制低电平的时候,NMOS导通,I/O锁定在低电平。
    在这里插入图片描述

  • 开漏输出
    这个好处一是可以提高I/O的驱动外部负载的能力,二是可以实现电平的转换
    在这里插入图片描述

  • 复用推挽输出
    ](https://img-blog.csdnimg.cn/0cffda871ee7403abeed5aa276be2fbd.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBALeaZrumAmuS6ui0=,size_20,color_FFFFFF,t_70,g_se,x_16)

  • 输入上拉模式
    这个模式用于比如读取外部按键的电平,如果没有这个上拉电阻电平就会不稳定,这个上拉电阻就会稳定的高电平。
    在这里插入图片描述

  • 输入下拉模式

  • 输入模拟模式
    绕过肖特基二极管(整理波形的作用),直接读取I/O口电平。

  • 输入复用模式

代码

GPIO初始化

/**
  * @brief GPIO Initialization Function
  * @param None
  * @retval None
  */
static void MX_GPIO_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOD_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);

  /*Configure GPIO pin : PA0 */
  GPIO_InitStruct.Pin = GPIO_PIN_0;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  /*Configure GPIO pin : PA1 */
  GPIO_InitStruct.Pin = GPIO_PIN_1;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

}

执行任务

  while (1)
  {
    /* USER CODE END WHILE */
		//任务1:闪灯
		HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);
		HAL_Delay(5000);
		HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);
		HAL_Delay(5000);
		
		//任务2:按键点灯
		if(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0))
		{
			/* 按键消抖 */
			HAL_Delay(10);
			
			if(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0))
			{
				HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);
			}
			else
			{
				HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);
			}
		}

    /* USER CODE BEGIN 3 */
  }

这里任务1和任务2时间上会有冲突,因为这是一个死循环,当执行1的时候就执行不了2.这就是单片机轮询的缺点,可能和其他任务冲突,优点是简单,新手也可以看懂。

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-03-16 22:35:59  更:2022-03-16 22:41:39 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 6:39:12-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码