嵌入式期末复习题(三)

2023-05-16

1嵌入式系统的定义

①嵌入式系统是用于控制、监视或辅助操作机器和设备的装置

②嵌入式系统是以应用为中心,以计算机技术为基础,软硬件可裁剪,适应应用系统对功能、可靠性、成本、体积和功耗等严格要求的专用计算机系统

2嵌入式系统的特点

①嵌入式系统通常是面向特定应用的

②嵌入式系统是将先进的计算机技术、半导体技术和电子技术与各个行业的具体应用相结合后的产物

③嵌入式系统的硬件和软件都必须高效率地设计、量体裁衣、去除冗余

④嵌入式系统和具体应用有机地结合在一起

⑤嵌入式系统中的软件一般都固化在存储器芯片或单片机本身中

⑥嵌入式系统本身不具备自主开发能力

3嵌入式系统的组成

①软件结构:应用软件、操作系统、软件程序

②硬件结构:存储器、处理器、输入、输出(输入、输出:外围电路)

4嵌入式系统的开发方法:系统需求分析(规格说明书)、系统体系结构设计、系统硬件功能设计(机械/结构设计、系统软件功能设计)、系统集成(联调)、系统综合测试、产品

5嵌入式处理器的分类①微控制器MCU(MCS-51、STM32)②数字信号处理器DSP③微处理器MPU④嵌入式片上可编程系统SOPC

6 ①stm32F100超值型24MHz②101基本36M③102USB基本48④103增强72⑤ 105/107互联72⑥L系列超低功耗72

7 ROM和RAM(半导体存储器):ROM停止供电可保持数据(EEPROM电擦除功能,价格高,写入时间长、慢);RAM掉电丢失数据 (SRAM读/写速度最快,昂贵)。Flash结合所有优点。

8处理器最小系统组成:电源电路、时钟晶振电路、复位电路、启动电路、程序下载电路

9电源供电方案①VSSA,VDDA=2.0~3.6V:为ADC、复位模块、RC振荡器和PLL模拟部分供电(使用ADC时,VDD>2.4V)②VDD=2.0~3.6V,VDD管脚为I/O管脚和内部解调器供电③VBAT=1.8~3.6V,关闭VDD时(通过内部电源切换器)为RTC、外部32KHz振荡器和后备存储器供电

1DMA指一种高速的数据传输操作,允许在外部设备和存储器之间利用系统总线直接读/写数据,即不通过微处理器,也不需要微处理器干预。

特点:“分散—收集”。

缺点:允许外设直接访问内存形成对总线的独占;如果传输数据量大,造成中断延时过长。DMA传送方式的优先级高于程序中断。

2 DMA3要素:①传输源②传输目标③触发信号。

1ADC功能:

①规则转换和注入转换均有外部触发选项

②在规则通道转换期间,可以产生DMA请求

③自校准。在每次ADC开始转换前进行一次自校准

④通道采样间隔时间可编程

⑤带内嵌数据一致性的数据对齐

⑥可设置成单次、连续、扫描、间断模式

⑦双ADC模式,带2个ADC设备ADC1和ADC2,有8种转换方式

⑧)转换结束、注入转换结束和发生模拟看门狗事件时产生中断

2ADC结构:模拟信号通道、A/D转换器、模拟看门狗部分、中断电路

1启动模式①主闪存存储器(BOOT1=X BOOT0=0)②系统存储器(BOOT1=0 BOOT0=1)③内置SRAM(BOOT1=1 BOOT0=1)

2①嵌入式C程序就是针对嵌入式产品开发的C语言程序

②在ANSI标准C语言程序设计的基础上,加上特定的处理器头,在特定的编译环境下,生成可执行文件

3嵌入式C程序模块化设计思想:主程序、A/D转换、数字滤波、参数比较、故障标志生成、手动(气缸上升、气缸下降、变频参数输出、阻机转动)、自动、故障显示

4 Gene8310嵌入式系统:开关电源、液晶显示 摄像头、扬声器、麦克风 人脸跟踪、语音识别、无线通讯系统 动作、行走控制

5 STM32命名:①STM32:基于ARM的32位微控制器②F:通用类型③103:增强型④T:36脚、C48 R64 V100 Z144⑤4:16KBFlash 6:32 8:64 B128 C256 D384 E512⑥封装T=LQFP

6 GPIO_DeInit  将外设GPIOX寄存器设为缺省值

GPIO_AFIODeInit  将复用功能(重映射事件控制和EXTI设置)重设为缺省值

GPIO_Init  根据GPIO_InitStruct中指定的参数初始化外设GPIOX寄存器

GPIO_StructInit  把GPIO_InitStruct中的每一个参数按缺省值填入

GPIO_ReadInputDataBit  读取指定端口管脚的输入

GPIO_ReadInputData  读取指定的GPIO端口输入 

GPIO_ReadOutputDataBit  读取指定端口管脚的输出

GPIO_SetBits  设置指定的数据端口位

GPIO_ResetBits  清除指定的数据端口位

GPIO_WriteBit  设置或清除指定的数据端口位

