0、STM32散装知识

Pout/Pin0.010.112
dB

Pout/Pin0.010.10.512310100
dB-20-10-30351020

Pending:挂起

Active:激活

Interrupt:中断

Registers:寄存器

Priority:优先级

Prescaler:预分频器

Division:分开(分频)

Structure:结构体

Handler:处理,处理器

Config:配置

Go To Definition:跳转至定义

Go To Reference:跳转至引用

volatile:不稳定的,暂态的,易变的

declared:声明

implicitly:不明显地

  1. 宏名一般用大写;
  2. 使用宏可提高程序的通用性和易读性,减少不一致性,减少输入错误和便于修改。如:数组大小常用宏定义;
  3. 预处理是在编译之前的处理,而编译工作的任务之一就是语法检查,预处理不做语法检查;
  4. 宏定义末尾不加分号;
  5. 宏定义写在函数的花括号外边,作用域为其后的程序,通常在文件的最开头;
  6. 可以用#undef命令终止宏定义的作用域;
  7. 宏定义允许嵌套;
  8. 字符串( " " )中永远不包含宏;
  9. 宏定义不分配内存,变量定义分配内存;
  10. 宏定义不存在类型问题,它的参数也是无类型的。

#include"stdio.h"
#define Print1(str) printf("%s",str)

#define PI 3.14
#define STR "圆周率约等于"

#define Print2 printf("hello world!")
int main()
{
	Print1("替换!");//预处理时会被替换为 printf("%s","替换!")
    printf("\r\n");//回车换行 
    
    printf("%s %f",STR,PI); //预处理时会被替换为 printf("%s %f","圆周率约等于",3.14);
    printf("\r\n");//回车换行 
    
    Print2;  //预处理时会被替换为 printf("hello world!");
    printf("\r\n");//回车换行 
    
	return 0;
}


 

#define PI 3.141592654

// 代码

#undef PI    //下面开始 PI 就失效了
#ifndef <标识> //先测试x是否被宏定义过
#define <标识> //如果没有宏定义下面就宏定义x并编译下面的语句

// 代码

#endif //如果已经定义了则编译#endif后面的语句
ifndef _STDIO_H_
#define STDIO_H

enum 枚举类型名
{
 枚举值1,枚举值2,…
}
typedef enum
{
    RED,
    GREEN,
    BULE,
}Color;
typedef struct
{
  uint16_t GPIO_Pin;

  GPIOSpeed_TypeDef GPIO_Speed; 

  GPIOMode_TypeDef GPIO_Mode;  

}GPIO_InitTypeDef;
void KEY_Configuration(void) //IO初始化
{ 
 	GPIO_InitTypeDef GPIO_InitStructure;
 
 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

	GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_2;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; 
 	GPIO_Init(GPIOE, &GPIO_InitStructure);
}

 每一个枚举值都代表着一个模式,最后通过把这些值写入相应寄存器,最终完成GPIO的模式配置

typedef enum
{ GPIO_Mode_AIN = 0x0,
  GPIO_Mode_IN_FLOATING = 0x04,
  GPIO_Mode_IPD = 0x28,
  GPIO_Mode_IPU = 0x48,
  GPIO_Mode_Out_OD = 0x14,
  GPIO_Mode_Out_PP = 0x10,
  GPIO_Mode_AF_OD = 0x1C,
  GPIO_Mode_AF_PP = 0x18
}GPIOMode_TypeDef;

枚举值的比较

规则:按其在说明时的顺序号比较,如果说明时没有人为指定,则第一个枚举元素的值认作 0

若用户没有给一个枚举常量赋初值,则系统给它赋予的值是它前一项枚举常量的值加1,若它本身就是首项,则被自动赋予整数0。

可以利用枚举类型来进行条件判断:if(today==1)······

 一个整数不能直接赋给一个枚举变量,必须强制进行类型转换才能赋值

#include <stdio.h>
void main() 
{ 
	enum weekday {sun,mon,tue,wed,thu,fri,sat} day; 
	int k; 
	printf("请输入0到6的数:"); 
	scanf("%d",&k);
	day=(enum weekday)k; 

	switch(day) 
	{ 
		case sun: printf("sunday\n");break; 
		case mon: printf("monday\n");break; 
		case tue: printf("tuesday\n");break; 
		case wed: printf("wednesday\n");break; 
		case thu: printf("thursday\n");break; 
		case fri: printf("friday\n");break; 
		case sat: printf("satday\n");break; 
		default: printf("input error\n");break; 
	} 
} //输入0-6中的一个数字,能够输出对应的星期。
#include“stdio.h”
#define TEST_2    1
int main()
{
    int  a=11;

    #if  TEST_2 
        int *b=&a;                    
        *b = 10;
    #endif

 a++;
}
enum Roster { 	//该语句定义了Roster这一枚举类型 
	Tom,
	Sharon, 
	Bill, 
	Teresa, 
	John
}; 

