1.基础知识

news/2024/11/13 9:22:07/文章来源:https://www.cnblogs.com/aQxiong/p/18302944

单片机: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 PROCEXPORT Reset_Handler [WEAK]IMPORT __mainLDR R0, =0xE000ED88 ;使能浮点运算 CP10,CP11LDR R1,[R0]ORR R1,R1,#(0xF << 20)STR R1,[R0];寄存器版本代码,因为没有用到 SystemInit 函数,所以注释掉以下代码为防止报错!;HAL 库版本代码,建议加上这里(外部必须实现 SystemInit 函数),以初始化;stm32 时钟等.;IMPORT SystemInit;LDR R0, =SystemInit;BLX R0LDR R0, =__mainBX R0ENDP

设置使用 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"

 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

线程池遇到父子任务,有大坑,要注意!

你好呀,我是歪歪。 最近在使用线程池的时候踩了一个坑,给你分享一下。 在实际业务场景下,涉及到业务代码和不同的微服务,导致问题有点难以定位,但是最终分析出原因之后,发现可以用一个很简单的例子来演示。 所以歪师傅这次先用 Demo 说问题,再说场景,方便吸收。Demo 老…

线性规划模型复习总结

线性规划(Linear Programming, LP)是一种数学优化方法,用于在给定约束条件下最大化或最小化目标函数。线性规划广泛应用于经济、工程、管理等领域,通过建立数学模型,帮助决策者找到最优解决方案。 一、线性规划数学模型 1.1 模型三要素目标函数(Objective Function) 目标…

nginx ./nginx -s reload 工作进程pid与实际不一致导致平滑重启报错

某次修改nginx配置后使用 ./nginx -s reload 重启nginx, 结果报错, 如图所示, 去kill工作进程的时候显示找不到该进程原因是位于nginx/logs下的 nginx.pid 中的pid和实际不一致造成的 nginx.pid 文件是 Nginx web 服务器在启动时创建的一个进程标识符 (PID) 文件。这个文件包含…

第七天学习笔记(经验测试,白盒测试)

经验测试法 错误推测法 基于经验的测试技术之错误推测法 错误推测法也叫错误猜测法,就是根据经验猜想,已有的缺陷,测试经验和失败数据等可能有什么问题并依此设计测试用例.异常分析法 基于经验的测试技术之异常分析法 系统异常分析法就是针对系统有可能存在的异常操作、软硬…

SQL Server sa账号被锁定

SQL Server的sa账号老是被锁(登录已锁定)问题:最近sa登录老是被锁定,去查看数据库->安全性->sa账号右键属性,在状态选项卡中找到sql server 身份验证 ,发现“登录已锁定”被勾选了;把这个勾选去掉,然后提示必须修改密码。“登录已锁定”的勾选去掉并修改密码后又能…

B+树要点梳理

B+树重要操作 中间节点中间节点的key,与其对应的指针的原则是,小于key的元素在其指针指向的节点中 中间节点的key可以看成是右斜着排放的,即小于等于key的节点由key对应的指针指定,最有一个指针指向大于最右侧key的节点分裂当中间节点数量满了时,进行分裂,新生成一个相邻…

AI学习 | 概念解释 + Scikit-learn 的简单情况

一些机器学习概念解释点击查看代码 * 机器学习:是AI的一个子集,不用人类显式编程,让计算机通过算法自行学习和改进 * 监督学习:有数据、有标签,告诉机器什么是什么,让机器来学习输入和输出的映射关系。比如:分类和回归(预测)* 非监督学习:有数据没有标签,让机器自己…

LeetCode 1530. Number of Good Leaf Nodes Pairs

原题链接在这里:https://leetcode.com/problems/number-of-good-leaf-nodes-pairs/description/ 题目: You are given the root of a binary tree and an integer distance. A pair of two different leaf nodes of a binary tree is said to be good if the length of the s…

Windows节点加入K8S集群(K8S搭建Linux和Window混合集群)

说明:K8S多数情况用于linux系统的集群,目前很少人实践linux 和 windows 的混合集群。linux 和 windows 的K8S混合集群,是以linux 为Master节点,Windows 为 Node节点的。本示例linux 采用centos7.6,windows 采用 windows server 2019(均为虚拟机)。 一、前提准备1.熟悉li…

[笔记]快速傅里叶变换(FFT)

模板题:P3803 【模板】多项式乘法(FFT) 快速傅里叶变换(Fast Fourier Transform,FFT)在算法竞赛中主要用于求卷积,或者说多项式乘法。如果我们枚举两数的各系数相乘,时间复杂度是\(O(n^2)\),而FFT可以将这一过程优化到\(O(n\log n)\)。 流程 整个FFT算法分\(3\)个过程:…

Improving News Recommendation via Bottlenecked Multi-task Pre-training论文阅读笔记

Improving News Recommendation via Bottlenecked Multi-task Pre-training论文阅读笔记 Abstract 现存的问题: ​ 现有的 PLM 大多是在大规模通用语料库上预先训练的,并没有专门用于捕捉新闻文章中的丰富信息。因此,它们生成的新闻嵌入信息可能不足以表示新闻内容或描述新闻…