文档库 最新最全的文档下载
当前位置:文档库 › 基于STM32芯片的128点FFT

基于STM32芯片的128点FFT

基于STM32芯片的128点FFT
基于STM32芯片的128点FFT

Main函数

/******************** (C) COPYRIGHT 2008 STMicroelectronics ******************** * File Name : main.c

* Author : MCD Application Team

* Version : V2.0.1

* Date : 06/13/2008

* Description : Main program body

******************************************************************************* *

* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONL Y AIMS A T PROVIDING CUSTOMERS

* WITH CODING INFORMA TION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SA VE TIME.

* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,

* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE

* CONTENT OF SUCH FIRMW ARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING

* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.

******************************************************************************* /

/* Includes ------------------------------------------------------------------*/

#include "stm32f10x_lib.h"

#include "stdio.h"

#include "math.h"

#include "stm32_dsp.h"

/* Private typedef -----------------------------------------------------------*/

/* Private define ------------------------------------------------------------*/

#define ADC1_DR_Address ((u32)0x4001244C)

#define USART1_DR_Base ((u32)0x40013804)

#define LEN 128

/* Private macro -------------------------------------------------------------*/

/* Private variables ---------------------------------------------------------*/

ErrorStatus HSEStartUpStatus;

/* Private function prototypes -----------------------------------------------*/

void RCC_Configuration(void);

void GPIO_Configuration(void);

void NVIC_Configuration(void);

void TIM_BaseConfiguration(void);

void DMA_Configuration(void);

void USART_Configuration(void);

void ADC_Configuration(void);

void ADC_ALL_Init(void);

void FFT_Configuration(double *pr,double *pi,int n,int k,double*fr,double*fi,int l,int il);

void FFT_solve(void);

void Delay(u32 counter);

/* Private functions ---------------------------------------------------------*/

u16 data_buff[LEN];

u16 px_buff[LEN];

u16 pz_buff[LEN];

double x[128];

double pr[128];

double pi[128];

double fr[128];

double fi[128];

double mo[128];

//int *px = (int*)0x1f00;

//int *pz = (int*)0x1f80;

int xm,zm,i,t = 0;

u8 Flag = 0;

/****************************************************************************** *

* Function Name : main

* Description : Main program

* Input : None

* Output : None

* Return : None

******************************************************************************* /

int main(void)

{

#ifdef DEBUG

debug();

#endif

/* System clocks configuration ---------------------------------------------*/

RCC_Configuration();

/* NVIC configuration ------------------------------------------------------*/

NVIC_Configuration();

/* GPIO configuration ------------------------------------------------------*/

GPIO_Configuration();

/* ADC1 configuration ------------------------------------------------------*/

ADC_Configuration();

/*USART Configuration--------------------------------------------------------*/

USART_Configuration();

ADC_ALL_Init();

while (1)

{

FFT_solve();

}

}

/****************************************************************************** *

* Function Name : RCC_Configuration

* Description : Configures the different system clocks.

* Input : None

* Output : None

* Return : None

******************************************************************************* /

void RCC_Configuration(void)

{

/* RCC system reset(for debug purpose) */

RCC_DeInit();

/* Enable HSE */

RCC_HSEConfig(RCC_HSE_ON);

/* Wait till HSE is ready */

HSEStartUpStatus = RCC_WaitForHSEStartUp();

if(HSEStartUpStatus == SUCCESS)

{

/* Enable Prefetch Buffer */

FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

/* Flash 2 wait state */

FLASH_SetLatency(FLASH_Latency_2);

/* HCLK = SYSCLK */

RCC_HCLKConfig(RCC_SYSCLK_Div1);

/* PCLK2 = HCLK */

RCC_PCLK2Config(RCC_HCLK_Div1);

/* PCLK1 = HCLK/2 */

RCC_PCLK1Config(RCC_HCLK_Div2);

/* ADCCLK = PCLK2/4 */

RCC_ADCCLKConfig(RCC_PCLK2_Div4);

/* PLLCLK = 8MHz * 7 = 56 MHz */

RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_7);

/* Enable PLL */

RCC_PLLCmd(ENABLE);

/* Wait till PLL is ready */

while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)

{

}

/* Select PLL as system clock source */

RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

/* Wait till PLL is used as system clock source */

while(RCC_GetSYSCLKSource() != 0x08)

{

}

}

/* Enable peripheral clocks --------------------------------------------------*/

/* Enable DMA1 clock */

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

/* Enable USART2 clock */

RCC_APB1PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

/*Enable TIM2 clock*/

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

/* Enable ADC1 and GPIOC clock */

RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOA, ENABLE);

}

/****************************************************************************** *

* Function Name : GPIO_Configuration

* Description : Configures the different GPIO ports.

* Input : None

* Output : None

* Return : None

******************************************************************************* /

void GPIO_Configuration(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

/* Configure PC.04 (ADC Channel14) as analog input -------------------------*/

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;

GPIO_Init(GPIOC, &GPIO_InitStructure);

/* Configure PA.03 (ADC Channel14) as analog input -------------------------*/

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;

GPIO_Init(GPIOA, &GPIO_InitStructure);

/* Configure USART1 Rx (PA.10) as input floating */

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

GPIO_Init(GPIOA, &GPIO_InitStructure);

/* Configure USART1 Tx (PA.09) as alternate function push-pull */

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

}

/****************************************************************************** *

* Function Name : NVIC_Configuration

* Description : Configures Vector Table base location.

* Input : None

* Output : None

* Return : None

*******************************************************************************

/

void NVIC_Configuration(void)

{

NVIC_InitTypeDef NVIC_InitStructure;

#ifdef VECT_TAB_RAM

/* Set the Vector Table base location at 0x20000000 */

NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);

#else /* VECT_TAB_FLASH */

/* Set the Vector Table base location at 0x08000000 */

NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);

#endif

/* Enable the TIM2 gloabal Interrupt */

NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQChannel;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

/* Enable the ADC1_EOC Interrupt */

NVIC_InitStructure.NVIC_IRQChannel = ADC1_2_IRQChannel;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

}

/****************************************************************************** *

* Function Name : TIM_BaseConfiguration

* Description : Configures Vector Table base location.

* Input : None

* Output : None

* Return : None

******************************************************************************* /

void TIM_BaseConfiguration(void)

{

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

/* Time base configuration */

TIM_TimeBaseStructure.TIM_Period = 65535;

TIM_TimeBaseStructure.TIM_Prescaler = 0;

TIM_TimeBaseStructure.TIM_ClockDivision = 0;

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

/*Enable TIM2*/

TIM_Cmd(TIM2,ENABLE);

/* TIM IT enable */

TIM_ITConfig(TIM2, TIM_IT_Update , ENABLE);

}

