嵌入式期末复习题(三)

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");

  }

  }

  • 6
    点赞
  • 72
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
1、 ARM微处理器有 7种工作模式,它们分为两类 非特权模式 、 特权模式 。其中用户模式属于 非特权模式 2、 ARM支持两个指令集, ARM核因运行的指令集不同,分别有两个状态 ARM 、 Thumb ,状态寄存器CPSR的 T 位反映了处理器运行不同指令的当前状态 3、 ARM核有多个寄存器,其中大部分用于通用寄存器,有小部分作为专用寄存器, R15 寄存器用于存储PC,R13通常用来存储 SP 4、 ARM处理器有两种总线架构,数据和指令使用同一接口的是 冯诺依曼 ,数据和指令分开使用不同接口的是 哈佛结构 1. 下列不是嵌入式系统特点的是: A. 系统内核小 B. 专用性强 C. 系统精简 D. 实时性要求不高 2. 关于ARM汇编和C语言混合编程下列错误的是: A.C语言中可以直接嵌入某些汇编指令 B. C语言中可以调用汇编的子程序 C. 汇编程序中可以调用C语言的函数 D. C语言嵌入的汇编指令时,不可以使用C的变量 3. 关于ATPCS规则,说法错误的是: A. 只能使用R0-R3来传递参数 B. R13为堆栈指针SP,需要保护 C. R14为连接寄存器,用于存放程序返回地址 D. 单字的返回值存放在R0 4. 关于交叉编译描述正确的是: A. 编译器运行在目标机,生成的可执行文件在宿主机上运行 B.编译器运行在宿主机,生成的可执行文件在宿主机上运行 C.编译器运行在目标机,生成的可执行文件在目标机上运行 D.编译器运行在宿主机,生成的可执行文件在目标机上运行 5. 建立嵌入式Linux开发环境中,使用Bootp协议的直接目的是: A. 分配宿主机的IP地址 B. 分配目标机的IP地址 C. 用于宿主机和目标机之间通讯 D. 用于监控目标机的运行。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Chris_Brown

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值