GPIO_Write  向指定GPIO数据端口写入数据

GPIO_PinLockConfig  锁定GPIO管脚设置寄存器

GPIO_EventOutputConfig  选择GPIO管脚用作事件输出

GPIO_EventOutputCmd  使能或失能事件输出

GPIO_PinRemapConfig  改变指定管脚的映射

GPIO_EXTILineConfig  选择GPIO管脚用作外部中断线路

7  GPIO_Speed  描述

GPIO_Mode_AIN          模拟输入

GPIO_Mode_IN_FLOATING  浮空输入

GPIO_Mode_IPD          下拉输入

GPIO_Mode_IPU          上拉输入

GPIO_Mode_OUT_OD       开漏输出

GPIO_Mode_OUT_PP       推挽输出

GPIO_Mode_AF_OD        复用开漏输出

GPIO_Mode_AF_PP        复用推挽输出

1 stm32嵌入式处理器中断

①中断通道:处理中断的信号通路。每个中断通道对应唯一的中断向量和唯一的中断服务程序。

②51单片机中断通道有5个:外部中断0、定时器中断0、外部中断1、定时器中断1、串口中断

③stm32F103嵌入式处理器有60个中断通道;stm32F107嵌入式处理器有68个中断通道。

2 中断优先级与嵌套:

①STM32中有两个优先级的概念:抢占式优先级和响应优先级,响应优先级称作“亚优先级”或“副优先级”,每个中断源都需要被指定这两种优先级。

具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断的嵌套。

当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。

②假设STM2配置了三个中断向量,其属性如下。那么STM22在响应中断时,中断A能否打断中断C的中断服务函数?中断B能否打断中断C?如果中断B和中断C中断同时到达,响应哪个中断?。

中断向量  抢占优先级  响应优先级

A          0            0

B          1            0

C          1            1

若内核正在执行C的中断服务函数,则它能被抢占优先级更高的中断A打断,由于B和C的抢占优先级相同,所以C不能被B打断。↓

但如果B和C中断是同时到达的,内核就会首先响应响应优先级别更高的B中断。

3 void USART_Transmit(u8 data)
while(USART_GetFlagStatus(USARTl,USART_FLAG_TXE)==RESET);USART_SendData(USART1,data);

}
void put_s(u8 *s)
while(*s)

{
USART_Transmit(*s);

s++;

}

4 STM32 AD转换及硬件设计

STM32芯片内部集成的12位ADC:

是一种逐次逼近型模拟数字转换器。

具有18个通道

可测量16个外部和2个内部信号源。

1μs转换时间

ADC供电要求: 2.4V到3.6V

ADC输入 范围: VREF < VIN < VREF+

5 STM32 USART①串口1:PA9、PA10②串口2:PA1、PA2③串口3:PB10、PB11

6 AD转换结果计算

ADC=(Vin*4096)/Vref【Vin:被选中引脚的输入电压 Vref:参考电压】

7 CM3(一个字32位)处理器内核是嵌入式微控制器的中央处理单元。CM3内核基本结构:CM3内核、调试系统、外设、存储器、时钟和复位、I/O。CM3用3级流水线:取指、解码、执行

8 调用固件库函数

①函数GPIO_SetBits   函数GPIO_ResetBits

//点亮LED灯

GPIO_ResetBits(GPIOA,GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7);

//熄灭LED灯

GPIO_SetBits(GPIOA,GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7);

②函数GPIO_WriteBit

//点亮LED灯

GPIO_WriteBit(GPIOA,GPIO_Pin_4,Bit_RESET);

GPIO_WriteBit(GPIOA,GPIO_Pin_5,Bit_RESET);

GPIO_WriteBit(GPIOA,GPIO_Pin_6,Bit_RESET);

GPIO_WriteBit(GPIOA,GPIO_Pin_7,Bit_RESET);

//熄灭LED灯

GPIO_WriteBit(GPIOA,GPIO_Pin_7,Bit_SET);

GPIO_WriteBit(GPIOA,GPIO_Pin_7,Bit_SET);

GPIO_WriteBit(GPIOA,GPIO_Pin_7,Bit_SET);

GPIO_WriteBit(GPIOA,GPIO_Pin_7,Bit_SET);

9 void GPIO_Init_B(void)

{

  GPIO_InitTypeDef GPIO_InitStructure;

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);

  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1|GPIO_Pin_0|GPIO_Pin_5|GPIO_Pin_6;

  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;

  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;

  GPIO_Init(GPIOB,&GPIO_InitStructure);

1while(1)