/****************************************************************************** *

* Function Name : ADC_Configuration

* Description : Configures Vector Table base location.

* Input : None

* Output : None

* Return : None

******************************************************************************* /

void ADC_Configuration(void)

{

ADC_InitTypeDef ADC_InitStructure;

ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; /*工作在独立模式*/

ADC_InitStructure.ADC_ScanConvMode = ENABLE; /*规定了模数转换工作在扫描模式(多通道)还是单次(单通道)模式*/

ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; /*规定了模数转换工作在连续还是单次模式*/

ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; /*转换由软件而不是外部触发启动*/

ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; /*规定了ADC 数据向左边对齐还是向右边对齐*/

ADC_InitStructure.ADC_NbrOfChannel = 1; /*规定了顺序进行规则转换的ADC通道的数目*/

ADC_Init(ADC1, &ADC_InitStructure);

}

void ADC_ALL_Init(void)

{

/* ADC1 regular channel14 configuration */

ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 1, ADC_SampleTime_7Cycles5);

/*设置指定ADC的规则组通道,设置它们的转化顺序和采样时间*/

/* Enable ADC1 EOC interrupts */

ADC_ITConfig(ADC1, ADC_IT_EOC , ENABLE);

/* Enable ADC1 */

ADC_Cmd(ADC1, ENABLE);

/* Enable ADC1 reset calibaration register */

ADC_ResetCalibration(ADC1); /*重置指定的ADC的校准寄存器*/

/* Check the end of ADC1 reset calibration register */

while(ADC_GetResetCalibrationStatus(ADC1));/*获取ADC重置校准寄存器的状态*/

/* Start ADC1 calibaration */

ADC_StartCalibration(ADC1);

/* Check the end of ADC1 calibration */

while(ADC_GetCalibrationStatus(ADC1));

/* Start ADC1 Software Conversion */

ADC_SoftwareStartConvCmd(ADC1, ENABLE);/*使能指定的ADC的软件转换启动功能*/

}

/****************************************************************************** *

* Function Name : USART_Configuration

* Description : Configures Vector Table base location.

* Input : None

* Output : None

* Return : None

******************************************************************************* /

void USART_Configuration(void)

{

USART_InitTypeDef USART_InitStructure;

USART_https://www.wendangku.net/doc/6615347765.html,ART_BaudRate = 9600;

USART_https://www.wendangku.net/doc/6615347765.html,ART_WordLength = USART_WordLength_8b;

USART_https://www.wendangku.net/doc/6615347765.html,ART_StopBits = USART_StopBits_1;

USART_https://www.wendangku.net/doc/6615347765.html,ART_Parity = USART_Parity_No;

USART_https://www.wendangku.net/doc/6615347765.html,ART_HardwareFlowControl = USART_HardwareFlowControl_None;

USART_https://www.wendangku.net/doc/6615347765.html,ART_Mode = USART_Mode_Rx | USART_Mode_Tx;

/* Configure USART1 */

USART_Init(USART1, &USART_InitStructure);

/*Enable USART1 */

USART_Cmd(USART1, ENABLE);

}

/******************************************************************************

* Function Name : FFT_Configuration

* Description :

* Input : None

* Output : None

* Return : None

******************************************************************************* /

void FFT_Configuration(double *pr,double *pi,int n,int k,double*fr,double*fi,int l,int il)

//int n,k,l,il; double pr[],pi[],fr[],fi[];

/*pr(实部),pi(虚部),n(点数),k(阶数)*/

{

int it,m,is,i,j,nv,l0;

double p,q,s,vr,vi,poddr,poddi;

/*雷德(Rader)算法,实现数据的倒位序排列-----------*/

for (it=0; it<=n-1; it++)

{

m=it;

is=0;

for (i=0; i<=k-1; i++)

{

j=m/2;

is=2*is+(m-2*j);

m=j;

}

fr[it]=pr[is];

fi[it]=pi[is];

}

pr[0]=1.0;

pi[0]=0.0;

p=6.283185306/(1.0*n);

pr[1]=cos(p);

pi[1]=-sin(p);

if (l!=0)

pi[1]=-pi[1];

for (i=2; i<=n-1; i++)

{

p=pr[i-1]*pr[1];

q=pi[i-1]*pi[1];

s=(pr[i-1]+pi[i-1])*(pr[1]+pi[1]);

pr[i]=p-q;

pi[i]=s-p-q;

}

for (it=0; it<=n-2; it=it+2)

{

vr=fr[it];

vi=fi[it];

fr[it]=vr+fr[it+1];

fi[it]=vi+fi[it+1];

fr[it+1]=vr-fr[it+1];

fi[it+1]=vi-fi[it+1];

}

m=n/2;

nv=2;

for (l0=k-2; l0>=0; l0--)

{

m=m/2;

nv=2*nv;

for (it=0; it<=(m-1)*nv; it=it+nv)

for (j=0; j<=(nv/2)-1; j++)

{

p=pr[m*j]*fr[it+j+nv/2];

q=pi[m*j]*fi[it+j+nv/2];

s=pr[m*j]+pi[m*j];

s=s*(fr[it+j+nv/2]+fi[it+j+nv/2]);

poddr=p-q;

poddi=s-p-q;

fr[it+j+nv/2]=fr[it+j]-poddr;

fi[it+j+nv/2]=fi[it+j]-poddi;

fr[it+j]=fr[it+j]+poddr;

fi[it+j]=fi[it+j]+poddi;

}

}

if (l!=0)

for (i=0; i<=n-1; i++)

{ fr[i]=fr[i]/(1.0*n);

fi[i]=fi[i]/(1.0*n);

}

if (il!=0)

for (i=0; i<=n-1; i++)

{

pr[i]=sqrt(fr[i]*fr[i]+fi[i]*fi[i]);

if (fabs(fr[i])<0.000001*fabs(fi[i]))

{

if ((fi[i]*fr[i])>0) pi[i]=90.0;

else

pi[i]=-90.0;

}

else

pi[i]=atan(fi[i]/fr[i])*360.0/6.283185306;

}

}

/****************************************************************************** *

* Function Name : FFT_solve

* Description :

* Input : None

* Output : None

* Return : None

******************************************************************************* /

void FFT_solve(void)

{

if(Flag)

{

/*寄存器接收满后Flag = 1,关闭ADC中断,进行FFT运算--------*/

ADC_Cmd(ADC1, DISABLE);

//px = (int*)0x1f00;

/*转换存储位置-------------*/

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

{

//*px=data_buff[i];

//px++;

px_buff[i] = data_buff[i];

}

//px = (int*)0x1f00;

/*将ADC采来的数据转换为实际的幅度值--------------*/

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

{

//xm=*px;

xm = px_buff[i];

x[i]=xm/32768.0;

pr[i]=x[i];/*pr数组存放函数点的实部-------------*/

pi[i]=0; /*pi数组存放函数点的虚部-------------*/

//px++;

}

