这个仅仅是零碎的知识点,还没有总结,总结将会在二月二十五号开始,到时候所有的自学笔记我会完全整理成步骤,到时候会系统的学习,另外这个笔记是学习利用cube使用stm32,而且学习的主要目的是robomasrter,所以出现的大部分历程都是RM的
1月12日
1. STM32板子的类型
Evaluation board(评估板)板子上已经集成了大部分外设,设计相对固化
Discovery kits(探索套件)只有将微控制器的引脚全部引出
Nucleo board (由探索套件设计而来,兼容Ardunio
2.仿真器
仿真器可以替代你的目标系统中的MCU,仿真其运行。 仿真器运行起来和实际的目标处理器一样,但是增加了其它功能,使你能够通过桌面计算机或其它调试界面来观察MCU中的程序和数据,并控制MCU的运行。随着IC和软件集成平台的飞速发展,仿真器也不断赋予新的内容和新的挑战,因为它的发展必须与CPU同步,要想在总线速度为150Mhz 64bit的情况下实现TRACE已经成为不可能。
3.2. STM32系列命名规则
STM32 F 103 C 8 T 6 xxx
1 2 3 4 5 6 7 8
第1部分: 产品系列名,固定为STM32
第2部分:产品类型;F表示这是Flash产品,目前没有其它选项
第3部分:产品子系列;103表示增强型产品,101表示基本型产品
105表示集成一个全速USB 2.0 Host/Device/OTG接口和两个具有先进过滤功能的CAN2.0B控制器,
107表示在STM32F105系列基础增加一个10/100以太网媒体访问控制器(MAC),互联型产品。
第4部分:管脚数目;
T=36脚; C=48脚; R=64脚;V=100脚; Z=144脚
第5部分:闪存存储器容量:
6=32K字节; 8=64K字节; B=128K字节; C=256K字节
D=384K字节; E=512K字节
第6部分:封装信息;
H=BGA;T=LQFP;U=VFQFPN
第7部分:工作温度范围;
6=工业级,-40~+85°C
7=工业级,-40~+105°C
第8部分:可选项;此部分可以没有,可以用于标示内部固件版本号。
3. stm32F103c8t6片上资源
.64K FLASH
.20K SRAM
. 3个16位定时器,每个定时器有多达4个,用于输入捕获/输出比较/PWM或脉冲计数的通道和增量编码器输入
. 1个16位带死区控制和紧急刹车,用于电机控制的PWM高级控制定时器
.2个SPI(18M位/秒)
.2个IIC
.3个USART
.1个USB 2.0全速接口
.1个CAN(2.0B 主动)
.2个12位模数转换器,1μs转换时间
.7通道DMA控制器
.37个通用IO口
.2个看门狗定时器
. CRC计算单元,96位的芯片唯一代码
.串行单线调试(SWD)和JTAG接口
来源 http://bbs.elecfans.com/jishu_486854_14_1.html#comment_top
4.SWD (Serial Wire Debug)串行线调试
5. 拿到开发板后
先要看开发文档的第四部分Quick started(快速上手部分)
以及Hardware layout an configuration (硬件布局及配置)
和Electrical schematics(电气原理图)
6. SRAM(Static Random-Access Memory)
静态随机存取存储器是随机存取存储器的一种。所谓的“静态”,是指这种存储器只要保持通电,里面储存的数据就可以恒常保持。相对之下,动态随机存取存储器(DRAM)里面所储存的数据就需要周期性地更新。然而,当电力供应停止时,SRAM储存的数据还是会消失(被称为volatile memory),这与在断电后还能储存资料的ROM或闪存是不同的。
7.相关单词
POR (Power-On Reset)上电复位
PDR(Power-Down Reset)掉电复位
PLL (Phase Locked Loop) 锁相环
JTAG(Joint Test Action Group) 一种调试接口
FSMC(Flexible Static Memory Controller)可变静态存储控制器,一种新型的存储器扩展技术。
DMK-ARM指的就是keil
以下是keil界面
Register 记录; 登记簿,寄存器; Execution profiler
peripheral 外部设备 Disassembly Window 汇编语言窗口
8.HAL驱动文件介绍
API(Application Programming Interface,应用程序编程接口)
是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。
跑马灯例程
初始代码
Int main(void)
{
HAL_Init( );
//hal库初始化,一般cube会帮你写
SystemClock_Config();
//滴答时钟配置为64MHZ
LED_GPIO_CLK_ENABLE();
//led时钟使能
GPIO_InitStruct.mode = GPIO_MODE_OUTPUT_PP ;
GPIO_InitStruct.Pull =GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.Pin =LED2_PIN;
//GPIO口配置
HAL_GPIO_Init(LED2_GPIO_PORT,&GPIO_InitStruct);
//GPIO初始化
While(1)
{
HAL_GPIO_TogglePIN(LED2_GPIO_PORT,LED2_PIN);
//hal翻转函数,第一个变量表示(ABCD),第二个表示(1234)
HAL_Delay(100);‘’
//延时函数,变量为ms
}
}
1.输入模式类型(八种)
-输入浮空(GPIO_Mode_IN_FLOATING)
-输入上拉(GPIO_Mode_IPU)
-输入下拉(GPIO_Mode_IPD)
-模拟输入(GPIO_Mode_AIN)
输出模式
-开漏输出(GPIO_Mode_Out_OD)
-开漏复用功能(GPIO_Mode_AF_OD)
-推挽式输出(GPIO_Mode_Out_P
-推挽式复用功能(GPIO_Mode_AF_PP)
2.时钟配置中APB1和APB2区别
APB2负责AD,I/O,串口1,高级定时器TIM
APB1负责DA,串口2,3,4,5,普通定时器TIM, USB , IIC , CAN
APB2又称高速高级外设总线
3.GPIO配置相关函数
初始化函数
HAL_GPIO_Init 根据设定参数初始化GPIO寄存器
HAL_GPIO_DeInit 初始化GPIO外设寄存器为初始化时的默认值
状态位操作函数
HAL_GPIO_ReadPin 读取GPIO口的输入数据寄存器的指定位
HAL_GPIO_WritePin设置或者清除指定GPIO口相应数据位
HAL_GPIO_TogglePin改变指定GPIO口的状态
HAL_GPIO_LockPin锁定指定GPIO口的配置寄存器
I/O操作流程
使能I/O口时钟 HAL_RCC_GPIOx_CLK_ENABLE
配置I/O口输出模式 HAL_GPIO_Init
操作I/O口输出数据寄存器,控制I/O引脚输出状态:HAL_GPIO_ReadPin | HAL_GPIO_WritePIN | HAL_GPIO_TogglePin | HAL_GPIO_LockPIn
遥控器各种参量的定义(以.h类型定义)
#ifndef _REMOTE_H_
#define _REMOTE_H_
#include "stm32f4xx.h"
#define CH0_BIAS 1024
#define CH1_BIAS 1024
#define CH2_BIAS 1024
#define CH3_BIAS 1024
struct Remote
{
int16_t ch0;
int16_t ch1;
int16_t ch2;
int16_t ch3;
int8_t s1;
int8_t s2;
};
struct Mouse
{
int16_t x;
int16_t y;
int16_t z;
uint8_t press_1;
uint8_t press_r;
};
struct Key
{
uint16_t v;
};
enum RemoteInputMode
{
RC_Stop,
RC_Remote,
RC_MouseKey,
};
struct DT7Remote
{
struct Remote rc;
struct Mouse mouse;
struct Key key;
enum RemoteInputmode inputmode;
};
extern struct DT7Remote Remote;
extern uint8_t rc_data[18];
void RemoteReceiveHandle(void);
#endif
//int是带符号的,表示范围是:-2147483648到2147483648,即-2^31到2^31次方。
uint则是不带符号的,表示范围是:2^32即0到4294967295。
遥控器数据处理(.c文件)
#include "remote.h"
uint8_t rc_data[18]; //用于储存遥控器发来的数据
struct DT7Remote Remote; //遥控器数据结构体
void RemoteReceiveHandle(void)
{
Remote.rc.ch0 = ((int16_t)rc_data[0] | ((int16_t)rc_data[1] << 8)) & 0x07FF;
Remote.rc.ch1 = (((int16_t)rc_data[1] >> 3) | ((int16_t)rc_data[2] << 5)) & 0x07FF;
Remote.rc.ch2 = (((int16_t)rc_data[2] >> 6) | ((int16_t)rc_data[3] << 2) |
((int16_t)rc_data[4] << 10)) & 0x07FF;
Remote.rc.ch3 = (((int16_t)rc_data[4] >> 1) | ((int16_t)rc_data[5]<<7)) & 0x07FF;
Remote.rc.s1 = ((rc_data[5] >> 4) & 0x000C) >> 2;
Remote.rc.s2 = ((rc_data[5] >> 4) & 0x0003);
Remote.mouse.x = ((int16_t)rc_data[6]) | ((int16_t)rc_data[7] << 8);
Remote.mouse.y = ((int16_t)rc_data[8]) | ((int16_t)rc_data[9] << 8);
Remote.mouse.z = ((int16_t)rc_data[10]) | ((int16_t)rc_data[11] << 8);
Remote.mouse.press_l = rc_data[12];
Remote.mouse.press_r = rc_data[13];
Remote.key.v = ((int16_t)rc_data[14]);
//以下是用于根据s2,从而确定此时遥控器控制的模式
if (Remote.rc.s2 ==2)
{
Remote.inputmode = RC_Stop;
}
else if (Remote.rc.s2 ==3)
{
Remote.inputmode = RC_MouseKey ;
}
else if(Remote.rc.s2 ==1)
{
Remote.inputmode =RC_Remote;
}
}
//回调函数
void HAL_UART_RxCpltcallback(UART_HandleTypeDef *huart)
{
if(huart == &huart1)
{
HAL_UART_Receive_DMA(&huart1,rc_data,18u);
//将串口1收到的数据保存在rc_data中。位数为18位
RemoteReceiveHandle ();
//遥控器数据的具体解析函数
}
}
注意一定要在cube里确定中断
在C语言中,数值常数默认为int型,当数值常量后边有U/UL/f等尾缀时,代表指定其数据类型.
0U 表示 无符号整型 0
1U 表示 无符号整型 1
如果不写U后缀,系统默认为:int, 即,有符号整数。
1.数值常数有:整型常数、浮点常数;
2.只有数值常数才有后缀说明;
3.数值常数后缀不区分字母大小写。
(1)整型常数的表示形式有:十进制形式、以0开头的八进制形式、以0x开头的十六进制形式,无二进制形式。 整型常数默认是signed int的。 对整型常数进行类型转换的后缀只有:u或U(unsigned)、l或L(long)、u/U与l/L的组合(如:ul、lu、Lu等)。例:100u; -123u; 0x123l;
(2)浮点常数的表示形式有:科学计数形式和小数点形式。 浮点常数默认是double的。 对浮点常数进行类型转换的后缀只有:f或F(单精度浮点数)、l或L(长双精度浮点数)。(注:因浮点型常数总是有符号的,故没有u或U后缀)。例:1.23e5f; 1.23l; -123.45f;
https://www.cnblogs.com/leo0621/p/9435794.html
assert_param()的使用