打印

STM32性能很不错

[复制链接]
5395|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
skyler|  楼主 | 2007-7-3 22:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
目前我只用到SPI接口,性能真的不错,103的spi时钟达到16MHz,DMA时spi是9MHz
比str7优秀很多。

不过有点郁闷,为何dma比单字节写时更慢?
沙发
席君秋| | 2007-7-3 22:49 | 只看该作者

羡慕中,楼上已经能忽悠STM32了。

俺还在等待样片中!

使用特权

评论回复
板凳
zhiwei| | 2007-7-4 20:03 | 只看该作者

DMA

存储器总线只有一条,带宽被CPU占用,DMA只能窃取一些空闲总线周期来传输数据;用指令来加载当然比较快了,用DMA有可能就会慢一些。Atmel的PDC好像速度还快一些,不知道怎么做到的。

使用特权

评论回复
地板
skyler|  楼主 | 2007-7-4 21:26 | 只看该作者

不止一条总线

参考STM32 ref man,上面说STM32内部有四条总线,分别是
ICode Bus,DCode Bus,System Bus,DMA Bus
DMA时从 Ram->端口 用到DMA Bus,程序运行时用到了ICode Bus,似乎不会竞争。我估计是DMA时设置不对所以变慢,而不是总线问题。

使用特权

评论回复
5
浪淘沙| | 2007-7-4 21:50 | 只看该作者

太羡慕了,我还没玩呢

看看这个能帮多少忙。

这玩意太花时间和精力,望大虾指正。
相关链接:https://bbs.21ic.com/upfiles/img/20077/200774214930745.pdf

使用特权

评论回复
6
skyler|  楼主 | 2007-7-5 00:06 | 只看该作者

3楼正确,的确存在竟争

谢谢浪淘沙的文档,的确很及时 ^o^

DMA 控制器和 Cortex-M3 核共享系统数据线执行直接存储器数据传输。因此,1 个 DMA
请求占用至少 2个周期的 CPU访问系统总线时间。为了保证 Cortex-M3核的代码执行的最
小带宽,DMA控制器总是在 2个连续的DMA请求间释放系统时钟至少1个周期。

可是spi相对指命来说,是很慢的设备,问题肯定不在这里。我贴出代码,浪淘沙可有空帮忙解决? xixi

代码是demo中的,只在Demo_Init函数未尾增加了SPI DMA的代码。

int main(void)
{
#ifdef DEBUG
  debug();
#endif

  /* Initialize the Demo */
  Demo_Init();
  while(1);
}

void Demo_Init(void)
{
    SPI_InitTypeDef    SPI_InitStructure;
    DMA_InitTypeDef    DMA_InitStructure;
    unsigned char SPI1_Buffer_Rx[128];
    unsigned char SPI1_Buffer_Tx[128];

  /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration -----------------------------*/   
  /* 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)
  {
    /* HCLK = SYSCLK */
    RCC_HCLKConfig(RCC_SYSCLK_Div1); 
  
    /* PCLK2 = HCLK */
    RCC_PCLK2Config(RCC_HCLK_Div1); 

    /* PCLK1 = HCLK/2 */
    RCC_PCLK1Config(RCC_HCLK_Div2);

    /* ADCCLK = PCLK2/6 */
//    RCC_ADCCLKConfig(RCC_PCLK2_Div6);

    /* Flash 2 wait state */
    FLASH_SetLatency(FLASH_Latency_2);

    /* Enable Prefetch Buffer */
    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

    /* PLLCLK = 8MHz * 9 = 72 MHz */
    RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);

    /* 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)
    {
    }
  }
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA, ENABLE);
  
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |
                         RCC_APB2Periph_SPI1, ENABLE);
  
  /* Enable GPIOA, GPIOB, GPIOC, GPIOD, GPIOE and AFIO clocks */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |RCC_APB2Periph_GPIOC 
         | RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO, ENABLE);

  /* TIM1 Periph clock enable */
//  RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);

  /* SPI2 Periph clock enable */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);

  /* TIM2  and TIM4 clocks enable */
//  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 | RCC_APB1Periph_TIM4, ENABLE);

  /* USBCLK = PLLCLK/1.5 */
//  RCC_USBCLKConfig(RCC_USBCLKSource_PLLCLK_1Div5);

  /* Enable USB clock */
//  RCC_APB1PeriphClockCmd(RCC_APB1Periph_USB, ENABLE);

/*------------------- Resources Initialization -----------------------------*/
  /* GPIO Configuration */
  GPIO_Config();

  /* Interrupt Configuration */
  InterruptConfig();

  /* Configure the systick */    
  SysTick_Config();

/*------------------- Drivers Initialization -------------------------------*/
  /* Initialize the LEDs toogling */
  LedShow_Init();

  /* Initialize the Low Power application */
  LowPower_Init();

  /* If HSE is not detected at program startup */
  if(HSEStartUpStatus == ERROR)
  {
    /* Generate NMI exception */
    NVIC_SetSystemHandlerPendingBit(SystemHandler_NMI);
  }

  /* Initialize the SPI FLASH driver */
  SPI_FLASH_Init();
//  MSD_Init();

#if 1
  /* Test for SPI DMA function */
