你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32官方实战经验分享(2020.7.31更新) 精华  

[复制链接]
沐紫 发布时间:2014-1-23 14:58
阅读主题, 点击返回1楼
11 收藏 152 评论273 发布时间:2014-1-23 14:58
273个回答
1401696616 回答时间:2017-9-28 15:25:21
许多问题并没有碰到  只能来签个到
嵌了个入式 回答时间:2017-11-21 08:54:00
厉害了,这个帖子必须要顶一下
带我装逼带我飞 回答时间:2017-12-22 09:14:44
好贴,MARK!
5768340 回答时间:2018-1-13 14:42:54
HI  
   有个问题纠结很久了。使用的STM32F205RE MCU SPI2 进行DMA 传输,数据量大的时候接收的数据会乱,直接将MISO 和 MOSI 短接测试的,代码如下:
   期望接收到的全部为0x55 ,实际出来的是前面数据正常,后面的数据就乱了。
  1. /*****************************************
  2. 函数名称:Cdfinger_Bspspi_init
  3. 函数作用:spi初始化函数
  4. 备注:
  5. ******************************************/
  6. void Cdfinger_Bspspi_init(void)
  7. {
  8.         GPIO_InitTypeDef GPIO_InitStructure;
  9.         SPI_InitTypeDef  SPI_InitStructure;
  10.         DMA_InitTypeDef  DMA_InitStructure;
  11.         NVIC_InitTypeDef NVIC_InitStructure;
  12.   
  13.         int ii =0;
  14.        
  15.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
  16.         /*!< Enable SPI2 clocks */
  17.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);
  18.         /*!< Enable GPIO clocks */
  19.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE);
  20.         /*!< Connect SPI pins to AF5 */
  21.         GPIO_PinAFConfig(GPIOB, GPIO_PinSource13,GPIO_AF_SPI2);
  22.         GPIO_PinAFConfig(GPIOB, GPIO_PinSource14,GPIO_AF_SPI2);
  23.         GPIO_PinAFConfig(GPIOB, GPIO_PinSource15,GPIO_AF_SPI2);

  24.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  25.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  26.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  27.         GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_DOWN;
  28.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
  29.         GPIO_Init(GPIOB, &GPIO_InitStructure);

  30.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
  31.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  32.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  33.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  34.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//GPIO_PuPd_NOPULL;
  35.         GPIO_Init(GPIOB, &GPIO_InitStructure);
  36.         Cdfinger_BspCs_HIGH();
  37.         //Cdfinger_Bspdelay_ms(1);
  38.   //Cdfinger_BspCs_LOW();
  39.         SPI_Cmd(SPI2,DISABLE);
  40.         SPI_DeInit(SPI2);
  41.         SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
  42.         SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
  43.         SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
  44.         SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
  45.         SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
  46.         SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;//;
  47.         SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;
  48.         SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
  49.         SPI_InitStructure.SPI_CRCPolynomial = 7;
  50.         SPI_Init(SPI2, &SPI_InitStructure);

  51.   memset(&cdfingerimgtxbuf[0],0x55,COMMUNICATIONLEN);
  52.         /* DMA1 Stream0 channel4 spi tx configuration **************************************/
  53.         DMA_DeInit(DMA1_Stream4);
  54.         DMA_InitStructure.DMA_Channel = DMA_Channel_0;
  55.         DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&(SPI2->DR);
  56.         DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&cdfingerimgtxbuf[0];
  57.         DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;
  58.         DMA_InitStructure.DMA_BufferSize = COMMUNICATIONLEN;
  59.         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//;
  60.         DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  61.         DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
  62.         DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
  63.         DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;// ;
  64.         DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;//DMA_Priority_Medium;//DMA_Priority_High;
  65.         DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;//;//DMA_FIFOMode_Enable;
  66.         DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
  67.         DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
  68.         DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
  69.         DMA_Init(DMA1_Stream4, &DMA_InitStructure);
  70.   
  71.         /* DMA1 Stream0 channel3 spi rx configuration **************************************/
  72.         DMA_DeInit(DMA1_Stream3);
  73.         DMA_InitStructure.DMA_Channel = DMA_Channel_0;
  74.         DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&(SPI2->DR);
  75.         DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&cdfingerimgrxbuf[0];//(uint32_t)&cdfingerimgrxbuf[0];
  76.         DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
  77.         DMA_InitStructure.DMA_BufferSize =COMMUNICATIONLEN;
  78.         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  79.         DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  80.         DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
  81.         DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
  82.         DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;//DMA_Mode_Circular;
  83.         DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;//DMA_Priority_Medium;
  84.         DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;//DMA_FIFOMode_Disable;
  85.         DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
  86.         DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
  87.         DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
  88.         DMA_Init(DMA1_Stream3, &DMA_InitStructure);
  89.         //Cdfinger_BspCs_HIGH();
  90.        


  91.         //发送中断
  92.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
  93.         NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream4_IRQn;     
  94.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  95.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03;
  96.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  97.         NVIC_Init(&NVIC_InitStructure);
  98.        
  99.         //接收中断
  100.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
  101.         NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream3_IRQn;     
  102.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  103.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x04;
  104.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  105.         NVIC_Init(&NVIC_InitStructure);
  106.         SPI_TIModeCmd(SPI2,ENABLE);
  107.         SPI_Cmd(SPI2, ENABLE);
  108.         DMA_ITConfig(DMA1_Stream4,DMA_IT_TC,ENABLE);
  109.         DMA_ITConfig(DMA1_Stream3,DMA_IT_TC,ENABLE);

  110.   DMA_Cmd(DMA1_Stream3, ENABLE);
  111.         DMA_Cmd(DMA1_Stream4, ENABLE);
  112.         SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Tx|SPI_I2S_DMAReq_Rx, ENABLE);

  113.         for(ii=0;ii<COMMUNICATIONLEN;ii++)
  114.         {
  115.           if(ii%8==0)
  116.                 {
  117.                                 printf("\r\n");
  118.                 }
  119.                 printf("  0x%x",cdfingerimgrxbuf[ii]);
  120.         }
  121.         printf("111\r\n");
  122. }


  123. void DMA1_Stream4_IRQHandler(void)
  124. {
  125.   if(DMA_GetITStatus(DMA1_Stream4,DMA_IT_TCIF4) != RESET)
  126.   {
  127.           printf("DMA1_Stream4_IRQHandler = %d \r\n",DMA_GetCurrDataCounter(DMA1_Stream4));
  128.     DMA_Cmd(DMA1_Stream4, DISABLE);
  129.                 DMA_ClearITPendingBit(DMA1_Stream4,DMA_IT_TCIF4);
  130.           DMA_ClearFlag(DMA1_Stream4,DMA_IT_TCIF4);
  131.   }
  132. }

  133. void DMA1_Stream3_IRQHandler(void)
  134. {
  135.   if(DMA_GetITStatus(DMA1_Stream3,DMA_IT_TCIF3) != RESET)
  136.   {
  137.           printf("DMA1_Stream3_IRQHandler = %d \r\n",DMA_GetCurrDataCounter(DMA1_Stream3));
  138.     DMA_Cmd(DMA1_Stream3, DISABLE);
  139.                 DMA_ClearITPendingBit(DMA1_Stream3,DMA_IT_TCIF3);
  140.           DMA_ClearFlag(DMA1_Stream3,DMA_IT_TCIF3);
  141.   }
  142. }
复制代码
feixiang20 回答时间:2018-1-15 20:53:18
喜欢实战篇
dapan100 回答时间:2018-2-5 17:11:58
多看看别人出过的错,自己就不会犯了
langtaosha 回答时间:2018-2-22 21:04:38
多谢,大神中的大神
天外来客-399848 回答时间:2018-3-16 14:51:55
MARK一下
MouseCat 回答时间:2018-3-16 17:46:27
好资料!!!!
冷眼1121 回答时间:2018-3-16 19:53:51
极好的帖子

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版