首页 > 其他分享 >1.基础知识

1.基础知识

时间:2024-07-15 12:51:23浏览次数:8  
标签:文件 定义 .. 基础知识 地址 寄存器 外设

单片机:Single-Chip Microcomputer,单片微型计算机,是一种集成电路芯片

CPU:CPU
内存:SRAM
硬盘:FLASH
主板:外设

仪器仪表:电源/示波器/焊台
家用电器:空调/冰箱/洗衣机
工业控制:机器人/PLC/电梯
汽车电子:GPS/ABS/胎压监测

:数据与程序储存在同一存储器,分时复用

CoreMark分数:https://www.eembc.org/coremark/scores.php
ARM公司官网:https://www.arm.com/
ARM开发者官网:https://developer.arm.com/

STM32:
ST:意法半导体  M:MCU/MPU  32:32位
ST累计推出了:5大类、18个系列、1000多个型号的Cortex内核微控制器
ST中文社区网:https://www.stmcu.org.cn 
ST官网: https://www.st.com
正点原子论坛:www.openedv.com/forum.php
STM32 主要分两大块, MCU 和 MPU, MCU 不能跑 Linux,而 MPU可以跑 Linux。

芯片的基本参数:
1,主频/FLASH/SRAM
2,工作电压/最大电流
3,IO引脚接入电压范围
4,单个IO引脚最大电流

最小系统:电源、复位、启动、晶振、调试     电源:         VDD/VSS         VDDA/VSSA:模拟部分供电         VREF+/VREF- :给内部 ADC/DAC 提供参考电压         VBAT:给RTC和后备区域供电。     复位:         NRST:低电平复位     启动:         BOOT0/BOOT1:启动选择引脚,一般接下拉电阻     晶振:         OSC_IN /OSC_OUT:外部 HSE 晶振,提供高精度系统时钟         OSC32_IN /OSC32_OUT:外部 LSE 晶振,给内部 RTC 提供时钟     调试:         SWCLK/SWDIO   IO分配: IIC:     IIC_SCL、IIC_SDA SPI :     SPI_CS、MOSI、MISO、SCK TIM:     TIM_CH1/2/3/4、ETR/1N/2N/3N、BKIN 等 USART、UART:     USART 有 USART_TX/RX/CTS/RTS/CK 信号     UART 有 UART_TX/RX 两个信号     U(S)ART_TX、U(S)ART_RX USB :     USB_DP 和 USB_DM CAN:     CAN_RX 和 CAN_TX。 ADC :     ADC_IN0 ~ ADC_IN15 DAC :     DAC_OUT1 、DAC_OUT2 SDIO :     SDIO_D0/1/2/3、SCK、CMD FSMC:     FSMC_D0~15/A0~25/ NBL0~1/NE1~4/NCE2~3/NOE/NWE/NWAIT/CLK 等   集成开发环境(IDE)     MDK--Keil     EWARM--IAR 仿真器:     DAP--ARM:免驱动     STLINK--ST      JLINK--Segger 串口调试助手:     XCOM--正点原子     SSCOM--丁丁

获取MDK:
MDK安装 = MDK软件安装 + 器件支持包
MDK软件下载:https://www.keil.com/download/product
器件支持包下载:https://www.keil.com/dd2/pack/
拷贝下载算法到Flash文件夹,如 D:\MDK5.34\ARM\Flash(可选)
安装CH340 USB虚拟串口驱动,数据线插入开发板中

程序在Projects\MDK-ARM中

I/O :表示输入/输出引脚

编译结果看:Build Output窗口
数据类型:占用Flash or SRAM:说明
Code:表示代码大小
RO-Data:表示只读数据所占的空间大小,一般是指 const 修饰的数据大小。
RW-Data:初值为非 0的可读可写数据
ZI-Data:初值为0 的可读可写数据
FLASH占用:Code+RO+RW
SRAM占用:RW+ZI

hex文件在Output中

STM32 常见的下载方式有三种: 串口下载: BOOT0 接 3.3V、 BOOT1 接 GND、按复位 SWD 下载:直接下载,特殊情况需 BOOT0接 3.3V,按复位 JTAG 下载:直接下载,特殊情况需 BOOT0接 3.3V,按复位

