本规范涉及 C 语言和单片机外设相关技术的名称与含义及经典示例,提供给初学者及兴趣爱 好者查阅使用,本文档中英文对比展示常用相关技术术语,目的是提高阅读理解与关联记忆。 出发点是为了培养嵌入式工程师开发人员的严谨、务实工作作风和严肃、认真的工作态度, 增强他们的责任感和使命感,提高工作效率和研发成功率,保证程序设计的可靠性。
嵌入式单片机设计指南说明
1、通用输入输出端口【GPIO】
常用HAL库函数:
//功能:初始化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宏定义:
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 //引脚号
示例代码:
实验验证:
2、变量【variable】
定义:
类型名 变量名; int a;
类型名 变量名=初始值; int a=1;
声明:
extern 类型名 变量名; extern int a;
类型:
全局变量 (函数外部定义,作用域整个项目空间)
局部变量 (函数内部定义,作用域在本函数内)
静态变量 (static修饰,改变作用域范围和存储空间)
地址:
&变量名
实例代码:
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);//使能中断
示例代码:
实验验证:
3、运算符【=+-*/%&|!】
运算符释义:
= 赋值
== 等于
+ 加
- 减
* 乘
/ 除
% 模
++ 自增
-- 自减
& 位与
| 位或
~ 位反
&& 逻辑与
|| 逻辑或
! 逻辑非
实例代码:
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);
}
}
示例代码:
实验验证:
4、判断结构【if switch ?:】
语法形式:
if(条件)
{
代码块
}
流程图:
条件->假->结束
条件->真->代码块->结束
实例代码:
语法形式:
if(条件)
{
代码块1
}
else
{
代码块2
}
流程图:
条件->真->代码块1->结束
条件->假->代码块2->结束
实例代码:
语法形式:
switch(变量)
{
case 值1:
代码块1
break;
case 值2:
代码块2
break;
default:
代码块3
break;
}
流程图:
变量->值1->代码块1->结束
变量->值2->代码块2->结束
变量->其它->代码块3->结束
实例代码:
语法形式:
表达式1 ?表达式2 : 表达式3
流程图:
表达式1->真->表达式2->结束
表达式1->假->表达式3->结束
实例代码:
4、系统节怕器【SysTick】
简介:
SysTick定时器是一个24位的计数器,当倒计数为0时,将从RELOAD寄存器中取值作为定时器的初始值,
同时可以选择在这个时候产生中断。例如从RELOAD的值为1000,那么当倒计数为0时,就会重新复位为1000继续倒计数。
寄存器定义:
示例代码:
实验验证:
5、循环结构【while do for】
语法形式:
while(表达式)
{
代码块
}
流程图:
表达式->假->结束
表达式->真->代码块->表达式->假->结束
实例代码:
语法形式:
do
{
代码块
}
while(表达式);
流程图:
代码块->表达式->假->结束
代码块->表达式->真->代码块->表达式->假->结束
实例代码:
语法形式:
for(表达式1;表达式2;表达式3)
{
代码块
}
流程图:
表达式1->表达式2->假->结束
表达式1->表达式2->真->代码块->表达式3->表达式2->假->结束
实例代码:
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)
{
}
示例代码:
实验验证:
6、数组【array】
一维数组(类型相同,地址连续)
实例代码:
二维数组(一维数组的拓展)
实例代码:
6、串口通信【UART】
常用HAL库函数:
HAL_UART_Receive_IT(&huart2,&rx,1); //串口接收中断方式
HAL_UART_Transmit(&huart2,&tx,1,0xffff); //串口发送轮询方式
//串口接收中断回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
}
示例代码:
实验验证:
7、函数【function】
定义:
返回值 函数名(参数列表)
{
代码块
}
声明:
extern 返回值 函数名(参数列表);
类型:
无参数无返回值 void fun1(void)
有参数无返回值 void fun2(int para)
无参数有返回值 int fun3(void)
有参数有返回值 int fun4(int para)
调用:
带参数函数必须传入实参,获取函数返回值不是必须的
地址:
&函数名(&可以省略,函数名即是函数地址)
实例代码:
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);
示例代码:
实验验证:
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);
示例代码:
实验验证:
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℃。
查看扇区分布:
常用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);
示例代码:
实验验证:
10、预处理【#include#define】
简介:
编译器在编译之前需要预先完成的处理过程
定义:
#预处理指令
类别:
#include 包含源代码文件
#define 宏定义
#ifndef 如果宏没有定义,则返回真
#ifdef 如果宏有定义,则返回真
#endif 结束一个条件编译块
#if 如果给定条件为真,则编译下面代码
#else 如果给定条件为假,则编译下面代码
#endif 结束一个条件编译块
#error 当遇到标准错误时,输出错误消息
例程代码:
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)
{
}
示例代码:
实验验证: