日常学习笔记--嵌入式相关

持续更新 ing…

【 1. STM32选型后缀 】

STM32的F4系列只要对应的封装是相同的(STM32F407ZET6和STM32F407ZGT6都是LQPF144封装),那么对应的管教顺序就是完全相同的,
对于同一F4系列芯片,他们区别从名字就可以看出来,比如STM32F407ZE和STM32F407ZG

  • F代表系列(还有L系列(低功耗),H系列(高性能(功耗比L还低)),WB(没用过)。
  • 407代表外设的多少。
  • Z是引脚数,代表144引脚(T(36脚),V(48),R(64),V(100),I(176))。
  • E和G分别代表512kb和1024kb的flash,(6(32),8(64,),B(128),C(256),D(384))。
  • T是LQPF封装(H(BGA),U(VFQFPN))。
  • 6是工作的温度范围,所以这两块只有FLASH的差别。

【 2. keilC51各数据类型长度 】

在这里插入图片描述

【 3. KEIL MDK各数据类型长度 】

在这里插入图片描述

【 4. typedef 、#define区别 】

typedef unsigned char u8;
  • 它在自己的作用域内给一个给已有的类型起一个别名,定义与平台无关的数据类型。
  • typedef 在编译时处理 的, typedef在编译阶段有效,因此 typedef 有类型检查的功能。
  • typedef有自己的作用域。
#define KEY0 		PEin(4)
  • #define则是宏定义,发生在预处理阶段,也就是 编译之前,它只进行简单而机械的 字符串替换 ,而不进行任何检查。
  • #define不只是可以为类型取别名,还可以定义常量、变量、编译开关等。
  • #define没有作用域的限制,只要是之前预定义过的宏,在以后的程序中都可以使用。

【 5. 外部变量声明 】

extern int a;     //声明一个全局变量a。
int a;            //定义一个全局变量a。
extern int a =0 ; //定义一个全局变量a,并给初值。
int a =0;         //定义一个全局变量a,并给初值。
  • 第四个 等于 第 三个,都是定义一个可以被外部使用的全局变量,并给初值,即 有赋值的就是定义
  • 定义只能出现1次,声明可以出现多次!:不管是 int a; 还是 extern int a=0; 还是 int a=0; 都只能出现一次,而 extern int a;可以出现很多次。
  • 当使用一个全局变量的时候,就要用到 声明的唯一代码:extern int a; 这时候extern不能省略,因为省略了,就变成 int a; 就变成了一个定义,而不是声明;另外赋值的话如 extern int a=5; 也就变成了定义。
  • 另一种方式:
    在头文件中包含下列代码:
    extern int temp=5;
    而在对应包含该头文件的源文件中则不需声明该变量。

2021/10/9

  • 普通变量
//.c文件
int Distance;
//.h文件
extern int Distance;
  • 结构体变量
//.c文件
lidar BenewakeLidar;
//.h文件
typedef struct 
{
 uint16_t Dist;
 uint16_t AMP;
 uint16_t tem;
 uint8_t RecieveFlag;
}lidar;

extern lidar BenewakeLidar;

【 6. sys文件夹 】

在 sys.h 里面定义了 STM32F4 的 I/O 口输入读取宏定义和输出宏定义。sys.c 里面主要是一些汇编函数。

【 7. 输入阻抗、输出阻抗 】

在这里插入图片描述

  • 输入阻抗 可以理解为后级电路的阻抗RL。
  • 输出阻抗 可以理解为前级电路的阻抗Rs。

1. 恒压源情况下–高输入阻抗低输出阻抗

  • 可知当输入阻抗较大,输出阻抗较小时,信号源电压将 “全部赋给” 后级电路,此时仅需较小的电流即可驱动后级电路。
  • 输入阻抗越大越好,那么我们想办法把它设计得很大很大,岂不是最好?不然,当输入阻抗很大的时候,回路电流就会很小很小,而实际电路中,电流路径是容易被干扰的(来自其他信号的串扰,或来自空中的电磁辐射),这时只要一个很小的扰动叠加到回路电流上就会严重的干扰到信号质量。所以除非能够保证信号被很好的屏蔽,不受外界干扰,否则也不要把输入阻抗设计得过大。

2. 恒流源情况下–低输入阻抗高输出阻抗

  • 前边说的,都是指电压信号,电流信号则要反过来看。
  • 如果是电流信号(恒流源),那么相当于前级电路与后级电路并联。
  • 那么前级电路的输出阻抗越大,则有较小电流流入前级电路;后级电路的输入阻抗越小,则有较大电流流入后级电路。

【 8. TVS二极管 】

  • 瞬态二极管(Transient Voltage Suppressor)简称TVS,是一种二极管形式的高效能保护器件。
  • 当TVS管两端经受瞬间的高能量冲击时,它能以极高的速度(最高达1*10-12秒)使其阻抗骤然降低,同时吸收一个大电流,将其两端间的电压箝位在一个预定的数值上,从而确保后面的电路元件免受瞬态高能量的冲击而损坏。

【 9. IO输入输出配置 】

  • IO 输入/输出 方向设置
#define SDA_IN()  {GPIOB->MODER&=~(3<<(9*2));GPIOB->MODER|=0<<9*2;}	//PB9输入模式
#define SDA_OUT() {GPIOB->MODER&=~(3<<(9*2));GPIOB->MODER|=1<<9*2;} //PB9输出模式
  • IO 输入/输出 宏定义
#define IIC_SCL    PBout(8) //SCL
#define IIC_SDA    PBout(9) //SDA	 
#define READ_SDA   PBin(9)  //输入SDA 
  • 例子
//产生IIC起始信号
void IIC_Start(void)
{
	SDA_OUT();     //sda线输出
	IIC_SDA=1;	  	  
	IIC_SCL=1;
	delay_us(4);
 	IIC_SDA=0;//START:when CLK is high,DATA change form high to low 
	delay_us(4);
	IIC_SCL=0;//钳住I2C总线,准备发送或接收数据 
}	  

//读1个字节,ack=1时,发送ACK,ack=0,发送nACK   
u8 IIC_Read_Byte(unsigned char ack)
{
	unsigned char i,receive=0;
	SDA_IN();//SDA设置为输入
    for(i=0;i<8;i++ )
	{
        IIC_SCL=0; 
        delay_us(2);
		IIC_SCL=1;
        receive<<=1;
        if(READ_SDA)receive++;   
		delay_us(1); 
    }					 
    if (!ack)
        IIC_NAck();//发送nACK
    else
        IIC_Ack(); //发送ACK   
    return receive;
}

【 10. F4驱动24C02 】

2021/7/11

  • 在使用F4开发板运行24C02实验时,总是显示 Failed to drive 24C02!\r\n
  • 后来发现是IIC的STOP时序有问题。
原程序
void IIC_Stop(void)
{
        SDA_OUT();//sda线输出
        IIC_SCL=0;
        IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
        delay_us(4);
        IIC_SCL=1;
        IIC_SDA=1;//发送I2C总线结束信号
        delay_us(4);                                                                  
}


改为
void IIC_Stop(void)
{
        SDA_OUT();//sda线输出
        IIC_SCL=0;
        IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
        delay_us(4);
        IIC_SCL=1;
        delay_us(4);
        IIC_SDA=1;//发送I2C总线结束信号                                                                  
}

就没问题了。

【 11. F1代码移植到F4 】

2021/7/26
由于F1较高的性价比,一般能满足绝大数要求,网上好多代码的驱动都是F1,需要移植到F4,特此做笔记。
移植时主要注意这两个问题:

  • 时钟使能函数
    F1的GPIO时钟是挂载在APB2总线上的,而F4的GPIO时钟是挂载在AHB1总线上,因此
	RCC_AHPeriphClockCmd(RCC_APB2Periph_GPIOX, ENABLE);	 //使能端口时钟

需要将上述改为:↓

	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOX, ENABLE);	 //使能端口时钟
  • GPIO引脚配置

F1的引脚配置:


1. 输入浮空 GPIO_Mode_IN_FLOATING
2. 输入上拉 GPIO_Mode_IPU
3. 输入下拉 GPIO_Mode_IPD
4. 模拟输入 GPIO_Mode_AIN
5. 开漏输出 GPIO_Mode_Out_OD
6. 开漏复用输出 GPIO_Mode_AF_OD
7. 推挽输出 GPIO_Mode_Out_PP
8. 推挽式复用输出 GPIO_Mode_AF_PP

F4的引脚配置:


/* 
GPIO_InitStructure.GPIO_Mode
*/
1. GPIO_Mode_IN;  //普通输入
2. GPIO_Mode_OUT; //输出
3. GPIO_Mode_AF;  //复用
4. GPIO_Mode_AN;  //模拟

/*
GPIO_InitStructure.GPIO_PuPd 
*/
1. GPIO_PuPd_NOPULL; //浮空
2. GPIO_PuPd_UP;     //上拉
3. GPIO_PuPd_DOWN;   //下拉

/* 
GPIO_InitStructure.GPIO_OType
*/  
1. GPIO_OType_OD ; //开漏输出
2. GPIO_OType_PP;  //推挽输出
 
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MR_Promethus

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值