C语言基础及STM32基础
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 一、C语言基础
- 二、STM32基础
- 三、HAL库
- 四、实时操作系统
一、C语言基础
C语言(代码什么都都可以干)
写代码之前要考虑事件怎么操作
C语言要提前定义变量
{1.#include 2.mian() 3.变量 (int float char)
4判断(if switch) 5.循环(while for) 6.数组
7.函数 8.指针 9.结构体}
这就是C语言!
1.库函数,头文件(相当于程序的解)
2.main(看程序一定要从main函数开始看)
3.int pi =3.14 (pi是变量)(const) #define pi 3.14(pi是常量)
有符号(unsigned)和无符号(signed)
7.函数:传入参数 返回值
全局变量:括号外定义变量,没有赋初值,打印出来是0
局部变量:括号内定义变量,没有赋初值,打印出来是随机数
运行后会被释放
8.指针:C语言的灵魂
9.结构体:使用结构体,数据类型最为合理,节省内存,防止浪费。
结构体:“偷懒+变量”
关键字:
1.static
全局变量:对于全局变量也是存储在静态区,但是它的作用域仅为本文件。
局部变量:再次调用函数的时候,这个静态变量仍然保持上次时候的值。
静态函:只在当前文件下调用此函数,防止被其他的.c文件调用。
2.extern
extern关键字可以用来声明变量、函数作为外部变量或者函数供其它文件使用。
3.struct和union
struct和union都是由多个不同的数据类型成员组成, 但在任何同一时刻, union中只存放了一个被选中的成员, 而struct的所有成员都存在。在struct中,各成员都占有自己的内存空间,它们是同时存在的。一个struct变量的总长度等于所有成员长度之和。在Union中,所有成员不能同时占用它的内存空间,它们不能同时存在。Union变量的长度等于最长的成员的长度。
二、STM32基础
STM32被广泛应用在控制领域,本此选用STM32F407进行电机实验,此单片机是基于arm-cortem4为核心。
功能:执行 感知 计算 计时(定时器:外部晶振,按照一定周期震动,可以条件占空比)
控制器:
MCU(GPIO 定时器 PWM UARRT CAN) 板载外设(LED 通讯电路 驱动电路)
执行:I/O口 供电(母头)防止触碰引起火花
STM32功能很复杂,模式很多,所以引入寄存器。
STM32—电调(调速板)—电机
PID:P比例,I积分(求面积),D微分(求导)
纯P控制(无法消除误差) PI控制(求面积消除误差)
实际值和目标值,实际值需要用编码器来反馈。
输入捕获(I/O口的输入,定时器)
通信 数据传输(协议,数据,接受,发送)
遥控器—(无线)—接收机—串口(TX发送 RX接受)—单片机
协议可以通俗的理解为一个高低电平所经过的时间,比如规定经过2S为触发开关,经过3S为关闭开关。
串口 CAN IIC SPI
CAN((两根线 CAN_H CAN_L):稳定,挂在总线上的设备都有标识的ID。
CAN总线优势:
1.信号是差分信号,同一个信号通过两根线做差的方式作为最后的信号,干扰下相互抵消,抗干扰能力强。
2.总线形式,可以把所有的设备挂在总线上,设备的ID号不同可以挂无数个设备
作用给所有的电机发送命令,接受电机编码器所测量的数据
总结:
CAN总线发送数据,两个标识符(0x200,0x1FF),各自控制4个电机,
如0x200给四个电机发数据,用过数据域DATA【0】和DATA【1】这两个字节共同作用与一个电机,DATA【0】为一个字节高8为,DATA【1】为一个字节低8位
CAN总线接受数据,标识符0x20+电调ID(如ID为1,该标识符为0x201),反馈必须带上自己的ID号
CAN总线为什么用一个标识符就可以同时给4个电机发送指令,而调速板只能用一个对应ID的标识符反馈一个电机的参数呢?
这是因为发送的时候只用到2个字节对应一个电机,接受的时候用8个字节对应一个电机,接受的时候会接受多个参数,比如:角度,速度,转矩,温度等等,这都会占用相应的字节
陀螺仪通过IIC总线连接一块开发板,开发板通过CAN总线挂在主控板上,降低了主控板CPU的占用率。
DMA:通俗的讲,DMA的作用其实就相当于CPU的搬家公司,CPU只发送搬家命令给DMA,DMA计算发送数据,大大减少了CPU的任务负担。
步兵机器人
1.LED 提示(程序是否可以运行,主控板是否好坏)
2.按键 (模式切换,作为输入口,传感器信号的接受)
3.地盘(电机要和负载连接紧凑,调一块的时候关闭其他模块)
陀螺仪(角度传感器,角速度传感器,加速度传感器)
三、HAL库
主要是完成不同开发板的适配工作
寄存器编程缺点 HAL缺点:
1.代码可读性太差 1.代码效率不是很高
2.二次开发难度大
3.每次写程序都要查阅手册
用户层
CMSIS层(提供除外设以的各种接口,hal库固件包在此层)
MCU层
固件包的文件夹
Documentation说明文档,如何使用固件包
Drives文(BSP CMSIS HAL_Drives
Middlewares中间件
Projects工程实例
Utilities通用文件
使用HAL库的两种方式
1.自己移植
2.CubeMX
板级支持包:对板上的资源功能给出实现,并且提供给用户程序的接口。以LED灯为例,用户应用程序不需要知道GPIO硬件的特点,只需要知道这个函数,就可以点亮LED灯了!
预定义
#ifndef _BSP_LED_H_
#define _BSP_LED_H_#endif
预定义包含在.h文件中
作用:举个例子.h文件中引用了下面这个头文件,main函数中不仅引用了.h文件还引用了下面这个头文件,如果不使用预定义,系统就会报错。
#include "stm32f4xx.h"
RCC外设
系统时钟配置:时钟的原理是晶振震动的次数,即频率,而频率的倒数就是周期,这样就可以规定外设运行的时间。
复位:系统复位,电源复位,备份域复位
时钟:工作频率越高,功耗越高
HSI高速内部时钟 HSE高速外部时钟 PLL倍频时钟
Cube MX 配置时钟树
定时器
高级定时器—通用定时器—基本定时器
基本定时器(TM6 TM7):16位向上递增的(0到65535) 挂在APB1上
高级定时器:输入捕获 输出比较 PWM生成
SysTick定时器
属于Cortex-M内核中的一个外设。
计数宽度(24bit来存数据) 计数模式(向下递减) 计数周期(1/工作频率)
HAL_Delay()
SysTick定时器,可以调用一个中断服务函数
中断中不建议使用SysTick,因为中断优先级没有很好配置的话,就无法跳出死循环
PWM
高电平和低电平的比值,即占空比,调节占空比即调节电压的大小,进而调节电机的转速。
I/O口的输入捕获:就是为了读取PWM的频率,即占空比
中断
与按键的作用机理相似,区别在于按键的I/O口一直在监测电平的变换状态,中断只要写好中断程序等待触发即可,不用一直监视,减少了CPU资源占用。但是一般写按键,中断多了容易乱套。
其实所有能写成中断的都可以不写成中断
中断优先级:比如你在写作业的时候,电话响了同时有人敲门,你是先接电话还是先看门,这里就用到了中断优先级,分为可编程和不可编程。
复位:-3(最高)
中断优先级按照优先级分组(抢占优先级>子优先级>IRQ编号)
嵌套向量中断控制器(NVIC)
EXTI外设(扩展中断事件控制器):1.捕获外部输入事件 2.生成中断请求
事件->中断
通过EXTI线,捕获EXTI事件,并且去生成中断,再中断中,反转LDE的状态,并且清除EXTI中断标志
通信
I2C总线(两条总线线路,串行数据线(SDA)串行时钟线(SCL))
硬件IIC:可以设计一个芯片直接通信
软件IIC:可以控制IO口的高低规定信号协议
起始信号(SCL为高电平时,SDA有高电平向低电平跳变,开始传送数据)
停止信号(SCL为高电平时,SDA由低电平向到点评跳变,结束传送数据)
操作系统
Freertos
初写点亮程序
写程序第一步是初始化,你想点亮LED你就要把I/O口初始化,你想实现串口通信你就需要把串口初始化。
F12按键,转到定义处。
仿真器不仅可以下载程序还可以进行仿真
仿真:进入仿真加断点,如果发现某段程序中无法加断点,说明程序没有运行到这段程序中,
移植程序前,一定要把所要移植的程序看懂,带着目的去看。
上来一定看的是main函数
程序不是敲出来的,而是拼出来的
对与一些理论的东西,比如各种算法,PID,卡尔曼滤波,一上来不用先搞明白原理这些东西,先用起来,学会忽略一些东西。不能用通俗易懂的话描述出来的,说明你没有懂。
程序没用报错并不代表完全正确,只是说可能没有用到
机器人控制篇
比的不是会控制更多的传感器,写更多的程序,而是算法的逻辑
小数后面一定要加个f,否则会报错
遥控器
写程序调试不允通过串口调试助手来看,因为会占用一个串口,必须通过仿真看
串口:波特率,单元数据长度等+数据帧(相当于语言,这个语言很规范,精确到标点符号),tx连rt,这就是串口的全部内容
串口的数据形式:高低电平的形式
建议看看野火的DMA视频,讲的很详细。
1.IO口配置成AF(复用)功能
2.配置串口结构体(CAN总线里面有3个参数是设置时钟的,把3个数进行计算得到一个波特率)
1.程序逻辑的整体把握,多写多练
2.程序规范性很重要,变量用结构体,对C语言理解透彻了就会发现有很多程序不用那么繁琐
3.算法,编程到最后一定是数学。。。
4.只要传感器给我一个例程,就能把它编程自己的程序
英雄机器人
1.LED灯闪烁任务
2.检测任务(看门狗 STM32F407上的LED灯)
3.校准任务(得到3个参数引进消除误差,放到flash中)
4.底盘任务
(初始化各种外设,if或CAN总线,PID)
<1> 延时,给硬件初始化留时间
<2> 底盘初始化(可以通过指针得到遥控器值的地址,将这一类型结构体的地址引过来)
<3> while(1)
{
SET_MODE(模式)
模式变换(过度)
遥控器的值和鼠标键盘(斜坡函数)引进来
PID(速度计算) 目标值 实际值
CAN(函数)发给电机
}
模式 无力模式(调试) 正常遥控 小陀螺 子模式:在正常模式下插入子程序实现其他功能
5.云台任务
6.发射任务
7.MPU任务
反馈的值只要是连续的,就往PID方面想
读程序:
1.先去看程序的结构,所要实现的功能
从主函数开始main.c—底盘任务.c—底盘任务.h(结构体都摘出来)—初始化看变量找对应的函数赋初值—看死循环里面的函数—代码全部去掉—移植代码(结构体每用到一个成员填进去,每写一个函数进行仿真)
2.生成程序脑图
3.找和底盘有关的程序(底盘任务和底盘行为(模式))
不要排斥程序,太有乐趣了,对自己是一种升华
四、实时操作系统
前台系统 后台系统
RTOS实时系统(实时内核)
硬实时:不允许超时
软实时:允许超时
多任务管理:模块化开发
C语言基础及STM32基础相关推荐
- 零基础学stm32要多久?stm32应该怎么学?
STM32由于资料丰富.稳定.性价比高深得广大工程师和企业的喜爱. 现在随便在招聘平台上搜索单片机开发或者嵌入式开发,基本都要求会STM32. 我用STM32也有很多年了,基本上是围绕着F103.F0 ...
- STM32 基础系列教程 49 – Jansson
前言 JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式.它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全 ...
- STM32 基础系列教程 48 – CJSON
前言 JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式.它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全 ...
- STM32 基础系列教程 36 - Lwip_dns
前言 域名系统(英文:DomainNameSystem,缩写:DNS)是互联网的一项服务.它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网.DNS使用TCP和UDP端口53 ...
- 【正点原子STM32连载】第五章 STM32基础知识入门 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1
1)实验平台:正点原子MiniPro H750开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=677017430560 3)全套实验源码+手册+视频 ...
- python语言的单行注释以井号开头_推荐|零基础学习Python基础知识
原标题:推荐|零基础学习Python基础知识 Python是一种面向对象.解释型计算机程序设计语言.语法简洁清晰,强制用空白符作为语句缩进. Python具有丰富和强大的库,又被称为胶水语言.能把其他 ...
- R语言数据可视化 ggplot2基础4 位置与坐标系
R语言数据可视化 ggplot2基础4 位置与坐标系 我们继续使用ggplot2::diamonds介绍position. position = "identity" ggplot ...
- R语言数据可视化 ggplot2基础3 添加几何对象
R语言数据可视化 ggplot2基础3 添加几何对象 数据的统计变换 添加几何对象 数据的统计变换 添加几何对象 上一讲我们介绍的是如何创建散点图,这一讲我们介绍如何创建其他类型的图,以及怎么创建有多 ...
- R语言数据可视化 ggplot2基础2 创建单图层的散点图 创建facet
R语言数据可视化 ggplot2基础2 创建单图层的散点图 创建facet 单图层散点图 单图层散点图的facet 单图层散点图 这一讲我们从最简单的散点图开始介绍ggplot2应用的基础,首先我们下 ...
最新文章
- Python3中的内置函数
- CISCO SCE 第三部分 SCE平台的升级
- Fcoin Token ( FT )——数字货币交易所的颠覆者,还是无情镰刀的收割者
- FMS3 服务器集群虚拟服务器配置入门
- IIS 使用OpenSSL 生成的自签名证书,然后使用SingalR 客户端访问Https 站点通信
- DOM-1 DOM初探、JS对象、XML、幻灯片案例展示
- 如何使用字节序列化双精度数组(二进制增量编码,用于低差单调浮点数据集)...
- [react] React的事件和普通的HTML事件有什么不同
- 常用JavaScript函数 31 - 46(自我总结)
- 2021-2025年中国顶灯行业市场供需与战略研究报告
- Selenium2.0功能测试之设置浏览器大小
- js 难点之原型理解
- 【优化算法】多目标哈里斯鹰优化算法(MOHHO)【含Matlab源码 1596期】
- 教学设计和反思高中计算机,高中信息技术教学反思
- python根据词性进行词频统计_如何根据词性来确定语篇中的词频?
- 服务认证的介绍-实施依据及作用
- 《五月集训》第二日——字符串
- matlab 检测键盘,matlab检测键盘
- 基于NFC的毕业纪念卡片
- 5-羧基四甲基罗丹明TMR标记Polyacetal聚缩醛/HA透明质酸纳米载体TMR--Polyacetal|TMR-HA
热门文章
- 2023年highway-env更新之后的使用记录(含DDQN,DuelingDQN,DDQN+OtherChanges) 入门到入土,再踩坑就不玩原神了
- 线阵CCD FPGA CCD测量 直径测量 FPGA代码 CCD光学传感器 TCD1501
- 四元数算法 c语言,四元数算法运算规则及基本概念
- idea ctrl 左键进入方法后,如何返回上一个方法
- 和平精英——产品分析
- linux系统适合什么游戏,Linux 系统不适合运行主流游戏?这是为何
- 网络技术学习基础篇。
- 知乎周源微信_每周源代码42-树修剪,插件和MEF
- 不出网上线CS的各种姿势
- hs = hht(imf)的输出介绍