嵌入式学习<1>:建立工程、GPIO和keil仿真

news2024/11/24 14:10:00

嵌入式学习_part1

本部分笔记用于学习记录,笔记源头 >>b站江科大_STM32入门教程_新建工程

建立工程、GPIO

开发环境:keil MDK、STM32F103C8T6

1 )建立工程

(1)基于寄存器开发、基于标准库 或者 基于HAL库开发;

(2)下载ST公司的标准库文件; ST外设标准库下载链接

1.添加 start 文件

1.1 添加文件
内核寄存器配置信息:core_cm3.c / core_cm3.h
外设寄存器配置信息:startup_stm32f10x_md.s (启动文件)
 				stm32f10x.h(外设寄存器配置文件)
                system_stm32f10x.h / system_stm32f10x.c (时钟配置文件)

在这里插入图片描述

1.2 添加文件路径

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

1.3 设置字体大小(color & font)

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

1.4 其他设置

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

2.添加 library 文件

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

3.添加 User 文件

main文件:主逻辑实现
stm32f10x_conf.h:库函数的头文件包含关系
stm32f10x_it.c / stm32f10x_it.h :中断处理函数...ST公司给提供的接口

stm32f10x.h 中有个选择编译 :
在这里插入图片描述
在这里插入图片描述

4.启动文件.S的选择

在这里插入图片描述

5.新建工程的步骤总结

在这里插入图片描述

6.框架

在这里插入图片描述

2 )GPIO

b站江科大_STM32入门教程_GPIO

1.GPIO的功能

配置:8种输入输出模式
引脚电平:0~3.3v, 部分容忍5v(FT:数据手册里面的引脚定义)
时钟:APB2总线
引脚:0~15

在这里插入图片描述

用途:1.普通IO口;
     2.复用功能:ADC、EXIT、TIM、PWM、USART等协议;

在这里插入图片描述

2.GPIO的基本结构

保护二极管:0~3.3v,超过这个区间,电流流过二极管,不过电路;
输入部分:1.VDD上拉电阻(高阻态),弱上拉;
        2.VSS下拉电阻(高阻态),强下拉;
       3.施密特触发器,高低两个阈值,大于高阈值为“1”,低于低阈值为“0”,高低阈值中间的无变化;
       4.模拟输入,ADC ; 复用功能输入,USART_RX / EXIT;
       5.输入数据寄存器,高16位“保存”,只用低16位;
输出部分: 1.输出数据寄存器,高16位“保存”,只用低16位;
		 2.复用功能输出,TIM / PWM / USART_TX;
		 3.推免模式,P_MOS开,N_MOS开,高/低电平都具有驱动能力;
		 4.开漏模式,P_MOS关,N_MOS开,高电平呈现高阻态, 低电平具有驱动能力;

在这里插入图片描述

3.GPIO的8种模式

在这里插入图片描述

3)GPIO的代码实现

1.keilkill

处理中间文件,当你将代码发送给别人时,缩小文件大小

在这里插入图片描述

2.GPIO作为输出(推挽 / 开漏)

1.开启时钟 & 初始化GPIO结构体
	/*开启时钟*/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	//开启GPIOA的时钟
	
	/*GPIO初始化*/
	GPIO_InitTypeDef GPIO_InitStructure;//定义结构体变量
	
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;		//GPIO模式,赋值为推挽输出模式
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;				//GPIO引脚,赋值为第0号引脚
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		//GPIO速度,赋值为50MHz
	
	GPIO_Init(GPIOA, &GPIO_InitStructure);					//将赋值后的构体变量传递给GPIO_Init函数
															//函数内部会自动根据结构体的参数配置相应寄存器
															//实现GPIOA的初始化
2.输出赋值
	/*具体IO口引脚的赋值*/
	GPIO_ResetBits(GPIOA, GPIO_Pin_0);// 输出"0"
	GPIO_SetBits(GPIOA, GPIO_Pin_0);// 输出"1"
	GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_RESET);// 输出"0"
	GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_SET);// 输出"1"
	
	/*GPIOx_0~15同时赋值*/
	GPIO_Write(GPIOA, 0x01);//操作的GPIOx->ODR = PortVal;
3.延时函数
放在System -> Delay.c/ Delay.h
#include "stm32f10x.h"

/**
  * @brief  微秒级延时
  * @param  xus 延时时长,范围:0~233015
  * @retval 无
  */
void Delay_us(uint32_t xus)
{
	SysTick->LOAD = 72 * xus;				//设置定时器重装值
	SysTick->VAL = 0x00;					//清空当前计数值
	SysTick->CTRL = 0x00000005;				//设置时钟源为HCLK,启动定时器
	while(!(SysTick->CTRL & 0x00010000));	//等待计数到0
	SysTick->CTRL = 0x00000004;				//关闭定时器
}