利用串口给 STM32 下载代码:
USB_UART 通过 USB 线连接电脑->电源灯亮起(蓝色)->USART1的 RXD、PA9,TXD 、PA10通过跳线帽连接->BOOT0、GND,BOOT1、GND通过跳线帽连接->按一下复位按键->使用上位机软件下载代码->双击打开 ATK-XISP->波特率推荐设置为 76800->选择 DTR 的低电平复位,RTS 高电平进 BootLoader->下载成功后,会有“共写入 xxxxKB,进度 100%,耗时 xxxx 毫秒”

使用 DAP 下载与调试程序:

DAP 通过 USB 线连接电脑,通过 20P 灰排线连接开发板->开发板供电->
打开MDK IDE:
魔术棒->Debug->use: CMSIS-DAP Debugger->勾选Run to main->
点击 Settings->Port:SW->Max Clock:8Mhz->
Utilities ->勾选 Use Debug Driver->点击 Settings->选中 Reset and Run->如果没有 flash 算法,点击 Add 按钮自行添加->
F7 ->F8

使用 DAP 仿真调试程序:
Register:寄存器窗口
Disassembly:反汇编窗口,方便从汇编级别查看程序运行状态
Call Stack + Locals:调用关系和局部变量窗口,查看函数调用关系,以及函数的局部变量

 


Debug 工具条

关闭Disassembly窗口->添加Watch1窗口->双击 Enter expression,将全局变量: g_fac_us (在 delay.c 里面定义)加入 Watch1 窗口->
在 delay_init 函数处放置一个断点->点击执行到该断点处->执行进去->执行过去(g_fac_us值显示出来)->执行进去
从 Call Stack + Locals 窗口看到函数的调用关系,其原则是: 从下往上看,即下一个函数调用了上一个函数

MDK5 使用技巧:
自定义字体颜色:
设置->Encoding:Chinese GB2312(Simplified)->勾选View White Space(编辑器的空格可见)->勾选Insert spaces for tabs(代码对齐)->Tab size:4->
Colors & Fonts 选项卡->C/C++ Editor Files(设置自己的代码的字体和颜色)->
User Keywords 选项卡,设置用户定义关键字

看看某个变量或数组是在哪个地方定义,快速定位:
魔术棒->Output->勾选 Browse Information->编译->
右键->Go to Definition Of

快速注释/消注释块代码的功能->右键->高级(Advanced)->注释选择(Comment Selection)

快速打开头文件:右键->Open Document

C 语言基础知识: 位操作:     按位与:&     按位或:|     按位异或:^     按位取反:~     左移:<<     右移:>> 单片机开发中的一些实用技巧。     1,在不改变其他位的值的状况下,对某几个位进行设值。用&操作符进行清零操作, 然后用|操作符设值,         比如:要改变 GPIOA 的 CRL 寄存器 bit6(第 6 位)的值为 1         GPIOA->CRL &= 0XFFFFFFBF; / 将第 bit6 清 0 /         然后再与需要设置的值进行|或运算         GPIOA->CRL |= 0X00000040; / 设置 bit6 的值为 1,不改变其他位的值 /     2.移位操作提高代码的可读性         比如:将 CTRL 寄存器的第 1 位(从 0 开始算起)设置为 1         SysTick->CTRL |= 1 << 1;     3.~按位取反操用于清除某一个/某几个位         比如:设置 CTRL 寄存器的第 0 位(最低位)为 0,其他位的值保持不变。         SysTick->CTRL &= ~(1 << 0) ; / 关闭 SYSTICK /     4.^按位异或操,用于控制某个位翻转         比如:使 PB5 的输出状态翻转一次         GPIOB->ODR ^= 1 << 5;

define :预处理命令,它用于宏定义
常见的格式:define 标识符 字符串
标识符:宏名。

ifdef 条件编译:条件编译命令最常见的形式为:
 #ifdef 标识符
  程序段 1
#else
  程序段 2