{

ReadValue1=GPIO_InputDataBit(GPIOB,GPIO_Pin_0);

ReadValue2=GPIO_InputDataBit(GPIOB,GPIO_Pin_1);

ReadValue3=GPIO_InputDataBit(GPIOB,GPIO_Pin_5);

ReadValue4=GPIO_InputDataBit(GPIOB,GPIO_Pin_6);

if(ReadValue1==0)

{

GPIO_WriteBit(GPIOA,GPIO_Pin_4,Bit_SET);

}

if(ReadValue2==0)

{

GPIO_WriteBit(GPIOA,GPIO_Pin_5,Bit_SET);

}

if(ReadValue3==0)

{

GPIO_WriteBit(GPIOA,GPIO_Pin_6,Bit_SET);

}

if(ReadValue4==0)

{

GPIO_WriteBit(GPIOA,GPIO_Pin_7,Bit_SET);

}

一按键流水灯

#include "stm32f10x.h"

unsigned char ReadValue1;

unsigned char ReadValue2;

void Gpio_Init_Port(void)

{

    GPIO_InitTypeDef GPIO_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

    GPIO_Init(GPIOA, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

    GPIO_Init(GPIOD, &GPIO_InitStructure);

}

void Gpio_Init_Key(void)

{

    GPIO_InitTypeDef GPIO_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

    GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);

   

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;

    GPIO_Init(GPIOC, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;

    GPIO_Init(GPIOA, &GPIO_InitStructure);

}

  //yanchi

void Delay_MS(u32 time)

{

  unsigned char i;

  unsigned int j;

  for(j=0;j<time;j++)

  {

    for(i=0;i<120;i++)

    {

      ;;

    }

   }

}

int main(void)

{

   Gpio_Init_Port();

     Gpio_Init_Key();

 while(1)

 {

    GPIO_WriteBit(GPIOA, GPIO_Pin_8, Bit_SET);

    GPIO_WriteBit(GPIOD, GPIO_Pin_2, Bit_SET);

   

    ReadValue1= GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_5);

    ReadValue2= GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_15); 

     

     if(ReadValue1==0)

     {

        GPIO_WriteBit(GPIOA, GPIO_Pin_8, Bit_RESET);

     }

      if(ReadValue2==0)

     {

        GPIO_WriteBit(GPIOD, GPIO_Pin_2, Bit_RESET);

     }

  }

 }

二按键中断

#include "stm32f10x.h"

void Gpio_Init_Port(void)

{

    GPIO_InitTypeDef GPIO_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

    GPIO_Init(GPIOA, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;

    GPIO_Init(GPIOA, &GPIO_InitStructure);

}

 void EXTI_Configuration(void)

{

    EXTI_InitTypeDef EXTI_InitStructure;

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

   

    GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);

    EXTI_InitStructure.EXTI_Line=EXTI_Line0;

    EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;

    EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising;

    EXTI_Init(&EXTI_InitStructure);

   

}

void NVIC_Config(void)

{

    NVIC_InitTypeDef NVIC_InitStructure;

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

    NVIC_InitStructure.NVIC_IRQChannel=EXTI0_IRQn;

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x00;

    NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x00;

    NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;

    NVIC_Init(&NVIC_InitStructure);

}

 void EXTI_IRQHandler(void)

 {

    if( EXTI_GetITStatus(EXTI_Line0)!=RESET)

    {

GPIO_WriteBit(GPIOA,GPIO_Pin_8,(BitAction)((1-GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_8))));

    }

   EXTI_ClearFlag(EXTI_Line0);

 }

 int main(void)

 {

     Gpio_Init_Port();

     EXTI_Configuration();

       NVIC_Config();

     GPIO_WriteBit(GPIOA, GPIO_Pin_8, Bit_RESET);

     while(1);

 }

三串口发送字符

#include "stm32f10x.h"

  u16 RxData;

//时钟配置

void Gpio_Init_A(void)

{

    GPIO_InitTypeDef GPIO_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

    GPIO_Init(GPIOA, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

    GPIO_Init(GPIOA, &GPIO_InitStructure);

    }  

void Usart_init(void)

{

   USART_InitTypeDef USART_InitStructure;

   RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);

   USART_InitStructure.USART_BaudRate=115200;

   USART_InitStructure.USART_WordLength = USART_WordLength_8b;

   USART_InitStructure.USART_StopBits = USART_StopBits_1;

   USART_InitStructure.USART_Parity = USART_Parity_No;

   USART_InitStructure.USART_HardwareFlowControl =USART_HardwareFlowControl_None;

   USART_InitStructure.USART_Mode = USART_Mode_Tx|USART_Mode_Rx;

   USART_Init(USART1, &USART_InitStructure);

   USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);

   USART_Cmd(USART1, ENABLE);

   USART_ClearFlag(USART1,USART_FLAG_TC);

}

void Nvic_Init(void)

{

  NVIC_InitTypeDef NVIC_InitStructure;

  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;

  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;

  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

  NVIC_Init(&NVIC_InitStructure);

}

void USART1_IRQHandler(void)

{

 if(USART_GetITStatus(USART1,USART_IT_RXNE)==SET)

 {

 RxData=USART_ReceiveData(USART1);

 USART_SendData(USART1,RxData);

 while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);

 }

}

  void USART_Transmit(u8 data)

{

 while( USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);

 USART_SendData(USART1,data);

}

 void put_s(u8*s)

{

 while(*s)

 {

   USART_Transmit(*s);

   s++;

 }

}

  //延迟函数

void Delay_MS(u32 time)