/**
  * @brief  毫秒级延时
  * @param  xms 延时时长,范围:0~4294967295
  * @retval 无
  */
void Delay_ms(uint32_t xms)
{
	while(xms--)
	{
		Delay_us(1000);
	}
}
 
/**
  * @brief  秒级延时
  * @param  xs 延时时长,范围:0~4294967295
  * @retval 无
  */
void Delay_s(uint32_t xs)
{
	while(xs--)
	{
		Delay_ms(1000);
	}
} 

3.C语言的数据类型

单片中通常存放整数,而不是 char 字符型,所以c语言和ST重新定义(typedef)了名字;

在这里插入图片描述

typedef unsigned           char uint8_t;
typedef unsigned short     int uint16_t;
typedef unsigned           int uint32_t;
typedef uint32_t  u32;//兼容老版本
typedef uint16_t u16;
typedef uint8_t  u8;

4.GPIO作为输入(上拉 / 下拉 / 浮空 / 模拟)

1.开启时钟 & 初始化GPIO结构体
	/*开启时钟*/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);		//开启GPIOB的时钟
	
	/*GPIO初始化*/
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_11;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure);						//将PB1和PB11引脚初始化为上拉输入
2.输入读取
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);

5.GPIO反转

//GPIO反转,用于点灯
void GPIO_Toggle(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->ODR ^= GPIO_Pin;
}

4)keil仿真

keil仿真之示波器的使用

1.Debug的设置

SARMCM3.DLL
DARMSTM.DLL
TARMSTM.DLL
-pSTM32F103C8

在这里插入图片描述

2.setup设置,仿真输出的引脚

GPIOB_IDR.11

在这里插入图片描述

在这里插入图片描述

3.RUN

在这里插入图片描述

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

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

相关文章

学习网络需要认识的各种设备

网桥(bridge) 网桥工作在数据链路层,可以把多个局域网连接起来,组成一个更大的局域网 以太网中,数据链路层地址就是mac地址,网桥与集线器的区别就是,网桥会过滤mac,只有目的mac地址…

财务管理|基于SprinBoot+vue的财务管理系统(源码+数据库+文档)

财务管理系统 目录 基于SprinBootvue的财务管理系统 一、前言 二、系统设计 三、系统功能设计 系统功能实现 1管理员功能模块 2员工功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: 博主介绍&#xff1…

Word设置代码块格式

前言 Word中无法像Markdown和LaTeX一样插入代码块,若要在Word中插入代码块可以手动设置代码块格式或自动粘贴代码块格式。若不追求完美高亮效果,可使用前者方案;若追求完美的高亮效果,可使用后者方案。下文介绍这2种方案。 手动…

同时安装多个nodejs版本可切换使用,或者用nvm管理、切换nodejs版本(两个详细方法)

目录 一.使用nvm的方法: 1.卸载nodejs 2.前往官网下载nvm 3.安装nvm 4.查看安装是否完成 5.配置路径和淘宝镜像 6.查看和安装各个版本的nodejs 7.nvm的常用命令 二.不使用nvm,安装多个版本: 1.安装不同版本的nodejs 2.解压到你想放…

生信技能45 - 基于docker容器运行生信软件

1. 获取docker镜像 以运行xhmm CNV分析软件为例。 # 搜索仓库镜像 sudo docker search xhmm# 拉取镜像 sudo docker pull ksarathbabu/xhmm_v1.0# 启动镜像,非后台 sudo docker run -it ksarathbabu/xhmm_v1.0 /bin/bash # -i: 交互式操作。 # -t: 终端。 # ksarathbabu/xhmm…

鲁棒控制:鲁棒性能

鲁棒控制(Robust Control)是一种控制系统设计方法,其目标是使控制系统在面临参数摄动、外部干扰、建模误差等不确定性因素时,仍能够保持其期望的性能特性。鲁棒性是指控制系统在一定(结构,大小)…

分布式光伏管理平台功能介绍

一、项目管理系统 1、关键信息:板块化展现项目关键信息,包含所在区域、屋面类型、未来25年发电量、累计收益等信息。 (1) 可迅速获取项目核心要点 (2) 及时跟进修改,凸显项目信息 (3) 项目信息清晰展现,了解整体项目流程 2、项…

QQ超大文件共享(别用,传进去后,压缩都显示不出来,LJ qq!)(共享文件)

文章目录 需要共享双方同时在线开启方法第一次会提示设置默认共享目录&#xff0c;默认是E:\QQFileShare\<qq号>\&#xff1a;然后新建共享会在其后创建共享目录&#xff0c;共享目录中只能共享文件。需要点击添加文件&#xff0c;直接把文件拷贝到目录里好像还不行&…

激光雷达在智能自动装车系统中的关键技术