/*进行FFT运算----------------------*/

FFT_Configuration(pr,pi,128,7,fr,fi,0,1);

//pz = (int*)0x1f80;

/*将最终计算出的值放入pz 中----------------------*/

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

{

mo[i] = sqrt(fr[i]*fr[i]+fi[i]*fi[i]);

zm = (int)(mo[i]*1000.0);

//*pz = zm;

//pz++;

pz_buff[i] = zm;

}

}

Flag = 0;

}

/****************************************************************************** *

* Function Name : Delay

* Description :

* Input : None

* Output : None

* Return : None

******************************************************************************* /

void Delay(u32 counter)

{

for(;counter > 0;counter--);

}

#ifdef DEBUG

/****************************************************************************** *

* Function Name : assert_failed

* Description : Reports the name of the source file and the source line number

* where the assert_param error has occurred.

* Input : - file: pointer to the source file name

* - line: assert_param error line source number

* Output : None

* Return : None

******************************************************************************* /

void assert_failed(u8* file, u32 line)

{

/* User can add his own implementation to report the file name and line number, ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */

/* Infinite loop */

while (1)

{

}

}

#endif

/******************* (C) COPYRIGHT 2008 STMicroelectronics *****END OF FILE****/

stm32f10x_it.c

/******************** (C) COPYRIGHT 2008 STMicroelectronics ******************** * File Name : stm32f10x_it.c

* Author : MCD Application Team

* Version : V2.0.1

* Date : 06/13/2008

* Description : Main Interrupt Service Routines.

* This file provides template for all exceptions handler

* and peripherals interrupt service routine.

******************************************************************************* *

* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONL Y AIMS A T PROVIDING CUSTOMERS

* WITH CODING INFORMA TION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SA VE TIME.

* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,

* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE

* CONTENT OF SUCH FIRMW ARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING

* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.

******************************************************************************* /

/* Includes ------------------------------------------------------------------*/

#include "stm32f10x_it.h"

#include "stdio.h"

/* Private typedef -----------------------------------------------------------*/

/* Private define ------------------------------------------------------------*/

#define ADC1_DR_Address ((u32)0x4001244C)

#define LEN 128

/* Private macro -------------------------------------------------------------*/

/* Private variables ---------------------------------------------------------*/

/* Private function prototypes -----------------------------------------------*/

/* Private functions ---------------------------------------------------------*/

extern u16 data_buff[LEN];

extern int t ;

extern u8 Flag;

u32 *P = (u32*)0x4001244C;

/****************************************************************************** *

* Function Name : NMIException

* Description : This function handles NMI exception.

* Input : None

* Output : None

* Return : None

******************************************************************************* /

void NMIException(void)

{

}

/****************************************************************************** *

* Function Name : HardFaultException

* Description : This function handles Hard Fault exception.

* Input : None

* Output : None

* Return : None

******************************************************************************* /

void HardFaultException(void)

{

/* Go to infinite loop when Hard Fault exception occurs */

while (1)

{

}

}

/****************************************************************************** *

* Function Name : MemManageException

* Description : This function handles Memory Manage exception.

* Input : None

* Output : None

* Return : None

******************************************************************************* /

void MemManageException(void)

{

/* Go to infinite loop when Memory Manage exception occurs */

while (1)

{

}

}

/****************************************************************************** *

* Function Name : BusFaultException

* Description : This function handles Bus Fault exception.

* Input : None

* Output : None

* Return : None

******************************************************************************* /

void BusFaultException(void)

{

/* Go to infinite loop when Bus Fault exception occurs */

while (1)

{

}

}

/****************************************************************************** *

* Function Name : UsageFaultException

* Description : This function handles Usage Fault exception.

* Input : None

* Output : None

* Return : None

******************************************************************************* /

void UsageFaultException(void)

{

/* Go to infinite loop when Usage Fault exception occurs */

while (1)

{

}

}