{

  unsigned char i;

  unsigned int j;

  for(j=0;j<time;j++)

  {

    for(i=0;i<120;i++)

    {

      ;;

    }

   }

}

int main(void)

{

  Gpio_Init_A();

  Usart_init();

  Nvic_Init();

 

  while(1)

  {

   put_s("桂林航天工业学院");

   put_s("\n");

   Delay_MS(10000);

   Delay_MS(10000);

   Delay_MS(10000);

  }

 }

四单路AD

#include "stm32f10x.h"

//变量定义

     u16 RxData;

u16 RxData;

u16 ADC_value[10];

u32 ADC_value_add;

u16 ADC_value_true;

u8 ADC_volt[]={0,46,0,0,0};

u8 ADC_convert_volt ;

//端口配置(初始化:使能该GPIO口的时钟,定义GPIO口的使用引脚、速度、使用方式)

void Gpio_Init_A(void) 

{

    GPIO_InitTypeDef GPIO_InitStructure; 

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);  

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_4|GPIO_Pin_5; 

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   

    GPIO_Init(GPIOA, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

    GPIO_Init(GPIOA, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

    GPIO_Init(GPIOA, &GPIO_InitStructure);

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 ,ENABLE);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;

    GPIO_Init(GPIOA, &GPIO_InitStructure);

}

//AD转换初始化子函数 

void ADC_init(void)

{

ADC_InitTypeDef ADC_InitStructure ;

ADC_InitStructure.ADC_Mode=ADC_Mode_Independent; //独立模式

    ADC_InitStructure.ADC_ScanConvMode = DISABLE;//单通道模式

    ADC_InitStructure.ADC_ContinuousConvMode =ENABLE;//连续转换

  ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;//转换由软件启动,不受外界决定

    ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;//右对齐

  ADC_InitStructure.ADC_NbrOfChannel=1;//AD转换通道数

    ADC_Init(ADC1, &ADC_InitStructure);

  ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_1Cycles5);//ADC1的通道,采样时间为1.5周期

    ADC_Cmd(ADC1, ENABLE);//使能指定的ADC

    ADC_SoftwareStartConvCmd(ADC1, ENABLE);//使能ADC1的软件转换启动功能。

    }

//读出AD转换结果

void ADC_data_read(void)

{

u8 i=0;

    for(;i<10;i++)

    {

        while(ADC_GetFlagStatus(ADC1,  ADC_FLAG_EOC)==RESET);

        ADC_value[i]=ADC_GetConversionValue(ADC1);

        ADC_value[i]=ADC_value[i]&0x0fff;

    }

}

void ADC_data_filter()

{

    ADC_value_add=ADC_value[0]+ ADC_value[1]+ADC_value[2]+ADC_value[3]+ADC_value[4]+ADC_value[5]+ADC_value[6]+ADC_value[7]+ADC_value[8]+ADC_value[9];

    ADC_value_true=(u16)(ADC_value_add/10);

}

void ADC_data_convert()

{

ADC_convert_volt=ADC_value_true*330/4096;

ADC_volt[0]= ADC_convert_volt/100+48;

ADC_volt[2]= (ADC_convert_volt- (ADC_volt[0]-48)*100    )/10+48;

ADC_volt[3]= ADC_convert_volt%10+48;

}

  //串口编程

void USART_Transmit(u8 data)   

{

while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);

    USART_SendData(USART1, data);

}

void put_s(u8*s)

{

while(*s)

{

USART_Transmit(*s);

s++;

}

}

//串口配置

void Usart_Init(void)

{

USART_InitTypeDef USART_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 ,ENABLE);//使能串口1时钟

   

USART_InitStructure.USART_BaudRate=9600;//波特率9600

USART_InitStructure.USART_WordLength=USART_WordLength_8b;//数据位为8位

USART_InitStructure.USART_StopBits =USART_StopBits_1;//1位停止位

USART_InitStructure.USART_Parity =USART_Parity_No;//无校验位

USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;//接收、发送使能

USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//硬件流控制失能

USART_Init(USART1, &USART_InitStructure);

USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);

USART_Cmd(USART1, ENABLE);//使能USART1外设,打开串口1

USART_ClearFlag(USART1, USART_FLAG_TC);//清除USART1发送完成标志位

 } 

  //串口中断配置

void Nvic_init(void)

{

NVIC_InitTypeDef NVIC_InitStructure;

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

NVIC_InitStructure.NVIC_IRQChannel= USART1_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;

NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;

NVIC_InitStructure.NVIC_IRQChannelCmd =ENABLE;

     NVIC_Init(&NVIC_InitStructure);

}

  void USART1_IRQHandler(void)

  {

  if(USART_GetITStatus(USART1,USART_IT_RXNE)==SET)//是否产生中断

  {

  RxData = USART_ReceiveData(USART1);   //结束一个字符

  USART_SendData(USART1,RxData) ;

  while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);

  }

 }

  //延迟函数

void Delay_MS(u32 time)

{

  unsigned char i;

  unsigned int j;

  for(j=0;j<time;j++)

  {

    for(i=0;i<120;i++)

    {

      ;;

    }

  }

}

