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

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

[复制链接]
沐紫 发布时间:2014-1-23 14:58
阅读主题, 点击返回1楼
11 收藏 156 评论278 发布时间:2014-1-23 14:58
278个回答
diandian 回答时间:2017-8-1 14:48:40
签到签到
diandian 回答时间:2017-8-1 14:53:42
围观围观
忘不掉 回答时间:2017-9-5 19:19:50
非常不错!很好的资料!
epochal 回答时间:2017-9-5 21:09:57
版块真好!赞赞赞!
leo121_3006061 回答时间:2017-9-18 11:50:24
非常好的帖子,THANKS!
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
极好的帖子

所属标签

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