#define CRCPolynomial      7
#define SPI1_DR_Address    0x4001300C
#define BufferSize         128
  
  /* 初始化SPI1 ------------------------------------------------------*/
  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
  SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
  SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
  SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;
  SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
  SPI_InitStructure.SPI_CRCPolynomial = CRCPolynomial;
  SPI_Init(SPI1, &SPI_InitStructure);
  
  /* 初始化DMA Channel2 ----------------------------------------------*/
  DMA_DeInit(DMA_Channel2);
  DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)SPI1_DR_Address;
  DMA_InitStructure.DMA_MemoryBaseAddr = (u32)SPI1_Buffer_Rx;
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
  DMA_InitStructure.DMA_BufferSize = BufferSize;
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
  DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
  DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
  DMA_Init(DMA_Channel2, &DMA_InitStructure); 
  
  /* DMA Channel3 configuration ----------------------------------------------*/
  DMA_DeInit(DMA_Channel3);
  DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)SPI1_DR_Address;
  DMA_InitStructure.DMA_MemoryBaseAddr = (u32)SPI1_Buffer_Tx;
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
  DMA_InitStructure.DMA_Priority = DMA_Priority_Low;
  DMA_Init(DMA_Channel3, &DMA_InitStructure);
  
  /* Enable SPI1 DMA Rx request */
  SPI_DMACmd(SPI1, SPI_DMAReq_Tx, ENABLE);
  SPI_DMACmd(SPI1, SPI_DMAReq_Rx, ENABLE);
  
  /* Enable SPI1 CRC calculation */
  SPI_CalculateCRC(SPI1, ENABLE);
  
  /* Enable SPI1 */
  SPI_Cmd(SPI1, ENABLE);
  DMA_Cmd(DMA_Channel2, ENABLE);
  DMA_Cmd(DMA_Channel3, ENABLE);
  
  /* Transfer complete */
  while(!DMA_GetFlagStatus(DMA_FLAG_TC2));
#endif
  /* Enable Leds toggling */
  LedShow(ENABLE);

}

使用特权

评论回复
7
daguang72| | 2007-7-5 09:17 | 只看该作者

楼主用的是什么调试器?

使用特权

评论回复
8
alin_99| | 2007-7-5 09:52 | 只看该作者

这么快啊就有人使用,不知 到哪里申请样片啊?

使用特权

评论回复
9
skyler|  楼主 | 2007-7-5 11:26 | 只看该作者

问ST拿的

用jlink,但需要为iar和jlink打补丁。
明天发板出去,争取下周出样机,可能是第一个出产品的,嘻嘻。

使用特权

评论回复
10
浪淘沙| | 2007-7-5 11:57 | 只看该作者

恭喜楼主,记得有机会上来介绍一下心得

对1楼的问题有点疑问,“103的spi时钟达到16MHz,DMA时spi是9MHz”,你是在使用DMA时SPI的速率设为16MHz但输出只有9MHz,还是在使用DMA时SPI的速率只能设为9MHz。

从你的程序看,你是把SPI的速率设为了9MHz:
 SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;

使用特权

评论回复
11
grant_jx| | 2007-7-6 11:07 | 只看该作者

To 席君秋

你的样品在申请,打电话给你的是我的同事。

我今天也将STM32xx的最新培训资料发给了你,你收一下邮件。

使用特权

评论回复
12
席君秋| | 2007-7-6 12:33 | 只看该作者

邮件已收到,谢谢!

使用特权

评论回复
13
alin_99| | 2007-7-9 17:16 | 只看该作者

请给我也发一份,.谢谢 !tipse@sohu.com

使用特权

评论回复
14
skyler|  楼主 | 2007-7-9 20:57 | 只看该作者

的确是SPI时钟没设对

这个速度的确很爽 ^o^

使用特权

评论回复
15
kingpoo| | 2007-7-11 07:55 | 只看该作者

TO grant_jx:不厚道了

既然有了"STM32xx的最新培训资料",怎么不共享出来给大家看看啊?
难道你不是ST的人?

使用特权

评论回复
16
grant_jx| | 2007-7-11 12:14 | 只看该作者

我确实不是ST的,呵呵,这个香水城可以作证

因为培训资料是我去参加培训的资料,我也不是非常清楚ST是否愿意公开?因为好像上面的版本还是0.x,不知道ST是否会有正式的文档发布,以前的STR71x是有的,你可以在IAR或Keil的安装文件夹的例子里面找到。如果不是正式的版本,我随便公开出来,要是有什么内容引起误会,到时又会有人上来说三到四了,说什么我们骗他。

因为席君秋算是我的客户,自然我要支持他当然需要给他一些资料,这本也没有什么好说的,你没看见ZLG吗,翻译的资料现在只提供给他自己的客户?

如果你是公司,确实有项目要做,可以向我提供你们项目的资料,我们是ST的代理,会对你的项目评估,但资料肯定会给你;如果你是个人有兴趣,请你等待,等待ST的正式资料发布。

动手试验课的例子:
https://bbs.21ic.com/upfiles/img/20077/2007711121034688.rar

题目:
https://bbs.21ic.com/upfiles/img/20077/2007711121134926.rar

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

57

帖子

1

粉丝