/****************************************************************************** *

* Function Name : DebugMonitor

* Description : This function handles Debug Monitor exception.

* Input : None

* Output : None

* Return : None

******************************************************************************* /

void DebugMonitor(void)

{

}

/****************************************************************************** *

* Function Name : SVCHandler

* Description : This function handles SVCall exception.

* Input : None

* Output : None

* Return : None

******************************************************************************* /

void SVCHandler(void)

{

}

/****************************************************************************** *

* Function Name : PendSVC

* Description : This function handles PendSVC exception.

* Input : None

* Output : None

* Return : None

******************************************************************************* /

void PendSVC(void)

{

}

/****************************************************************************** *

* Function Name : SysTickHandler

* Description : This function handles SysTick Handler.

* Input : None

* Output : None

* Return : None

******************************************************************************* /

void SysTickHandler(void)

{

}

/****************************************************************************** *

* Function Name : WWDG_IRQHandler

* Description : This function handles WWDG interrupt request.

* Input : None

* Output : None

* Return : None

******************************************************************************* /

void WWDG_IRQHandler(void)

{

}

/****************************************************************************** *

* Function Name : PVD_IRQHandler

* Description : This function handles PVD interrupt request.

* Input : None

* Output : None

* Return : None

******************************************************************************* /

void PVD_IRQHandler(void)

{

}

/****************************************************************************** *

* Function Name : TAMPER_IRQHandler

* Description : This function handles Tamper interrupt request.

* Input : None

* Output : None

* Return : None

******************************************************************************* /

void TAMPER_IRQHandler(void)

{

}

/****************************************************************************** *

* Function Name : RTC_IRQHandler

* Description : This function handles RTC global interrupt request.

* Input : None

* Output : None

* Return : None

******************************************************************************* /

void RTC_IRQHandler(void)

{

}

/****************************************************************************** *

* Function Name : FLASH_IRQHandler

* Description : This function handles Flash interrupt request.

* Input : None

* Output : None

* Return : None

******************************************************************************* /

void FLASH_IRQHandler(void)

{

}

/****************************************************************************** *

* Function Name : RCC_IRQHandler

* Description : This function handles RCC interrupt request.

* Input : None

* Output : None

* Return : None

******************************************************************************* /

void RCC_IRQHandler(void)

{

}

/****************************************************************************** *

* Function Name : EXTI0_IRQHandler

* Description : This function handles External interrupt Line 0 request.

* Input : None

* Output : None

* Return : None

******************************************************************************* /

void EXTI0_IRQHandler(void)

{

}

/****************************************************************************** *

* Function Name : EXTI1_IRQHandler

* Description : This function handles External interrupt Line 1 request.

* Input : None

* Output : None

* Return : None

******************************************************************************* /

void EXTI1_IRQHandler(void)

{

}

/****************************************************************************** *

* Function Name : EXTI2_IRQHandler

* Description : This function handles External interrupt Line 2 request.

* Input : None

* Output : None

* Return : None

******************************************************************************* /

void EXTI2_IRQHandler(void)

{

}

/****************************************************************************** *

* Function Name : EXTI3_IRQHandler

* Description : This function handles External interrupt Line 3 request.

* Input : None

* Output : None

* Return : None

******************************************************************************* /

void EXTI3_IRQHandler(void)

{

}

/****************************************************************************** *

* Function Name : EXTI4_IRQHandler

* Description : This function handles External interrupt Line 4 request.

* Input : None

* Output : None

* Return : None

******************************************************************************* /

void EXTI4_IRQHandler(void)

{

}

/****************************************************************************** *

* Function Name : DMA1_Channel1_IRQHandler

* Description : This function handles DMA1 Channel 1 interrupt request.

* Input : None

* Output : None

* Return : None

******************************************************************************* /

void DMA1_Channel1_IRQHandler(void)

{

}

/****************************************************************************** *

* Function Name : DMA1_Channel2_IRQHandler

* Description : This function handles DMA1 Channel 2 interrupt request.

* Input : None

* Output : None

* Return : None

******************************************************************************* /

void DMA1_Channel2_IRQHandler(void)

{

}

/******************************************************************************

STM32单片机硬件关键基础精华及注意事项

STM32单片机硬件关键基础精华及注意事项 时间:2012-09-06 19:02:44 来源:作者: STM32简单介绍 一、背景 如果你正为项目的处理器而进行艰难的选择:一方面抱怨16位单片机有限的指令和性能,另一方面又抱怨32位处理器的高成本和高功耗,那么,基于ARM Cortex-M3内核的STM32系列处理器也许能帮你解决这个问题。使你不必在性能、成本、功耗等因素之间做出取舍和折衷。 即使你还没有看完STM32的产品手册,但对于这样一款融合ARM和ST技术的“新生儿”相信你和我一样不会担心这款针对16位MCU 应用领域的32位处理器的性能,但是从工程的角度来讲,除了芯片本身的性能和成本之外,你或许还会考虑到开发工具的成本和广泛度;存储器的种类、规模、性能和容量;以及各种软件获得的难易,我相信你看完本专题会得到一个满意的答案。 对于在16位MCU领域用惯专用在线仿真器(ICE)的工程师可能会担心开发工具是否能够很快的上手?开发复杂度和整体成本会不会增加?产品上市时间会不会延长?没错,对于32位嵌入式处理器来说,随着时钟频率越来越高,加上复杂的封装形式,ICE已越来越难胜任开发工具的工作,所以在32位嵌入式系统开发中多是采用JTAG仿真器而不是你熟悉的ICE。但是STM32采用串行单线调试和JTAG,通过JTAG调试器你可以直接从CPU获取调试信息,从而将使你的产品设计大大简化,而且开发工具的整体价格要低于ICE,何乐而不为?

有意思的是STM32系列芯片上印有一个蝴蝶图像,据ST微控制器产品部Daniel COLONNA先生说,这是代表自由度,意在给工程师一个充分的创意空间。我则“曲解”为预示着一种蝴蝶效应,这种蝴蝶效应不仅会对方案提供商以及终端产品供应商带来举足轻重的影响,而且会引起竞争对手策略的改变……翅膀已煽动,让我们一起静观其变! 二、STM32市面上流通的型号 截至2010年7月1日,市面流通的型号有: 基本型:STM32F101R6,STM32F101C8,STM32F101R8,STM32F101V8 ,STM32F101RB,STM32F101VB 增强型:STM32F103C8,STM32F103R8,STM32F103V8,STM32F103RB,STM32F103VB,STM32F103VE,STM32F103ZE 三、STM32系列的作用 ARM公司的高性能”Cortex-M3”内核 1.25DMips/MHz,而ARM7TDMI只有0.95DMips/MHz 一流的外设 1μs的双12位ADC,4兆位/秒的UART,18兆位/秒的SPI,18MHz的I/O翻转速度 低功耗 在72MHz时消耗36mA(所有外设处于工作状态),待机时下降到2μA 最大的集成度 复位电路、低电压检测、调压器、精确的RC振荡器等 简单的结构和易用的工具 四、STM32F10x重要参数 2V-3.6V供电 容忍5V的I/O管脚 优异的安全时钟模式 带唤醒功能的低功耗模式 内部RC振荡器 内嵌复位电路 工作温度范围:-40℃至+85℃或105℃ 五、性能特点 基本型STM32F101:36MHz CPU,多达16K字节SRAM,1x12位ADC温度传感器 增强型STM32F103:72MHz CPU,多达20K字节SRAM,2x12位ADC 温度传感,PWM定时器,CAN,USB 六、STM32互联型系列简介: 全新STM32互连型(Connectivity)系列微控制器增加一个全速USB(OTG)接口,使终端产品在连接另一个USB设备时既可以充当USB主机又可充当USB从机;还增加一个硬件支持IEEE1588精确时间协议(PTP)的以太网接口,用硬件实现这个协议可降低CPU开销,提高实时应用和联网设备同步通信的响应速度。 全新互连型系列还是STM32家族中首款集成两个CAN2.0B控制器的产品,让开发人员能够研制可连接两条工业标准CAN(控制器区域网)总线的网关设备。此外,新系列微控制器还支持以太网、USB OTG和CAN2.0B外设接口同时工作,因此,开发人员只需一颗芯片就能设计整合所有这些外设接口的网关设备。 STM32互连型系列产品强化了音频性能,采用一个先进的锁相环机制,实现音频级别的I2S通信。结合USB主机或从机功能,STM32可以从外部存储器(U盘或MP3播放器)读取、解码和输出音频信号。设计人员还可以在新系列微控制器上开发人机界面(HMI)功能,如播放和停止按键,以及显示器界面。这个功能使其可用于各种家庭音响设备,如音响底座系统、闹钟/音乐播放器和家庭影院。 新系列产品整合先进的面向连接的外设,标准的STM32外设(包括一个PWM定时器),高性能的32位ARM Cortex-M3 CPU,这些特性使开发人员可以在设备上(如家电、楼宇或工业自动化)整合多种功能,如马达控制、用户界面控制和设备互连功能。其它目标应用包括需要联网、数据记录或USB外设扩展功能的系统,如病患监视、销售终端机、自动售货机和保安系统。 包括新的互连型系列在内的STM32系列微控制器具有多种配套软件和开发工具,其中包括意法半导体免费提供的软件库以及第三方工具厂商的广泛支持。意法半导体还将推出一个新的评估板,目前正在向大客户提供STM32F105和STM32F107互连型系列的样片。

STM32芯片的ROM与RAM

按照上边的例子, 在Keil中编译工程成功后,在下面的Bulid Ouput窗口中会输出下面这样一段信息: Program Size: Code=119222 RO-data=18266 RW-data=320 ZI-data=23492 代表的意思: Code :是程序中代码所占字节大小 RO-data :程序中所定义的指令和常量大小(个人理解:Read Only) RW-data :程序中已初始化的变量大小 (个人理解”:Read/Write) ZI-Data :程序中未初始化的变量大小 (个人理解:Zero Initialize) ROM(Flash) size = Code+RO-data+RW-data; RAM size = RW-data+ZI-data 可以通过.map查看占用的flash和ram大小 Code是代码占用的空间,RO-data是 Read Only 只读常量的大小,如const型,RW-data是(Read Write)初始化了的可读写变量的大小,ZI-data是(Zero Initialize)没有初始化的可读写变量的大小。ZI-data不会被算做代码里因为不会被初始化。 简单的说就是在烧写的时候是FLASH中的被占用的空间为:Code+RO Data+RW Da ta 程序运行的时候,芯片内部RAM使用的空间为:RW Data+ZI Data ARM编译中的RO、RW和ZI DATA区段 ARM程序(指在ARM系统中正在执行的程序,而非保存在ROM中的bin文件)的组成 一个ARM程序包含3部分:RO段,RW段和ZI段 RO是程序中的指令和常量 RW是程序中的已初始化变量

stm32芯片简介

单片机存储器处理器成本STM32 背景如果你正为项目的处理器而进行艰难的选择:一方面抱怨16位单片机有限的指令和性能,另一方面又抱怨32位处理器的高成本和高功耗,那么,基于ARM Cortex-M3内核的STM32系列处理器也许能帮你解决这个问题。使你不必在性能、成本、功耗等因素之间做出取舍和折衷。 即使你还没有看完STM32的产品手册,但对于这样一款融合ARM和ST技术的“新生儿”相信你和我一样不会担心这款针对16位MCU应用领域的32位处理器的性能,但是从工程的角度来讲,除了芯片本身的性能和成本之外,你或许还会考虑到开发工具的成本和广泛度;存储器的种类、规模、性能和容量;以及各软件获得的难易,我相信你看完本专题会得到一个满意的答案。 对于在16位MCU领域用惯专用在线仿真器(ICE)的工程师可能会担心开发工具是否能够很快的上手?开发复杂度和整体成本会不会增加?产品上市时间会不会延长?没错,对于32位嵌入式处理器来说,随着时钟频率越来越高,加上复杂的封装形式,ICE已越来越难胜任开发工具的工作,所以在32位嵌入式系统开发中多是采用JTAG仿真器而不是你熟悉的ICE。但是STM32采用串行单线调试和JTAG,通过JTAG调试器你可以直接从CPU获取调试信息,从而将使你的产品设计大大简化,而且开发工具的整体价格要低于ICE,何乐而不为? 有意思的是STM32系列芯片上印有一个蝴蝶图像,据ST微控制器产品部Daniel COLONNA 先生说,这是代表自由度,意在给工程师一个充分的创意空间。我则“曲解”为预示着一种蝴蝶效应,这种蝴蝶效应不仅会对方案提供商以及终端产品供应商带来举足轻重的影响,而且会引起竞争对手策略的改变……翅膀已煽动,让我们一起静观其变! STM32市面上流通的型号截至2010年7月1日,市面流通的型号有:基本型:STM32F101R6 STM32F101C8 STM32F101R8 STM32F101V8 STM32F101RB STM32F101VB 增强型:STM32F103C8 STM32F103R8 STM32F103V8 STM32F103RBSTM32F103VB STM32F103VE STM32F103ZE STM32系列的作用简介ARM公司的高性能”Cortex-M3”内核 1.25DMips/MHz,而ARM7TDMI只有0.95DMips/MHz 一流的外设 1μs的双12位ADC,4兆位/秒的UART,18兆位/秒的SPI,18MHz的I/O翻转速度低功耗 在72MHz时消耗36mA(所有外设处于工作状态),待机时下降到2μA 最大的集成度 复位电路、低电压检测、调压器、精确的RC振荡器等 简单的结构和易用的工具 STM32F10x重要参数2V-3.6V供电 容忍5V的I/O管脚 优异的安全时钟模式 带唤醒功能的低功耗模式 内部RC振荡器 内嵌复位电路 工作温度范围: -40°C至+85°C或105°C STM32F101性能特点36MHz CPU 多达16K字节SRAM 1x12位ADC温度传感器 STM32F103性能特点72MHz CPU多达20K字节SRAM 2x12位ADC 温度传感 PWM定时器 CAN USB STM32互联型系列简介:全新STM32互连型(Connectivity)系列微控制器增加一个全

STM32对时钟芯片PCF8563的编程

这是用STM32对PCF8563编程的程序、模拟IIC,经验证可用~ 移植用到的文件:IIC.h IIC.c PCF8563.h PCF8563.c ,我把它们全都复制到了这个Word文档里。 使用要初始化的函数:void PCF8563_Init(void). 就唯一这个。 全局变量: u8 PCF8563_Time[7]; 程序初始的值是给PCF8563设置的时间,程序中读取返回的值是PCF8563当时的时间。 我这里使用的IIC的SCL,SDA的引脚分别为PA.0 PA.1,具体看IIC.h 和IIC.C。只要修改好两个引脚的初始化配套你手上的板子这,就能成功移植~ Delay_nus(20):这是一个延迟20us的函数。 IIC.h: #ifndef _IIC_H_ #define _IIC_H_ #include "stm32f10x.h" /* Private typedef -----------------------------------------------------------*/ /* Private define ------------------------------------------------------------*/ /*#define I2C_Speed 100000 #define I2C1_SLA VE_ADDRESS7 0xA0 #define I2C_PageSize 256 */ //SCL PA0 //SDA PA1 #define SCL_H() GPIO_SetBits(GPIOA, GPIO_Pin_0) #define SCL_L() GPIO_ResetBits(GPIOA, GPIO_Pin_0) #define SDA_H() GPIO_SetBits(GPIOA, GPIO_Pin_1) #define SDA_L() GPIO_ResetBits(GPIOA, GPIO_Pin_1) //返回0,和1 #define Read_SDA() GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1) u8 IIC_ReadByte(void); void IIC_WriteByte(u8 byte); void IIC_WaitAck(void); void IIC_Stop(void); void IIC_Start(void); void IIC_Init(void); void I2C_Ack(void); void I2C_NoAck(void); //取回八个字节的数据:秒,分,时,天,星期,月份,年份。