int main(void)

{

Gpio_Init_A();

Usart_Init();

Nvic_init();

ADC_init();

while(1)

{

ADC_data_read();

ADC_data_filter();

ADC_data_convert();

put_s(ADC_volt);

put_s("V");

put_s("\n");

Delay_MS(10000);

Delay_MS(10000);

Delay_MS(10000);

}

}

五多路AD

#include "stm32f10x.h"

  u16 RxData;

  u32  ADC_value_add;

  u16  ADC_value_true;

  u16  ADC_value[10];  

  u8   ADC_volt[]={0,46,0,0,0};

  u8   ADC_convert_volt;

//时钟配置

void Gpio_Init_A(void)

{

    GPIO_InitTypeDef GPIO_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_4|GPIO_Pin_5;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

    GPIO_Init(GPIOA, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

    GPIO_Init(GPIOA, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

    GPIO_Init(GPIOA, &GPIO_InitStructure);

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;

    GPIO_Init(GPIOA, &GPIO_InitStructure);

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC2,ENABLE);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;

    GPIO_Init(GPIOA, &GPIO_InitStructure);

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC3,ENABLE);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;

    GPIO_Init(GPIOA, &GPIO_InitStructure);

    }

   

void ADC_init(void)

{

    ADC_InitTypeDef ADC_InitStructure;

    ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;

    ADC_InitStructure.ADC_ScanConvMode = DISABLE;

    ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;

    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;

    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;

    ADC_InitStructure.ADC_NbrOfChannel = 1;

    ADC_Init(ADC1, &ADC_InitStructure);

    ADC_RegularChannelConfig(ADC1,ADC_Channel_1, 1,ADC_SampleTime_1Cycles5);

    ADC_Cmd(ADC1,ENABLE);

    ADC_SoftwareStartConvCmd(ADC1,ENABLE);

     ADC_Init(ADC2, &ADC_InitStructure);

    ADC_RegularChannelConfig(ADC2,ADC_Channel_2, 1,ADC_SampleTime_1Cycles5);

    ADC_Cmd(ADC2,ENABLE);

    ADC_SoftwareStartConvCmd(ADC2,ENABLE);

     ADC_Init(ADC3, &ADC_InitStructure);

    ADC_RegularChannelConfig(ADC3,ADC_Channel_3, 1,ADC_SampleTime_1Cycles5);

    ADC_Cmd(ADC3,ENABLE);

    ADC_SoftwareStartConvCmd(ADC3,ENABLE);

}

void ADC1_data_read(void)

{

    u8 i=0;

    for(i=0;i<10;i++)

    {while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)==RESET);

    ADC_value[i]=ADC_GetConversionValue(ADC1);

    ADC_value[i]=ADC_value[i]&0x0fff;

    }

}

void ADC2_data_read(void)

{

    u8 i=0;

    for(i=0;i<10;i++)

    {while(ADC_GetFlagStatus(ADC2,ADC_FLAG_EOC)==RESET);

    ADC_value[i]=ADC_GetConversionValue(ADC2);

    ADC_value[i]=ADC_value[i]&0x0fff;

    }

}

void ADC3_data_read(void)

{

    u8 i=0;

    for(i=0;i<10;i++)

    {while(ADC_GetFlagStatus(ADC3,ADC_FLAG_EOC)==RESET);

    ADC_value[i]=ADC_GetConversionValue(ADC3);

    ADC_value[i]=ADC_value[i]&0x0fff;

    }

}

void ADC_data_filter(void)

{

  ADC_value_add=ADC_value[0]+ADC_value[1]+ADC_value[2]+ADC_value[3]+ADC_value[4]+ADC_value[5]+ADC_value[6]+ADC_value[7]+ADC_value[8]+ADC_value[9];

  ADC_value_true=(u16)(ADC_value_add/10);

}

void ADC_data_convert(void)

{

   ADC_convert_volt=(ADC_value_true*330)/4096;

    ADC_volt[0]= ADC_convert_volt/100+48;

    ADC_volt[2]=(ADC_convert_volt-(ADC_volt[0]-48)*100)/10+48;

    ADC_volt[3]=ADC_convert_volt%10+48;

}

  

void Usart_Init(void)

{

   USART_InitTypeDef USART_InitStructure;

   RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);

   USART_InitStructure.USART_BaudRate=115200;

   USART_InitStructure.USART_WordLength = USART_WordLength_8b;

   USART_InitStructure.USART_StopBits = USART_StopBits_1;

   USART_InitStructure.USART_Parity = USART_Parity_No;

   USART_InitStructure.USART_HardwareFlowControl =USART_HardwareFlowControl_None;

   USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;

   USART_Init(USART1, &USART_InitStructure);

   USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);

   USART_Cmd(USART1, ENABLE);

   USART_ClearFlag(USART1,USART_FLAG_TC);

}

void Nvic_Init(void)

{

  NVIC_InitTypeDef NVIC_InitStructure;

  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;

  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;

  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

  NVIC_Init(&NVIC_InitStructure);

}