#endif
当标识符已经被定义过(一般是用#define 命令定义),则对程序段 1 进行编译, 否则编译程序段 2。 其中#else 部分也可以没有

extern 外部申明:
extern :置于变量或者函数前,以表示变量或者函数的定义在别的文件中。 extern 申明变量可以多次,但定义只有一次

typedef:为现有类型创建一个新的名字,或称为类型别名,用来简化变量的定义。定义结构体的类型别名和枚举类型。
typedef struct
{
  __IO uint32_t CRL;
  __IO uint32_t CRH;
  …
} GPIO_TypeDef;

声明结构体类型:
struct 结构体名
{
  成员列表;
}变量名列表;
  在结构体申明的时候可以定义变量,也可以申明之后定义:struct 结构体名字 结构体变量列表 ;
  结构体成员变量的引用方法是:结构体变量名字.成员名

指针:本质是指向一个地址,从而可以访问一片内存区域。
申明指针我们一般以 p 开头:char * p_str = “This is a test!”;
p_num:变量的地址
*p_num:指向的地址所存储的值
&p_num:指针自身的地址

寄存器:单片机内部一种特殊的内存,它可以实现对单片机各个功能的控制 STM32 寄存器分为两类:内核寄存器和外设寄存器 内核寄存器:     1.内核相关寄存器:包含 R0~R15、 xPSR、特殊功能寄存器等     2.中断控制寄存器:包含 NVIC 和 SCB 相关寄存器,         NVIC: ISER、 ICER、ISPR、 IP 等;         SCB: VTOR、 AIRCR、 SCR 等     3.SysTick 寄存器:CTRL、 LOAD、 VAL、CALIB     4.内存保护寄存器:可选功能, STM32F407 没有     5.调试系统寄存器:ETM、 ITM、 DWT、IPIU 等相关寄存器 重点关心中断控制寄存器和 SysTick 寄存器 外设寄存器:     包含 GPIO、 UART、 IIC、 SPI、 TIM、 DMA、 ADC、 DAC、RTC、 I/WWDG、 PWR、 CAN、 USB 等各种外设寄存器

存储器本身是没有地址信息的,存储器分配地址的过程就叫存储器映射。
给寄存器的地址命名的过程就叫寄存器映射。
寄存器的地址=外设基地址+地址偏移量
=总线基地址(BUS_BASE_ADDR)+总线基地址的偏移量(PERIPH_OFFSET)+外设基地址的偏移量(REG_OFFSET)
例如:GPIOB_ODR地址 = AHB1总线基地址 + GPIOB外设偏移量 + 寄存器偏移量
外设基地址在stm32参考手册2.3存储器映射中查看

/*GPIOB_ODR 寄存器的地址为: 0x4002 0414, 假设我们要控制GPIOB 的 16 个 IO 口都输出 1*/
#define GPIOB_ODR      *(unsigned int *)(0x40020414)
GPIOB_ODR = 0XFFFF;
/*这个宏定义过程就可以称之为寄存器的映射。*/
STM32F407所有寄存器映射都在stm32f407xx.h里面完成 stm32f407xx.h文件主要包含五个部分内容     1.中断编号定义:定义 IRQn_Type 枚举类型,包含STM32内部所有中断编号(中断号),方便后续编写代码     2.外设寄存器结构体类型定义:以外设为基本单位,使用结构体类型定义对每个外设的所有寄存器进行封装,方便后面的寄存器映射     3.寄存器映射:定义总线地址和外设基地址;使用外设结构体类型定义将外设基地址强制转换成结构体指针,完成寄存器映射     4.寄存器位定义:定义外设寄存器每个功能位的位置及掩码     5.外设判定:判断某个外设是否合法(即是否存在该外设) 寄存器映射主要有两个组成部分:外设寄存器结构体类型定义、寄存器映射 包括3个步骤:     1, 外设寄存器结构体类型定义     2, 外设基地址定义     3, 寄存器映射(通过将外设基地址强制转换为外设结构体类型指针即可) 寄存器映射原理:     1,结构体地址自增;     2,地址强制转换;   环境搭建: 新建5个文件夹: Drivers:与硬件相关的驱动层文件     BSP:开发板板级支持包驱动代码,如LED、蜂鸣器、按键各种外设驱动     CMSIS: CMSIS 底层代码         Device         Include     STM32F4xx_HAL_Driver         Inc         Src     SYSTEM:系统级核心驱动代码,如 sys.c、 delay.c 和 usart.c 等,拷贝system文件   STM32F4xx_HAL_Driver:存放hal库文件 Middlewares:中间层组件文件、第三方中间层文件,如: USMART、MALLOC、 TEXT、 FATFS、 USB、 LWIP、各种 OS、各种 GUI 等等。 Output:工程编译输出文件 Projects:MDK 工程文件   MDK-ARM User:main.c、stm32f4xx_hal_conf.h、stm32f4xx_it.c、stm32f4xx_it.h

新建一个工程框架:
打开 MDK 软件->项目->新的->STM32 型号(要安装对应的器件 pack 才会显示这些内容)->
自动创建了 3 个文件夹:
DebugConfig:调试设置信息文件(.dbgconf),不可删除
Listings:编译过程产生的链接列表等文件
Objects:编译过程产生的调试信息、 .hex、预览、 .lib 文件等->
先把 MDK 自动生成的这两个文件夹(Listings 和 Objects)删除

添加文件: 设置工程名和分组名:设置工程名字为: 品->Template-> 设置五个分组:     Startup(存放启动文件):Drivers\CMSIS\Device\ST\STM32F4xx\Source\Templates\arm     User(存放 main.c 等用户代码)、     Drivers/SYSTEM(存放系统级驱动代码):Drivers\SYSTEM中的.c文件     Drivers/STM32F4xx_HAL_Driver(hal库文件)、     Readme(存放工程说明文件)-> 添加启动文件:启动文件存放在 STM32CubeF4 软件包的: Drivers\CMSIS\Device\ST\STM32F4xx\Source\Templates\arm\.s文件-> 启动文件主要作用:     1、堆栈(SP)的初始化;     2、初始化程序计数器(PC)     3、设置向量表异常事件的入口地址;     4、调用 main 函数等 ->做了2 处修改:将 Heap_Size 改成 0;去掉 SystemInit调用->
Heap_Size EQU 0x00000000
; Reset handler
Reset_Handler PROC
				EXPORT Reset_Handler [WEAK]
				IMPORT __main
				LDR R0, =0xE000ED88 ;使能浮点运算 CP10,CP11
				LDR R1,[R0]
				ORR R1,R1,#(0xF << 20)
				STR R1,[R0]
				;寄存器版本代码,因为没有用到 SystemInit 函数,所以注释掉以下代码为防止报错!
				;HAL 库版本代码,建议加上这里(外部必须实现 SystemInit 函数),以初始化
				;stm32 时钟等.
				;IMPORT SystemInit
				;LDR R0, =SystemInit
				;BLX R0
				LDR R0, =__main
				BX R0
				ENDP

设置使用 FPU:魔术棒->Target1选项卡->Floating Point Hardware:Double Precision

魔术棒设置: 1,Target 选项卡:外部晶振频率Xtal:看原理图设置时钟频率->ARM Compiler:Use default compiler version 5(即 AC5 编译器) 2,Output 选项卡:Select Folder for Objects(选择Objects输出文件夹)->勾选"Create HEX File" 3,Listing 选项卡:Select Folder for Listing(选择Objects输出文件夹) 4,C/C++ 选项卡:     Define(设置全局宏定义):USE_HAL_DRIVER,STM32F407xx->Optimization:Level 0(-O0)->勾选 C99 Mode->     Include Path:头文件包含路径设置         ..\..\User         ..\..\Drivers         ..\..\Drivers\CMSIS\Device\ST\STM32F4xx\Include         ..\..\Drivers\CMSIS\Include         ..\..\Drivers\STM32F4xx_HAL_Driver\Inc         ..\..\Middlewares 5,Debug 选项卡:Use:CMSIS-DAP Debugger->点击Settings->Debug->Port:SW--Max Clock:10NHz 6,Utilities 选项卡:点击Settings->点击Flash Download->勾选Reset and Run 7,Linker 选项卡(可选):取消勾选"Use ..."->Scatter File:..\..\User\SCRIPT\qspi_code.scf.scf

使用 AC6 编译器,Misc Controls : -Wnoinvalid-source-encoding->
添加main.c->添加到分组->编译会报错修改stm32fxx_it.c添加头文件#include "stm32f4xx_hal.h"

 

标签:文件,定义,..,基础知识,地址,寄存器,外设
From: https://www.cnblogs.com/aQxiong/p/18302944

相关文章

  • Unity 基础知识点
    废话不多说,上教程。......
  • java基础知识(2)—面向对象.属性和方法
    本章会引入属性和方法的基本概念。一个植物类(Plant)有很多的状态信息,如名字、话费、血量、攻击力和攻击速度等。这些植物的状态就叫做一个类的属性。Part1:属性的类型属性的类型可以是基本类型,比如int整数,float浮点数也可以是类类型,比如String字符串publicclassPlant{......
  • 微前端基础知识
    1.前言        随着Web应用程序规模的日益扩大和复杂性的增加,传统的前端开发模式逐渐显现出其在维护、扩展以及团队协作方面的局限性。微前端作为一种新兴的前端架构模式,正是为了应对这些挑战而诞生的。        微前端(Micro-Frontends)并没有定义框架或API,......
  • JS基础知识总结(1)
    1、编写一个程序,用于判空和判断对象是否被定义。functionisUndefined(arg){if(typeofarg=='undefined'||JSON.stringify(arg)=="{}"){returntrue;//第二个选项是把空对象筛选出去}else{//这里需要解释一......
  • Kafka基础知识
    目录Kafka简介消息Kafka简介中间件,如Kafka,用来存储消息的软件(组件)程序员可以在消息队列中存取消息很多时候消息队列是临时存储(设定期限:消息在MQ中保存10天)消息存在topic主题,类似数据库中的表,但是是半结构化的一般存同一类型的消息,但有些情况下也可以存不同类......
  • Python基础知识
    Python基础知识Python注释Python单行注释Python中使用井号(#)作为单行注释的符号,语法格式为:#注释内容也就是说,从符号#处开始,直到换行处结束,此部分内容都作为注释的内容,当程序执行时,这部分内容会被忽略。单行注释放置的位置,既可以是要注释代码的前一行,例如:#这是一行简单的......
  • 音视频开发基础知识
    视频解码解复用(Demux):解复用也可叫解封装。这里有一个概念叫封装格式,封装格式指的是音视频的组合格式,常见的有mp4、flv、mkv等。通俗来讲,封装是将音频流、视频流、字幕流以及其他附件按一定规则组合成一个封装的产物。而解封装起着与封装相反的作用,将一个流媒体文件拆解成音频......
  • 硬件基础知识——电感
    电感常用公式 感抗:XL=2πfL,频率越小感抗越小,频率越大感抗越大电感能量公式:电感两端电压:磁通量:ψ(psi)为磁通量,N表示线条数,Φ表示磁通量B表示磁感应强度,A是电感的有效截面积。如果电感中流过电流I,会产生磁动势F,特性:阻交通直,阻碍电流的突然变化,当电感饱和之后相当于一条......
  • Java基础知识之NIO
    概述讲述ava层面NIO基础知识,用作基础回顾所用1.NIO概述​ 在Java中,NIO(Non-blockingI/O或NewI/O)是JavaSE1.4及后续版本中引入的一套新的输入/输出操作API。​ 它与传统的IO模型相比,提供了更高的效率和更好的并发处理能力。NIO的关键特性在于它的非阻塞特性,这使得单个......
  • python基础知识(全部)
    2023年说明:如果代码有误的话,记得处理一下缩进,或者注释的问题,文章粘贴的代码在此处可能部分缩进有问题建议食用:目录一变量和简单数据类型输出二数整数.浮点数注释三列表定义和打印访问列表元素修改,添加,删除元素修改添加删除组织列......