<p id="p9r1t"><cite id="p9r1t"></cite></p>

<p id="p9r1t"><del id="p9r1t"><thead id="p9r1t"></thead></del></p>

    <pre id="p9r1t"></pre>

      <ruby id="p9r1t"></ruby>

      <p id="p9r1t"></p>
      <track id="p9r1t"><strike id="p9r1t"><b id="p9r1t"></b></strike></track>

      <ruby id="p9r1t"></ruby>

      <pre id="p9r1t"><ruby id="p9r1t"></ruby></pre>

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

      本规范涉及 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 


      成人亚洲区>>在线免费观看视频>>成人亚洲区