void USART1_IRQHandler(void)

{

 if(USART_GetITStatus(USART1,USART_IT_RXNE)==SET)

 {

 RxData=USART_ReceiveData(USART1);

 USART_SendData(USART1,RxData);

 while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);

 }

}

 void USART_Transmit(u8 data)

{

 while( USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);

 USART_SendData(USART1,data);

}

 void put_s(u8*s)

{

 while(*s)

 {

   USART_Transmit(*s);

   s++;

 }

}

  //延迟函数

void Delay_MS(u32 time)

{

  unsigned char i;

  unsigned int j;

  for(j=0;j<time;j++)

  {

    for(i=0;i<120;i++)

    {

      ;;

    }

   }

}

int main(void)

{

  Gpio_Init_A();

  Usart_Init();

  ADC_init();

  GPIO_WriteBit(GPIOA,GPIO_Pin_4,Bit_RESET);

  GPIO_WriteBit(GPIOA,GPIO_Pin_5,Bit_RESET);

  GPIO_WriteBit(GPIOA,GPIO_Pin_6,Bit_RESET);

  GPIO_WriteBit(GPIOA,GPIO_Pin_7,Bit_RESET);

 while(1)

  {

  ADC1_data_read();

  ADC_data_filter();

  ADC_data_convert();

   put_s(ADC_volt);

   put_s("v");

   put_s("\n");

  ADC2_data_read();

  ADC_data_filter();

  ADC_data_convert();

   put_s(ADC_volt);

   put_s("v");

   put_s("\n");

  ADC3_data_read();

  ADC_data_filter();

  ADC_data_convert();

   put_s(ADC_volt);

   put_s("v");

   put_s("\n");

    Delay_MS(10000);

    Delay_MS(10000);

    Delay_MS(10000);

   put_s("\n");

  }

  }

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

