嵌入式单片机设计指南说明

本规范涉及 C 语言和单片机外设相关技术的名称与含义及经典示例,提供给初学者及兴趣爱 好者查阅使用,本文档中英文对比展示常用相关技术术语,目的是提高阅读理解与关联记忆。 出发点是为了培养嵌入式工程师开发人员的严谨、务实工作作风和严肃、认真的工作态度, 增强他们的责任感和使命感,提高工作效率和研发成功率,保证程序设计的可靠性。

Snipaste_2023-09-07_13-04-40_看图王.png

1、通用输入输出端口【GPIO】

常用HAL库函数:

image.png 

//功能:初始化GPIO

void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init);

//功能:GPIO设置输出电平

void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);

void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);

//功能:GPIO获取输入电平

GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);

//功能:外部中断回调处理

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);

GPIO常用HAL库API宏定义:

image.png 

GPIO_MODE_INPUT //输入模式

GPIO_MODE_OUTPUT_PP //输出推挽模式

GPIO_MODE_OUTPUT_OD //输出开漏模式

GPIO_PULLUP //上拉

GPIO_PULLDOWN //下拉

GPIO_SPEED_FREQ_LOW //低速

GPIO_SPEED_FREQ_MEDIUM //中速

GPIO_SPEED_FREQ_HIGH //高速

GPIOA - GPIOE //端口号

GPIO_PIN_0 - GPIO_PIN_15 //引脚号

示例代码:

image.png 

image.png 

实验验证:

image.png 


2、变量【variable】

定义:

类型名 变量名; int a;

类型名 变量名=初始值; int a=1;

声明:

extern 类型名 变量名; extern int a;

类型:

全局变量 (函数外部定义,作用域整个项目空间)

局部变量 (函数内部定义,作用域在本函数内)

静态变量 (static修饰,改变作用域范围和存储空间)

地址:

&变量名

实例代码:

image.png

2、外部中断【EXIT】

常用HAL库函数:

GPIO_InitStruct.Pin = GPIO_PIN_4; //外部中断PIN号

GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING; //外部中断上升沿触发

GPIO_InitStruct.Pull = GPIO_PULLUP; //开启上拉

HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);


HAL_NVIC_SetPriority(EXTI4_IRQn, 0, 0);//设置中断优先级

HAL_NVIC_EnableIRQ(EXTI4_IRQn);//使能中断

 

GPIO_InitStruct.Pin = GPIO_PIN_5; //外部中断PIN号

GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; //外部中断下降沿触发

GPIO_InitStruct.Pull = GPIO_PULLUP; //开启上拉

HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

 

HAL_NVIC_SetPriority(EXTI9_5_IRQn, 0, 0);//设置中断优先级

HAL_NVIC_EnableIRQ(EXTI9_5_IRQn);//使能中断

示例代码:

image.png 

实验验证:

image.png 

3、运算符【=+-*/%&|!】

运算符释义: 

=  赋值

==  等于

+   加

-   减

*   乘

/   除

%  模

++    自增

-- 自减

&    位与

|    位或

~     位反

&&   逻辑与

||  逻辑或

!  逻辑非

实例代码:


image.png

3、定时器【TIMER】

常用HAL库函数:

HAL_TIM_Base_Start_IT(&htim1); //中断方式启动定时器

//定时周期完成中断回调函数,每次计数器溢出触发中断后会调用本函数

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)

{

if(htim == &htim1)

{

//翻转灯状态

HAL_GPIO_TogglePin(LED2_GPIO_Port,LED2_Pin);

}

}

示例代码:

image.png 

实验验证:

image.png 


4、判断结构【if switch ?:】

语法形式:

if(条件)

{

代码块

}

流程图:

条件->假->结束

条件->真->代码块->结束

实例代码:

image.png

语法形式:

if(条件)

{

代码块1

}

else

{

代码块2

}

流程图:

条件->真->代码块1->结束

条件->假->代码块2->结束 

实例代码:

image.png 

语法形式:

switch(变量)

{

case 值1:

代码块1

break;

case 值2:

代码块2

break;

default:

代码块3

break;

}

流程图:

变量->值1->代码块1->结束

变量->值2->代码块2->结束

变量->其它->代码块3->结束 

实例代码:

image.png  

语法形式:

表达式1 ?表达式2 : 表达式3

流程图:

表达式1->真->表达式2->结束

表达式1->假->表达式3->结束

实例代码:

image.png 


4、系统节怕器【SysTick】

简介:

SysTick定时器是一个24位的计数器,当倒计数为0时,将从RELOAD寄存器中取值作为定时器的初始值,

同时可以选择在这个时候产生中断。例如从RELOAD的值为1000,那么当倒计数为0时,就会重新复位为1000继续倒计数。

寄存器定义:

image.png 

示例代码:

image.png 

实验验证:

image.png 


5、循环结构【while do for】

语法形式:

while(表达式)

{

代码块

} 

流程图:

表达式->假->结束

表达式->真->代码块->表达式->假->结束

实例代码:

image.png 

语法形式:

do

{

代码块

}

while(表达式);

流程图:

代码块->表达式->假->结束

代码块->表达式->真->代码块->表达式->假->结束 

实例代码:

image.png  

语法形式:

for(表达式1;表达式2;表达式3)

{

代码块

}

流程图:

表达式1->表达式2->假->结束

表达式1->表达式2->真->代码块->表达式3->表达式2->假->结束 

实例代码:

image.png

5、模数转换器【ADC】

常用HAL库函数:

HAL_ADCEx_Calibration_Start(&hadc1); //ADC自校准

HAL_ADC_Start(&hadc1); //启动ADC

HAL_ADC_PollForConversion(&hadc1,100); //轮询采样

HAL_ADC_GetState(&hadc1); //获取ADC采样状态

HAL_ADC_GetValue(&hadc1); //获取ADC采样值

//ADC转换完成中断回调函数

void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)

{

}

示例代码:

image.png 

实验验证:

image.png 


6、数组【array】

一维数组(类型相同,地址连续)

实例代码:

image.png 

二维数组(一维数组的拓展)

实例代码:

image.png 


6、串口通信【UART】

常用HAL库函数:

HAL_UART_Receive_IT(&huart2,&rx,1); //串口接收中断方式

HAL_UART_Transmit(&huart2,&tx,1,0xffff); //串口发送轮询方式

//串口接收中断回调函数

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)

{

}

示例代码:

image.png 

实验验证:

image.png 

image.png 


7、函数【function】

定义:

返回值 函数名(参数列表)

{

代码块

}

声明:

extern 返回值 函数名(参数列表);

类型:

无参数无返回值 void fun1(void)

有参数无返回值 void fun2(int para)

无参数有返回值 int fun3(void)

有参数有返回值 int fun4(int para)

调用:

带参数函数必须传入实参,获取函数返回值不是必须的

地址:

&函数名(&可以省略,函数名即是函数地址)

实例代码:

image.png 


7、同步串行总线【I2C】

常用HAL库函数:

//硬件I2C往EEPROM写数据查询方式

HAL_I2C_Mem_Write(&hi2c1,0xa0,0,I2C_MEMADD_SIZE_16BIT,wBuf,4,0xffff); 

//硬件I2C从EEPROM读数据查询方式

HAL_I2C_Mem_Read(&hi2c1,0xa0,0,I2C_MEMADD_SIZE_16BIT,rBuf,4,0xffff);

//硬件I2C往EEPROM写数据中断方式

HAL_I2C_Mem_Write_IT(&hi2c1,0xa0,0,I2C_MEMADD_SIZE_16BIT,wBuf,4);

//硬件I2C从EEPROM读数据中断方式

HAL_I2C_Mem_Read_IT(&hi2c1,0xa0,0,I2C_MEMADD_SIZE_16BIT,rBuf,4);

示例代码:

image.png 

实验验证:

image.png 


8、串行外设总线【SPI】

常用HAL库函数:

//SPI查询方式发送数据

HAL_SPI_Transmit(&hspi1,&wdat,1,0xffff);

//SPI查询方式接收数据

HAL_SPI_Receive(&hspi1,&rdat,1,0xffff);

//SPI中断方式发送数据

HAL_SPI_Transmit_IT(&hspi1,&wdat,1);

//SPI中断方式接收数据

HAL_SPI_Receive_IT(&hspi1,&rdat,1);

示例代码:

image.png 

实验验证:

image.png 


9、指针【pointer】

实质:

地址

定义:

类型名 *变量名;

读取内容:

x = *变量名;

写入内容:

*变量名 = x;

类别:

基本指针

char *p;

unsigned char *p;

short *p;   

unsigned short *p;

int *p;

unsigned int *p;

float *p;

double *p;

数组指针

类型 (*p)[];

结构体指针

struct s

{

成员列表;

} *p;

指针型指针

int **p;

函数指针

返回值(*p)(参数列表);

空指针

 void *p;

9、闪存控制器【FSMC】

STM32命名规则:

F:F代表芯片子系列

103:103代表增强型系列 

C R:代表引脚数,其中T代表36脚,C代表48脚,R代表64脚,V代表100脚,Z代表144脚。

6 B:代表内嵌Flash容量,其中6代表32K字节,8代表64K字节,B代表128K字节,C代表256K字节,D代表384K字节,E代表512K字节。

T T:代表封装,其中H代表BGA封装,T代表LQFP封装,U代表VFQFPN封装。

6 6:代表工作温度范围,其中6代表-40℃--85℃,7代表-40℃--105℃。

查看扇区分布:

image.png 

常用HAL库函数:

//解锁

HAL_FLASH_Unlock();

//擦除

HAL_FLASHEx_Erase(&EraseInitStruct, &PAGEError);

//烧录

HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD,u32Addr,*u32buf);

//上锁

HAL_FLASH_Lock();

//把写缓存数据写入Flash芯片

IFM_SectorWrite(ADDR_FLASH_PARA,wBuf,4);

//从Flash芯片读取数据存到读缓存

IFM_AnyRead(ADDR_FLASH_PARA,rBuf,4);

示例代码:

image.png 

实验验证:

image.png 


10、预处理【#include#define】

简介:

编译器在编译之前需要预先完成的处理过程

定义:

#预处理指令

类别:

#include  包含源代码文件

#define  宏定义

#ifndef  如果宏没有定义,则返回真

#ifdef    如果宏有定义,则返回真

#endif   结束一个条件编译块

#if    如果给定条件为真,则编译下面代码

#else    如果给定条件为假,则编译下面代码

#endif   结束一个条件编译块

#error   当遇到标准错误时,输出错误消息

例程代码:

image.png

10、直接存储器存取【DMA】

简介:

直接存储器访问(Direct Memory Access)简称DMA。DMA是CPU一个用于数据从一个地址空间到另一地址空间“搬运”的外设,

数据拷贝过程不需CPU干预,数据拷贝完成通知CPU处理。因此大量数据拷贝时,使用DMA可以释放CPU资源。DMA数据拷贝过程,典型的有:

内存—>内存,内存间拷贝

外设—>内存,如uart、spi、i2c等总线接收数据过程

内存—>外设,如uart、spi、i2c等总线发送数据过程

常用HAL库函数:

//DMA方式启动ADC转换

HAL_ADC_Start_DMA(&hadc1,(uint32_t *)buf1,2);

//ADC转换完成中断回调函数

void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)

{

}

示例代码:

image.png 

实验验证:

image.png