嵌入式学习<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结构体
c 复制代码
	/*开启时钟*/
	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.输出赋值
c 复制代码
	/*具体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
c 复制代码
#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)了名字;
c 复制代码
typedef unsigned           char uint8_t;
typedef unsigned short     int uint16_t;
typedef unsigned           int uint32_t;
c 复制代码
typedef uint32_t  u32;//兼容老版本
typedef uint16_t u16;
typedef uint8_t  u8;

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

1.开启时钟 & 初始化GPIO结构体
c 复制代码
	/*开启时钟*/
	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.输入读取
c 复制代码
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反转

c 复制代码
//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

相关推荐
@小博的博客1 小时前
C++初阶学习第十弹——深入讲解vector的迭代器失效
数据结构·c++·学习
南宫生2 小时前
贪心算法习题其四【力扣】【算法学习day.21】
学习·算法·leetcode·链表·贪心算法
scan13 小时前
单片机串口接收状态机STM32
stm32·单片机·串口·51·串口接收
懒惰才能让科技进步3 小时前
从零学习大模型(十二)-----基于梯度的重要性剪枝(Gradient-based Pruning)
人工智能·深度学习·学习·算法·chatgpt·transformer·剪枝
love_and_hope3 小时前
Pytorch学习--神经网络--搭建小实战(手撕CIFAR 10 model structure)和 Sequential 的使用
人工智能·pytorch·python·深度学习·学习
Chef_Chen3 小时前
从0开始学习机器学习--Day14--如何优化神经网络的代价函数
神经网络·学习·机器学习
芊寻(嵌入式)3 小时前
C转C++学习笔记--基础知识摘录总结
开发语言·c++·笔记·学习
hong1616884 小时前
跨模态对齐与跨领域学习
学习
Mortal_hhh4 小时前
VScode的C/C++点击转到定义,不是跳转定义而是跳转声明怎么办?(内附详细做法)
ide·vscode·stm32·编辑器
阿伟来咯~4 小时前
记录学习react的一些内容
javascript·学习·react.js