// 定义匿名的枚举变量,只能使用a这一个枚举类型的变量,不能再定义其他该类型的枚举变量
enum  {Jan=1,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,dec} a;

// typedef  enum则是用来定义一个数据类型,那么该类型的变量值只能在enum定义的范围内取
typedef enum  {Jan=1,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,dec} Day;

// 定义enum/枚举类型的同时,声明变量
enum Month {Jan=1,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,dec} a,b;

enum 语句实际上并没有创建任何变量,只是定义了一个枚举类型

不同枚举类型中的枚举常量的名字必须互不相同,但枚举常量可以具有相同的值

为枚举符号赋值,则它们必须是整数

总结
枚举常量之间用逗号隔开,最后一个枚举常量之后不需要逗号;
整个枚举类型定义语句的最后需要一个分号;
Roster是该枚举类型的名字,这是一个可选项;
不能对枚举常量进行赋值操作(定义枚举类型时除外);
枚举常量和枚举变量可以用于判断语句,实际用于判断的是其中实际包含的值;
一个整数不能直接赋值给一个枚举变量,必须用该枚举变量所属的枚举类型进行类型强制转换才行;
使用常规的手段输出无法输出枚举常量所对应的字符串,因为枚举常量为整型值;
在使用枚举变量的时候,我们不关心其值的大小,而是其表示的状态;
enum用来定义一系列宏定义常量,相当于一系列的#define xx xx,当然它后面的标识符也可当作一个类型标识符;
typedef enum则是用来定义一个数据类型,那么该类型的变量值只能在enum定义的范围内取。两者在这点上是没有差别的。
对enum变量取地址是不合法的,类似于#define的行为,对#define取地址也不合法(见Effective C++条款02)

getchar()实例

#include <stdio.h>
int main() {
    char password[10];
    printf("请输入密码:");
    scanf("%s", password);
    printf("请确认密码(Y/N):");
    int ch = getchar();
    if (ch == 'Y') {
        printf("登录成功\n");
    }
    else  printf("登录失败\n");
}
 //重定向 c 库函数 printf 到串口,重定向后可使用 printf 函数
int fputc(int ch, FILE *f)
{
	USART_SendData(USART1, (uint8_t) ch);//发送一个字节数据到串口

	while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET){}//等待发送完毕
   
    return ch;
}
/*使用方式:printf("重定向串口实验\n")*/

//重定向 c 库函数 scanf 到串口,重定向后可使用 scanf、getchar 等函数
 int fgetc(FILE *f)
 {
 /* 等待串口输入数据 */
 while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);
 
 return (int)USART_ReceiveData(USART1);
 }
 //此函数作为接收数据时记得关闭串口得接收中断!
 //使用scanf函数时,在发送数据时需要在末尾加空格或者回车然后,scanf才会停止字符匹配
 /*使用方式:
			scanf("%s", Buffer_Rx);
			printf("重定向串口实验:%s\n",Buffer_Rx);

5.上拉电阻阻值选择原则

1)从节约功耗及芯片的灌电流能力考虑,电阻值应当足够大。电阻越大,电流越小。

2)从确保足够的驱动电流考虑,电阻值需要足够小。电阻值越小,电流越大。

3)对于高速电路,过大的上拉电阻可能边沿变平缓。需要电阻与电容形成RC滤波电路,影响信号的高频分量的传输。

4)驱动能力与功耗的平衡。以上拉电阻为例,一般来说,上拉电阻越小,驱动能力越强,但功耗越大,设计时应注意二者之间的平衡。

5)下级电路的驱动需求。同样以上拉电阻为例,当输出高电平时,开关管断开,上拉电阻应适当选择以能够向下级电路提供足够的电流。

6)高低电平的设定。不同电路的高低电平的门槛电平会有所不同,电阻应适当设定以确保能输出正确的电平。以上拉电阻为例,当输出低电平时开关管导通,上拉电阻和开关管导通电阻分压值应确保在零电平门槛之下。

7)频率特性。以上拉电阻为例,上拉电阻和开关管漏源极之间的电容和下级电路之间的输入电容会形成RC延迟,电阻越大,延迟越大。上拉电阻的设定应考虑电路在频率方面的需求。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值