嵌入式期末复习题(三) 的相关文章

  • ETHZ数据集介绍

    Ess等构建了基于双目视觉的行人数据库用于多人的行人检测与跟踪研究 该数据库采用一对车载的AVT Marlins F033C摄像头进行拍摄 xff0c 分辨率为640 480 xff0c 帧率13 14fps xff0c 给出标定信息和行人
  • Swin Transformer V2

    Swin Transformer V2 论文链接 xff1a https arxiv org pdf 2111 09833 pdf 代码链接 xff1a https github com microsoft Swin Transformer
  • Jetson_Xavier_NX使用教程1(刷机)

    刷机教程 一 xff1a 准备 1 xff1a 准备需要一个tf卡 xff0c 容量最好大点 xff0c 我买的128G的 2 xff1a 还有两个软件一个是格式化卡的软件 xff0c 一个是将镜像文件写入的卡的软件 格式化卡的软件 写入镜
  • Jetson_Xavier_NX使用教程2(简单实用)

    本文会介绍一些刷机后的基本操作 1 风扇控制 刚开始插入电源风扇不转我以外坏了 xff0c 后来才发现并没有 Xavier NX的风扇在系统内核中有一套自动控制温度和转速的算法 xff0c 经过我观察大约在40度左右的时候会自动开启风扇进行
  • NVIDIA Jetson NX使用教程3配置pytorch环境

    本节主要记录 xff0c 安装pytorch及torch vision 1 下载Pytorch 因为jetson属于arm架构的机器 xff0c 所以需要去nvidia的官网下载对应的安装包而不是pytroch的官网 官网链接 xff0c
  • Java 基于 IETF RFC 2617 身份认证

    IETF RFC 2617 身份认证 是基于 HTTP 协议进行验证的 xff0c 认证过程中需要发送两次 HTTP 请求 xff0c 第一次请求服务器返回 401 和 认证标识 xff08 nonce xff09 xff0c 第二次访问H
  • 判断一台机器是大端序还是小端序

    在几乎所有的机器上 xff0c 多字节对象都被存储为连续的字节序列 例如在C语言中 xff0c 一个类型为int的变量x地址为0x100 xff0c 那么其对应地址表达式 amp x的值为0x100 且x的四个字节将被存储在存储器的0x10
  • STL容器保存智能指针并将this指针通过emplace传入STL容器所造成的致命问题(【double free or corruption (out)】和【bad_weak_ptr】)

    我用std queue保存了一个Message类型的智能指针 queue lt shared ptr lt MessageA gt xff0c 然后在Message类型中来将this指针插入队列 xff0c 使用std queue push
  • 实时动态定位(RTK)

    内容来着网络 实时动态定位 xff1a Real Time Kinematic RTK技术的关键在于使用了GPS的载波相位观测量 xff0c 并利用了参考站和移动站之间观测误差的空间相关性 xff0c 通过差分的方式除去移动站观测数据中的大
  • 几个实用的 Bat 脚本命令

    文章目录 1 截图2 息屏后锁屏3 查看当前的路径4 倒计时5 密码输入6 比较两个文本的差异 1 截图 start snippingtool 2 息屏后锁屏 powershell Add Type 39 DllImport 34 user
  • 学习cmake的使用和CMakeLists.txt

    1 学习cmake的使用和CMakeLists txt 文章目录 1 学习cmake的使用和CMakeLists txt1 1 cmake外部构建基础1 2 让每个源文件目录都包含一个CMakeLists txt1 3 安装 1 4 构建静
  • ROS系统基础知识梳理(四) 串口通信

    ROS系统基础知识梳理 四 串口通信 学习ROS系统 xff0c 初步接触到ROS系统外接传感器 xff0c 传感器通过Uart通信向台式机发送数据 xff0c 内容涉及到ROS调用串口数据 串口数据校验 以及欧拉角转换四元数 任务系统 x
  • Keil5中添加新的.c和.h文件

    目录 在Project的文件夹中添加添加路径使用include 在Project的文件夹中添加 如图1所示 xff0c 在User的文件夹上右键 xff0c 添加已有文件 图1 添加路径 然后需要在options for Target xf
  • 学习c语言的总结

    学习时间 xff1a 早上9点 晚上9点 学习内容 xff1a 利用c语言对 的代码学习 xff0c 并根据自己的理解编写代码 xff0c 最后整合学习的代码和自己理解的代码 xff0c 编写出更优的代码 学习体会 xff1a 对一个问题举
  • C/C++程序编译成可执行程序步骤图文源码详解

    一个C 43 43 程序被编译为目标程序的过程中经历了四个部分 xff0c 分别是预处理 编译 汇编 链接 下面将通过一个简单的C 43 43 代码分别执行预处理 编译 汇编 链接四个步骤后的结果和基本原理讲解 注意 xff1a 博主是在u
  • 【linux】程序找不到动态库.so的解决办法|查看.so动态库信息|.so动态库加载顺序

    目录 找不到 so解决方法 方法一 xff1a 添加环境变量 方法二 xff1a 复制so文件到lib路径 方法三 xff1a xff08 推荐 xff09 添加ldconfig寻找路径 方法四 xff1a 在编译目标代码时指定该程序的动态
  • 使用Arduino开发ESP32(08):TCP Client与TCP Server使用

    文章目录 目的TCP Client使用说明常用方法基础使用演示作为WEB Client使用 TCP Server使用说明常用方法基础使用演示作为WEB Server使用 总结 目的 TCP是网络应用中常用的功能 xff0c 很多高级功能也是
  • ModBus学习笔记

    一 什么是ModBus xff1f 1 预备知识 xff08 1 xff09 什么是通讯协议 xff1f 通信协议是指双方实体完成通信或服务所必须遵循的规则和约定 通过通信信道和设备互连起来的多个不同地理位置的数据通信系统 xff0c 要使
  • Jetson TX2 将系统迁移到SD卡,系统文件修改方式

    系统迁移步骤 xff1a 格式化SD卡 复制系统到SD卡 修改系统文件 1 在原系统盘内 cd boot extlinux sudo vim extlinux conf 该文件初始内容如下 xff1a TIMEOUT 30 DEFAULT
  • svn中打标签的一种方法

    SVN创建标签的方法 方法一 xff1a TortoiseSVN客户端浏览创建 选中需要创建标签的目录 xff0c 右键 gt copy to 在弹出框中输入新建标签所在的URL地址 xff0c 填写log信息 xff0c 确定 方法二 x