MEMORY存储芯片STM32F103C8T6中文规格书

Features ?ARM? 32-bit Cortex?-M3 CPU Core –72 MHz maximum frequency, 1.25 DMIPS/MHz (Dhrystone 2.1) performance at 0 wait state memory access –Single-cycle multiplication and hardware division ?Memories –64 or 128 Kbytes of Flash memory –20 Kbytes of SRAM ?Clock, reset and supply management – 2.0 to 3.6 V application supply and I/Os –POR, PDR, and programmable voltage detector (PVD) –4-to-16 MHz crystal oscillator –Internal 8 MHz factory-trimmed RC –Internal 40 kHz RC –PLL for CPU clock –32 kHz oscillator for RTC with calibration ?Low-power –Sleep, Stop and Standby modes –V BAT supply for RTC and backup registers ? 2 x 12-bit, 1 μs A/D converters (up to 16 channels) –Conversion range: 0 to 3.6 V –Dual-sample and hold capability –Temperature sensor ?DMA –7-channel DMA controller –Peripherals supported: timers, ADC, SPIs, I2Cs and USARTs ?Up to 80 fast I/O ports –26/37/51/80 I/Os, all mappable on 16 external interrupt vectors and almost all 5 V-tolerant ?Debug mode –Serial wire debug (SWD) & JTAG interfaces ?7 timers –Three 16-bit timers, each with up to 4 IC/OC/PWM or pulse counter and quadrature (incremental) encoder input –16-bit, motor control PWM timer with dead-time generation and emergency stop – 2 watchdog timers (Independent and Window) –SysTick timer 24-bit downcounter ?Up to 9 communication interfaces –Up to 2 x I2C interfaces (SMBus/PMBus) –Up to 3 USARTs (ISO 7816 interface, LIN, IrDA capability, modem control) –Up to 2 SPIs (18 Mbit/s) –CAN interface (2.0B Active) –USB 2.0 full-speed interface ?CRC calculation unit, 96-bit unique ID ?Packages are ECOPACK? Table 1. Device summary Reference Part number STM32F103x8 STM32F103C8, STM32F103R8 STM32F103V8, STM32F103T8 STM32F103xB STM32F103RB STM32F103VB, STM32F103CB, STM32F103TB 找Memory、FPGA、二三极管、连接器、模块、光耦、电容电阻、单片机、处理器、晶振、传感器、滤波器, 上深圳市美光存储技术有限公司 August 2015

