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

嵌入式学习_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.mfbz.cn/a/610634.html

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

相关文章

【Linux】编写一个简易的shell

思维导图 学习目标 将简易的shell代码进行编写。 一、阐述shell的基本思路 在进程程序替换中,我们可以将一个指令交给子进程,让子进程去完成这个指令。如果这个命令是一个内建命令,我们需要将这个命令交给bash进行处理。 大致思路是&#xf…

语言基础 /CC++ 可变参函数设计与实践,变参函数的实现、使用、替代方法

文章目录 概述适用于做可变参数的数据类型格式化字符串输出用int做变长参数类型用结构体指针做变长参数类型用double做变长参数类型用结构体直接做变长参数类型 变参函数与宏定义符号 ... 不能透传符号 ... 不接受ap做参数_VA_ARGS_ 代表可变参数 回调可变参数函数取代变参函数…

【数据库原理及应用】期末复习汇总高校期末真题试卷05

试卷 一、选择题 1.( )是存储在计算机内有结构的数据的集合。 A.数据库系统 B.数据库 C.数据库管理系统 D.数据结构 2.数据库的三级模式结构中,数据库对象—视图是( ) A.外模式 B.内模式 C.存储模式 D.模式 3.在下列关于关系表的陈述中,错误的是(…

Zabbix监控中文乱码问题解决方法

一、问题描述 1.查看Zabbix仪表盘 在Zabbix的监控仪表盘界面,字体显示为“方框”,无法查看到具体的性能指标名称。 2.问题分析 Zabbix的web端没有中文字库,导致切换到中文页面,中文成了乱码这个问题,我们最需要把中文…

使用LlamaIndex构建能对文档进行推理;大模型自动执行基于浏览器的工作流;ElevenLabs宣布进军音乐创作领域

✨ 1: Building Agentic RAG with LlamaIndex 由Jerry Liu教授、专注于使用LlamaIndex构建能对文档进行推理和回答复杂问题的代理研究型RAG的新课程 我很高兴向大家介绍“使用(RAG)与Llamalndex构建主动性研究助理代理”的课程,这是由Llama…

XSS-Labs 靶场通过解析(下)

前言 XSS-Labs靶场是一个专门用于学习和练习跨站脚本攻击(XSS)技术的在线平台。它提供了一系列的实验场景和演示,帮助安全研究人员、开发人员和安全爱好者深入了解XSS攻击的原理和防御方法。 XSS-Labs靶场的主要特点和功能包括:…

关联系统-整车控制器VCU

整车驱动原理 如上图所示,电池组输出直流电给DC/AC逆变器,逆变器将直流电转化为交流电输入给电机,电机在电磁力的作用下转动,通过传动机构将驱动力输送到车轮,其中整车控制器VCU可以根据用户油门/刹车的输入控制输出功…

国际化业务、全球化团队沟通难?浅析跨文化沟通的挑战和应对措施

在全球化背景下,发展出海业务相比以往更具有巨大的前景和潜力,是企业寻找“第二增长点”和提升综合实力的优先选择。近几年“中企出海”大热,中国企业在世界各地开展业务拓展国际市场,获得更加国际化的营商经验与客户资源。与此同…

【数据结构】单链表和双链表

文章目录 一、链表的概念及结构二、链表的分类三、无头单向非循环链表1.单链表创建2.尾插和头插3.尾删和头删4.打印5.查找6.插入7.删除8.销毁 四、带头双向循环链表1.双链表的创建2.初始化3.判断链表是否为空4.尾插和头插5.尾删和头删6.查找7.插入8.删除9.销毁 五、总结链表和顺…

《窄门》安德烈·纪德

究竟会不会有这样一种爱情,即使毫无希望,一个人也可以将它长久地保持在心中;即使生活每天吹它,也始终无法把它吹灭……? 在《窄门》中,纪德将爱情中的神秘主义体验推向极致,为我们讲述了一段纯…

C语言(指针)3

Hi~!这里是奋斗的小羊,很荣幸各位能阅读我的文章,诚请评论指点,关注收藏,欢迎欢迎~~ 💥个人主页:小羊在奋斗 💥所属专栏:C语言 本系列文章为个人学习笔记&#x…

YOLOv9改进策略 | 添加注意力篇 | 利用YOLO-Face提出的SEAM注意力机制优化物体遮挡检测(附代码 + 修改教程)

一、本文介绍 本文给大家带来的改进机制是由YOLO-Face提出能够改善物体遮挡检测的注意力机制SEAM,SEAM(Spatially Enhanced Attention Module)注意力网络模块旨在补偿被遮挡面部的响应损失,通过增强未遮挡面部的响应来实现这一目…

链表第4/9题--翻转链表--双指针法

LeetCode206:给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 示例 1: 输入:head [1,2,3,4,5] 输出:[5,4,3,2,1]示例 2: 输入:head [1,2] 输出:[2,1]示例…

鸿蒙OpenHarmony开发板解析:【特性配置规则】

特性 特性配置规则 下面介绍feature的声明、定义以及使用方法。 feature的声明 开发前请熟悉鸿蒙开发指导文档:gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。 在部件的bundle.json文件中通过feature_list来声明部件的feature列…

生信技能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…

爆爽,英语小白怒刷 50 课!像玩游戏一样学习英语~

重点!!!(先看这) 清楚自己学英语的目的, 先搞清楚目标,再行动自身现在最需要的东西:词汇量?口语?还是阅读能力?找对应的书籍,学习资料往兴趣靠拢:网上有大量的推荐美剧学习、小说学习,不要被他…

机器学习算法应用——K近邻分类器(KNN)

K近邻分类器(KNN)(4-2) K近邻分类器(K-Nearest Neighbor,简称KNN)是一种基本的机器学习分类算法。它的工作原理是:在特征空间中,如果一个样本在特征空间中的K个最相邻的样…

【一刷《剑指Offer》】面试题 17:合并两个排序的链表

力扣对应题目链接:21. 合并两个有序链表 - 力扣(LeetCode) 核心考点:链表合并。 一、《剑指Offer》内容 二、分析题目 这道题的解题思路有很多: 可以一个一个节点的归并。可以采用递归完成。 三、代码 1、易于理解的…

Linux-基础命令第三天

1、命令:wc 作用:统计行数、单词数、字符数 格式:wc 选项 文件名 例: 统计文件中的行数、单词数、字符数 说明:59代表行数,111代表单词数,2713代表字符数,a.txt代表文件名 选项…

c语言查找字符串中指定字符串的个数

目录 一、测试思路二、方式1三、方式2 一、测试思路 使用C语言来查找一个字符串中指定数量的子字符串&#xff0c;使用 strncmp 函数或者 memcmp 函数&#xff0c;遍历主字符串并计数子字符串出现的次数。或者使用 strstr 函数&#xff0c; strstr 函数是 C 语言标准库 <str…
最新文章