智能自动装车系统是现代物流领域的重要发展方向之一&#xff0c;而激光雷达作为其中的关键技术之一&#xff0c;发挥着至关重要的作用。 一、激光雷达在智能自动装车系统中的关键技术 三维点云处理&#xff1a;激光雷达通过获取目标车辆的三维点云数据&#xff0c;可以构建出…

从零入门激光SLAM(十三)——LeGo-LOAM源码超详细解析4

大家好呀&#xff0c;我是一个SLAM方向的在读博士&#xff0c;深知SLAM学习过程一路走来的坎坷&#xff0c;也十分感谢各位大佬的优质文章和源码。随着知识的越来越多&#xff0c;越来越细&#xff0c;我准备整理一个自己的激光SLAM学习笔记专栏&#xff0c;从0带大家快速上手激…

六一儿童节活动方案策划怎么写?

六一儿童节活动方案策划不难&#xff0c;一般看前人策划的案例就可以仿写一篇充满创意的儿童节活动方案。 当然&#xff0c;你也可以照着下面的模版直接写&#xff1a; 成年人的时间是离弦的箭 向着目标,一往无前 孩子的时间是旋转木马 载着今天和明天转啊转啊圈圈 成年人…

互联网轻量级框架整合之SpringIoC概念详解

在之前的几篇文字中说道容器的概念&#xff0c;实际上Spring也是基于容器的理念&#xff0c;之所以如此成功并不是因为很先进的技术&#xff0c;而是因为理念&#xff0c;其中核心便是IoC(控制反转)&#xff0c;AOP(面向切面编程)&#xff0c;其中IoC是Spring的基础&#xff0c…

idea使用前的全局配置,一次配置,多次使用

前提&#xff1a;每次导入一个新的项目&#xff0c;就需要重新设置编码、maven、jdk、git版本等信息。实际每个项目所用到的配置信息是一致的&#xff0c;除非换一家公司&#xff0c;不然不会改动到这些内容。 idea版本&#xff1a;2024.1.1 1.1、全局Maven配置 IDEA启动页面…

ARTS Week 26

Algorithm 本周的算法题为 35. 搜索插入位置 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 示例 1:输入: nums [1,…

自然资源-地质勘查工作的流程梳理

自然资源-地质勘查工作的流程梳理 地质勘查从广义上可理解为地质工作&#xff0c;地质队员就好像是国家宝藏的“寻宝人”&#xff0c;通过地质勘查&#xff0c;为国家找矿&#xff0c;以保障国家能源资源安全和服务国计民生&#xff0c;发挥着地质工作在国民经济建设中的基础性…

【Linux】Centos7配置JDK

1.启动虚拟机、Xshell、Xftp 2.在Xshell中新建一个会话&#xff0c;用于连接到虚拟机中 3.因为虚拟机里自带有JDK&#xff0c;所以需要先卸载自带的JDK 3.1.查询已安装的 jdk 列表 rpm -qa | grep jdk3.2.将查询到的全部删除 yum -y remove XXX&#xff08;上面查询到的 j…

25岁软件工程师:19岁创业,25岁创建自己的工作室,谈一下我对创业的一点思考。

文章目录 &#x1f95d;About Me&#x1f3c0;关于工作室✅我对创业思考 大家好哈&#xff0c;欢迎查看工程师令狐本期节目。这篇文章主要是一篇回忆复盘总结文&#xff0c;复盘总结刚上大学到走向工作这段经历&#xff0c;自己的感悟、感想与收获&#xff0c;期望对读者有所帮…

java.lang.NoSuchMethodException: com.ruoyi.web.controller.test.bean.HeadTeacher

软件开发过程中使用Java反射机制时遇到了下面的问题 com.ruoyi.web.controller.test.bean.HeadTeacher4b9af9a9 com.ruoyi.web.controller.test.bean.HeadTeacher4b9af9a9java.lang.NoSuchMethodException: com.ruoyi.web.controller.test.bean.HeadTeacher.<init>(java…

【网络】gateway 可以提供的一些功能之三 “ 支持Eureka服务发现 ”

一、Eureka是干什么的 Eureka就像是一个电话簿&#xff0c;但是用来存储和管理各种微服务的地址信息。它帮助微服务之间相互发现和交流&#xff0c;就像你想找某人电话号码一样&#xff0c;只需查看电话簿就能找到他们的联系方式。Eureka也可以帮助系统在服务出现问题时自动发现…

C++反汇编——多态,面试题01

文章目录 1.C的三大特性1.1封装1.2继承1.3多态1.3.1 虚函数1.3.2 多态代码反汇编分析。反汇编分析1——基类指针指向子类对象&#xff0c;构造过程。反汇编分析2——基类指针指向子类对象&#xff0c;调用虚函数getPrice()过程。反汇编分析3——基类对象&#xff0c;调用虚函数…