STM32学习—如何选择各个电路部分的主要芯片

STM32学习—如何选择各个电路部分的主要芯片 电路设计的基本过程一般是这样的:需求分析——元件选型——原理图设计——PCB设计——焊接调试。 ▼需求分析: 在这里,主要是确定小车需要哪些模块、外设或接口。首先,STM32最小系统是必须的,这是小车控制的核心。然后小车的两个轮子需要两个H桥驱动和编码器接口。需要陀螺仪感知小车的姿态(包括倾角,转向角,角速度等)。需要一些调试和指示用的外设(蜂鸣器,LED等)。需要电源电路为系统供电。需要电池电压采集电路来实时采集电池电压,做低压报警,防止电池过放。需要下载接口和调试用的串口。基本就是根据自己想要实现功能,然后确定需要那些部分的电路。 ▼元件选型: 为需要的各个部分电路选择元件,一般来说,主要是选择何种型号、什么封装的芯片,对于一些比较特殊的电路,即使是电阻电容这样常见的无源器件也需要认真选择,然而平衡小车的电路中并不需要一些高精度或很高速的电路部分,所以,下面主要介绍如何选择各个电路部分的主要芯片。 1.最小系统:考虑到小车的主控板可以作为今后做四轴或其他更高级的机器人的基础电路,所以主控选择了STM32F405RGT6,这款主控是M3内核的,主频可以达到168M,有丰富的外设资源可以使用,性能非常强悍,非常适合以后的开发和拓展。 2.电机驱动:小车的两个轮子电机需要两个H桥驱动。驱动的选择和电机的参数紧密相关。我选用的电机的正常工作电流360mA,并且考虑到小车在正常情况下基本不会出现赌转的情况,并且为了尽量减小PCB板的面积,所以选择了东芝的电机驱动芯片TB6612,该芯片有两个集成的H桥,可以同时驱动两个电机,每个H桥可以持续输出1.2A的电流,PWM 频率可以到100kHz,芯片的供电电压最大可以到15V,适合用3S电池供电,并且芯片封装很小,节省PCB面积。 3.电源电路:主要考虑输入电压、输出电压、输出电流等。小车电池采用3S锂聚合物电

STM32芯片烧写和加密解密

STM32芯片烧写和加密、解密 yurenchen 2013/3/4 连接 (还可以设置JLink script) Target -> Connect 烧写 打开要烧写的文件,如keil编译生成的hex文件, 点烧写即可.

加密 加密后将不可通过JTAG读写flash, 需要解密才可以.

解密 解密后flash会被全部清空成0xFF 加密解密操作同函数 FLASH_ReadOutProtection(ENABLE) FLASH_ReadOutProtection(DISABLE) 只是通过这个函数需要代码执行一次后才能完成加密. 操作: OB->RDP ENABLE: OB->RDP = 0x00; DISABLE: OB->RDP = RDP_Key; //0x00A5 OB地址0x1FFFF800 OB 结构 typedef struct { __IO uint16_t RDP; __IO uint16_t USER; __IO uint16_t Data0; __IO uint16_t Data1; __IO uint16_t WRP0; __IO uint16_t WRP1; __IO uint16_t WRP2; __IO uint16_t WRP3; } OB_TypeDef;

(摘自refrence.pdf)

(摘自programingManual.pdf) flash 加密的实质: 标记 Information Block 段的Option Bytes某字节, 通过JTAG接口访问Flash时先检查此字节的标志. 通常的flash 读写都不修改 Information Block.

STM32 大小容量芯片之间的差别

STM32 大小容量芯片之间的差别 本文主要讨论STM32F103xC,STM32F103xD 和STM32F103xE 大容量增强型芯片的特性:1)何为大容量芯片呢? 答:高达512K 字节的闪存和64K 字节的SRAM 的芯片为大容量。 2)STM32 有分小容量,中等容量和大容量的型号,区别呢? 因为STM32F103xx 是一个完整的系列,其成员之间是完全地脚对脚兼容,软件和功能上也兼容。在参考手册中,STM32F013x4 和STM32F103x6 被归为小容量产品,STM32F103x8 和STM32F103xB 被归为中等容量产品, STM32F103xC,STM32103xD 和STM32F103xE 被归为大容量产品,其中我们的神舟II 号就是选择的STM32F103xC 芯片,神舟III 号是STM32xE 芯片,都是属于大容量产品,容量大一点,大家在做产品和项目时更具备参考性。 小容量和大容量产品是中等容量产品(STM32F103x8/B)的延伸,小容量 对应的数据手册为《STM32F103x4/6 数据手册》和《STM32F103xC/D/E 数据手册》。 小容量产品具有较小的闪存存储器,RAM 空间和较少的定时器和外设。而 大容量的产品则具有较大的闪存存储器,RAM 空间和更多的片上外设,如SDIO,FSMC,I2S 和DAC 等,同时保持与其它同系列的产品兼容。 表:STM32F103xx 系列 3)规格说明 答:STM32F103xC,STM32F103xD 和STM32F103xE 型系列是32 位的RISC 内核,工作频率为72MHz,丰富的增强I/O 端口和联接到两条APB 总线的外设。