随机推荐

  • (图解 HTTP)一篇文章带你深入了解 HTTP 协议

    文章目录 一 了解客户端和服务器通讯的过程二 HTTP 是不保存状态的协议三 请求 URI 定位资源四 告知服务器意图的 HTTP 方法1 GET xff1a 获取资源2 POST xff1a 传输实体主体3 PUT xff1a 传输文件4
  • VC编译选项

    C 在预处理输出中保留注释语句 c 只编译 xff0c 不连接 xff0c 相当于在 34 Build 34 菜单下选择了 34 Compile 34 D 定义常量和宏 xff0c 与源程序里的 define 有相同效果 E 预处理C C
  • C语言中String库函数

    为了以后学习以及查阅方便 xff0c 转贴在此 xff0c 若有雷同 xff0c 敬请包含 文中内容摘自 C程序设计教程 xff08 美 xff09 H M Deitel P J Deitel著 xff0c 薛万鹏等译 xff0c 机械工业
  • JAVA与海康威视人脸机对接,使用ISUP方式

    1下载DEMO包 下载地址 JAVA海康威视人脸机isup方式对接demo包 Java文档类资源 CSDN下载 2设置依赖 需要把examples jar和jna jar引入项目 3配置本地 config properties 把ip地址设
  • Keil工程

    文章目录 1 Keil工程添加源文件和头文件 xff08 c和 h xff09 的方法1 方式一2 方式二 2 keil工程生成的MAP文件取消优化 1 Keil工程添加源文件和头文件 xff08 c和 h xff09 的方法 1 方式一
  • 2020-09-28

    通用异步收发器 xff08 Universal Asynchronous Receiver Transmitter xff0c 通常称作UART xff0c 是一种串行 异步 全双工的通信协议 xff0c 在嵌入式领域应用的非常广泛 UAR
  • 【cmake】CMakeList添加库|添加头文件|添加路径|add_executable、add_library、target_link_libraries|添加编译选项|宏开关

    目录 官网查阅 开胃菜例子 CMakeLists生成和添加依赖库 CMakeLists更多小例子 生成 so共享库文件 调用 so共享库文件 生成一个可执行程序的 CMakeList 生成一个 so动态库的 CMakeList add li
  • TCP连接的建立

    前言 xff1a TCP的问题已然困惑我很久了 xff0c 一直是一知半解 xff0c 靠记忆来记住TCP连接的过程 xff0c 不能根本上理解 xff0c 漏洞百出 xff0c 最近抽时间把TCP经典书籍 TCP IP详解 阅读了一下 废
  • 【Nokov】动作捕捉系统培训笔记

    Nokov度量科技 简介 xff1a Nokov是一种光学三维动作捕捉系统 xff0c 采用红外镜头捕捉被动发光标记点 xff0c 构建三维数据的动作采集与分析系统 xff0c 运用于运动分析 步态康复 模拟训练 机械仿生 机器人 无人机
  • 【Nokov】动作捕捉系统标定与机械臂各坐标系的说明

    导语 xff1a 这一周的工作先是完成了度量系统Nokov的标定 xff0c 然后对机械臂自身的编码器得到的坐标值与动作捕捉系统Nokov测得的坐标值进行了比较 xff0c 来观察二者之间的误差 在这个过程中我对Nokov软件Seeker的
  • 【Nokov】关于动捕系统获取刚体姿态的说明

    动作捕捉系统Nokov获取刚体的姿态信息 前言 xff1a 对于动捕系统软件Seeker的基本使用以及获取单个Marker的位置操作已经比较熟悉了 xff0c 对于机械臂而言 xff0c 接下来就是获取它的姿态信息 xff0c 经过昨天下午
  • 【机器人】机械臂与动捕Nokov的深入了解

    导语 xff1a 每次的实践操作后 xff0c 总能刷新我对机械臂以及Nokov的认识 xff0c 既让我惊喜不已 xff0c 同时也让我知道我掌握的还远远不够 xff0c 需要不断的学习 关于机械臂 示教器上NOA姿态表示方式 xff1a
  • Ubuntu18.04+ROS+kalibr标定工具箱安装编译

    目录 前言 一 安装ROS 1 设置镜像源 2 更新软件包索引 3 安装ROS 4 测试ROS是否安装成功 二 安装kalibr melodic 1 kalibr简介 2 安装kalibr 3 测试kalibr 参考文献 xff1a 前言
  • okhttp源码分析,Builder.ParseResult.parse(null, url) HttpUrl.parse(url) 方法详细分析

    在使用okhttp3时 以下方式具体对url进行了怎样的处理 查了许多资料没有发现有关介绍查询源码进行分析添加相关方法介绍 Request request 61 new Request Builder url 34 https www be
  • MP地面站二次开发教程(二)MP的框架与修改

    目录 MP高级功能 主界面基本修改 1 菜单名称背景修改 2 主窗体语言修改 3 主要窗体目录位置 4 菜单栏删除 5 入口函数 6 参数配置函数 定制修改步骤 1 主题环境修改 2 菜单精简 去掉冗余菜单按键 3 功能按键添加 新建按钮实
  • QGC地面站二次开发(三)Qt 简洁地面站

    目录 多机控制原理 多机控制实现 简洁地面站优化 1 飞机的飞行轨迹以不同的颜色区分 2 控制所有的飞机 3 将设定航线送给特定的飞机 多机控制原理 多机地面站支持 TCP UDP 和串口等三种连接方式 xff0c 首先我们需要对这两种连接
  • 基于51单片机的密码锁设计

    研究内容 本系统由STC89C52单片机系统 xff08 主要是STC89C52单片机最小系统 xff09 4 4矩阵键盘 LCD1602显示和报警系统等组成 xff0c 具有设置 修改六位用户密码 超次报警 超次锁定 密码错误报警等功能
  • 【gcc】gcc优化等级 -O1 -O2 -O3 -Os -Ofast -Og|gcc关闭优化

    目录 优化等级 O1 O2 O3 Os Ofast Og cmake 生成 debug和 release 版 Cmake设置优化等级 Debug和Release 方案 About table About question gcc g 43
  • 嵌入式期末复习题(二)

    考试题型 一 选择题 每小题2分 xff0c 15题 xff0c 共30分 二 填空题 每题2分 xff0c 10题 xff0c 共20分 三 简答题 每题5分 xff0c 4题 xff0c 共20分 四 分析题 每题5分 xff0c 3题
  • 嵌入式期末复习题(三)

    1嵌入式系统的定义 嵌入式系统是用于控制 监视或辅助操作机器和设备的装置 嵌入式系统是以应用为中心 xff0c 以计算机技术为基础 xff0c 软硬件可裁剪 xff0c 适应应用系统对功能 可靠性 成本 体积和功耗等严格要求的专用计算机系统