STM32芯片型号的命名规则

STM32芯片型号的命名规则 一 STM32F105和STM32F107互连型系列微控制器之前,意法半导体已经推出STM32基本型系列、增强型系列、USB基本型系列、增强型系列;新系列产品沿用增强型系列的72MHz 处理频率。内存包括64KB到256KB闪存和20KB到64KB嵌入式SRAM。新系列采用LQFP64、LQFP100和LFBGA100三种封装,不同的封装保持引脚排列一致性,结合STM32平台的设计理念,开发人员通过选择产品可重新优化功能、存储器、性能和引脚数量,以最小的硬件变化来满足个性化的应用需求。 截至2010年7月1日,市面流通的型号有: 基本型:STM32F101R6 STM32F101C8 STM32F101R8 STM32F101V8 STM32F101RB STM32F101VB 增强型:STM32F103C8 STM32F103R8 STM32F103V8 STM32F103RBSTM32F103VB STM32F103VE STM32F103ZE STM32型号的说明:以STM32F103RBT6这个型号的芯片为例,该型号的组成为7个部分,其命名规则如下: (1)STM32:STM32代表ARM Cortex-M3内核的32位微控制器。 (2)F:F代表芯片子系列。 (3)103:103代表增强型系列。 (4)R:R这一项代表引脚数,其中T代表36脚,C代表48脚,R代表64脚,V代表100脚,Z代表144脚。 (5)B:B这一项代表内嵌Flash容量,其中6代表32K字节Flash,8代表64K字节Flash,B代表128K字节Flash,C代表256K字节Flash,D代表384K字节Flash,E代表512K字节Flash。 (6)T:T这一项代表封装,其中H代表BGA封装,T代表LQFP封装,U代表VFQFPN 封装。 (7)6:6这一项代表工作温度范围,其中6代表-40——85℃,7代表-40——105℃。 二 从上面的料号可以看出以下信息: ST品牌ARM Cortex-Mx系列内核32位超值型MCU,LQFP -48封装闪存容量32KB 温度范围-40℃-85℃; 1.产品系列: STM32代表ST品牌Cortex-Mx系列内核(ARM)的32位MCU; 2.产品类型: F:通用快闪(Flash Memory); L:低电压(1.65~3.6V);F类型中F0xx和F1xx系列为2.0~3.6V; F2xx和F4xx系列为

STM32芯片引脚图

Pinouts and pin descriptions STM32F103xC, STM32F103xD, STM32F103xE 26/123 Doc ID 14611 Rev 7

STM32F103xC, STM32F103xD, STM32F103xE Pinouts and pin descriptions Doc ID 14611 Rev 727/123 Figure 6. STM32F103xC and STM32F103xE performance line LQFP100 pinout 100999897969594939291908988878685848382818079787776 12345678910111213141516171819202122232425 75747372717069686766656463626160595857565554535251VDD_2 VSS_2 NC P A 13 P A 12 P A 11 P A 10 P A 9 P A 8 PC9 PC8 PC7 PC6 PD15 PD14 PD13 PD12 PD11 PD10 PD9 PD8 PB15 PB14 PB13 PB12 P A 3V S S _4V D D _4P A 4P A 5P A 6P A 7P C 4P C 5P B 0P B 1P B 2P E 7P E 8P E 9P E 10P E 11P E 12P E 13P E 14P E 15P B 10P B 11V S S _1V D D _1V D D _3 V S S _3 P E 1 P E 0 P B 9 P B 8 B O O T 0 P B 7 P B 6 P B 5 P B 4 P B 3 P D 7 P D 6 P D 5 P D 4 P D 3 P D 2 P D 1 P D 0 P C 12 P C 11 P C 10 P A 15 P A 14 26272829303132333435363738394041424344454647484950 PE2PE3PE4PE5PE6VBAT PC13-TAMPER-RTC PC14-OSC32_IN PC15-OSC32_OUT VSS_5VDD_5OSC_IN OSC_OUT NRST PC0PC1PC2PC3VSSA VREF-VREF+VDDA PA0-WKUP PA1PA2ai14391 LQFP100

STM32芯片+8M+32.768Khz晶振的设计思路

STM32芯片+8M+32.768Khz晶振的设计思路、参考方案 意法半导体(STMicro Electronics)集团于1987年6月成立,是由意大利的SGS微电子公司和法国Thomson半导体公司合并而 成。自1999年起,ST始终是世界十大半导 体公司之一。 STM32系列产品是ST在2007年推出的基于ARM@Cortex-M 内核的高性能、低成本、低功耗MCU。STM32F1系列是最早推出的一个产品系列,也是目前用的最多的一个产品系列。 本文主要讲解STM32系列MCU匹配晶振的推荐选型及注意事项等。 --STM32F103一般来说MCU需要接入一个主频和一个时钟频率,STM32F1系列也不例外。其中主频4~16MHZ居多,一般搭配常用的8MHZ 晶振;时钟频率即是最常见的32.768KHZ晶振。 如图所示:

一、8MHZ的主频晶振 可供选择的范围很广泛,但是随着电子产品小型化越来越成为主流,因此电路板上提供给各位研发设计人员的空间越来越小,因此对晶振的选择也是以小体积的贴片封装为主,本文推荐两颗极具性价比的8MHZ晶振,即上海唐辉电子代理的日本KDS大真空公司推出的DSX321G和DSX320G/DSX320GE系列产品。 1、工业级、消费类产品用DSX321G8MHZ,如下图: 该型号产品封装为3.2mm*2.5mm,体积不到传统49S封装的

1/5,精度可达到20PPM,工作温度达到-40—+85°C的工业级,完全能够满足客户的要求。 2、汽车电子、工控类产品用DSX320G/DSX320GE,如下图: 该型号产品封装统一为3.2*2.5mm,精度可做到100ppm和50ppm,除了温度能满足客户要求的-40-+125°C、-40-+150°C外,还符合AEC-Q200标准。

stm32芯片资料

基于STM32的电能质量检测技术研究 近些年来,随着现代化工业设备和民用电器设备的普及,电力用户对供电质量的要求越来越高。特别是大量非线性电力负荷用到日常生活和工业生产中,使得公用电网中的电能质量问题愈显凸出,已经严重影响了电能供应质量。因此,根据国家电能质量检测标准,有必要对电网供电的各项参数进行测试,分析电网的电能质量。 国内外已有不少方法对电能质量进行检测。但是传统的基于8、16位的单片机的电能检测设备存在处理速度慢,硬件结构不够完善等缺点。而当下比较流行的运用DSP处理器的电能检测设备,虽然其处理速度快、精度高,但是成本较高、功耗大,不利于大规模的推广[1]。本文提出一种基于STM32芯片以内嵌入式智能仪器模式设计的方案。STM32具有杰出的功耗控制及众多外设。设计时可充分利用其丰富的片上资源,大大节省了硬件的投资。利用STM2内置的A/D可对信号进行高速采集和处理,其自带的USB接口可对数据进行快速传输,以及通过电阻式彩色触摸屏TFT对相关数据进行实时显示等。系统具有设计结构简单、携带方便、低成本、低功耗、可靠性高等优点,适合实时现场操作,具有较高的应用价值。 1电能质量检测设备总体设计方案 本电能质量检测系统的主要设计思路是:根据国家制定的电能质量相关标准对系统进行设计、开发,系统框图如图1所示。通过高精度的模拟信号采集电路对公用电网的电压、电流进行采集;通过FFT算法对谐波进行检测分析,以及运用电能检测芯片对电压幅值、电流值、功率因素等一系列参数进行检测;最后将测试结果显示在液晶屏幕上,同时将数据存储在SD 卡上,检测设备之间可以通过2.4 G无线通信模块进行数据交换,还可运用USB通信接口传输实时的数据到上位机,以便上位机对数据进行存储和分析[2-5]。 2硬件设计 2.1STM32处理器介绍 本系统采用的是由意法半导体公司推出的基于ARMCortex-M3内核的STM32F103RBT6增强型32位处理器。其工作频率为72 MHz,内置高速存储器(高达128 K字节的闪存和20 K 字节的SRAM),丰富的增强型I/O端口和联接到2条APB总线的外设。包含2个12位的A/D、3个通用16位定时器和1个PWM定时器,还包含标准和先进的通信接口:多达2个IIC接口和SPI接口、3个USART接口、一个USB接口和一个CAN接口。STM32较市场上同种类的单片机具有价格低、功能强、使用简单、开发方便等优势。 2.2电能数据采集模块设计 对于前端电压电流的采集选用高精度的电压电流互感器。其体积小、精度高、全封闭、机械和耐环境性能好,电压隔离能力强,安全可靠且工作频率范围在20 Hz~20 kHz。运用互感器将大电压电流信号转换成小信号,再通过分压将其转换成STM32的A/D输入通道的合理电压输入范围(0~3.3 V)。

STM32的BOOT概述——补充

STM32的BOOT概述——补充 STM32三种启动模式对应的存储介质均是芯片内置的,它们是: 用户闪存:BOOT1=x BOOT0=0芯片内置的Flash。 SRAM:BOOT1=1 BOOT0=1芯片内置的RAM 区,就是内存啦。 系统存储器:BOOT1=0 BOOT0=1芯片内部一块特定的区域,芯片出厂时在这个区域预置了一段Bootloader,就是通常说的ISP程序。这个区域的内容在芯片出厂后没有人能够修改或擦除,即它是一个ROM 区。 在每个STM32的芯片上都有两个管脚BOOT0和BOOT1,这两个管脚在芯片复位时的电平状态决定了芯片复位后从哪个区域开始执行程序,见下表: BOOT1=x BOOT0=0 从用户闪存启动,这是正常的工作模式。 BOOT1=0 BOOT0=1 从系统存储器启动,这种模式启动的程序功能由厂家设置。 BOOT1=1 BOOT0=1 从内置SRAM 启动,这种模式可以用于调试。 要注意的是,一般不使用内置SRAM 启动(BOOT1=1 BOOT0=1),因为SRAM 掉电后数据就丢失。多数情况下SRAM 只是在调试时使用,也可以做其他一些用途。如做故障的局部诊断,写一段小程序加载到SRAM 中诊断板上的其他电路,或用此方法读写板上的Flash 或EEPROM 等。还可以通过这种方法解除内部Flash 的读写保护,当然解除读写保护的同时Flash 的内容也被自动清除,以防止恶意的软件拷贝。 一般BOOT0 和BOOT1 跳线都跳到0(GND)。只是在ISP下载的情况下,BOOT0=1,BOOT1=0 ,下载完成后,把BOOT0 的跳线接回0,也即BOOT0=0,BOOT1=0 。 对于一般的应用来说,直接把BOOT0 和BOOT1 引脚接地即可,不用设置跳线,使用IAR 调试程序时可以选择RAM 调试还是Flash 调试,与BOOT0 和BOOT1 的配置无关。

STM32F103芯片CAN总线应用程序

/******************************************************************* ---------------------Copyright(a)----------------------------------- 作者: 日期: 修改记录: 描述: STM32共有14组过滤器,用以对接收到的帧进行过滤。每组过滤器包括了2个可配置的32位寄存器:CAN_FxR0和CAN_FxR1。 对于过滤器组,可以将其配置成屏蔽位模式,这样CAN_FxR0中保存的就是标识符匹配值,CAN_FxR1中保存的是屏蔽码, 即CAN_FxR1中如果某一位为1, 则CAN_FxR0中相应的位必须与收到的帧的标志符中的相应位吻合才能通过过滤器;CAN_FxR1中为0的位表示CAN_FxR0中的相应位可不必与收到的帧进行匹配。 过滤器组还可以被配置成标识符列表模式,此时CAN_FxR0和CAN_FxR1中的都是要匹配的标识符,收到的帧的标识符必须与其中的一个吻合才能通过过滤。 例如: CAN_FilterInitStructure.CAN_FilterNumber=0; //设置第一组过滤器 CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; //屏蔽位模式 CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32位 CAN_FilterInitStructure.CAN_FilterIdHigh=(0x0635<<5); //接收ID为635的消息11位帧ID 标准帧因此左移5 CAN_FilterInitStructure.CAN_FilterIdLow=0x0000; CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0xffff; // CAN_FilterInitStructure.CAN_FilterMaskIdLow=0xffff; CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO0; //第一组过滤器指向FIFO0 CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; CAN_FilterInit(&CAN_FilterInitStructure); 滤波器配置详细如下: 1、对扩展数据帧进行过滤:(只接收扩展数据帧) CAN_FilterInitStructure.CAN_FilterIdHigh = (((u32)slave_id<<3)&0xFFFF0000)>>16; CAN_FilterInitStructure.CAN_FilterIdLo=(((u32)slave_id<<3)|CAN_ID_EXT|CAN_RTR_DATA)&0xFF FF; CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0xFFFF; CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0xFFFF; (注:标准帧数据帧、标准远程帧和扩展远程帧均被过滤)

相关文档
相关文档 最新文档